From 6ef374d6f53f64954fb2941f5d83a999632e0004 Mon Sep 17 00:00:00 2001 From: noise Date: Tue, 21 Jul 2026 17:41:28 +0800 Subject: [PATCH 1/6] chore: add `eslint-pluginmd-style` packge & update eslint's packages --- advanced/api/plugin.md | 7 +- eslint.config.js | 84 +- package.json | 6 +- pnpm-lock.yaml | 4797 ++++++++++++++++++++++++---------------- 4 files changed, 2902 insertions(+), 1992 deletions(-) diff --git a/advanced/api/plugin.md b/advanced/api/plugin.md index 709554e8e..aec85e013 100644 --- a/advanced/api/plugin.md +++ b/advanced/api/plugin.md @@ -46,7 +46,7 @@ export function plugin(): Plugin { ::: ::: tip TypeScript -Vitest 通过 `Vite` namespace 重新导出所有仅 Vite 类型的导入,我们可以使用它来保持版本同步。但是,如果我们正在为 Vite 和 Vitest 编写插件,则可以继续使用 `vite` 入口点的 `Plugin` 类型。只需确保我们在某处引用了 `vitest/config` ,以便正确增强 `configureVitest` 即可: +Vitest 通过 `Vite` namespace 重新导出所有仅 Vite 类型的导入,我们可以使用它来保持版本同步。但是,如果我们正在为 Vite 和 Vitest 编写插件,则可以继续使用 `vite` 入口点的 `Plugin` 类型。只需确保我们在某处引用了 `vitest/config`,以便正确增强 `configureVitest` 即可: ```ts /// @@ -59,7 +59,7 @@ Vitest 通过 `Vite` namespace 重新导出所有仅 Vite 类型的导入,我 ### project -该插件所属的当前[测试项目](./test-project)。 +该插件所属的当前 [测试项目](./test-project)。 ::: warning 浏览器模式 请注意,如果我们依赖浏览器功能,则 `project.browser` 字段尚未设置。请改用 [`reporter.onBrowserInit`](./reporters#onbrowserinit) 事件。 @@ -75,7 +75,7 @@ vitest.config.reporters.push([['my-reporter', {}]]) ``` ::: warning 配置已解析完成 -请注意,Vitest 已经解析了配置,因此某些类型可能与通常的用户配置不同。这也意味着某些属性将不会再次解析,例如 `setupFile` 。如果我们要添加新文件,请确保先解析它。 +请注意,Vitest 已经解析了配置,因此某些类型可能与通常的用户配置不同。这也意味着某些属性将不会再次解析,例如 `setupFile`。如果我们要添加新文件,请确保先解析它。 此时尚未创建记者,因此修改 `vitest.reporters` 将不起作用,因为它将被覆盖。如果我们需要注入自己的记者,请修改配置。 ::: @@ -123,3 +123,4 @@ vitest.config.project.push('my-project-name') 请注意,这也将继承 `name` - Vitest 不允许多个项目使用相同的名称,因此这将引发错误。请确保我们指定了不同的名称。我们可以通过 `project.name` 属性访问当前名称,并且所有使用的名称都可以在 `vitest.projects` 数组中找到。 ::: + diff --git a/eslint.config.js b/eslint.config.js index dd5c23190..88862c03a 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,42 +1,50 @@ import antfu, { GLOB_SRC } from '@antfu/eslint-config' +import mdStyle from 'eslint-plugin-md-style' -export default antfu({ - stylistic: true, - typescript: true, - vue: true, - jsonc: false, - yaml: false, - ignores: [ - 'dist', - 'node_modules', - '*.svelte', - '*.snap', - '*.d.ts', - 'coverage', - '!.vitepress', - // contains technically invalid code to display pretty diff - 'guide/snapshot.md', - // uses invalid js example - 'advanced/api/import-example.md', - 'guide/examples/*.md', - ], - rules: { - 'no-restricted-globals': 'off', - 'no-empty-pattern': 'off', +export default antfu( + { + stylistic: true, + typescript: true, + vue: true, + jsonc: false, + yaml: false, + formatters: { + markdown: 'prettier', + }, + ignores: [ + 'dist', + 'node_modules', + '*.svelte', + '*.snap', + '*.d.ts', + 'coverage', + '!.vitepress', + // contains technically invalid code to display pretty diff + 'guide/snapshot.md', + // uses invalid js example + 'advanced/api/import-example.md', + 'guide/examples/*.md', + 'README.md', + '.github/*.md', + ], + rules: { + 'no-restricted-globals': 'off', + 'no-empty-pattern': 'off', + }, }, -}, { - files: [ - `**/*.md`, - `**/*.md/${GLOB_SRC}`, - ], - rules: { - 'perfectionist/sort-imports': 'off', - 'style/max-statements-per-line': 'off', - 'import/newline-after-import': 'off', - 'import/first': 'off', - 'unused-imports/no-unused-imports': 'off', - 'ts/method-signature-style': 'off', - 'no-self-compare': 'off', - 'import/no-mutable-exports': 'off', + mdStyle.configs.all, + { + files: [`**/*.md`, `**/*.md/${GLOB_SRC}`], + rules: { + 'perfectionist/sort-imports': 'off', + 'style/max-statements-per-line': 'off', + 'import/newline-after-import': 'off', + 'import/first': 'off', + 'unused-imports/no-unused-imports': 'off', + 'ts/method-signature-style': 'off', + 'no-self-compare': 'off', + 'import/no-mutable-exports': 'off', + 'markdown/no-multiple-h1': 'off', + }, }, -}) +) diff --git a/package.json b/package.json index 9b838595b..db0710c16 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "vue": "latest" }, "devDependencies": { - "@antfu/eslint-config": "^5.4.1", + "@antfu/eslint-config": "^9.1.0", "@antfu/ni": "^26.1.0", "@iconify-json/carbon": "latest", "@iconify-json/logos": "latest", @@ -38,7 +38,9 @@ "@vitest/coverage-istanbul": "^3.2.4", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", - "eslint": "^9.38.0", + "eslint": "^10.7.0", + "eslint-plugin-format": "^2.0.1", + "eslint-plugin-md-style": "^0.2.0", "esno": "^4.8.0", "fs-extra": "^11.3.0", "https-localhost": "^4.7.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5deec18fe..aad2c0935 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,8 +16,8 @@ importers: version: 3.5.18(typescript@5.9.2) devDependencies: '@antfu/eslint-config': - specifier: ^5.4.1 - version: 5.4.1(@vue/compiler-sfc@3.5.21)(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + specifier: ^9.1.0 + version: 9.1.0(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.2))(@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(@vue/compiler-sfc@3.5.40)(eslint-plugin-format@2.0.1(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(ts-declaration-location@1.0.7(typescript@5.9.2))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) '@antfu/ni': specifier: ^26.1.0 version: 26.2.0 @@ -47,25 +47,31 @@ importers: version: 1.0.0 '@vite-pwa/vitepress': specifier: ^1.0.0 - version: 1.0.0(@vite-pwa/assets-generator@1.0.0)(vite-plugin-pwa@1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(workbox-build@7.3.0)(workbox-window@7.3.0)) + version: 1.0.0(@vite-pwa/assets-generator@1.0.0)(vite-plugin-pwa@1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.3.0)) '@vitejs/plugin-vue': specifier: latest - version: 6.0.1(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) + version: 6.0.1(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.18(typescript@5.9.2)) '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) + version: 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@3.2.4) '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(@vitest/browser@3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + version: 3.2.4(@vitest/browser@3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@3.2.4))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitest/ui': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) eslint: - specifier: ^9.38.0 - version: 9.39.0(jiti@2.5.1) + specifier: ^10.7.0 + version: 10.7.0(jiti@2.7.0) + eslint-plugin-format: + specifier: ^2.0.1 + version: 2.0.1(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-md-style: + specifier: ^0.2.0 + version: 0.2.0(@antfu/eslint-config@9.1.0(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.2))(@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(@vue/compiler-sfc@3.5.40)(eslint-plugin-format@2.0.1(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(ts-declaration-location@1.0.7(typescript@5.9.2))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)))(@eslint/markdown@8.0.3)(eslint@10.7.0(jiti@2.7.0)) esno: specifier: ^4.8.0 version: 4.8.0 @@ -98,28 +104,28 @@ importers: version: 5.9.2 unocss: specifier: latest - version: 66.4.2(postcss@8.5.6)(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + version: 66.4.2(postcss@8.5.21)(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) unplugin-vue-components: specifier: latest - version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.18(typescript@5.9.2)) + version: 29.0.0(@babel/parser@7.29.7)(vue@3.5.18(typescript@5.9.2)) vite: specifier: ^7.1.5 - version: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) vite-plugin-pwa: specifier: ^1.0.0 - version: 1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(workbox-build@7.3.0)(workbox-window@7.3.0) + version: 1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.3.0) vitepress: specifier: 2.0.0-alpha.12 - version: 2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.5.1)(postcss@8.5.6)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1) + version: 2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.7.0)(postcss@8.5.21)(terser@5.49.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.9.0) vitepress-plugin-group-icons: specifier: ^1.6.3 - version: 1.6.5(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + version: 1.6.5(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) vitepress-plugin-tabs: specifier: ^0.7.3 - version: 0.7.3(vitepress@2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.5.1)(postcss@8.5.6)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) + version: 0.7.3(vitepress@2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.7.0)(postcss@8.5.21)(terser@5.49.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.9.0))(vue@3.5.18(typescript@5.9.2)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) workbox-window: specifier: ^7.3.0 version: 7.3.0 @@ -130,21 +136,23 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/eslint-config@5.4.1': - resolution: {integrity: sha512-x7BiNkxJRlXXs8tIvg0CgMuNo5IZVWkGLMJotCtCtzWUHW78Pmm8PvtXhvLBbTc8683GGBK616MMztWLh4RNjA==} + '@antfu/eslint-config@9.1.0': + resolution: {integrity: sha512-Vtjt+W/6/bV9hgQG8AiWG66OpAeLKmpo5bZaAmUdRvZsMyirVvIJeHnbM4XUJf4urIuLvK0gGSvXD74PI3ZnGQ==} hasBin: true peerDependencies: - '@eslint-react/eslint-plugin': ^1.38.4 - '@next/eslint-plugin-next': ^15.4.0-canary.115 + '@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': ^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 - eslint: ^9.10.0 + eslint: ^9.10.0 || ^10.0.0 eslint-plugin-astro: ^1.2.0 eslint-plugin-format: '>=0.1.0' eslint-plugin-jsx-a11y: '>=6.10.2' - eslint-plugin-react-hooks: ^5.2.0 - eslint-plugin-react-refresh: ^0.4.19 + eslint-plugin-react-refresh: ^0.5.0 eslint-plugin-solid: ^0.14.3 eslint-plugin-svelte: '>=2.35.1' eslint-plugin-vuejs-accessibility: ^2.4.1 @@ -152,6 +160,12 @@ packages: prettier-plugin-slidev: ^1.0.5 svelte-eslint-parser: '>=0.37.0' peerDependenciesMeta: + '@angular-eslint/eslint-plugin': + optional: true + '@angular-eslint/eslint-plugin-template': + optional: true + '@angular-eslint/template-parser': + optional: true '@eslint-react/eslint-plugin': optional: true '@next/eslint-plugin-next': @@ -168,8 +182,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: @@ -196,8 +208,8 @@ packages: '@antfu/utils@9.2.0': resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} - '@apideck/better-ajv-errors@0.3.6': - resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + '@apideck/better-ajv-errors@0.3.7': + resolution: {integrity: sha512-TajUJwGWbDwkCx/CZi7tRE8PVB7simCvKJfHUsSdvps+aTM/PDPP4gkLmKnc+x3CE//y9i/nj74GqdL/hwk7Iw==} engines: {node: '>=10'} peerDependencies: ajv: '>=8' @@ -206,40 +218,60 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.0': resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.28.0': resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.28.0': resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.1': - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -247,64 +279,94 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.27.3': resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': 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.27.1': resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 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'} - '@babel/helper-wrap-function@7.27.1': - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.29.7': + resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} engines: {node: '>=6.9.0'} '@babel/helpers@7.28.2': resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.28.0': resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} @@ -315,32 +377,43 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': + resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7': + resolution: {integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7': + resolution: {integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7': + resolution: {integrity: sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7': + resolution: {integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7': + resolution: {integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -351,14 +424,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + '@babel/plugin-syntax-import-assertions@7.29.7': + resolution: {integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -369,314 +442,314 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + '@babel/plugin-transform-arrow-functions@7.29.7': + resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + '@babel/plugin-transform-async-generator-functions@7.29.7': + resolution: {integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + '@babel/plugin-transform-async-to-generator@7.29.7': + resolution: {integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + '@babel/plugin-transform-block-scoped-functions@7.29.7': + resolution: {integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.0': - resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + '@babel/plugin-transform-block-scoping@7.29.7': + resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + '@babel/plugin-transform-class-properties@7.29.7': + resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.27.1': - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + '@babel/plugin-transform-class-static-block@7.29.7': + resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.0': - resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} + '@babel/plugin-transform-classes@7.29.7': + resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + '@babel/plugin-transform-computed-properties@7.29.7': + resolution: {integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.28.0': - resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + '@babel/plugin-transform-destructuring@7.29.7': + resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + '@babel/plugin-transform-dotall-regex@7.29.7': + resolution: {integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + '@babel/plugin-transform-duplicate-keys@7.29.7': + resolution: {integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + '@babel/plugin-transform-dynamic-import@7.29.7': + resolution: {integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-explicit-resource-management@7.28.0': - resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + '@babel/plugin-transform-explicit-resource-management@7.29.7': + resolution: {integrity: sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.27.1': - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + '@babel/plugin-transform-exponentiation-operator@7.29.7': + resolution: {integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + '@babel/plugin-transform-export-namespace-from@7.29.7': + resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + '@babel/plugin-transform-for-of@7.29.7': + resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + '@babel/plugin-transform-function-name@7.29.7': + resolution: {integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + '@babel/plugin-transform-json-strings@7.29.7': + resolution: {integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + '@babel/plugin-transform-literals@7.29.7': + resolution: {integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.27.1': - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + '@babel/plugin-transform-logical-assignment-operators@7.29.7': + resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + '@babel/plugin-transform-member-expression-literals@7.29.7': + resolution: {integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + '@babel/plugin-transform-modules-amd@7.29.7': + resolution: {integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.27.1': - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + '@babel/plugin-transform-modules-systemjs@7.29.7': + resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + '@babel/plugin-transform-modules-umd@7.29.7': + resolution: {integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + '@babel/plugin-transform-new-target@7.29.7': + resolution: {integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': + resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + '@babel/plugin-transform-numeric-separator@7.29.7': + resolution: {integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.0': - resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + '@babel/plugin-transform-object-rest-spread@7.29.7': + resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + '@babel/plugin-transform-object-super@7.29.7': + resolution: {integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + '@babel/plugin-transform-optional-catch-binding@7.29.7': + resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + '@babel/plugin-transform-optional-chaining@7.29.7': + resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + '@babel/plugin-transform-parameters@7.29.7': + resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + '@babel/plugin-transform-private-methods@7.29.7': + resolution: {integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + '@babel/plugin-transform-private-property-in-object@7.29.7': + resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + '@babel/plugin-transform-property-literals@7.29.7': + resolution: {integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.1': - resolution: {integrity: sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==} + '@babel/plugin-transform-regenerator@7.29.7': + resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + '@babel/plugin-transform-regexp-modifiers@7.29.7': + resolution: {integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + '@babel/plugin-transform-reserved-words@7.29.7': + resolution: {integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + '@babel/plugin-transform-shorthand-properties@7.29.7': + resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + '@babel/plugin-transform-spread@7.29.7': + resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + '@babel/plugin-transform-sticky-regex@7.29.7': + resolution: {integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + '@babel/plugin-transform-template-literals@7.29.7': + resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + '@babel/plugin-transform-typeof-symbol@7.29.7': + resolution: {integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + '@babel/plugin-transform-unicode-escapes@7.29.7': + resolution: {integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + '@babel/plugin-transform-unicode-property-regex@7.29.7': + resolution: {integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + '@babel/plugin-transform-unicode-sets-regex@7.29.7': + resolution: {integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.28.0': - resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==} + '@babel/preset-env@7.29.7': + resolution: {integrity: sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -690,14 +763,26 @@ packages: resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.0': resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.2': resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} @@ -706,6 +791,10 @@ packages: resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -713,11 +802,13 @@ packages: '@canvas/image-data@1.0.0': resolution: {integrity: sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==} - '@clack/core@0.5.0': - resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + engines: {node: '>= 20.12.0'} - '@clack/prompts@0.11.0': - resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + engines: {node: '>= 20.12.0'} '@docsearch/css@4.0.1': resolution: {integrity: sha512-ouRI2SEwAg8qBqX4S3zfm4OJ/07o9Is7TzivNGkqP7FtYU4W0qgigumWkPbYvDwtG0koZw2ZebpcQiEpkCyv+g==} @@ -725,16 +816,36 @@ packages: '@docsearch/js@4.0.1': resolution: {integrity: sha512-xHxFULFCihnu8XxNB4QRH/H6ZtG0ThuM9aaY1FAhZXHk+aQ5uo5JG+UiDkSb6YrwItsw0+cSGzBNxyB0g3fGtQ==} + '@dprint/formatter@0.5.1': + resolution: {integrity: sha512-cdZUrm0iv/FnnY3CKE2dEcVhNEzrC551aE2h2mTFwQCRBrqyARLDnb7D+3PlXTUVp3s34ftlnGOVCmhLT9DeKA==} + + '@dprint/markdown@0.21.1': + resolution: {integrity: sha512-XbZ/R7vRrBaZFYXG6vAvLvtaMVXHu8XB+xwie7OYrG+dPoGDP8UADGirIbzUyX8TmrAZcl6QBmalipTGlpzRmQ==} + + '@dprint/toml@0.7.0': + resolution: {integrity: sha512-eFaQTcfxKHB+YyTh83x7GEv+gDPuj9q5NFOTaoj5rZmQTbj6OgjjMxUicmS1R8zYcx8YAq5oA9J3YFa5U6x2gA==} + + '@e18e/eslint-plugin@0.5.1': + resolution: {integrity: sha512-mqUozeyNI9xvJbjrOO7y765dT7Kud3bwCm/DHwctxdEngPdJWQaS9BNGgpM1wCCzZfOtlKQh4ZRhm3VRomT9KA==} + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 + oxlint: ^1.68.0 + peerDependenciesMeta: + eslint: + optional: true + oxlint: + optional: true + '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@es-joy/jsdoccomment@0.50.2': - resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} - engines: {node: '>=18'} + '@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.58.0': - resolution: {integrity: sha512-smMc5pDht/UVsCD3hhw/a/e/p8m0RdRYiluXToVfd+d4yaQQh7nn9bACjkk6nXJvat7EWPAxuFkMEFfrxeGa3Q==} - engines: {node: '>=20.11.0'} + '@es-joy/resolve.exports@1.2.0': + resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} + engines: {node: '>=10'} '@esbuild/aix-ppc64@0.25.8': resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} @@ -892,80 +1003,58 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-plugin-eslint-comments@4.5.0': - resolution: {integrity: sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==} - 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 - - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@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 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.3.2': - resolution: {integrity: sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/compat@2.1.0': + resolution: {integrity: sha512-LgaSCymEpw7tF53xvDw9SNsraPb1IBHxpdABIOM0hW8UAlP8znrjYtuxfR58FSJ3L9BhwD+FaPRFQpZq84Nh6g==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - eslint: ^8.40 || 9 + eslint: ^8.40 || 9 || 10 peerDependenciesMeta: eslint: optional: true - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.16.0': - resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.0': - resolution: {integrity: sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/markdown@7.5.0': - resolution: {integrity: sha512-reKloVSpytg4ene3yviPJcUO7zglpNn9kWNRiSQ/8gBbBFMKW5Q042LaCi3wv2vVtbPNnLrl6WvhRAHeBd43QA==} - 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@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - 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/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@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.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@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.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -976,22 +1065,22 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -1129,6 +1218,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -1136,12 +1229,18 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.10': - resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} @@ -1152,25 +1251,134 @@ packages: '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@ota-meshi/ast-token-store@0.3.0': + resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@oxfmt/binding-android-arm-eabi@0.35.0': + resolution: {integrity: sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.35.0': + resolution: {integrity: sha512-/O+EbuAJYs6nde/anv+aID6uHsGQApyE9JtYBo/79KyU8e6RBN3DMbT0ix97y1SOnCglurmL2iZ+hlohjP2PnQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.35.0': + resolution: {integrity: sha512-pGqRtqlNdn9d4VrmGUWVyQjkw79ryhI6je9y2jfqNUIZCfqceob+R97YYAoG7C5TFyt8ILdLVoN+L2vw/hSFyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.35.0': + resolution: {integrity: sha512-8GmsDcSozTPjrCJeGpp+sCmS9+9V5yRrdEZ1p/sTWxPG5nYeAfSLuS0nuEYjXSO+CtdSbStIW6dxa+4NM58yRw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.35.0': + resolution: {integrity: sha512-QyfKfTe0ytHpFKHAcHCGQEzN45QSqq1AHJOYYxQMgLM3KY4xu8OsXHpCnINjDsV4XGnQzczJDU9e04Zmd8XqIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': + resolution: {integrity: sha512-u+kv3JD6P3J38oOyUaiCqgY5TNESzBRZJ5lyZQ6c2czUW2v5SIN9E/KWWa9vxoc+P8AFXQFUVrdzGy1tK+nbPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.35.0': + resolution: {integrity: sha512-1NiZroCiV57I7Pf8kOH4XGR366kW5zir3VfSMBU2D0V14GpYjiYmPYFAoJboZvp8ACnZKUReWyMkNKSa5ad58A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.35.0': + resolution: {integrity: sha512-7Q0Xeg7ZnW2nxnZ4R7aF6DEbCFls4skgHZg+I63XitpNvJCbVIU8MFOTZlvZGRsY9+rPgWPQGeUpLHlyx0wvMA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.35.0': + resolution: {integrity: sha512-5Okqi+uhYFxwKz8hcnUftNNwdm8BCkf6GSCbcz9xJxYMm87k1E4p7PEmAAbhLTk7cjSdDre6TDL0pDzNX+Y22Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.35.0': + resolution: {integrity: sha512-9k66pbZQXM/lBJWys3Xbc5yhl4JexyfqkEf/tvtq8976VIJnLAAL3M127xHA3ifYSqxdVHfVGTg84eiBHCGcNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.35.0': + resolution: {integrity: sha512-aUcY9ofKPtjO52idT6t0SAQvEF6ctjzUQa1lLp7GDsRpSBvuTrBQGeq0rYKz3gN8dMIQ7mtMdGD9tT4LhR8jAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.35.0': + resolution: {integrity: sha512-C6yhY5Hvc2sGM+mCPek9ZLe5xRUOC/BvhAt2qIWFAeXMn4il04EYIjl3DsWiJr0xDMTJhvMOmD55xTRPlNp39w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.35.0': + resolution: {integrity: sha512-RG2hlvOMK4OMZpO3mt8MpxLQ0AAezlFqhn5mI/g5YrVbPFyoCv9a34AAvbSJS501ocOxlFIRcKEuw5hFvddf9g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.35.0': + resolution: {integrity: sha512-wzmh90Pwvqj9xOKHJjkQYBpydRkaXG77ZvDz+iFDRRQpnqIEqGm5gmim2s6vnZIkDGsvKCuTdtxm0GFmBjM1+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.35.0': + resolution: {integrity: sha512-+HCqYCJPCUy5I+b2cf+gUVaApfgtoQT3HdnSg/l7NIcLHOhKstlYaGyrFZLmUpQt4WkFbpGKZZayG6zjRU0KFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.35.0': + resolution: {integrity: sha512-kFYmWfR9YL78XyO5ws+1dsxNvZoD973qfVMNFOS4e9bcHXGF7DvGC2tY5UDFwyMCeB33t3sDIuGONKggnVNSJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.35.0': + resolution: {integrity: sha512-uD/NGdM65eKNCDGyTGdO8e9n3IHX+wwuorBvEYrPJXhDXL9qz6gzddmXH8EN04ejUXUujlq4FsoSeCfbg0Y+Jg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.35.0': + resolution: {integrity: sha512-oSRD2k8J2uxYDEKR2nAE/YTY9PobOEnhZgCmspHu0+yBQ665yH8lFErQVSTE7fcGJmJp/cC6322/gc8VFuQf7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.35.0': + resolution: {integrity: sha512-WCDJjlS95NboR0ugI2BEwzt1tYvRDorDRM9Lvctls1SLyKYuNRCyrPwp1urUPFBnwgBNn9p2/gnmo7gFMySRoQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -1181,19 +1389,21 @@ packages: '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} - '@rollup/plugin-babel@5.3.1': - resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} - engines: {node: '>= 10.0.0'} + '@rollup/plugin-babel@6.1.0': + resolution: {integrity: sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==} + engines: {node: '>=14.0.0'} peerDependencies: '@babel/core': ^7.0.0 '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: '@types/babel__core': optional: true + rollup: + optional: true - '@rollup/plugin-node-resolve@15.3.1': - resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -1201,28 +1411,26 @@ packages: rollup: optional: true - '@rollup/plugin-replace@2.4.2': - resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - - '@rollup/plugin-terser@0.4.4': - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + '@rollup/plugin-replace@6.0.3': + resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/pluginutils@3.1.0': - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} + '@rollup/plugin-terser@1.0.0': + resolution: {integrity: sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==} + engines: {node: '>=20.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0 + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1235,51 +1443,111 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.46.2': resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.46.2': resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.46.2': resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.46.2': resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.46.2': resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.46.2': resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.46.2': resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.46.2': resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} cpu: [loong64] @@ -1290,46 +1558,111 @@ packages: cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.46.2': resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.46.2': resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.46.2': resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.46.2': resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.46.2': resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.46.2': resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.46.2': resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.46.2': resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + cpu: [x64] + os: [win32] + '@shikijs/core@3.13.0': resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==} @@ -1371,14 +1704,15 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@stylistic/eslint-plugin@5.5.0': - resolution: {integrity: sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw==} + '@sindresorhus/base62@1.0.0': + resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} + engines: {node: '>=18'} + + '@stylistic/eslint-plugin@5.10.0': + resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=9.0.0' - - '@surma/rollup-plugin-off-main-thread@2.2.3': - resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + eslint: ^9.0.0 || ^10.0.0 '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} @@ -1390,6 +1724,10 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' + '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': + resolution: {integrity: sha512-/67zpWDBLV+oYAEL682s1ktXL0HgqX76f6gaVGkGnVZlBbm1zd0v4Bz8MFF2GGhoX9rvfq3KSQHubFHwa6w6/Q==} + engines: {node: '>=12'} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -1399,27 +1737,39 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree@0.0.39': - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} '@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/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} '@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/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -1450,100 +1800,63 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@typescript-eslint/eslint-plugin@8.46.2': - resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.46.2 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/parser@8.46.2': - resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + '@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: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^8.65.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.39.0': - resolution: {integrity: sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==} + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.46.2': - resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + '@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: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/scope-manager@8.39.0': - resolution: {integrity: sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.46.2': - resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + '@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.39.0': - resolution: {integrity: sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==} + '@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.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/tsconfig-utils@8.46.2': - resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + '@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: - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.46.2': - resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/types@8.39.0': - resolution: {integrity: sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==} + '@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/types@8.46.2': - resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.39.0': - resolution: {integrity: sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/typescript-estree@8.46.2': - resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + '@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.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.39.0': - resolution: {integrity: sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==} + '@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 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.46.2': - resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/visitor-keys@8.39.0': - resolution: {integrity: sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.46.2': - resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + '@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.1': @@ -1690,14 +2003,17 @@ packages: '@vitest/browser': optional: true - '@vitest/eslint-plugin@1.4.0': - resolution: {integrity: sha512-TMzJ0Vqdsc71stblzI0ZdqSnt6Bp4mJ+amD3Hv3qhKK82hBUnznYfnLwA80gdGfe5V24ysndMOoSGrol6fyvbA==} + '@vitest/eslint-plugin@1.6.23': + resolution: {integrity: sha512-CbrXxQpIUMbeyylGlxaxTgnWYM44et4Nx58swl7+vrTyC9Ttx+hQoy8BGCregbbZ08K5qFhRHeoad1VvERUbkg==} 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: @@ -1749,24 +2065,36 @@ packages: '@vue/compiler-core@3.5.21': resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} + '@vue/compiler-core@3.5.40': + resolution: {integrity: sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==} + '@vue/compiler-dom@3.5.18': resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} '@vue/compiler-dom@3.5.21': resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} + '@vue/compiler-dom@3.5.40': + resolution: {integrity: sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==} + '@vue/compiler-sfc@3.5.18': resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==} '@vue/compiler-sfc@3.5.21': resolution: {integrity: sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==} + '@vue/compiler-sfc@3.5.40': + resolution: {integrity: sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==} + '@vue/compiler-ssr@3.5.18': resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==} '@vue/compiler-ssr@3.5.21': resolution: {integrity: sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==} + '@vue/compiler-ssr@3.5.40': + resolution: {integrity: sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==} + '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -1821,6 +2149,9 @@ packages: '@vue/shared@3.5.21': resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} + '@vue/shared@3.5.40': + resolution: {integrity: sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==} + '@vueuse/core@13.6.0': resolution: {integrity: sha512-DJbD5fV86muVmBgS9QQPddVX7d9hWYswzlf4bIyUD2dj8GC46R1uNClZhVAmsdVts4xb2jwp1PbpuiA50Qee1A==} peerDependencies: @@ -1903,11 +2234,16 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} alien-signals@2.0.6: resolution: {integrity: sha512-P3TxJSe31bUHBiblg59oU1PpaWPtmxF9GhJ/cB7OkgJ0qN/ifFSKUI25/v8ZhsT+lIG6ac8DpTOplXxORX6F3Q==} @@ -1936,14 +2272,14 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansis@4.1.0: - resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} - engines: {node: '>=14'} - ansis@4.2.0: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + engines: {node: '>=14'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1955,9 +2291,6 @@ packages: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -1994,24 +2327,33 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + babel-plugin-polyfill-corejs3@0.14.2: + resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.44: + resolution: {integrity: sha512-T3ghW+sl/ZJ8w1v/yQx3qvJ9040DWoLBz8JT/CILbAKcFyG9b2MRe75v6W5uXjv6uH1lumK2Kv46y2zSkcej0Q==} + engines: {node: '>=6.0.0'} + hasBin: true + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2026,12 +2368,16 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.1.2: + resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} + + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -2041,11 +2387,16 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.6: + resolution: {integrity: sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==} + 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==} - builtin-modules@5.0.0: - resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} + builtin-modules@5.3.0: + resolution: {integrity: sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ==} engines: {node: '>=18.20'} bytes@3.1.2: @@ -2056,25 +2407,28 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} engines: {node: '>= 0.4'} call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - caniuse-lite@1.0.30001733: resolution: {integrity: sha512-e4QKw/O2Kavj2VQTKZWrwzkt3IxOmIlU6ajRb6LP64LHpBo1J67k2Hi4Vu/TgJWsNtynurfS0uK3MaUTCPfu5Q==} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2082,10 +2436,6 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -2106,14 +2456,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - ci-info@4.3.0: - resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + ci-info@4.4.0: + 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'} @@ -2149,8 +2495,12 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-parser@1.4.7: + resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} engines: {node: '>= 12.0.0'} common-tags@1.8.2: @@ -2165,15 +2515,15 @@ packages: resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} engines: {node: '>= 0.8.0'} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2200,8 +2550,8 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} - core-js-compat@3.45.0: - resolution: {integrity: sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2282,6 +2632,9 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -2319,6 +2672,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.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} @@ -2329,6 +2686,10 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -2353,6 +2714,9 @@ packages: electron-to-chromium@1.5.199: resolution: {integrity: sha512-3gl0S7zQd88kCAZRO/DnxtBKuhMO4h0EaQIN3YgZfV6+pW+5+bf2AdQeHNESCoaQqo/gjGVYEf2YM4O5HJQqpQ==} + electron-to-chromium@1.5.394: + resolution: {integrity: sha512-Wmt2Gm0o8JWBuGgmc4XZ0u9s1RaCRqhxP47phplmfg04+qypTUurpeJGP45A7Fhv7jdrrVH44PLlR9qXo37cVQ==} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2362,8 +2726,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - empathic@2.0.0: - resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} encodeurl@1.0.2: @@ -2374,20 +2738,28 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.24.3: + resolution: {integrity: sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==} engines: {node: '>=10.13.0'} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@7.0.1: + 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.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -2405,12 +2777,16 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} esbuild@0.25.8: @@ -2425,10 +2801,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'} @@ -2443,27 +2815,26 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-compat-utils@0.6.5: - resolution: {integrity: sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==} - engines: {node: '>=12'} + eslint-config-flat-gitignore@2.3.0: + resolution: {integrity: sha512-bg4ZLGgoARg1naWfsINUUb/52Ksw/K22K+T16D38Y8v+/sGwwIYrGvH/JBjOin+RQtxxC9tzNNiy4shnGtGyyQ==} peerDependencies: - eslint: '>=6.0.0' + eslint: ^9.5.0 || ^10.0.0 - eslint-config-flat-gitignore@2.1.0: - resolution: {integrity: sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA==} - peerDependencies: - eslint: ^9.5.0 + eslint-flat-config-utils@3.2.0: + resolution: {integrity: sha512-PHgo1X5uqIorJONLVD9BIaOSdoYFD3z/AeJljdqDPlWVRpeCYkDbK9k0AXoYVqqNJr6FEYIEr5Rm2TSktLQcHw==} - eslint-flat-config-utils@2.1.1: - resolution: {integrity: sha512-K8eaPkBemHkfbYsZH7z4lZ/tt6gNSsVh535Wh9W9gQBS2WjvfUbbVr2NZR3L1yiRCLuOEimYfPxCxODczD4Opg==} + eslint-formatting-reporter@0.0.0: + resolution: {integrity: sha512-k9RdyTqxqN/wNYVaTk/ds5B5rA8lgoAmvceYN7bcZMBwU7TuXx5ntewJv81eF3pIL/CiJE+pJZm36llG8yhyyw==} + peerDependencies: + eslint: '>=8.40.0' - eslint-json-compat-utils@0.2.1: - resolution: {integrity: sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==} + eslint-json-compat-utils@0.2.3: + resolution: {integrity: sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==} engines: {node: '>=12'} peerDependencies: '@eslint/json': '*' eslint: '*' - jsonc-eslint-parser: ^2.4.0 + jsonc-eslint-parser: ^2.4.0 || ^3.0.0 peerDependenciesMeta: '@eslint/json': optional: true @@ -2473,14 +2844,19 @@ packages: peerDependencies: eslint: '*' - eslint-plugin-antfu@3.1.1: - resolution: {integrity: sha512-7Q+NhwLfHJFvopI2HBZbSxWXngTwBLKxW1AGXLr2lEGxcEIK/AsDs8pn8fvIizl5aZjBbVbVK5ujmMpBe4Tvdg==} + eslint-parser-plain@0.1.1: + resolution: {integrity: sha512-KRgd6wuxH4U8kczqPp+Oyk4irThIhHWxgFgLDtpgjUGVIS3wGrJntvZW/p6hHq1T4FOwnOtCNkvAI4Kr+mQ/Hw==} + + eslint-plugin-antfu@3.2.3: + resolution: {integrity: sha512-U2fnz/H0gFPxpuC7QpaHa0Jv2AgCZ5hunp36SOP/yWo8yFzgvMh8X4pZ4uN4IKoqtBhk7G3HuVa93Urf51+sZg==} peerDependencies: eslint: '*' - eslint-plugin-command@3.3.1: - resolution: {integrity: sha512-fBVTXQ2y48TVLT0+4A6PFINp7GcdIailHAXbvPBixE7x+YpYnNQhFZxTdvnb+aWk+COgNebQKen/7m4dmgyWAw==} + eslint-plugin-command@3.5.3: + resolution: {integrity: sha512-JIhmUOW2K2Dw1K+p4mtj5potkqTZ4ZaicrTkgCygPZCWErP2+O2F46n7ZwGKapeEjiwcVqoY8u01SxNUUXWPeQ==} peerDependencies: + '@typescript-eslint/typescript-estree': '*' + '@typescript-eslint/utils': '*' eslint: '*' eslint-plugin-es-x@7.8.0: @@ -2489,92 +2865,114 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-import-lite@0.3.0: - resolution: {integrity: sha512-dkNBAL6jcoCsXZsQ/Tt2yXmMDoNt5NaBh/U7yvccjiK8cai6Ay+MK77bMykmqQA2bTF6lngaLCDij6MTO3KkvA==} + eslint-plugin-format@2.0.1: + resolution: {integrity: sha512-0BA65p5DAiuKtx5MmMJfPk9WaTjoHHbyVW7ZXRhaZoA1fdiMHhay9QRiDL2wr0hJWZxdF7CRThOK/70VUKVg2g==} + peerDependencies: + eslint: ^8.40.0 || ^9.0.0 || ^10.0.0 + + 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' - typescript: '>=4.5' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^9.0.0 || ^10.0.0 - eslint-plugin-jsdoc@59.1.0: - resolution: {integrity: sha512-sg9mzjjzfnMynyY4W8FDiQv3i8eFcKVEHDt4Xh7MLskP3QkMt2z6p7FuzSw7jJSKFues6RaK2GWvmkB1FLPxXg==} - engines: {node: '>=20.11.0'} + eslint-plugin-jsdoc@63.2.0: + resolution: {integrity: sha512-tccz9igEV5mTKVAwo/KwXqKP7ENqa3a+LpRFuEPAP3k/+SXG4T0sOvA+c2wwTD/TLNrH9MCW4LIu4xEExkJdzg==} + engines: {node: ^22.13.0 || >=24} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-jsonc@2.20.1: - resolution: {integrity: sha512-gUzIwQHXx7ZPypUoadcyRi4WbHW2TPixDr0kqQ4miuJBU0emJmyGTlnaT3Og9X2a8R1CDayN9BFSq5weGWbTng==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-plugin-jsonc@3.3.0: + resolution: {integrity: sha512-CsTR8aDcShDg6A71ZppLaWiPoSo2J1Ivjm5/c4Mnb9sxgwWq+WG2PgeoAnj7SwzDPJB75tlHvLrGy6ntooIitg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - eslint: '>=6.0.0' + eslint: '>=9.38.0' - eslint-plugin-n@17.23.1: - resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-plugin-md-style@0.2.0: + resolution: {integrity: sha512-Pc6IqbXJx8uD4Pm8WjqUVI8Iup2GBePdaryhVSjhBBhvI4tqRDvw/xQqBCSJdMZGGp46RIagPygrkq+c/oybKQ==} + engines: {node: '>=20.19.0'} peerDependencies: - eslint: '>=8.23.0' + '@antfu/eslint-config': ^7.5.0 + '@eslint/markdown': ^7.5.1 + eslint: ^9.30.0 || ^10.0.0 + peerDependenciesMeta: + '@antfu/eslint-config': + optional: true + + eslint-plugin-n@18.2.2: + resolution: {integrity: sha512-gOO0lIqwEjZ750kv9/SptCWArUoAZXJoBr0vYWTO2dCBxctHUXlBIigiC8xuxxr/NKqgIT6Ehz1xRcilj8a5cA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + 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@4.15.0: - resolution: {integrity: sha512-pC7PgoXyDnEXe14xvRUhBII8A3zRgggKqJFx2a82fjrItDs1BSI7zdZnQtM2yQvcyod6/ujmzb7ejKPx8lZTnw==} - engines: {node: ^18.0.0 || >=20.0.0} + 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' + eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-pnpm@1.3.0: - resolution: {integrity: sha512-Lkdnj3afoeUIkDUu8X74z60nrzjQ2U55EbOeI+qz7H1He4IO4gmUKT2KQIl0It52iMHJeuyLDWWNgjr6UIK8nw==} + eslint-plugin-pnpm@1.6.1: + resolution: {integrity: sha512-pgcaJclu3YxZ/WMsiKMF58bHQasbGVARSMqCJvFaETYxSc7KcR2H74UVWV6exuGv9nNv9c0KKqn4PVHQlzMSEg==} peerDependencies: - eslint: ^9.0.0 + eslint: ^9.0.0 || ^10.0.0 - eslint-plugin-regexp@2.10.0: - resolution: {integrity: sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng==} - engines: {node: ^18 || >=20} + eslint-plugin-regexp@3.1.1: + resolution: {integrity: sha512-MxR5nqoQCtVWmJwia0D2+NlXX1xzdpkslsVOZLEYQ4PQWEaL65PCZXURxaBc3lPnkNFpNxzMIRmYVxdl8giXRA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - eslint: '>=8.44.0' + eslint: '>=9.38.0' - eslint-plugin-toml@0.12.0: - resolution: {integrity: sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-plugin-toml@1.4.0: + resolution: {integrity: sha512-3ErTnfUjXq/23f72XeyRcE0Y4Sd/ME1lsZeezczqpn2R4tE7+Sgco/NUKDXm0xAMz15tzcRz/9RfJRm6AqRO+A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - eslint: '>=6.0.0' + eslint: '>=9.38.0' - eslint-plugin-unicorn@61.0.2: - resolution: {integrity: sha512-zLihukvneYT7f74GNbVJXfWIiNQmkc/a9vYBTE4qPkQZswolWNdu+Wsp9sIXno1JOzdn6OUwLPd19ekXVkahRA==} - engines: {node: ^20.10.0 || >=21.0.0} + eslint-plugin-unicorn@68.0.0: + resolution: {integrity: sha512-mHYWvX948Q4H3bGc39bsNMxD/leOuNI+Iws9NVsoSz5VA7EGP86wnz7mZ/SPSvRhefT8L4hd8DHfDuGC+lIoCQ==} + engines: {node: '>=22'} peerDependencies: - eslint: '>=9.29.0' + eslint: '>=10.4' - eslint-plugin-unused-imports@4.3.0: - resolution: {integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==} + eslint-plugin-unused-imports@4.4.1: + resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 - eslint: ^9.0.0 || ^8.0.0 + eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true - eslint-plugin-vue@10.4.0: - resolution: {integrity: sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw==} + 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 - vue-eslint-parser: ^10.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + vue-eslint-parser: ^10.3.0 peerDependenciesMeta: + '@stylistic/eslint-plugin': + optional: true '@typescript-eslint/parser': optional: true - eslint-plugin-yml@1.18.0: - resolution: {integrity: sha512-9NtbhHRN2NJa/s3uHchO3qVVZw0vyOIvWlXWGaKCr/6l3Go62wsvJK5byiI6ZoYztDsow4GnS69BZD3GnqH3hA==} - engines: {node: ^14.17.0 || >=16.0.0} + eslint-plugin-yml@3.6.0: + resolution: {integrity: sha512-8lSqBIiOJO8ms1gktdlNaVGm3zXQJiYeKhQmtIG66XzU58kFDOjQae4sufQEMGHC4bP8VxiaH3tjU5PpDB6euw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: - eslint: '>=6.0.0' + eslint: '>=9.38.0' eslint-processor-vue-blocks@2.0.0: resolution: {integrity: sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==} @@ -2582,9 +2980,9 @@ packages: '@vue/compiler-sfc': ^3.3.0 eslint: '>=9.0.0' - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -2594,9 +2992,13 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.0: - resolution: {integrity: sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.7.0: + resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -2612,12 +3014,12 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -2628,9 +3030,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -2641,6 +3040,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + eta@4.6.0: + resolution: {integrity: sha512-lW6is4T1NFOYnmqGZIfvixqj7A7sSvScF+DN8EK6K58xI5MZ5UvYe0GjopxOXQtZvUn4eDdVuZ8XSoYWTMEKwA==} + engines: {node: '>=20'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -2659,12 +3062,14 @@ packages: exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + exsolve@1.1.0: + resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -2672,11 +3077,17 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + 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.4: + resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2705,8 +3116,8 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -2731,6 +3142,9 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + floating-vue@5.2.2: resolution: {integrity: sha512-afW+h2CFafo+7Y9Lvw/xsqjaQlKLdJV7h1fCHfcYQ1C4SVMlu7OAekqWgu5d4SgvkBVU0pVpLlVsrSTBURFRkg==} peerDependencies: @@ -2771,9 +3185,6 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2782,8 +3193,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -2792,6 +3203,10 @@ packages: fzf@0.5.2: resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2818,6 +3233,9 @@ packages: get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -2833,20 +3251,18 @@ packages: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.5.0: - resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2863,9 +3279,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -2900,6 +3313,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} @@ -2916,6 +3333,9 @@ packages: hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2947,14 +3367,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} engines: {node: '>= 4'} - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -2963,10 +3379,6 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3009,8 +3421,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -3021,6 +3433,10 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3037,8 +3453,8 @@ packages: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -3148,6 +3564,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + jake@10.9.4: resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} engines: {node: '>=10'} @@ -3157,28 +3577,19 @@ packages: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} - engines: {node: '>=12.0.0'} - - jsdoc-type-pratt-parser@5.4.0: - resolution: {integrity: sha512-F9GQ+F1ZU6qvSrZV8fNFpjDNf614YzR2eF6S0+XbDjAcUI28FSoXnYZFjQmb1kFx3rrJb5PnxUH3/Yti6fcM+g==} - engines: {node: '>=12.0.0'} - - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true + jsdoc-type-pratt-parser@7.2.0: + resolution: {integrity: sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==} + engines: {node: '>=20.0.0'} jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} @@ -3194,9 +3605,6 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -3205,21 +3613,24 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-eslint-parser@2.4.0: - resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - jsonc-eslint-parser@2.4.1: - resolution: {integrity: sha512-uuPNLJkKN8NXAlZlQ6kmUF9qO+T6Kyd7oV4+/7yy8Jz6+MZNyhPq8EdLpdfnPVzUC8qSf1b4j1azKaGnFsjmsw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + jsonc-eslint-parser@3.1.0: + resolution: {integrity: sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + jsonpointer@5.0.1: 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==} @@ -3247,8 +3658,8 @@ packages: resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} engines: {node: '>=14'} - 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: @@ -3258,15 +3669,6 @@ 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.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -3280,6 +3682,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3287,15 +3693,15 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -3319,6 +3725,9 @@ packages: mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + mdast-util-frontmatter@2.0.1: resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} @@ -3340,6 +3749,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==} @@ -3362,10 +3774,6 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -3397,6 +3805,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==} @@ -3482,18 +3893,15 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} minimatch@9.0.5: @@ -3504,6 +3912,10 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + minisearch@7.1.2: resolution: {integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==} @@ -3513,6 +3925,12 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + module-replacements@3.0.0: + resolution: {integrity: sha512-tHIZqde+RlyNRobAIjfcH5UIgIrEbZbDGRL6J/x+HERX/g8O9mrm0p6knJbsTXmQtDvZ+eFP+xfOP3/9jHk6YA==} + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -3535,6 +3953,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==} @@ -3556,6 +3979,10 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3567,8 +3994,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-deep-merge@1.0.5: - resolution: {integrity: sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==} + object-deep-merge@2.0.1: + resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} @@ -3588,6 +4015,9 @@ packages: ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -3596,9 +4026,6 @@ packages: resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -3617,6 +4044,11 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxfmt@0.35.0: + resolution: {integrity: sha512-QYeXWkP+aLt7utt5SLivNIk09glWx9QE235ODjgcEZ3sd1VMaUBSpLymh6ZRCA76gD2rMP4bXanUz/fx+nLM9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3634,10 +4066,6 @@ packages: package-manager-detector@1.5.0: resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - parse-gitignore@2.0.0: resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} engines: {node: '>=14'} @@ -3659,10 +4087,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3674,6 +4098,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} @@ -3701,6 +4129,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -3712,24 +4144,28 @@ packages: pkg-types@2.2.0: resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - pnpm-workspace-yaml@1.3.0: - resolution: {integrity: sha512-Krb5q8Totd5mVuLx7we+EFHq/AfxA75nbfTm25Q1pIf606+RlaKUG+PXH8SDihfe5b5k4H09gE+sL47L1t5lbw==} + pnpm-workspace-yaml@1.6.1: + resolution: {integrity: sha512-yTeZntGWi8m9WNuhoVsP0DpFc4sC1U0+rr/qR6Zi9n2g3sxXY+JfccjXjjruNz96tM8I09yaJUA86doRnNLkbg==} possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} engines: {node: '>=4'} + postcss@8.5.21: + resolution: {integrity: sha512-v4sDNP3fdNiWMfabO7OwOQdOX8TiQSztKyT1Wj0w+j7LDallJThJRBBBmzVGyYj0crMh7jlV4zepPkiNu9UwDQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -3738,6 +4174,15 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -3774,12 +4219,6 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -3810,8 +4249,8 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} regenerate@1.4.2: @@ -3830,38 +4269,34 @@ packages: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + reserved-identifiers@1.2.0: + resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} + engines: {node: '>=18'} resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true @@ -3869,28 +4304,21 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@2.79.2: - resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} - engines: {node: '>=10.0.0'} - hasBin: true - rollup@4.46.2: resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -3926,12 +4354,18 @@ 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.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@7.0.7: + resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==} + engines: {node: '>=20.0.0'} serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} @@ -3974,6 +4408,10 @@ packages: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + side-channel-map@1.0.1: resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} engines: {node: '>= 0.4'} @@ -3986,6 +4424,10 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -4011,8 +4453,9 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} - smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + smob@1.6.2: + resolution: {integrity: sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==} + engines: {node: '>=20.0.0'} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -4025,14 +4468,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions - - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead + source-map@0.8.0: + resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==} + engines: {node: '>= 12'} space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -4043,8 +4481,8 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.22: - resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -4095,12 +4533,12 @@ packages: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -4132,14 +4570,10 @@ packages: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} @@ -4155,15 +4589,15 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} temp-dir@2.0.0: @@ -4174,8 +4608,8 @@ packages: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} engines: {node: '>=10'} - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + terser@5.49.0: + resolution: {integrity: sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==} engines: {node: '>=10'} hasBin: true @@ -4200,10 +4634,18 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -4219,26 +4661,27 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + to-valid-identifier@1.0.0: + resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} + engines: {node: '>=20'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - toml-eslint-parser@0.10.0: - resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + toml-eslint-parser@1.0.3: + resolution: {integrity: sha512-A5F0cM6+mDleacLIEUkmfpkBbnHJFV1d2rprHU2MXNk7mlxHq2zGojA+SRvQD1RoMo9gqjZPWEaKG4v1BQ48lw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -4277,10 +4720,6 @@ packages: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} - type-fest@4.2.0: - resolution: {integrity: sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==} - engines: {node: '>=16'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -4297,8 +4736,8 @@ packages: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} typescript@5.9.2: @@ -4309,6 +4748,9 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -4332,12 +4774,12 @@ packages: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} engines: {node: '>=4'} - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} unique-string@2.0.0: @@ -4347,18 +4789,30 @@ packages: unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + 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==} unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -4410,6 +4864,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -4544,11 +5004,11 @@ packages: jsdom: optional: true - vue-eslint-parser@10.2.0: - resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} + 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 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 vue-flow-layout@0.2.0: resolution: {integrity: sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q==} @@ -4577,15 +5037,9 @@ packages: wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -4598,8 +5052,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -4616,55 +5070,61 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workbox-background-sync@7.3.0: - resolution: {integrity: sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==} + workbox-background-sync@7.4.1: + resolution: {integrity: sha512-HhT7KE8tOWDm02wRNshXUnUPofMlhenF2DBdUnDPOubhizzPeItkYTmAB6td1Z2cjYPa98vzEiPLEuzn5hN66g==} - workbox-broadcast-update@7.3.0: - resolution: {integrity: sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==} + workbox-broadcast-update@7.4.1: + resolution: {integrity: sha512-uAlgslKLvbQY+suirIdnBCSYrcgBhjp81Nj4l1lj/Jmj0MJO2CJERnCJjT0GFVwmReV0N+zs78K6gqd5gr9/+A==} - workbox-build@7.3.0: - resolution: {integrity: sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==} - engines: {node: '>=16.0.0'} + workbox-build@7.4.1: + resolution: {integrity: sha512-SDhxIvEAde9Gy/5w4Yo1Jh/M49Z0qE3q0oteyE8zGq0DScxFqVBcCtIXFuLtmtxRQZCMbf0prco4VyEu3KBQuw==} + engines: {node: '>=20.0.0'} - workbox-cacheable-response@7.3.0: - resolution: {integrity: sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==} + workbox-cacheable-response@7.4.1: + resolution: {integrity: sha512-8xaFoJdDc2OjrlbbL3gEeBO1WKcMwRqwLRupgqahYXu75yXajPLuwrbXMrIGZuWYXrQwk0xDjOxZ/ujCy/oJYw==} workbox-core@7.3.0: resolution: {integrity: sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==} - workbox-expiration@7.3.0: - resolution: {integrity: sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==} + workbox-core@7.4.1: + resolution: {integrity: sha512-DT+vu46eh/2vRsSHTY4Xmc32Z1rr9PRlQUXr1Dx30ZuXRWwOsvZgGgcwxcasubQLQmbTNYZjv44LkBAQ4tT5tQ==} + + workbox-expiration@7.4.1: + resolution: {integrity: sha512-lRKUF7b+OGbeXkQk1s6MHXOa3d7Xxf7Of31W6c6hCfipfIyrtdWZ89stq21AHZMaoG7VNFoHply4Ox+rU31TWg==} - workbox-google-analytics@7.3.0: - resolution: {integrity: sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==} + workbox-google-analytics@7.4.1: + resolution: {integrity: sha512-Mks1JwLEt++ZAkF6sS1OpSh9RtAMIsiDgRpK+codiHGIPXeaUOgi4cPc3GFadUl8V5QPeypEk8Oxgl3HlwVzHw==} - workbox-navigation-preload@7.3.0: - resolution: {integrity: sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==} + workbox-navigation-preload@7.4.1: + resolution: {integrity: sha512-C4KVsjPcYKJOhr631AxR9XoG2rLF3QiTk5aMv36MXOjtWvm8axwNFAtKUPGsWUwLXXAMgYM1En7fsvndaXeXRQ==} - workbox-precaching@7.3.0: - resolution: {integrity: sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==} + workbox-precaching@7.4.1: + resolution: {integrity: sha512-cdr/9qByww7yzEp7zg/qI4ukUrrNjQLgN+ONQRpjy/VqGQXwkgHwr00KksGJK8v0VifwDXBb8a4cWNZH71jn3Q==} - workbox-range-requests@7.3.0: - resolution: {integrity: sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==} + workbox-range-requests@7.4.1: + resolution: {integrity: sha512-7i2oxAUE82gHdAJBCAQ04JzNOdRPqzuOzGfoUyJpFSmeqBNYGPrAH8GPoPjUQTfp+NycwrD2H68VtuF8qxv0vQ==} - workbox-recipes@7.3.0: - resolution: {integrity: sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==} + workbox-recipes@7.4.1: + resolution: {integrity: sha512-gnbVfmV4/TtmQaM4x9AtuXhcdstJsep3XMVeztOrQVPT+R6+6DeBjGTCQ7fFCXm+4GEHUA5VEBTyi5+4gWGeog==} - workbox-routing@7.3.0: - resolution: {integrity: sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==} + workbox-routing@7.4.1: + resolution: {integrity: sha512-yubJGErZOusuidAenaL5ypfhQOa7urxP/f8E0ws7FPb4039RiWXUWBAyUkmUoOL/BcQGen3h0J8872d51IYxtA==} - workbox-strategies@7.3.0: - resolution: {integrity: sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==} + workbox-strategies@7.4.1: + resolution: {integrity: sha512-GZxpaw9NbmOelj7667uZ2kpk5BFpOGbO4X0qjwh5ls8XQ8C+Lha5LQchTiUzsTFSS+NlUpftYAyOVXvQUrcqOQ==} - workbox-streams@7.3.0: - resolution: {integrity: sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==} + workbox-streams@7.4.1: + resolution: {integrity: sha512-HWWtraKUbJknd9kgqGcpQ3G114HOPYvqs8HaJMDs2ebLNAimDkVDaWfAXE6Ybl+m8U6KsCE6pWyLYuigWmnAXw==} - workbox-sw@7.3.0: - resolution: {integrity: sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==} + workbox-sw@7.4.1: + resolution: {integrity: sha512-fez5f2DUlDJWTFYkCWQpY10N8gtztd849NswCbVFk0QlcSM4HT5A8x4g4ii650yem4I8tHY0R7JZahwp3ltIPw==} workbox-window@7.3.0: resolution: {integrity: sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==} + workbox-window@7.4.1: + resolution: {integrity: sha512-notZDH2u8VXaqyuD7xaqIfEFi6SRM4SUSd7ewe9PDsVqADuepxX2ZMY3uvuZGxzY5ZOsGC/vD3A/3smFtJt4/A==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -4677,9 +5137,6 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -4692,22 +5149,27 @@ packages: utf-8-validate: optional: true - 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@1.3.0: - resolution: {integrity: sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==} - engines: {node: ^14.17.0 || >=16.0.0} + yaml-eslint-parser@2.1.0: + resolution: {integrity: sha512-1zo9KRfp6vIAXBEhWAz09ex3hUwh3T+/6dGbGteHvNseA0Uk4FgQnPES55klZ6cDzSy9FpgKS0D/CoLUvCCj4w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} yaml@2.8.1: resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} 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'} @@ -4722,49 +5184,55 @@ snapshots: '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 - '@antfu/eslint-config@5.4.1(@vue/compiler-sfc@3.5.21)(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))': + '@antfu/eslint-config@9.1.0(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.2))(@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(@vue/compiler-sfc@3.5.40)(eslint-plugin-format@2.0.1(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(ts-declaration-location@1.0.7(typescript@5.9.2))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: '@antfu/install-pkg': 1.1.0 - '@clack/prompts': 0.11.0 - '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.39.0(jiti@2.5.1)) - '@eslint/markdown': 7.5.0 - '@stylistic/eslint-plugin': 5.5.0(eslint@9.39.0(jiti@2.5.1)) - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - '@vitest/eslint-plugin': 1.4.0(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) - ansis: 4.1.0 - cac: 6.7.14 - eslint: 9.39.0(jiti@2.5.1) - eslint-config-flat-gitignore: 2.1.0(eslint@9.39.0(jiti@2.5.1)) - eslint-flat-config-utils: 2.1.1 - eslint-merge-processors: 2.0.0(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-antfu: 3.1.1(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-command: 3.3.1(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-import-lite: 0.3.0(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-jsdoc: 59.1.0(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-jsonc: 2.20.1(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-n: 17.23.1(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-no-only-tests: 3.3.0 - eslint-plugin-perfectionist: 4.15.0(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-pnpm: 1.3.0(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-regexp: 2.10.0(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-toml: 0.12.0(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-unicorn: 61.0.2(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.39.0(jiti@2.5.1)) - eslint-plugin-vue: 10.4.0(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.39.0(jiti@2.5.1))(vue-eslint-parser@10.2.0(eslint@9.39.0(jiti@2.5.1))) - eslint-plugin-yml: 1.18.0(eslint@9.39.0(jiti@2.5.1)) - eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.21)(eslint@9.39.0(jiti@2.5.1)) - globals: 16.5.0 - jsonc-eslint-parser: 2.4.0 - local-pkg: 1.1.2 + '@clack/prompts': 1.7.0 + '@e18e/eslint-plugin': 0.5.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/eslint-plugin-eslint-comments': 4.7.2(eslint@10.7.0(jiti@2.7.0)) + '@eslint/markdown': 8.0.3 + '@stylistic/eslint-plugin': 5.10.0(eslint@10.7.0(jiti@2.7.0)) + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + '@typescript-eslint/parser': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + '@vitest/eslint-plugin': 1.6.23(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) + ansis: 4.3.1 + cac: 7.0.0 + eslint: 10.7.0(jiti@2.7.0) + eslint-config-flat-gitignore: 2.3.0(eslint@10.7.0(jiti@2.7.0)) + eslint-flat-config-utils: 3.2.0 + eslint-merge-processors: 2.0.0(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-antfu: 3.2.3(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-command: 3.5.3(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.2))(@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-import-lite: 0.6.0(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-jsdoc: 63.2.0(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-jsonc: 3.3.0(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-n: 18.2.2(eslint@10.7.0(jiti@2.7.0))(ts-declaration-location@1.0.7(typescript@5.9.2))(typescript@5.9.2) + eslint-plugin-no-only-tests: 3.4.0 + eslint-plugin-perfectionist: 5.10.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + eslint-plugin-pnpm: 1.6.1(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-regexp: 3.1.1(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-toml: 1.4.0(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-unicorn: 68.0.0(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0)) + eslint-plugin-vue: 10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.7.0(jiti@2.7.0)))(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.7.0(jiti@2.7.0))) + eslint-plugin-yml: 3.6.0(eslint@10.7.0(jiti@2.7.0)) + eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.40)(eslint@10.7.0(jiti@2.7.0)) + globals: 17.7.0 + local-pkg: 1.2.1 parse-gitignore: 2.0.0 - toml-eslint-parser: 0.10.0 - vue-eslint-parser: 10.2.0(eslint@9.39.0(jiti@2.5.1)) - yaml-eslint-parser: 1.3.0 + toml-eslint-parser: 1.0.3 + vue-eslint-parser: 10.4.1(eslint@10.7.0(jiti@2.7.0)) + yaml-eslint-parser: 2.1.0 + optionalDependencies: + eslint-plugin-format: 2.0.1(eslint@10.7.0(jiti@2.7.0)) transitivePeerDependencies: - '@eslint/json' + - '@typescript-eslint/typescript-estree' + - '@typescript-eslint/utils' - '@vue/compiler-sfc' + - oxlint - supports-color + - ts-declaration-location - typescript - vitest @@ -4783,10 +5251,9 @@ snapshots: '@antfu/utils@9.2.0': {} - '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': + '@apideck/better-ajv-errors@0.3.7(ajv@8.20.0)': dependencies: - ajv: 8.17.1 - json-schema: 0.4.0 + ajv: 8.20.0 jsonpointer: 5.0.1 leven: 3.1.0 @@ -4796,8 +5263,16 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.28.0': {} + '@babel/compat-data@7.29.7': {} + '@babel/core@7.28.0': dependencies: '@ampproject/remapping': 2.3.0 @@ -4818,6 +5293,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.28.0': dependencies: '@babel/parser': 7.28.0 @@ -4826,9 +5321,17 @@ snapshots: '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': + '@babel/generator@7.29.7': dependencies: - '@babel/types': 7.28.4 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -4838,43 +5341,53 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.6 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.2.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)': + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 debug: 4.4.3 lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.12 transitivePeerDependencies: - supports-color '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.27.1': + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -4885,6 +5398,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -4894,48 +5414,63 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/types': 7.28.4 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.27.1': + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helper-wrap-function@7.29.7': dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.4 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -4944,6 +5479,11 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.4 + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + '@babel/parser@7.28.0': dependencies: '@babel/types': 7.28.2 @@ -4952,485 +5492,506 @@ snapshots: dependencies: '@babel/types': 7.28.4 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': + '@babel/parser@7.29.7': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/types': 7.29.7 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/template': 7.29.7 - '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)': + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.28.0)': + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-env@7.28.0(@babel/core@7.28.0)': - dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.0) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.45.0 + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/preset-env@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) + core-js-compat: 3.49.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.4 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.7 esutils: 2.0.3 '@babel/runtime@7.28.2': {} + '@babel/runtime@7.29.7': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.0 '@babel/types': 7.28.2 + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 @@ -5443,6 +6004,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.2': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -5453,45 +6026,59 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@bcoe/v8-coverage@1.0.2': {} '@canvas/image-data@1.0.0': {} - '@clack/core@0.5.0': + '@clack/core@1.4.3': dependencies: - picocolors: 1.1.1 + fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@clack/prompts@0.11.0': + '@clack/prompts@1.7.0': dependencies: - '@clack/core': 0.5.0 - picocolors: 1.1.1 + '@clack/core': 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 '@docsearch/css@4.0.1': {} '@docsearch/js@4.0.1': {} + '@dprint/formatter@0.5.1': {} + + '@dprint/markdown@0.21.1': {} + + '@dprint/toml@0.7.0': {} + + '@e18e/eslint-plugin@0.5.1(eslint@10.7.0(jiti@2.7.0))': + dependencies: + empathic: 2.0.1 + module-replacements: 3.0.0 + semver: 7.8.5 + optionalDependencies: + eslint: 10.7.0(jiti@2.7.0) + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true - '@es-joy/jsdoccomment@0.50.2': + '@es-joy/jsdoccomment@0.88.0': dependencies: - '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.39.0 - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.1.0 + '@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.2.0 - '@es-joy/jsdoccomment@0.58.0': - dependencies: - '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.46.2 - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 5.4.0 + '@es-joy/resolve.exports@1.2.0': {} '@esbuild/aix-ppc64@0.25.8': optional: true @@ -5571,92 +6158,66 @@ snapshots: '@esbuild/win32-x64@0.25.8': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.39.0(jiti@2.5.1))': + '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.7.0(jiti@2.7.0))': dependencies: escape-string-regexp: 4.0.0 - eslint: 9.39.0(jiti@2.5.1) - ignore: 5.3.2 + eslint: 10.7.0(jiti@2.7.0) + ignore: 7.0.6 - '@eslint-community/eslint-utils@4.7.0(eslint@9.39.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0(jiti@2.7.0))': dependencies: - eslint: 9.39.0(jiti@2.5.1) + eslint: 10.7.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.0(jiti@2.5.1))': - dependencies: - eslint: 9.39.0(jiti@2.5.1) - eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.2': {} - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/compat@1.3.2(eslint@9.39.0(jiti@2.5.1))': + '@eslint/compat@2.1.0(eslint@10.7.0(jiti@2.7.0))': + dependencies: + '@eslint/core': 1.2.1 optionalDependencies: - eslint: 9.39.0(jiti@2.5.1) + eslint: 10.7.0(jiti@2.7.0) - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 - minimatch: 3.1.2 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.5.5': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.15.2': + '@eslint/config-helpers@0.6.0': dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core': 1.2.1 - '@eslint/core@0.16.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.17.0': + '@eslint/markdown@8.0.3': dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.3.1': - dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.39.0': {} - - '@eslint/markdown@7.5.0': - dependencies: - '@eslint/core': 0.16.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.2 + 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@2.1.7': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.3.5': + '@eslint/plugin-kit@0.7.2': dependencies: - '@eslint/core': 0.15.2 - levn: 0.4.1 - - '@eslint/plugin-kit@0.4.1': - dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 '@floating-ui/core@1.7.3': @@ -5669,16 +6230,19 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/module-importer@1.0.1': {} + '@humanfs/types@0.15.0': {} - '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -5814,45 +6378,109 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@istanbuljs/schema@0.1.3': {} + '@isaacs/cliui@9.0.0': {} + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@ota-meshi/ast-token-store@0.3.0': {} + + '@oxfmt/binding-android-arm-eabi@0.35.0': + optional: true + + '@oxfmt/binding-android-arm64@0.35.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.35.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.35.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.35.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.35.0': + optional: true - '@jridgewell/gen-mapping@0.3.12': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 + '@oxfmt/binding-linux-arm64-gnu@0.35.0': + optional: true - '@jridgewell/resolve-uri@3.1.2': {} + '@oxfmt/binding-linux-arm64-musl@0.35.0': + optional: true - '@jridgewell/source-map@0.3.10': - dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@oxfmt/binding-linux-ppc64-gnu@0.35.0': + optional: true - '@jridgewell/sourcemap-codec@1.5.4': {} + '@oxfmt/binding-linux-riscv64-gnu@0.35.0': + optional: true - '@jridgewell/sourcemap-codec@1.5.5': {} + '@oxfmt/binding-linux-riscv64-musl@0.35.0': + optional: true - '@jridgewell/trace-mapping@0.3.29': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@oxfmt/binding-linux-s390x-gnu@0.35.0': + optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@oxfmt/binding-linux-x64-gnu@0.35.0': + optional: true - '@nodelib/fs.stat@2.0.5': {} + '@oxfmt/binding-linux-x64-musl@0.35.0': + optional: true - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + '@oxfmt/binding-openharmony-arm64@0.35.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.35.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.35.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.35.0': + optional: true '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.9': {} + '@pkgr/core@0.3.6': {} '@polka/url@1.0.0-next.29': {} @@ -5862,114 +6490,184 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.29': {} - '@rollup/plugin-babel@5.3.1(@babel/core@7.28.0)(rollup@2.79.2)': + '@rollup/plugin-babel@6.1.0(@babel/core@7.29.7)(rollup@4.62.2)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - rollup: 2.79.2 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@rollup/pluginutils': 5.4.0(rollup@4.62.2) + optionalDependencies: + rollup: 4.62.2 transitivePeerDependencies: - supports-color - '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.62.2)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@2.79.2) + '@rollup/pluginutils': 5.4.0(rollup@4.62.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.12 optionalDependencies: - rollup: 2.79.2 - - '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - magic-string: 0.25.9 - rollup: 2.79.2 + rollup: 4.62.2 - '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': + '@rollup/plugin-replace@6.0.3(rollup@4.62.2)': dependencies: - serialize-javascript: 6.0.2 - smob: 1.5.0 - terser: 5.43.1 + '@rollup/pluginutils': 5.4.0(rollup@4.62.2) + magic-string: 0.30.21 optionalDependencies: - rollup: 2.79.2 + rollup: 4.62.2 - '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + '@rollup/plugin-terser@1.0.0(rollup@4.62.2)': dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.79.2 + serialize-javascript: 7.0.7 + smob: 1.6.2 + terser: 5.49.0 + optionalDependencies: + rollup: 4.62.2 - '@rollup/pluginutils@5.2.0(rollup@2.79.2)': + '@rollup/pluginutils@5.4.0(rollup@4.62.2)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.5 optionalDependencies: - rollup: 2.79.2 + rollup: 4.62.2 '@rollup/rollup-android-arm-eabi@4.46.2': optional: true + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + '@rollup/rollup-android-arm64@4.46.2': optional: true + '@rollup/rollup-android-arm64@4.62.2': + optional: true + '@rollup/rollup-darwin-arm64@4.46.2': optional: true + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + '@rollup/rollup-darwin-x64@4.46.2': optional: true + '@rollup/rollup-darwin-x64@4.62.2': + optional: true + '@rollup/rollup-freebsd-arm64@4.46.2': optional: true + '@rollup/rollup-freebsd-arm64@4.62.2': + optional: true + '@rollup/rollup-freebsd-x64@4.46.2': optional: true + '@rollup/rollup-freebsd-x64@4.62.2': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.46.2': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.46.2': optional: true + '@rollup/rollup-linux-arm64-gnu@4.62.2': + optional: true + '@rollup/rollup-linux-arm64-musl@4.46.2': optional: true + '@rollup/rollup-linux-arm64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.2': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': optional: true '@rollup/rollup-linux-ppc64-gnu@4.46.2': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.46.2': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.46.2': optional: true + '@rollup/rollup-linux-riscv64-musl@4.62.2': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.46.2': optional: true + '@rollup/rollup-linux-s390x-gnu@4.62.2': + optional: true + '@rollup/rollup-linux-x64-gnu@4.46.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + '@rollup/rollup-linux-x64-musl@4.46.2': optional: true + '@rollup/rollup-linux-x64-musl@4.62.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.2': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.46.2': optional: true + '@rollup/rollup-win32-arm64-msvc@4.62.2': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.46.2': optional: true + '@rollup/rollup-win32-ia32-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.2': + optional: true + '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true + '@rollup/rollup-win32-x64-msvc@4.62.2': + optional: true + '@shikijs/core@3.13.0': dependencies: '@shikijs/types': 3.13.0 @@ -6050,22 +6748,17 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@stylistic/eslint-plugin@5.5.0(eslint@9.39.0(jiti@2.5.1))': + '@sindresorhus/base62@1.0.0': {} + + '@stylistic/eslint-plugin@5.10.0(eslint@10.7.0(jiti@2.7.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.5.1)) - '@typescript-eslint/types': 8.46.2 - eslint: 9.39.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@typescript-eslint/types': 8.65.0 + eslint: 10.7.0(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.3 - - '@surma/rollup-plugin-off-main-thread@2.2.3': - dependencies: - ejs: 3.1.10 - json5: 2.2.3 - magic-string: 0.25.9 - string.prototype.matchall: 4.0.12 + picomatch: 4.0.5 '@testing-library/dom@10.4.1': dependencies: @@ -6082,6 +6775,13 @@ snapshots: dependencies: '@testing-library/dom': 10.4.1 + '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.30.21 + string.prototype.matchall: 4.0.12 + '@types/aria-query@5.0.4': {} '@types/chai@5.2.2': @@ -6092,12 +6792,19 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + optional: true + '@types/deep-eql@4.0.2': {} - '@types/estree@0.0.39': {} + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 @@ -6107,12 +6814,18 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} '@types/jsonfile@6.1.4': dependencies: '@types/node': 24.2.1 + '@types/katex@0.16.8': {} + '@types/linkify-it@5.0.0': {} '@types/markdown-it@14.1.2': @@ -6140,150 +6853,96 @@ snapshots: '@types/web-bluetooth@0.0.21': {} - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.46.2 - eslint: 9.39.0(jiti@2.5.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.46.2 - debug: 4.4.1 - eslint: 9.39.0(jiti@2.5.1) + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 10.7.0(jiti@2.7.0) + ignore: 7.0.6 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.0(typescript@5.9.2)': + '@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) - '@typescript-eslint/types': 8.39.0 - debug: 4.4.1 + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + eslint: 10.7.0(jiti@2.7.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.2(typescript@5.9.2)': + '@typescript-eslint/project-service@8.65.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.2) - '@typescript-eslint/types': 8.46.2 - debug: 4.4.1 + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.2) + '@typescript-eslint/types': 8.65.0 + debug: 4.4.3 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.39.0': - dependencies: - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 - - '@typescript-eslint/scope-manager@8.46.2': - dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 - - '@typescript-eslint/tsconfig-utils@8.39.0(typescript@5.9.2)': - dependencies: - typescript: 5.9.2 - - '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.2)': + '@typescript-eslint/scope-manager@8.65.0': dependencies: - typescript: 5.9.2 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 - '@typescript-eslint/type-utils@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.2) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1 - eslint: 9.39.0(jiti@2.5.1) - ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@8.39.0': {} - - '@typescript-eslint/types@8.46.2': {} - - '@typescript-eslint/typescript-estree@8.39.0(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.39.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + debug: 4.4.3 + eslint: 10.7.0(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.2)': - dependencies: - '@typescript-eslint/project-service': 8.46.2(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.2) - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.65.0': {} - '@typescript-eslint/utils@8.39.0(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - eslint: 9.39.0(jiti@2.5.1) + '@typescript-eslint/project-service': 8.65.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.2) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.2) - eslint: 9.39.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.2) + eslint: 10.7.0(jiti@2.7.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.39.0': + '@typescript-eslint/visitor-keys@8.65.0': dependencies: - '@typescript-eslint/types': 8.39.0 - eslint-visitor-keys: 4.2.1 - - '@typescript-eslint/visitor-keys@8.46.2': - dependencies: - '@typescript-eslint/types': 8.46.2 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.65.0 + eslint-visitor-keys: 5.0.1 '@typescript/vfs@1.6.1(typescript@5.9.2)': dependencies: @@ -6294,13 +6953,13 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@unocss/astro@66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))': + '@unocss/astro@66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: '@unocss/core': 66.4.2 '@unocss/reset': 66.4.2 - '@unocss/vite': 66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + '@unocss/vite': 66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) optionalDependencies: - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) '@unocss/cli@66.4.2': dependencies: @@ -6338,13 +6997,13 @@ snapshots: sirv: 3.0.1 vue-flow-layout: 0.2.0 - '@unocss/postcss@66.4.2(postcss@8.5.6)': + '@unocss/postcss@66.4.2(postcss@8.5.21)': dependencies: '@unocss/config': 66.4.2 '@unocss/core': 66.4.2 '@unocss/rule-utils': 66.4.2 css-tree: 3.1.0 - postcss: 8.5.6 + postcss: 8.5.21 tinyglobby: 0.2.15 '@unocss/preset-attributify@66.4.2': @@ -6431,7 +7090,7 @@ snapshots: dependencies: '@unocss/core': 66.4.2 - '@unocss/vite@66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))': + '@unocss/vite@66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: '@ampproject/remapping': 2.3.0 '@unocss/config': 66.4.2 @@ -6442,7 +7101,7 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.15 unplugin-utils: 0.2.5 - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) '@vite-pwa/assets-generator@1.0.0': dependencies: @@ -6453,34 +7112,34 @@ snapshots: sharp-ico: 0.1.5 unconfig: 7.3.2 - '@vite-pwa/vitepress@1.0.0(@vite-pwa/assets-generator@1.0.0)(vite-plugin-pwa@1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(workbox-build@7.3.0)(workbox-window@7.3.0))': + '@vite-pwa/vitepress@1.0.0(@vite-pwa/assets-generator@1.0.0)(vite-plugin-pwa@1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.3.0))': dependencies: - vite-plugin-pwa: 1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(workbox-build@7.3.0)(workbox-window@7.3.0) + vite-plugin-pwa: 1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.3.0) optionalDependencies: '@vite-pwa/assets-generator': 1.0.0 - '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.18(typescript@5.9.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) vue: 3.5.18(typescript@5.9.2) - '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.21(typescript@5.9.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) vue: 3.5.21(typescript@5.9.2) - '@vitest/browser@3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitest/utils': 3.2.4 magic-string: 0.30.19 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -6488,7 +7147,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))': + '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: '@istanbuljs/schema': 0.1.3 debug: 4.4.3 @@ -6500,11 +7159,11 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(@vitest/browser@3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(@vitest/browser@3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@3.2.4))(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -6519,20 +7178,21 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) optionalDependencies: - '@vitest/browser': 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@3.2.4) transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.4.0(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))': + '@vitest/eslint-plugin@1.6.23(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.39.0(jiti@2.5.1) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + eslint: 10.7.0(jiti@2.7.0) optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) typescript: 5.9.2 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -6544,13 +7204,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -6581,7 +7241,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) '@vitest/utils@3.2.4': dependencies: @@ -6611,6 +7271,14 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.40': + dependencies: + '@babel/parser': 7.29.7 + '@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.18': dependencies: '@vue/compiler-core': 3.5.18 @@ -6621,6 +7289,11 @@ snapshots: '@vue/compiler-core': 3.5.21 '@vue/shared': 3.5.21 + '@vue/compiler-dom@3.5.40': + dependencies: + '@vue/compiler-core': 3.5.40 + '@vue/shared': 3.5.40 + '@vue/compiler-sfc@3.5.18': dependencies: '@babel/parser': 7.28.0 @@ -6645,6 +7318,18 @@ snapshots: postcss: 8.5.6 source-map-js: 1.2.1 + '@vue/compiler-sfc@3.5.40': + dependencies: + '@babel/parser': 7.29.7 + '@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.21 + source-map-js: 1.2.1 + '@vue/compiler-ssr@3.5.18': dependencies: '@vue/compiler-dom': 3.5.18 @@ -6655,6 +7340,11 @@ snapshots: '@vue/compiler-dom': 3.5.21 '@vue/shared': 3.5.21 + '@vue/compiler-ssr@3.5.40': + dependencies: + '@vue/compiler-dom': 3.5.40 + '@vue/shared': 3.5.40 + '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 @@ -6739,6 +7429,8 @@ snapshots: '@vue/shared@3.5.21': {} + '@vue/shared@3.5.40': {} + '@vueuse/core@13.6.0(vue@3.5.18(typescript@5.9.2))': dependencies: '@types/web-bluetooth': 0.0.21 @@ -6794,19 +7486,25 @@ snapshots: dependencies: acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + acorn@8.15.0: {} - ajv@6.12.6: + acorn@8.17.0: {} + + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.4 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -6828,10 +7526,10 @@ snapshots: ansi-styles@6.2.3: {} - ansis@4.1.0: {} - ansis@4.2.0: {} + ansis@4.3.1: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -6841,8 +7539,6 @@ snapshots: are-docs-informative@0.0.2: {} - argparse@2.0.1: {} - aria-query@5.3.0: dependencies: dequal: 2.0.3 @@ -6857,9 +7553,9 @@ snapshots: arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.2 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -6882,32 +7578,36 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.0): + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.7): dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.45.0 + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0): + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7): dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) transitivePeerDependencies: - supports-color balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.44: {} + binary-extensions@2.3.0: {} birpc@2.5.0: {} @@ -6931,15 +7631,18 @@ snapshots: boolbase@1.0.0: {} - brace-expansion@1.1.12: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@2.1.2: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.7: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -6951,20 +7654,30 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) + browserslist@4.28.6: + dependencies: + baseline-browser-mapping: 2.10.44 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.394 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.6) + buffer-from@1.1.2: {} - builtin-modules@5.0.0: {} + builtin-modules@5.3.0: {} bytes@3.1.2: {} cac@6.7.14: {} + cac@7.0.0: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: + call-bind@1.0.9: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -6976,10 +7689,10 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - callsites@3.1.0: {} - caniuse-lite@1.0.30001733: {} + caniuse-lite@1.0.30001806: {} + ccount@2.0.1: {} chai@5.3.3: @@ -6990,11 +7703,6 @@ snapshots: loupe: 3.2.0 pathval: 2.0.1 - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - change-case@5.4.4: {} character-entities-html4@2.1.0: {} @@ -7017,11 +7725,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - ci-info@4.3.0: {} - - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 + ci-info@4.4.0: {} cli-cursor@5.0.0: dependencies: @@ -7056,7 +7760,9 @@ snapshots: commander@2.20.3: {} - comment-parser@1.4.1: {} + commander@8.3.0: {} + + comment-parser@1.4.7: {} common-tags@1.8.2: {} @@ -7076,12 +7782,12 @@ snapshots: transitivePeerDependencies: - supports-color - concat-map@0.0.1: {} - confbox@0.1.8: {} confbox@0.2.2: {} + confbox@0.2.4: {} + consola@3.4.2: {} content-disposition@0.5.4: @@ -7100,9 +7806,9 @@ snapshots: dependencies: is-what: 4.1.16 - core-js-compat@3.45.0: + core-js-compat@3.49.0: dependencies: - browserslist: 4.25.1 + browserslist: 4.28.6 core-util-is@1.0.3: {} @@ -7175,6 +7881,10 @@ snapshots: dependencies: character-entities: 2.0.2 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -7203,6 +7913,8 @@ snapshots: destroy@1.2.0: {} + detect-indent@7.0.2: {} + detect-libc@2.0.4: {} detect-node@2.1.0: {} @@ -7211,6 +7923,8 @@ snapshots: dependencies: dequal: 2.0.3 + diff-sequences@29.6.3: {} + dom-accessibility-api@0.5.16: {} dunder-proto@1.0.1: @@ -7231,43 +7945,54 @@ snapshots: electron-to-chromium@1.5.199: {} + electron-to-chromium@1.5.394: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - empathic@2.0.0: {} + empathic@2.0.1: {} encodeurl@1.0.2: {} encodeurl@2.0.0: {} - enhanced-resolve@5.18.3: + enhanced-resolve@5.24.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.2 + tapable: 2.3.3 entities@4.5.0: {} + entities@7.0.1: {} + environment@1.1.0: {} - es-abstract@1.24.0: + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 @@ -7276,7 +8001,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.4 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -7294,20 +8019,20 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 + safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 + typed-array-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 + which-typed-array: 1.1.22 es-define-property@1.0.1: {} @@ -7319,15 +8044,22 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.4 - es-to-primitive@1.3.0: + es-to-primitive@1.3.4: dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 @@ -7365,213 +8097,238 @@ snapshots: 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@9.39.0(jiti@2.5.1)): + eslint-compat-utils@0.5.1(eslint@10.7.0(jiti@2.7.0)): dependencies: - eslint: 9.39.0(jiti@2.5.1) - semver: 7.7.2 + eslint: 10.7.0(jiti@2.7.0) + semver: 7.8.5 - eslint-compat-utils@0.6.5(eslint@9.39.0(jiti@2.5.1)): + eslint-config-flat-gitignore@2.3.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - eslint: 9.39.0(jiti@2.5.1) - semver: 7.7.2 + '@eslint/compat': 2.1.0(eslint@10.7.0(jiti@2.7.0)) + eslint: 10.7.0(jiti@2.7.0) - eslint-config-flat-gitignore@2.1.0(eslint@9.39.0(jiti@2.5.1)): + eslint-flat-config-utils@3.2.0: dependencies: - '@eslint/compat': 1.3.2(eslint@9.39.0(jiti@2.5.1)) - eslint: 9.39.0(jiti@2.5.1) + '@eslint/config-helpers': 0.5.5 + pathe: 2.0.3 - eslint-flat-config-utils@2.1.1: + eslint-formatting-reporter@0.0.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - pathe: 2.0.3 + eslint: 10.7.0(jiti@2.7.0) + prettier-linter-helpers: 1.0.1 - eslint-json-compat-utils@0.2.1(eslint@9.39.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0): + eslint-json-compat-utils@0.2.3(eslint@10.7.0(jiti@2.7.0))(jsonc-eslint-parser@3.1.0): dependencies: - eslint: 9.39.0(jiti@2.5.1) - esquery: 1.6.0 - jsonc-eslint-parser: 2.4.0 + eslint: 10.7.0(jiti@2.7.0) + esquery: 1.7.0 + jsonc-eslint-parser: 3.1.0 - eslint-merge-processors@2.0.0(eslint@9.39.0(jiti@2.5.1)): + eslint-merge-processors@2.0.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - eslint: 9.39.0(jiti@2.5.1) + eslint: 10.7.0(jiti@2.7.0) - eslint-plugin-antfu@3.1.1(eslint@9.39.0(jiti@2.5.1)): + eslint-parser-plain@0.1.1: {} + + eslint-plugin-antfu@3.2.3(eslint@10.7.0(jiti@2.7.0)): dependencies: - eslint: 9.39.0(jiti@2.5.1) + eslint: 10.7.0(jiti@2.7.0) - eslint-plugin-command@3.3.1(eslint@9.39.0(jiti@2.5.1)): + eslint-plugin-command@3.5.3(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.2))(@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@es-joy/jsdoccomment': 0.50.2 - eslint: 9.39.0(jiti@2.5.1) + '@es-joy/jsdoccomment': 0.88.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + eslint: 10.7.0(jiti@2.7.0) - eslint-plugin-es-x@7.8.0(eslint@9.39.0(jiti@2.5.1)): + eslint-plugin-es-x@7.8.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.0(jiti@2.5.1)) - '@eslint-community/regexpp': 4.12.1 - eslint: 9.39.0(jiti@2.5.1) - eslint-compat-utils: 0.5.1(eslint@9.39.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + eslint: 10.7.0(jiti@2.7.0) + eslint-compat-utils: 0.5.1(eslint@10.7.0(jiti@2.7.0)) - eslint-plugin-import-lite@0.3.0(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-format@2.0.1(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.0(jiti@2.5.1)) - '@typescript-eslint/types': 8.39.0 - eslint: 9.39.0(jiti@2.5.1) - optionalDependencies: - typescript: 5.9.2 + '@dprint/formatter': 0.5.1 + '@dprint/markdown': 0.21.1 + '@dprint/toml': 0.7.0 + eslint: 10.7.0(jiti@2.7.0) + eslint-formatting-reporter: 0.0.0(eslint@10.7.0(jiti@2.7.0)) + eslint-parser-plain: 0.1.1 + ohash: 2.0.11 + oxfmt: 0.35.0 + prettier: 3.9.6 + synckit: 0.11.13 + + eslint-plugin-import-lite@0.6.0(eslint@10.7.0(jiti@2.7.0)): + dependencies: + eslint: 10.7.0(jiti@2.7.0) - eslint-plugin-jsdoc@59.1.0(eslint@9.39.0(jiti@2.5.1)): + eslint-plugin-jsdoc@63.2.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@es-joy/jsdoccomment': 0.58.0 + '@es-joy/jsdoccomment': 0.88.0 + '@es-joy/resolve.exports': 1.2.0 are-docs-informative: 0.0.2 - comment-parser: 1.4.1 + comment-parser: 1.4.7 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 9.39.0(jiti@2.5.1) - espree: 10.4.0 - esquery: 1.6.0 - object-deep-merge: 1.0.5 + eslint: 10.7.0(jiti@2.7.0) + espree: 11.2.0 + esquery: 1.7.0 + html-entities: 2.6.0 + object-deep-merge: 2.0.1 parse-imports-exports: 0.2.4 - semver: 7.7.2 + semver: 7.8.5 spdx-expression-parse: 4.0.0 + to-valid-identifier: 1.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.20.1(eslint@9.39.0(jiti@2.5.1)): + eslint-plugin-jsonc@3.3.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.0(jiti@2.5.1)) - eslint: 9.39.0(jiti@2.5.1) - eslint-compat-utils: 0.6.5(eslint@9.39.0(jiti@2.5.1)) - eslint-json-compat-utils: 0.2.1(eslint@9.39.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0) - espree: 10.4.0 - graphemer: 1.4.0 - jsonc-eslint-parser: 2.4.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@ota-meshi/ast-token-store': 0.3.0 + diff-sequences: 29.6.3 + eslint: 10.7.0(jiti@2.7.0) + eslint-json-compat-utils: 0.2.3(eslint@10.7.0(jiti@2.7.0))(jsonc-eslint-parser@3.1.0) + jsonc-eslint-parser: 3.1.0 natural-compare: 1.4.0 - synckit: 0.11.11 + synckit: 0.11.13 transitivePeerDependencies: - '@eslint/json' - eslint-plugin-n@17.23.1(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-md-style@0.2.0(@antfu/eslint-config@9.1.0(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.2))(@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(@vue/compiler-sfc@3.5.40)(eslint-plugin-format@2.0.1(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(ts-declaration-location@1.0.7(typescript@5.9.2))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)))(@eslint/markdown@8.0.3)(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.0(jiti@2.5.1)) - enhanced-resolve: 5.18.3 - eslint: 9.39.0(jiti@2.5.1) - eslint-plugin-es-x: 7.8.0(eslint@9.39.0(jiti@2.5.1)) - get-tsconfig: 4.10.1 + '@eslint/markdown': 8.0.3 + eslint: 10.7.0(jiti@2.7.0) + optionalDependencies: + '@antfu/eslint-config': 9.1.0(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.2))(@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(@vue/compiler-sfc@3.5.40)(eslint-plugin-format@2.0.1(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(ts-declaration-location@1.0.7(typescript@5.9.2))(typescript@5.9.2)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) + + eslint-plugin-n@18.2.2(eslint@10.7.0(jiti@2.7.0))(ts-declaration-location@1.0.7(typescript@5.9.2))(typescript@5.9.2): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + enhanced-resolve: 5.24.3 + eslint: 10.7.0(jiti@2.7.0) + eslint-plugin-es-x: 7.8.0(eslint@10.7.0(jiti@2.7.0)) + get-tsconfig: 4.14.0 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.2 + semver: 7.8.5 + optionalDependencies: ts-declaration-location: 1.0.7(typescript@5.9.2) - transitivePeerDependencies: - - typescript + typescript: 5.9.2 - eslint-plugin-no-only-tests@3.3.0: {} + eslint-plugin-no-only-tests@3.4.0: {} - eslint-plugin-perfectionist@4.15.0(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-perfectionist@5.10.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2): dependencies: - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/utils': 8.39.0(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.39.0(jiti@2.5.1) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) + eslint: 10.7.0(jiti@2.7.0) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-pnpm@1.3.0(eslint@9.39.0(jiti@2.5.1)): + eslint-plugin-pnpm@1.6.1(eslint@10.7.0(jiti@2.7.0)): dependencies: - empathic: 2.0.0 - eslint: 9.39.0(jiti@2.5.1) - jsonc-eslint-parser: 2.4.1 + empathic: 2.0.1 + eslint: 10.7.0(jiti@2.7.0) + jsonc-eslint-parser: 3.1.0 pathe: 2.0.3 - pnpm-workspace-yaml: 1.3.0 - tinyglobby: 0.2.15 - yaml-eslint-parser: 1.3.0 - - eslint-plugin-regexp@2.10.0(eslint@9.39.0(jiti@2.5.1)): - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.0(jiti@2.5.1)) - '@eslint-community/regexpp': 4.12.1 - comment-parser: 1.4.1 - eslint: 9.39.0(jiti@2.5.1) - jsdoc-type-pratt-parser: 4.1.0 + pnpm-workspace-yaml: 1.6.1 + tinyglobby: 0.2.17 + yaml: 2.9.0 + yaml-eslint-parser: 2.1.0 + + eslint-plugin-regexp@3.1.1(eslint@10.7.0(jiti@2.7.0)): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + comment-parser: 1.4.7 + eslint: 10.7.0(jiti@2.7.0) + jsdoc-type-pratt-parser: 7.2.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-toml@0.12.0(eslint@9.39.0(jiti@2.5.1)): + eslint-plugin-toml@1.4.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - debug: 4.4.1 - eslint: 9.39.0(jiti@2.5.1) - eslint-compat-utils: 0.6.5(eslint@9.39.0(jiti@2.5.1)) - lodash: 4.17.21 - toml-eslint-parser: 0.10.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@ota-meshi/ast-token-store': 0.3.0 + debug: 4.4.3 + eslint: 10.7.0(jiti@2.7.0) + toml-eslint-parser: 1.0.3 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@61.0.2(eslint@9.39.0(jiti@2.5.1)): + eslint-plugin-unicorn@68.0.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.0(jiti@2.5.1)) - '@eslint/plugin-kit': 0.3.5 + '@babel/helper-validator-identifier': 7.29.7 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + browserslist: 4.28.6 change-case: 5.4.4 - ci-info: 4.3.0 - clean-regexp: 1.0.0 - core-js-compat: 3.45.0 - eslint: 9.39.0(jiti@2.5.1) - esquery: 1.6.0 + ci-info: 4.4.0 + core-js-compat: 3.49.0 + detect-indent: 7.0.2 + eslint: 10.7.0(jiti@2.7.0) find-up-simple: 1.0.1 - globals: 16.5.0 + globals: 17.7.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 jsesc: 3.1.0 pluralize: 8.0.0 - regexp-tree: 0.1.27 - regjsparser: 0.12.0 - semver: 7.7.2 - strip-indent: 4.0.0 + regjsparser: 0.13.2 + semver: 7.8.5 + strip-indent: 4.1.1 - eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.39.0(jiti@2.5.1)): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0)): dependencies: - eslint: 9.39.0(jiti@2.5.1) + eslint: 10.7.0(jiti@2.7.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) - eslint-plugin-vue@10.4.0(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.39.0(jiti@2.5.1))(vue-eslint-parser@10.2.0(eslint@9.39.0(jiti@2.5.1))): + eslint-plugin-vue@10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.7.0(jiti@2.7.0)))(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2))(eslint@10.7.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.7.0(jiti@2.7.0))): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.0(jiti@2.5.1)) - eslint: 9.39.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + eslint: 10.7.0(jiti@2.7.0) natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.1.2 - semver: 7.7.2 - vue-eslint-parser: 10.2.0(eslint@9.39.0(jiti@2.5.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.7.0(jiti@2.7.0)) + xml-name-validator: 5.0.0 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.5.1))(typescript@5.9.2) + '@stylistic/eslint-plugin': 5.10.0(eslint@10.7.0(jiti@2.7.0)) + '@typescript-eslint/parser': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.2) - eslint-plugin-yml@1.18.0(eslint@9.39.0(jiti@2.5.1)): + eslint-plugin-yml@3.6.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - debug: 4.4.1 - escape-string-regexp: 4.0.0 - eslint: 9.39.0(jiti@2.5.1) - eslint-compat-utils: 0.6.5(eslint@9.39.0(jiti@2.5.1)) + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@ota-meshi/ast-token-store': 0.3.0 + diff-sequences: 29.6.3 + escape-string-regexp: 5.0.0 + eslint: 10.7.0(jiti@2.7.0) natural-compare: 1.4.0 - yaml-eslint-parser: 1.3.0 - transitivePeerDependencies: - - supports-color + yaml-eslint-parser: 2.1.0 - eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.21)(eslint@9.39.0(jiti@2.5.1)): + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.40)(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@vue/compiler-sfc': 3.5.21 - eslint: 9.39.0(jiti@2.5.1) + '@vue/compiler-sfc': 3.5.40 + eslint: 10.7.0(jiti@2.7.0) - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -7579,29 +8336,28 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.0(jiti@2.5.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.5.1)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.39.0 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.6 + eslint-visitor-keys@5.0.1: {} + + eslint@10.7.0(jiti@2.7.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.12.6 - chalk: 4.1.2 + '@types/estree': 1.0.9 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -7611,12 +8367,11 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -7630,13 +8385,13 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - espree@9.6.1: + espree@11.2.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -7646,8 +8401,6 @@ snapshots: estraverse@5.3.0: {} - estree-walker@1.0.1: {} - estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -7656,6 +8409,8 @@ snapshots: esutils@2.0.3: {} + eta@4.6.0: {} + etag@1.8.1: {} eventemitter3@5.0.1: {} @@ -7700,25 +8455,27 @@ snapshots: exsolve@1.0.7: {} + exsolve@1.1.0: {} + fast-deep-equal@3.1.3: {} - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 + fast-diff@1.3.0: {} fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fast-uri@3.0.6: {} + fast-string-truncated-width@3.0.3: {} - fastq@1.19.1: + fast-string-width@3.0.2: dependencies: - reusify: 1.1.0 + fast-string-truncated-width: 3.0.3 + + fast-uri@3.1.4: {} + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 fault@2.0.1: dependencies: @@ -7732,15 +8489,19 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + fflate@0.8.2: {} file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - filelist@1.0.4: + filelist@1.0.6: dependencies: - minimatch: 5.1.6 + minimatch: 5.1.9 fill-range@7.1.1: dependencies: @@ -7767,11 +8528,13 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 flatted@3.3.3: {} + flatted@3.4.2: {} + floating-vue@5.2.2(vue@3.5.18(typescript@5.9.2)): dependencies: '@floating-ui/dom': 1.1.1 @@ -7807,29 +8570,32 @@ snapshots: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.1 universalify: 2.0.1 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.8: + function.prototype.name@1.2.0: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 - define-properties: 1.2.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 functions-have-names: 1.2.3 - hasown: 2.0.2 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 is-callable: 1.2.7 + is-document.all: 1.0.0 functions-have-names@1.2.3: {} fzf@0.5.2: {} + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} get-east-asian-width@1.4.0: {} @@ -7864,6 +8630,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -7883,20 +8653,18 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@7.2.3: + glob@11.1.0: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@14.0.0: {} + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 globals@15.15.0: {} - globals@16.5.0: {} + globals@17.7.0: {} globalthis@1.0.4: dependencies: @@ -7909,8 +8677,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -7939,6 +8705,10 @@ snapshots: dependencies: function-bind: 1.1.2 + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 @@ -7968,6 +8738,8 @@ snapshots: readable-stream: 2.3.8 wbuf: 1.7.3 + html-entities@2.6.0: {} + html-escaper@2.0.2: {} html-void-elements@3.0.0: {} @@ -8003,35 +8775,25 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 + ignore@7.0.6: {} imurmurhash@0.1.4: {} indent-string@5.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 + hasown: 2.0.4 + side-channel: 1.1.1 ipaddr.js@1.9.1: {} is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 get-intrinsic: 1.3.0 @@ -8060,13 +8822,13 @@ snapshots: is-builtin-module@5.0.0: dependencies: - builtin-modules: 5.0.0 + builtin-modules: 5.3.0 is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.2 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -8079,6 +8841,10 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -8091,9 +8857,10 @@ snapshots: dependencies: get-east-asian-width: 1.4.0 - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -8122,7 +8889,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.4 is-regexp@1.0.0: {} @@ -8147,7 +8914,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.19 + which-typed-array: 1.1.22 is-weakmap@2.0.2: {} @@ -8205,27 +8972,26 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + jake@10.9.4: dependencies: async: 3.2.6 - filelist: 1.0.4 + filelist: 1.0.6 picocolors: 1.1.1 jiti@2.5.1: {} + jiti@2.7.0: + optional: true + js-tokens@4.0.0: {} js-tokens@9.0.1: {} - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsdoc-type-pratt-parser@4.1.0: {} - - jsdoc-type-pratt-parser@5.4.0: {} - - jsesc@3.0.2: {} + jsdoc-type-pratt-parser@7.2.0: {} jsesc@3.1.0: {} @@ -8235,27 +9001,23 @@ snapshots: json-schema-traverse@1.0.0: {} - json-schema@0.4.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} - jsonc-eslint-parser@2.4.0: + jsonc-eslint-parser@3.1.0: dependencies: - acorn: 8.15.0 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - semver: 7.7.2 + acorn: 8.17.0 + eslint-visitor-keys: 5.0.1 + semver: 7.8.5 - jsonc-eslint-parser@2.4.1: + jsonfile@6.1.0: dependencies: - acorn: 8.15.0 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - semver: 7.7.2 + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.1: dependencies: universalify: 2.0.1 optionalDependencies: @@ -8263,6 +9025,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 @@ -8301,10 +9067,10 @@ snapshots: pkg-types: 2.2.0 quansync: 0.2.10 - local-pkg@1.1.2: + local-pkg@1.2.1: dependencies: - mlly: 1.7.4 - pkg-types: 2.3.0 + mlly: 1.8.2 + pkg-types: 2.3.1 quansync: 0.2.11 locate-path@6.0.0: @@ -8313,12 +9079,6 @@ snapshots: lodash.debounce@4.0.8: {} - lodash.merge@4.6.2: {} - - lodash.sortby@4.7.0: {} - - lodash@4.17.21: {} - log-update@6.1.0: dependencies: ansi-escapes: 7.1.1 @@ -8333,16 +9093,14 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.5.2: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 lz-string@1.5.0: {} - magic-string@0.25.9: - dependencies: - sourcemap-codec: 1.4.8 - magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 @@ -8351,6 +9109,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.3.5: dependencies: '@babel/parser': 7.28.0 @@ -8391,12 +9153,29 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-frontmatter@2.0.1: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: @@ -8459,6 +9238,18 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.5 + '@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 @@ -8498,8 +9289,6 @@ snapshots: merge-descriptors@1.0.3: {} - merge2@1.4.1: {} - methods@1.1.2: {} micromark-core-commonmark@2.0.3: @@ -8586,6 +9375,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 @@ -8717,17 +9516,15 @@ snapshots: mimic-function@5.0.1: {} - min-indent@1.0.1: {} - minimalistic-assert@1.0.1: {} - minimatch@3.1.2: + minimatch@10.2.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 5.0.7 - minimatch@5.1.6: + minimatch@5.1.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.1.2 minimatch@9.0.5: dependencies: @@ -8735,6 +9532,8 @@ snapshots: minipass@7.1.2: {} + minipass@7.1.3: {} + minisearch@7.1.2: {} mitt@3.0.1: {} @@ -8746,6 +9545,15 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mlly@1.8.2: + dependencies: + acorn: 8.17.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + module-replacements@3.0.0: {} + mrmime@2.0.1: {} ms@2.0.0: {} @@ -8758,6 +9566,8 @@ snapshots: nanoid@3.3.11: {} + nanoid@3.3.16: {} + natural-compare@1.4.0: {} natural-orderby@5.0.0: {} @@ -8770,6 +9580,8 @@ snapshots: node-releases@2.0.19: {} + node-releases@2.0.51: {} + normalize-path@3.0.0: {} nth-check@2.1.1: @@ -8778,9 +9590,7 @@ snapshots: object-assign@4.1.1: {} - object-deep-merge@1.0.5: - dependencies: - type-fest: 4.2.0 + object-deep-merge@2.0.1: {} object-inspect@1.13.4: {} @@ -8788,10 +9598,10 @@ snapshots: object.assign@4.1.7: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -8803,16 +9613,14 @@ snapshots: node-fetch-native: 1.6.7 ufo: 1.6.1 + ohash@2.0.11: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 on-headers@1.1.0: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -8840,6 +9648,30 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxfmt@0.35.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.35.0 + '@oxfmt/binding-android-arm64': 0.35.0 + '@oxfmt/binding-darwin-arm64': 0.35.0 + '@oxfmt/binding-darwin-x64': 0.35.0 + '@oxfmt/binding-freebsd-x64': 0.35.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.35.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.35.0 + '@oxfmt/binding-linux-arm64-gnu': 0.35.0 + '@oxfmt/binding-linux-arm64-musl': 0.35.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.35.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.35.0 + '@oxfmt/binding-linux-riscv64-musl': 0.35.0 + '@oxfmt/binding-linux-s390x-gnu': 0.35.0 + '@oxfmt/binding-linux-x64-gnu': 0.35.0 + '@oxfmt/binding-linux-x64-musl': 0.35.0 + '@oxfmt/binding-openharmony-arm64': 0.35.0 + '@oxfmt/binding-win32-arm64-msvc': 0.35.0 + '@oxfmt/binding-win32-ia32-msvc': 0.35.0 + '@oxfmt/binding-win32-x64-msvc': 0.35.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -8854,10 +9686,6 @@ snapshots: package-manager-detector@1.5.0: {} - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - parse-gitignore@2.0.0: {} parse-imports-exports@0.2.4: @@ -8872,8 +9700,6 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -8883,6 +9709,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.2 + minipass: 7.1.3 + path-to-regexp@0.1.12: {} pathe@2.0.3: {} @@ -8899,6 +9730,8 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.5: {} + pidtree@0.6.0: {} pkg-types@1.3.1: @@ -8913,25 +9746,31 @@ snapshots: exsolve: 1.0.7 pathe: 2.0.3 - pkg-types@2.3.0: + pkg-types@2.3.1: dependencies: - confbox: 0.2.2 - exsolve: 1.0.7 + confbox: 0.2.4 + exsolve: 1.1.0 pathe: 2.0.3 pluralize@8.0.0: {} - pnpm-workspace-yaml@1.3.0: + pnpm-workspace-yaml@1.6.1: dependencies: - yaml: 2.8.1 + yaml: 2.9.0 possible-typed-array-names@1.1.0: {} - postcss-selector-parser@6.1.2: + postcss-selector-parser@7.1.4: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss@8.5.21: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -8940,6 +9779,12 @@ snapshots: prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier@3.9.6: {} + pretty-bytes@5.6.0: {} pretty-bytes@6.1.1: {} @@ -8969,12 +9814,6 @@ snapshots: quansync@0.2.11: {} - queue-microtask@1.2.3: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - range-parser@1.2.1: {} raw-body@2.5.2: @@ -9008,20 +9847,20 @@ snapshots: refa@0.12.1: dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerate-unicode-properties@10.2.0: + regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 @@ -9039,44 +9878,43 @@ snapshots: regexp-ast-analysis@0.7.1: dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 refa: 0.12.1 - regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 es-errors: 1.3.0 get-proto: 1.0.1 gopd: 1.2.0 set-function-name: 2.0.2 - regexpu-core@6.2.0: + regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 + regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.12.0 + regjsparser: 0.13.2 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 + unicode-match-property-value-ecmascript: 2.2.1 regjsgen@0.8.0: {} - regjsparser@0.12.0: + regjsparser@0.13.2: dependencies: - jsesc: 3.0.2 + jsesc: 3.1.0 require-from-string@2.0.2: {} - resolve-from@4.0.0: {} + reserved-identifiers@1.2.0: {} resolve-pkg-maps@1.0.0: {} - resolve@1.22.10: + resolve@1.22.12: dependencies: - is-core-module: 2.16.1 + es-errors: 1.3.0 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -9085,14 +9923,8 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - reusify@1.1.0: {} - rfdc@1.4.1: {} - rollup@2.79.2: - optionalDependencies: - fsevents: 2.3.3 - rollup@4.46.2: dependencies: '@types/estree': 1.0.8 @@ -9119,13 +9951,40 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.46.2 fsevents: 2.3.3 - run-parallel@1.2.0: + rollup@4.62.2: dependencies: - queue-microtask: 1.2.3 + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 + fsevents: 2.3.3 - safe-array-concat@1.1.3: + safe-array-concat@1.1.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 get-intrinsic: 1.3.0 has-symbols: 1.1.0 @@ -9150,7 +10009,7 @@ snapshots: scslre@0.3.0: dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 refa: 0.12.1 regexp-ast-analysis: 0.7.1 @@ -9160,6 +10019,8 @@ snapshots: semver@7.7.2: {} + semver@7.8.5: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -9178,9 +10039,7 @@ snapshots: transitivePeerDependencies: - supports-color - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + serialize-javascript@7.0.7: {} serve-static@1.16.2: dependencies: @@ -9211,7 +10070,7 @@ snapshots: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 setprototypeof@1.2.0: {} @@ -9269,6 +10128,11 @@ snapshots: es-errors: 1.3.0 object-inspect: 1.13.4 + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-map@1.0.1: dependencies: call-bound: 1.0.4 @@ -9292,6 +10156,14 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -9315,7 +10187,7 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 - smob@1.5.0: {} + smob@1.6.2: {} source-map-js@1.2.1: {} @@ -9326,11 +10198,7 @@ snapshots: source-map@0.6.1: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - - sourcemap-codec@1.4.8: {} + source-map@0.8.0: {} space-separated-tokens@2.0.2: {} @@ -9339,9 +10207,9 @@ snapshots: spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 + spdx-license-ids: 3.0.23 - spdx-license-ids@3.0.22: {} + spdx-license-ids@3.0.23: {} spdy-transport@3.0.0: dependencies: @@ -9404,42 +10272,43 @@ snapshots: string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.1.0 + side-channel: 1.1.1 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.9: + string.prototype.trimend@1.0.10: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 string_decoder@1.1.1: dependencies: @@ -9470,11 +10339,7 @@ snapshots: strip-comments@2.0.1: {} - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 - - strip-json-comments@3.1.1: {} + strip-indent@4.1.1: {} strip-literal@3.1.0: dependencies: @@ -9490,13 +10355,13 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.11.11: + synckit@0.11.13: dependencies: - '@pkgr/core': 0.2.9 + '@pkgr/core': 0.3.6 tabbable@6.2.0: {} - tapable@2.2.2: {} + tapable@2.3.3: {} temp-dir@2.0.0: {} @@ -9507,10 +10372,10 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 - terser@5.43.1: + terser@5.49.0: dependencies: - '@jridgewell/source-map': 0.3.10 - acorn: 8.15.0 + '@jridgewell/source-map': 0.3.11 + acorn: 8.17.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -9536,8 +10401,15 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + tinypool@1.1.1: {} + tinypool@2.1.0: {} + tinyrainbow@2.0.0: {} tinyspy@4.0.4: {} @@ -9548,28 +10420,30 @@ snapshots: dependencies: is-number: 7.0.0 + to-valid-identifier@1.0.0: + dependencies: + '@sindresorhus/base62': 1.0.0 + reserved-identifiers: 1.2.0 + toidentifier@1.0.1: {} - toml-eslint-parser@0.10.0: + toml-eslint-parser@1.0.3: dependencies: - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 5.0.1 totalist@3.0.1: {} - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - trim-lines@3.0.1: {} - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.5.0(typescript@5.9.2): dependencies: typescript: 5.9.2 ts-declaration-location@1.0.7(typescript@5.9.2): dependencies: - picomatch: 4.0.3 + picomatch: 4.0.5 typescript: 5.9.2 + optional: true tslib@2.8.1: optional: true @@ -9606,8 +10480,6 @@ snapshots: type-fest@0.16.0: {} - type-fest@4.2.0: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -9621,7 +10493,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 @@ -9630,16 +10502,16 @@ snapshots: typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.7: + typed-array-length@1.0.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 @@ -9650,6 +10522,8 @@ snapshots: ufo@1.6.1: {} + ufo@1.6.4: {} + uglify-js@3.19.3: {} unbox-primitive@1.1.0: @@ -9673,11 +10547,11 @@ snapshots: unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 + unicode-property-aliases-ecmascript: 2.2.0 - unicode-match-property-value-ecmascript@2.2.0: {} + unicode-match-property-value-ecmascript@2.2.1: {} - unicode-property-aliases-ecmascript@2.1.0: {} + unicode-property-aliases-ecmascript@2.2.0: {} unique-string@2.0.0: dependencies: @@ -9687,10 +10561,19 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-position@5.0.0: 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 @@ -9700,20 +10583,31 @@ snapshots: '@types/unist': 3.0.3 unist-util-is: 6.0.0 + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universalify@2.0.1: {} - unocss@66.4.2(postcss@8.5.6)(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)): + unocss@66.4.2(postcss@8.5.21)(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)): dependencies: - '@unocss/astro': 66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + '@unocss/astro': 66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) '@unocss/cli': 66.4.2 '@unocss/core': 66.4.2 - '@unocss/postcss': 66.4.2(postcss@8.5.6) + '@unocss/postcss': 66.4.2(postcss@8.5.21) '@unocss/preset-attributify': 66.4.2 '@unocss/preset-icons': 66.4.2 '@unocss/preset-mini': 66.4.2 @@ -9728,9 +10622,9 @@ snapshots: '@unocss/transformer-compile-class': 66.4.2 '@unocss/transformer-directives': 66.4.2 '@unocss/transformer-variant-group': 66.4.2 - '@unocss/vite': 66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + '@unocss/vite': 66.4.2(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) optionalDependencies: - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) transitivePeerDependencies: - postcss - supports-color @@ -9742,7 +10636,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.3 - unplugin-vue-components@29.0.0(@babel/parser@7.28.4)(vue@3.5.18(typescript@5.9.2)): + unplugin-vue-components@29.0.0(@babel/parser@7.29.7)(vue@3.5.18(typescript@5.9.2)): dependencies: chokidar: 3.6.0 debug: 4.4.1 @@ -9754,7 +10648,7 @@ snapshots: unplugin-utils: 0.2.5 vue: 3.5.18(typescript@5.9.2) optionalDependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.29.7 transitivePeerDependencies: - supports-color @@ -9772,6 +10666,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.6): + dependencies: + browserslist: 4.28.6 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -9792,13 +10692,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -9813,20 +10713,20 @@ snapshots: - tsx - yaml - vite-plugin-pwa@1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(workbox-build@7.3.0)(workbox-window@7.3.0): + vite-plugin-pwa@1.0.2(@vite-pwa/assets-generator@1.0.0)(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.3.0): dependencies: debug: 4.4.1 pretty-bytes: 6.1.1 tinyglobby: 0.2.14 - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) - workbox-build: 7.3.0 + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) + workbox-build: 7.4.1 workbox-window: 7.3.0 optionalDependencies: '@vite-pwa/assets-generator': 1.0.0 transitivePeerDependencies: - supports-color - vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1): + vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0): dependencies: esbuild: 0.25.8 fdir: 6.5.0(picomatch@4.0.3) @@ -9837,27 +10737,27 @@ snapshots: optionalDependencies: '@types/node': 24.2.1 fsevents: 2.3.3 - jiti: 2.5.1 - terser: 5.43.1 + jiti: 2.7.0 + terser: 5.49.0 tsx: 4.20.3 - yaml: 2.8.1 + yaml: 2.9.0 - vitepress-plugin-group-icons@1.6.5(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)): + vitepress-plugin-group-icons@1.6.5(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)): dependencies: '@iconify-json/logos': 1.2.10 '@iconify-json/vscode-icons': 1.2.33 '@iconify/utils': 3.0.2 optionalDependencies: - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) transitivePeerDependencies: - supports-color - vitepress-plugin-tabs@0.7.3(vitepress@2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.5.1)(postcss@8.5.6)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)): + vitepress-plugin-tabs@0.7.3(vitepress@2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.7.0)(postcss@8.5.21)(terser@5.49.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.9.0))(vue@3.5.18(typescript@5.9.2)): dependencies: - vitepress: 2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.5.1)(postcss@8.5.6)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1) + vitepress: 2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.7.0)(postcss@8.5.21)(terser@5.49.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.9.0) vue: 3.5.18(typescript@5.9.2) - vitepress@2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.5.1)(postcss@8.5.6)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1): + vitepress@2.0.0-alpha.12(@types/node@24.2.1)(change-case@5.4.4)(jiti@2.7.0)(postcss@8.5.21)(terser@5.49.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.9.0): dependencies: '@docsearch/css': 4.0.1 '@docsearch/js': 4.0.1 @@ -9866,7 +10766,7 @@ snapshots: '@shikijs/transformers': 3.13.0 '@shikijs/types': 3.9.2 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.1(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@vitejs/plugin-vue': 6.0.1(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.21(typescript@5.9.2)) '@vue/devtools-api': 8.0.2 '@vue/shared': 3.5.18 '@vueuse/core': 13.9.0(vue@3.5.21(typescript@5.9.2)) @@ -9875,10 +10775,10 @@ snapshots: mark.js: 8.11.1 minisearch: 7.1.2 shiki: 3.9.2 - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) vue: 3.5.21(typescript@5.9.2) optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.21 transitivePeerDependencies: - '@types/node' - async-validator @@ -9904,11 +10804,11 @@ snapshots: - universal-cookie - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.2.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -9926,13 +10826,13 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.13 '@types/node': 24.2.1 - '@vitest/browser': 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(vite@7.1.6(@types/node@24.2.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@3.2.4) '@vitest/ui': 3.2.4(vitest@3.2.4) transitivePeerDependencies: - jiti @@ -9948,15 +10848,15 @@ snapshots: - tsx - yaml - vue-eslint-parser@10.2.0(eslint@9.39.0(jiti@2.5.1)): + vue-eslint-parser@10.4.1(eslint@10.7.0(jiti@2.7.0)): dependencies: - debug: 4.4.1 - eslint: 9.39.0(jiti@2.5.1) - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - semver: 7.7.2 + debug: 4.4.3 + eslint: 10.7.0(jiti@2.7.0) + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -9990,16 +10890,8 @@ snapshots: dependencies: minimalistic-assert: 1.0.1 - webidl-conversions@4.0.2: {} - webpack-virtual-modules@0.6.2: {} - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -10011,18 +10903,18 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.1.8 + function.prototype.name: 1.2.0 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.19 + which-typed-array: 1.1.22 which-collection@1.0.2: dependencies: @@ -10031,10 +10923,10 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.19: + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 @@ -10052,119 +10944,126 @@ snapshots: word-wrap@1.2.5: {} - workbox-background-sync@7.3.0: + workbox-background-sync@7.4.1: dependencies: idb: 7.1.1 - workbox-core: 7.3.0 + workbox-core: 7.4.1 - workbox-broadcast-update@7.3.0: + workbox-broadcast-update@7.4.1: dependencies: - workbox-core: 7.3.0 + workbox-core: 7.4.1 - workbox-build@7.3.0: + workbox-build@7.4.1: dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) - '@babel/core': 7.28.0 - '@babel/preset-env': 7.28.0(@babel/core@7.28.0) - '@babel/runtime': 7.28.2 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.0)(rollup@2.79.2) - '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) - '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) - '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) - '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.17.1 + '@apideck/better-ajv-errors': 0.3.7(ajv@8.20.0) + '@babel/core': 7.29.7 + '@babel/preset-env': 7.29.7(@babel/core@7.29.7) + '@babel/runtime': 7.29.7 + '@rollup/plugin-babel': 6.1.0(@babel/core@7.29.7)(rollup@4.62.2) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.62.2) + '@rollup/plugin-replace': 6.0.3(rollup@4.62.2) + '@rollup/plugin-terser': 1.0.0(rollup@4.62.2) + '@trickfilm400/rollup-plugin-off-main-thread': 3.0.0-pre1 + ajv: 8.20.0 common-tags: 1.8.2 + eta: 4.6.0 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 - glob: 7.2.3 - lodash: 4.17.21 + glob: 11.1.0 pretty-bytes: 5.6.0 - rollup: 2.79.2 - source-map: 0.8.0-beta.0 + rollup: 4.62.2 + source-map: 0.8.0 stringify-object: 3.3.0 strip-comments: 2.0.1 tempy: 0.6.0 upath: 1.2.0 - workbox-background-sync: 7.3.0 - workbox-broadcast-update: 7.3.0 - workbox-cacheable-response: 7.3.0 - workbox-core: 7.3.0 - workbox-expiration: 7.3.0 - workbox-google-analytics: 7.3.0 - workbox-navigation-preload: 7.3.0 - workbox-precaching: 7.3.0 - workbox-range-requests: 7.3.0 - workbox-recipes: 7.3.0 - workbox-routing: 7.3.0 - workbox-strategies: 7.3.0 - workbox-streams: 7.3.0 - workbox-sw: 7.3.0 - workbox-window: 7.3.0 + workbox-background-sync: 7.4.1 + workbox-broadcast-update: 7.4.1 + workbox-cacheable-response: 7.4.1 + workbox-core: 7.4.1 + workbox-expiration: 7.4.1 + workbox-google-analytics: 7.4.1 + workbox-navigation-preload: 7.4.1 + workbox-precaching: 7.4.1 + workbox-range-requests: 7.4.1 + workbox-recipes: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 + workbox-streams: 7.4.1 + workbox-sw: 7.4.1 + workbox-window: 7.4.1 transitivePeerDependencies: - '@types/babel__core' - supports-color - workbox-cacheable-response@7.3.0: + workbox-cacheable-response@7.4.1: dependencies: - workbox-core: 7.3.0 + workbox-core: 7.4.1 workbox-core@7.3.0: {} - workbox-expiration@7.3.0: + workbox-core@7.4.1: {} + + workbox-expiration@7.4.1: dependencies: idb: 7.1.1 - workbox-core: 7.3.0 + workbox-core: 7.4.1 - workbox-google-analytics@7.3.0: + workbox-google-analytics@7.4.1: dependencies: - workbox-background-sync: 7.3.0 - workbox-core: 7.3.0 - workbox-routing: 7.3.0 - workbox-strategies: 7.3.0 + workbox-background-sync: 7.4.1 + workbox-core: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 - workbox-navigation-preload@7.3.0: + workbox-navigation-preload@7.4.1: dependencies: - workbox-core: 7.3.0 + workbox-core: 7.4.1 - workbox-precaching@7.3.0: + workbox-precaching@7.4.1: dependencies: - workbox-core: 7.3.0 - workbox-routing: 7.3.0 - workbox-strategies: 7.3.0 + workbox-core: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 - workbox-range-requests@7.3.0: + workbox-range-requests@7.4.1: dependencies: - workbox-core: 7.3.0 + workbox-core: 7.4.1 - workbox-recipes@7.3.0: + workbox-recipes@7.4.1: dependencies: - workbox-cacheable-response: 7.3.0 - workbox-core: 7.3.0 - workbox-expiration: 7.3.0 - workbox-precaching: 7.3.0 - workbox-routing: 7.3.0 - workbox-strategies: 7.3.0 + workbox-cacheable-response: 7.4.1 + workbox-core: 7.4.1 + workbox-expiration: 7.4.1 + workbox-precaching: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 - workbox-routing@7.3.0: + workbox-routing@7.4.1: dependencies: - workbox-core: 7.3.0 + workbox-core: 7.4.1 - workbox-strategies@7.3.0: + workbox-strategies@7.4.1: dependencies: - workbox-core: 7.3.0 + workbox-core: 7.4.1 - workbox-streams@7.3.0: + workbox-streams@7.4.1: dependencies: - workbox-core: 7.3.0 - workbox-routing: 7.3.0 + workbox-core: 7.4.1 + workbox-routing: 7.4.1 - workbox-sw@7.3.0: {} + workbox-sw@7.4.1: {} workbox-window@7.3.0: dependencies: '@types/trusted-types': 2.0.7 workbox-core: 7.3.0 + workbox-window@7.4.1: + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 7.4.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -10183,21 +11082,21 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.2 - wrappy@1.0.2: {} - ws@8.18.3: {} - xml-name-validator@4.0.0: {} + xml-name-validator@5.0.0: {} yallist@3.1.1: {} - yaml-eslint-parser@1.3.0: + yaml-eslint-parser@2.1.0: dependencies: - eslint-visitor-keys: 3.4.3 - yaml: 2.8.1 + eslint-visitor-keys: 5.0.1 + yaml: 2.9.0 yaml@2.8.1: {} + yaml@2.9.0: {} + yocto-queue@0.1.0: {} zwitch@2.0.4: {} From 7f69e7e4f7e70e3d41d6cdc82a6169b06475619b Mon Sep 17 00:00:00 2001 From: noise Date: Tue, 21 Jul 2026 18:00:59 +0800 Subject: [PATCH 2/6] fix: document style --- advanced/api/plugin.md | 5 ++- advanced/api/test-case.md | 4 +- advanced/api/test-project.md | 11 ++++- advanced/api/test-suite.md | 3 +- advanced/api/vitest.md | 14 +++--- advanced/guide/tests.md | 5 ++- advanced/metadata.md | 4 +- advanced/pool.md | 2 +- advanced/runner.md | 3 +- api/assert.md | 82 ++++++++++++++++++------------------ api/expect.md | 38 +++++++++-------- api/index.md | 20 ++++----- eslint.config.js | 1 + guide/reporters.md | 15 ++++--- guide/test-annotations.md | 5 ++- guide/testing-types.md | 6 +-- guide/ui.md | 2 +- guide/using-plugins.md | 2 +- guide/why.md | 4 +- 19 files changed, 125 insertions(+), 101 deletions(-) diff --git a/advanced/api/plugin.md b/advanced/api/plugin.md index aec85e013..92d03582f 100644 --- a/advanced/api/plugin.md +++ b/advanced/api/plugin.md @@ -14,6 +14,7 @@ outline: deep Vitest 自 3.1 版起支持实验性的 `configureVitest` [插件](https://cn.vite.dev/guide/api-plugin) hook。欢迎在 [GitHub](https://github.com/vitest-dev/vitest/discussions/7104) 中提供有关此 API 的任何反馈。 ::: code-group + ```ts [only vitest] import type { Vite, VitestPluginContext } from 'vitest/node' @@ -26,6 +27,7 @@ export function plugin(): Vite.Plugin { } } ``` + ```ts [vite and vitest] /// @@ -43,6 +45,7 @@ export function plugin(): Plugin { } } ``` + ::: ::: tip TypeScript @@ -51,6 +54,7 @@ Vitest 通过 `Vite` namespace 重新导出所有仅 Vite 类型的导入,我 ```ts /// ``` + ::: 与 [`reporter.onInit`](/advanced/api/reporters#oninit) 不同,此 hooks 在 Vitest 生命周期的早期运行,允许我们更改 `coverage` 和 `reporters` 等配置。更值得注意的变化是,如果我们的插件是在项目中定义而不是在全局配置中定义的,我们可以从 [工作区项目](/guide/projects) 操作全局配置。 @@ -123,4 +127,3 @@ vitest.config.project.push('my-project-name') 请注意,这也将继承 `name` - Vitest 不允许多个项目使用相同的名称,因此这将引发错误。请确保我们指定了不同的名称。我们可以通过 `project.name` 属性访问当前名称,并且所有使用的名称都可以在 `vitest.projects` 数组中找到。 ::: - diff --git a/advanced/api/test-case.md b/advanced/api/test-case.md index 334c473e0..140a5cc89 100644 --- a/advanced/api/test-case.md +++ b/advanced/api/test-case.md @@ -126,7 +126,7 @@ function ok(): boolean function meta(): TaskMeta ``` -在测试执行期间附加到测试上的自定义[元数据](/advanced/metadata)。我们可以在测试运行期间通过给 `ctx.task.meta` 对象分配属性来附加元数据。 +在测试执行期间附加到测试上的自定义 [元数据](/advanced/metadata)。我们可以在测试运行期间通过给 `ctx.task.meta` 对象分配属性来附加元数据。 ```ts {3,6} import { test } from 'vitest' @@ -146,7 +146,7 @@ test('the validation works correctly', ({ task }) => { function result(): TestResult ``` -测试结果。如果测试尚未完成或刚刚开始收集,等于 `TestResultPending` : +测试结果。如果测试尚未完成或刚刚开始收集,等于 `TestResultPending`: ```ts export interface TestResultPending { diff --git a/advanced/api/test-project.md b/advanced/api/test-project.md index 1d5f8c52f..b2978f9c9 100644 --- a/advanced/api/test-project.md +++ b/advanced/api/test-project.md @@ -13,6 +13,7 @@ title: TestProject 名称是由用户分配或由 Vitest 解析的唯一字符串。如果用户没有提供名称,Vitest 会尝试加载项目根目录中的 `package.json` 并从中获取 `name` 属性。如果没有 `package.json`,Vitest 默认使用文件夹的名称。内联项目使用数字作为名称(转换为字符串)。 ::: code-group + ```ts [node.js] import { createVitest } from 'vitest/node' @@ -24,6 +25,7 @@ vitest.projects.map(p => p.name) === [ 'custom' ] ``` + ```ts [vitest.config.js] import { defineConfig } from 'vitest/config' @@ -48,6 +50,7 @@ export default defineConfig({ }, }) ``` + ::: ::: info @@ -74,6 +77,7 @@ const config: SerializedConfig = vitest.projects[0].serializedConfig ```ts project.serializedConfig === project.serializedConfig // ❌ ``` + ::: ## globalConfig @@ -120,6 +124,7 @@ function provide( 除了 [`config.provide`](/config/#provide) 字段外,还提供了一种向测试提供自定义值的方法。所有值在存储之前都通过 [`structuredClone`](https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone) 进行验证,但 `providedContext` 上的值本身不会被克隆。 ::: code-group + ```ts [node.js] import { createVitest } from 'vitest/node' @@ -128,10 +133,12 @@ const project = vitest.projects.find(p => p.name === 'custom') project.provide('key', 'value') await vitest.start() ``` + ```ts [test.spec.js] import { inject } from 'vitest' const value = inject('key') ``` + ::: 这些值可以动态提供。测试中提供的值将在下次运行时更新。 @@ -144,6 +151,7 @@ export default function setup({ provide }) { provide('wsPort', 3000) } ``` + ::: ## getProvidedContext @@ -240,7 +248,7 @@ Vitest 使用 [fast-glob](https://www.npmjs.com/package/fast-glob) 来查找测 - `test.include`、`test.exclude` 用于查找常规测试文件 - `test.includeSource`、`test.exclude` 用于查找源代码中的测试 - `test.typecheck.include`、`test.typecheck.exclude` 用于查找类型检查测试 -::: + ::: ## matchesTestGlob @@ -286,6 +294,7 @@ const dynamicExample = await project.import('./example.js') dynamicExample !== staticExample // ✅ ``` + ::: ::: info diff --git a/advanced/api/test-suite.md b/advanced/api/test-suite.md index 168abfb50..6eaefa290 100644 --- a/advanced/api/test-suite.md +++ b/advanced/api/test-suite.md @@ -198,7 +198,8 @@ describe('collection failed', () => { ```ts function meta(): TaskMeta ``` -在执行或收集过程中附加到套件的自定义[元数据](/advanced/metadata)。在测试运行期间,可以通过向 `task.meta` 对象分配属性来附加 meta: + +在执行或收集过程中附加到套件的自定义 [元数据](/advanced/metadata)。在测试运行期间,可以通过向 `task.meta` 对象分配属性来附加 meta: ```ts {5,10} import { test } from 'vitest' diff --git a/advanced/api/vitest.md b/advanced/api/vitest.md index ec6625680..291ff7b36 100644 --- a/advanced/api/vitest.md +++ b/advanced/api/vitest.md @@ -23,7 +23,7 @@ Vitest 4 新增了多个 API(它们都标记有 "4.0.0+" 徽章),并移除 - `globTestSpecs`(使用 [`globTestSpecifications`](#globtestspecifications) 代替) - `globTestFiles`(使用 [`globTestSpecifications`](#globtestspecifications) 代替) - `listFile`(使用 [`getRelevantTestSpecifications`](#getrelevanttestspecifications) 代替) -::: + ::: ## mode @@ -74,7 +74,7 @@ const testCase = vitest.state.getReportedEntity(task) // 新 API ## projects -这是一个数组,里面包含了所有 [测试项目](/advanced/api/test-project) ,这些项目是用户自己定义的。如果用户没有显式指定任何项目,那么这个数组中只会包含一个 [根项目](#getrootproject) 。 +这是一个数组,里面包含了所有 [测试项目](/advanced/api/test-project),这些项目是用户自己定义的。如果用户没有显式指定任何项目,那么这个数组中只会包含一个 [根项目](#getrootproject)。 Vitest 会保证这个数组里至少有一个项目可用。如果用户在命令行里通过 --project 参数指定了不存在的项目名称,Vitest 会在创建这个数组前就报错。 @@ -145,7 +145,7 @@ function getProvidedContext(): ProvidedContext function getProjectByName(name: string): TestProject ``` -此方法通过名称返回项目。类似于调用 `vitest.projects.find` 。 +此方法通过名称返回项目。类似于调用 `vitest.projects.find`。 ::: warning 如果项目不存在,此方法将返回根项目 - 请确保再次检查返回的项目是否是我们要找的项目。 @@ -190,7 +190,7 @@ function getRelevantTestSpecifications( - 如果我们需要获取已知测试文件的规范列表,请使用 [`getModuleSpecifications`](#getmodulespecifications) 代替。 - 如果我们需要获取所有可能的测试文件列表,请使用 [`globTestSpecifications`](#globtestspecifications)。 -::: + ::: ## mergeReports @@ -281,7 +281,7 @@ function runTestSpecifications( ): Promise ``` -该方法会根据接收到的 [测试规范](/advanced/api/test-specification) 运行所有测试。 第二个参数 `allTestsRun` 由覆盖率提供程序使用,用于确定是否需要对根目录下的每个文件进行覆盖率插桩(仅在启用覆盖率且 `coverage.all` 设置为 `true`时生效)。 +该方法会根据接收到的 [测试规范](/advanced/api/test-specification) 运行所有测试。 第二个参数 `allTestsRun` 由覆盖率提供程序使用,用于确定是否需要对根目录下的每个文件进行覆盖率插桩(仅在启用覆盖率且 `coverage.all` 设置为 `true` 时生效)。 ::: warning 此方法不会触发 `onWatcherRerun`、`onWatcherStart` 和 `onTestsRerun` 回调。如果我们基于文件更改重新运行测试,请考虑使用 [`rerunTestSpecifications`](#reruntestspecifications) 代替。 @@ -403,6 +403,7 @@ const dynamicExample = await vitest.import('./example.js') dynamicExample !== staticExample // ✅ ``` + ::: ::: info @@ -474,6 +475,7 @@ function onFilterWatchedSpecification( fn: (specification: TestSpecification) => boolean ): void ``` + 注册一个处理程序,当文件更改时调用。此回调应返回 `true` 或 `false`,指示是否需要重新运行测试文件。 通过此方法,我们可以挂钩到默认的观察器逻辑,以延迟或丢弃用户当前不想跟踪的测试: @@ -498,6 +500,6 @@ Vitest 可以根据 `pool` 或 `locations` 选项为同一文件创建不同的 function matchesProjectFilter(name: string): boolean ``` -检查名称是否与当前 [项目过滤器](/guide/cli#project) 匹配。如果没有项目过滤器,则始终返回 `true` 。 +检查名称是否与当前 [项目过滤器](/guide/cli#project) 匹配。如果没有项目过滤器,则始终返回 `true`。 无法通过编程方式更改 `--project` CLI 选项。 diff --git a/advanced/guide/tests.md b/advanced/guide/tests.md index c5cb50044..cf715ed09 100644 --- a/advanced/guide/tests.md +++ b/advanced/guide/tests.md @@ -1,7 +1,7 @@ # 运行测试 {#running-tests} ::: warning 注意 -本指南介绍如何使用高级 API 通过 Node.js 脚本运行测试。如果您只想[运行测试](/guide/),则可能不需要这个。它主要被库的作者使用。 +本指南介绍如何使用高级 API 通过 Node.js 脚本运行测试。如果您只想 [运行测试](/guide/),则可能不需要这个。它主要被库的作者使用。 破坏性变更可能不会遵循 SemVer,请在使用实验性 API 时固定 Vitest 的版本。 ::: @@ -71,7 +71,7 @@ finally { } ``` -如果我们打算保留 `Vitest` 实例,请确保至少调用 [`init`](/advanced/api/vitest#init) 。这将初始化报告器和覆盖率提供者,但不会运行任何测试。即使我们不打算使用 Vitest 观察器,但希望保持实例运行,也建议启用 `watch` 模式。Vitest 依赖此标志使其某些功能在连续过程中正常工作。 +如果我们打算保留 `Vitest` 实例,请确保至少调用 [`init`](/advanced/api/vitest#init)。这将初始化报告器和覆盖率提供者,但不会运行任何测试。即使我们不打算使用 Vitest 观察器,但希望保持实例运行,也建议启用 `watch` 模式。Vitest 依赖此标志使其某些功能在连续过程中正常工作。 报告器初始化后,如果需要手动运行测试,可以使用 [`runTestSpecifications`](/advanced/api/vitest#runtestspecifications) 或 [`rerunTestSpecifications`](/advanced/api/vitest#reruntestspecifications) 来运行测试。 @@ -106,6 +106,7 @@ watcher.on('add', async (file) => { } }) ``` + ::: 如果你需要禁用监视器,可以从 Vite 5.3 开始传递 `server.watch: null`,或者在 Vite 配置中传递 `server.watch: { ignored: ['*/*'] }`: diff --git a/advanced/metadata.md b/advanced/metadata.md index d0b1a7e12..cdff167a4 100644 --- a/advanced/metadata.md +++ b/advanced/metadata.md @@ -40,13 +40,13 @@ export default { ::: danger BEWARE Vitest 使用不同的方法与 Node.js 进程进行通信。 -- 如果 Vitest 在工作线程内运行测试,它将通过[消息端口](https://developer.mozilla.org/en-US/docs/Web/API/MessagePort)发送数据 +- 如果 Vitest 在工作线程内运行测试,它将通过 [消息端口](https://developer.mozilla.org/en-US/docs/Web/API/MessagePort) 发送数据 - 如果 Vitest 使用子进程,数据将通过 [`process.send`](https://nodejs.org/api/process.html#processsendmessage-sendhandle-options-callback) API 作为序列化缓冲区发送 - 如果 Vitest 在浏览器中运行测试,数据将使用 [flatted](https://www.npmjs.com/package/flatted) 包进行字符串化 该属性也会出现在每个测试的 `json` 报告中,因此请确保数据可以序列化为 JSON。 -另外,请确保在设置[错误属性](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#error_types)之前序列化它们。 +另外,请确保在设置 [错误属性](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#error_types) 之前序列化它们。 ::: 当测试运行完成时,你还可以从 Vitest 状态获取此信息: diff --git a/advanced/pool.md b/advanced/pool.md index 76c165600..8b67b9aea 100644 --- a/advanced/pool.md +++ b/advanced/pool.md @@ -1,4 +1,4 @@ -# 自定义运行池 +# 自定义运行池 {#custom-pool} ::: warning 这是一个高级且非常底层的 API。如果你只是想 [运行测试](/guide/),你可能不需要这个。它主要由库作者使用。 diff --git a/advanced/runner.md b/advanced/runner.md index 26c5c324e..1e4a88b34 100644 --- a/advanced/runner.md +++ b/advanced/runner.md @@ -135,6 +135,7 @@ export default class Runner { } } ``` + ::: ::: warning @@ -226,7 +227,7 @@ interface Test extends TaskBase { } ``` -每个任务都可以有一个 `result` 字段。只有当在套件回调或 `beforeAll`/`afterAll` 回调中抛出错误,阻止了测试的收集时,套件才会有这个字段。测试在它们的回调被调用后总是有这个字段——`state` 和 `errors` 字段根据结果的存在与否而存在。如果在 `beforeEach` 或 `afterEach` 回调中抛出了错误,抛出的错误将出现在 `task.result.errors` 中。 +每个任务都可以有一个 `result` 字段。只有当在套件回调或 `beforeAll`/`afterAll` 回调中抛出错误,阻止了测试的收集时,套件才会有这个字段。测试在它们的回调被调用后总是有这个字段 —— `state` 和 `errors` 字段根据结果的存在与否而存在。如果在 `beforeEach` 或 `afterEach` 回调中抛出了错误,抛出的错误将出现在 `task.result.errors` 中。 ```ts export interface TaskResult { diff --git a/api/assert.md b/api/assert.md index 9a3cffbbc..4d7a32bf6 100644 --- a/api/assert.md +++ b/api/assert.md @@ -111,7 +111,7 @@ test('assert.strictEqual', () => { - **类型:** `(actual: T, expected: T, message?: string) => void` -断言 `actual` 深度等于 `expected` 。 +断言 `actual` 深度等于 `expected`。 ```ts import { assert, test } from 'vitest' @@ -125,7 +125,7 @@ test('assert.deepEqual', () => { - **类型:** `(actual: T, expected: T, message?: string) => void` -断言 `actual` 不深度等于 `expected` 。 +断言 `actual` 不深度等于 `expected`。 ```ts import { assert, test } from 'vitest' @@ -139,7 +139,7 @@ test('assert.notDeepEqual', () => { - **类型:** `(valueToCheck: number, valueToBeAbove: number, message?: string) => void` -断言 `valueToCheck` 严格大于 (>) `valueToBeAbove` 。 +断言 `valueToCheck` 严格大于 (>) `valueToBeAbove`。 ```ts import { assert, test } from 'vitest' @@ -153,7 +153,7 @@ test('assert.isAbove', () => { - **类型:** `(valueToCheck: number, valueToBeAtLeast: number, message?: string) => void` -断言 `valueToCheck` 大于等于 (>=) `valueToBeAtLeast` 。 +断言 `valueToCheck` 大于等于 (>=) `valueToBeAtLeast`。 ```ts import { assert, test } from 'vitest' @@ -168,7 +168,7 @@ test('assert.isAtLeast', () => { - **类型:** `(valueToCheck: number, valueToBeBelow: number, message?: string) => void` -断言 `valueToCheck` 严格小于 (<) `valueToBeBelow` 。 +断言 `valueToCheck` 严格小于 (<) `valueToBeBelow`。 ```ts import { assert, test } from 'vitest' @@ -182,7 +182,7 @@ test('assert.isBelow', () => { - **类型:** `(valueToCheck: number, valueToBeAtMost: number, message?: string) => void` -断言 `valueToCheck` 小于等于 (<=) `valueToBeAtMost` 。 +断言 `valueToCheck` 小于等于 (<=) `valueToBeAtMost`。 ```ts import { assert, test } from 'vitest' @@ -688,7 +688,7 @@ test('assert.instanceOf', () => { - `(haystack: WeakSet, needle: T, message?: string) => void` - `(haystack: T, needle: Partial, message?: string) => void` -断言 `haystack` 包含 `needle` 。可以用来断言数组中是否包含一个值、字符串中是否包含一个子字符串、或者对象中是否包含一组属性。 +断言 `haystack` 包含 `needle`。可以用来断言数组中是否包含一个值、字符串中是否包含一个子字符串、或者对象中是否包含一组属性。 ```ts import { assert, test } from 'vitest' @@ -708,7 +708,7 @@ test('assert.include', () => { - `(haystack: WeakSet, needle: T, message?: string) => void` - `(haystack: T, needle: Partial, message?: string) => void` -断言 `haystack` 不包含 `needle` 。可以用来断言数组中是否不包含一个值、字符串中是否不包含一个子字符串、或者对象中是否不包含一组属性。 +断言 `haystack` 不包含 `needle`。可以用来断言数组中是否不包含一个值、字符串中是否不包含一个子字符串、或者对象中是否不包含一组属性。 ```ts import { assert, test } from 'vitest' @@ -727,7 +727,7 @@ test('assert.notInclude', () => { - `(haystack: readonly T[] | ReadonlySet | ReadonlyMap, needle: T, message?: string) => void` - `(haystack: T, needle: T extends WeakSet ? never : Partial, message?: string) => void` -断言 `haystack` 包含 `needle` 。可以用来断言数组中是否包含一个值或对象中是否包含一组属性。使用深度相等。 +断言 `haystack` 包含 `needle`。可以用来断言数组中是否包含一个值或对象中是否包含一组属性。使用深度相等。 ```ts import { assert, test } from 'vitest' @@ -748,7 +748,7 @@ test('assert.deepInclude', () => { - `(haystack: readonly T[] | ReadonlySet | ReadonlyMap, needle: T, message?: string) => void` - `(haystack: T, needle: T extends WeakSet ? never : Partial, message?: string) => void` -断言 `haystack` 不包含 `needle` 。可以用来断言数组中是否不包含一个值或对象中是否不包含一组属性。使用深度相等。 +断言 `haystack` 不包含 `needle`。可以用来断言数组中是否不包含一个值或对象中是否不包含一组属性。使用深度相等。 ```ts import { assert, test } from 'vitest' @@ -766,7 +766,7 @@ test('assert.notDeepInclude', () => { - **类型:** `(haystack: any, needle: any, message?: string) => void` -断言 `haystack` 包含 `needle` 。 可以用来断言对象中是否包含一组属性。允许使用点和括号表示法来引用嵌套属性。属性名中的 ‘[]’ 和 ‘.’ 可以使用双反斜杠转义。 +断言 `haystack` 包含 `needle`。 可以用来断言对象中是否包含一组属性。允许使用点和括号表示法来引用嵌套属性。属性名中的 ‘[]’ 和 ‘.’ 可以使用双反斜杠转义。 ```ts import { assert, test } from 'vitest' @@ -781,7 +781,7 @@ test('assert.nestedInclude', () => { - **类型:** `(haystack: any, needle: any, message?: string) => void` -断言 `haystack` 不包含 `needle` 。可以用来断言对象中是否不包含一组属性。允许使用点和括号表示法来引用嵌套属性。属性名中的 ‘[]’ 和 ‘.’ 可以使用双反斜杠转义。 +断言 `haystack` 不包含 `needle`。可以用来断言对象中是否不包含一组属性。允许使用点和括号表示法来引用嵌套属性。属性名中的 ‘[]’ 和 ‘.’ 可以使用双反斜杠转义。 ```ts import { assert, test } from 'vitest' @@ -796,7 +796,7 @@ test('assert.nestedInclude', () => { - **类型:** `(haystack: any, needle: any, message?: string) => void` -断言 `haystack` 包含 `needle` 。可以用来断言对象中是否包含一组属性,同时检查深度相等性。允许使用点和括号表示法来引用嵌套属性。属性名中的 ‘[]’ 和 ‘.’ 可以使用双反斜杠转义。 +断言 `haystack` 包含 `needle`。可以用来断言对象中是否包含一组属性,同时检查深度相等性。允许使用点和括号表示法来引用嵌套属性。属性名中的 ‘[]’ 和 ‘.’ 可以使用双反斜杠转义。 ```ts import { assert, test } from 'vitest' @@ -811,7 +811,7 @@ test('assert.deepNestedInclude', () => { - **类型:** `(haystack: any, needle: any, message?: string) => void` -断言 `haystack` 不包含 `needle` 。可以用来断言对象中是否不包含一组属性,同时检查深度相等性。允许使用点和括号表示法来引用嵌套属性。属性名中的 ‘[]’ 和 ‘.’ 可以使用双反斜杠转义。 +断言 `haystack` 不包含 `needle`。可以用来断言对象中是否不包含一组属性,同时检查深度相等性。允许使用点和括号表示法来引用嵌套属性。属性名中的 ‘[]’ 和 ‘.’ 可以使用双反斜杠转义。 ```ts import { assert, test } from 'vitest' @@ -826,7 +826,7 @@ test('assert.notDeepNestedInclude', () => { - **类型:** `(haystack: any, needle: any, message?: string) => void` -断言 `haystack` 包含 `needle` 。可以用来断言对象中是否包含一组属性,同时忽略继承的属性。 +断言 `haystack` 包含 `needle`。可以用来断言对象中是否包含一组属性,同时忽略继承的属性。 ```ts import { assert, test } from 'vitest' @@ -840,7 +840,7 @@ test('assert.ownInclude', () => { - **类型:** `(haystack: any, needle: any, message?: string) => void` -断言 `haystack` 包含 `needle` 。可以用来断言对象中是否不包含一组属性,同时忽略继承的属性 +断言 `haystack` 包含 `needle`。可以用来断言对象中是否不包含一组属性,同时忽略继承的属性 ```ts import { assert, test } from 'vitest' @@ -861,7 +861,7 @@ test('assert.notOwnInclude', () => { - **类型:** `(haystack: any, needle: any, message?: string) => void` -断言 `haystack` 包含 `needle` 。可以用来断言对象中是否包含一组属性,同时忽略继承的属性并检查深度相等性。 +断言 `haystack` 包含 `needle`。可以用来断言对象中是否包含一组属性,同时忽略继承的属性并检查深度相等性。 ```ts import { assert, test } from 'vitest' @@ -875,7 +875,7 @@ test('assert.deepOwnInclude', () => { - **类型:** `(haystack: any, needle: any, message?: string) => void` -断言 `haystack` 不包含 `needle` 。可以用来断言对象中是否不包含一组属性,同时忽略继承的属性并检查深度相等性。 +断言 `haystack` 不包含 `needle`。可以用来断言对象中是否不包含一组属性,同时忽略继承的属性并检查深度相等性。 ```ts import { assert, test } from 'vitest' @@ -889,7 +889,7 @@ test('assert.notDeepOwnInclude', () => { - **类型:** `(value: string, regexp: RegExp, message?: string) => void` -断言 `value` 匹配正则表达式 `regexp` 。 +断言 `value` 匹配正则表达式 `regexp`。 ```ts import { assert, test } from 'vitest' @@ -903,7 +903,7 @@ test('assert.match', () => { - **类型:** `(value: string, regexp: RegExp, message?: string) => void` -断言 `value` 不匹配正则表达式 `regexp` 。 +断言 `value` 不匹配正则表达式 `regexp`。 ```ts import { assert, test } from 'vitest' @@ -946,7 +946,7 @@ test('assert.notProperty', () => { - **类型:** `(object: T, property: string, value: V, message?: string) => void` -断言 `object` 具有由 `property` 指定的直接或继承属性,其值为 `value` 。使用严格相等检查(===)。 +断言 `object` 具有由 `property` 指定的直接或继承属性,其值为 `value`。使用严格相等检查(===)。 ```ts import { assert, test } from 'vitest' @@ -960,7 +960,7 @@ test('assert.notPropertyVal', () => { - **类型:** `(object: T, property: string, value: V, message?: string) => void` -断言 `object` 没有由 `property` 指定的直接或继承属性,其值为 `value` 。使用严格相等检查(===)。 +断言 `object` 没有由 `property` 指定的直接或继承属性,其值为 `value`。使用严格相等检查(===)。 ```ts import { assert, test } from 'vitest' @@ -975,7 +975,7 @@ test('assert.notPropertyVal', () => { - **类型:** `(object: T, property: string, value: V, message?: string) => void` -断言 `object` 具有由 `property` 指定的直接或继承属性,其值为 `value` 。使用深度相等检查。 +断言 `object` 具有由 `property` 指定的直接或继承属性,其值为 `value`。使用深度相等检查。 ```ts import { assert, test } from 'vitest' @@ -991,7 +991,7 @@ test('assert.deepPropertyVal', () => { - **类型:** `(object: T, property: string, value: V, message?: string) => void` -断言 `object` 没有由 `property` 指定的直接或继承属性,其值为 `value` 。使用深度相等检查。 +断言 `object` 没有由 `property` 指定的直接或继承属性,其值为 `value`。使用深度相等检查。 ```ts import { assert, test } from 'vitest' @@ -1041,7 +1041,7 @@ test('assert.deepPropertyVal', () => { - **类型:** `(object: T, property: string, value: any, message?: string) => void` -断言 `object` 具有由 `property` 指定的属性,其值为 `value` 给出。 `property` 可以使用点和方括号表示法进行嵌套引用。使用严格相等检查 (===)。 +断言 `object` 具有由 `property` 指定的属性,其值为 `value` 给出。`property` 可以使用点和方括号表示法进行嵌套引用。使用严格相等检查 (===)。 ```ts import { assert, test } from 'vitest' @@ -1055,7 +1055,7 @@ test('assert.nestedPropertyVal', () => { - **类型:** `(object: T, property: string, value: any, message?: string) => void` -断言 `object` 没有由 `property` 指定的属性,其值为 `value` 给出。 `property` 可以使用点和方括号表示法进行嵌套引用。使用严格相等检查 (===)。 +断言 `object` 没有由 `property` 指定的属性,其值为 `value` 给出。`property` 可以使用点和方括号表示法进行嵌套引用。使用严格相等检查 (===)。 ```ts import { assert, test } from 'vitest' @@ -1070,7 +1070,7 @@ test('assert.notNestedPropertyVal', () => { - **类型:** `(object: T, property: string, value: any, message?: string) => void` -断言 `object` 具有由 `property` 指定的属性,其值为 `value` 给出。 `property` 可以使用点和方括号表示法进行嵌套引用。使用深度相等检查。 +断言 `object` 具有由 `property` 指定的属性,其值为 `value` 给出。`property` 可以使用点和方括号表示法进行嵌套引用。使用深度相等检查。 ```ts import { assert, test } from 'vitest' @@ -1085,7 +1085,7 @@ test('assert.notNestedPropertyVal', () => { - **类型:** `(object: T, property: string, value: any, message?: string) => void` -断言 `object` 没有由 `property` 指定的属性,其值为 `value` 给出。 `property` 可以使用点和方括号表示法进行嵌套引用。使用深度相等检查。 +断言 `object` 没有由 `property` 指定的属性,其值为 `value` 给出。`property` 可以使用点和方括号表示法进行嵌套引用。使用深度相等检查。 ```ts import { assert, test } from 'vitest' @@ -1118,7 +1118,7 @@ test('assert.lengthOf', () => { - **类型:** `(object: T, keys: Array | { [key: string]: any }, message?: string) => void` -断言 `object` 至少拥有一个提供的 `keys` 。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 +断言 `object` 至少拥有一个提供的 `keys`。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 ```ts import { assert, test } from 'vitest' @@ -1135,7 +1135,7 @@ test('assert.hasAnyKeys', () => { - **类型:** `(object: T, keys: Array | { [key: string]: any }, message?: string) => void` -断言 `object` 拥有且仅拥有所有提供的 `keys` 。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 +断言 `object` 拥有且仅拥有所有提供的 `keys`。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 ```ts import { assert, test } from 'vitest' @@ -1173,7 +1173,7 @@ test('assert.containsAllKeys', () => { - **类型:** `(object: T, keys: Array | { [key: string]: any }, message?: string) => void` -断言 `object` 不拥有任何提供的 `keys` 。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 +断言 `object` 不拥有任何提供的 `keys`。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 ```ts import { assert, test } from 'vitest' @@ -1190,7 +1190,7 @@ test('assert.doesNotHaveAnyKeys', () => { - **类型:** `(object: T, keys: Array | { [key: string]: any }, message?: string) => void` -断言 `object` 至少不拥有一个提供的 `keys` 。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 +断言 `object` 至少不拥有一个提供的 `keys`。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 ```ts import { assert, test } from 'vitest' @@ -1207,7 +1207,7 @@ test('assert.hasAnyKeys', () => { - **类型:** `(object: T, keys: Array | { [key: string]: any }, message?: string) => void` -断言 `object` 至少拥有一个提供的 `keys` 。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 keys 数组,它的键将被用作预期的键集。 +断言 `object` 至少拥有一个提供的 `keys`。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 keys 数组,它的键将被用作预期的键集。 ```ts import { assert, test } from 'vitest' @@ -1226,7 +1226,7 @@ test('assert.hasAnyDeepKeys', () => { - **类型:** `(object: T, keys: Array | { [key: string]: any }, message?: string) => void` -断言 `object` 拥有且仅拥有所有提供的 `keys` 。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 keys 数组,它的键将被用作预期的键集。 +断言 `object` 拥有且仅拥有所有提供的 `keys`。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 keys 数组,它的键将被用作预期的键集。 ```ts import { assert, test } from 'vitest' @@ -1243,7 +1243,7 @@ test('assert.hasAnyDeepKeys', () => { - **类型:** `(object: T, keys: Array | { [key: string]: any }, message?: string) => void` -断言 `object` 包含所有提供的 `keys` 。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 +断言 `object` 包含所有提供的 `keys`。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 ```ts import { assert, test } from 'vitest' @@ -1260,7 +1260,7 @@ test('assert.containsAllDeepKeys', () => { - **类型:** `(object: T, keys: Array | { [key: string]: any }, message?: string) => void` -断言 `object` 不拥有任何提供的 `keys` 。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 +断言 `object` 不拥有任何提供的 `keys`。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 ```ts import { assert, test } from 'vitest' @@ -1277,7 +1277,7 @@ test('assert.doesNotHaveAnyDeepKeys', () => { - **类型:** `(object: T, keys: Array | { [key: string]: any }, message?: string) => void` -断言 `object` 至少不拥有一个提供的 `keys` 。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 +断言 `object` 至少不拥有一个提供的 `keys`。由于 Set 和 Map 可以拥有对象作为键,你可以使用这个断言来进行深度比较。你也可以提供一个单独的对象而不是一个 `keys` 数组,它的键将被用作预期的键集。 ```ts import { assert, test } from 'vitest' @@ -1342,7 +1342,7 @@ test('assert.doesNotThrow', () => { - **类型:** `(val1: OperatorComparable, operator: Operator, val2: OperatorComparable, message?: string) => void` -使用 `operator` 比较 `val1` 和 `val2` 。 +使用 `operator` 比较 `val1` 和 `val2`。 ```ts import { assert, test } from 'vitest' @@ -1613,7 +1613,7 @@ test('assert.oneOf', () => { - **类型:** `(modifier: Function, object: T, property: string, message?: string) => void` -断言 `函数` 用于修改 `property` 所属 `object` 。 +断言 `函数` 用于修改 `property` 所属 `object`。 ```ts import { assert, test } from 'vitest' @@ -1629,7 +1629,7 @@ test('assert.changes', () => { - **类型:** `(modifier: Function, object: T, property: string, change: number, message?: string) => void` -断言 `函数` 通过 `change` 修改 `property` 所属的 `object` 。 +断言 `函数` 通过 `change` 修改 `property` 所属的 `object`。 ```ts import { assert, test } from 'vitest' @@ -1645,7 +1645,7 @@ test('assert.changesBy', () => { - **类型:** `(modifier: Function, object: T, property: string, message?: string) => void` -断言 `函数` 不会通过 `change` 修改 `property` 或 `函数` 返回值的 `object` 。 +断言 `函数` 不会通过 `change` 修改 `property` 或 `函数` 返回值的 `object`。 ```ts import { assert, test } from 'vitest' diff --git a/api/expect.md b/api/expect.md index fa8b33e7e..a427c4613 100644 --- a/api/expect.md +++ b/api/expect.md @@ -36,7 +36,7 @@ expect(input).toBe(2) // jest API 此外,`expect` 可以静态地使用来访问匹配器函数,稍后将会介绍。 ::: warning -如果表达式没有类型错误,则 `expect` 对测试类型没有影响。 如果你想使用 Vitest 作为[类型检查器](/guide/testing-types),请使用 [`expectTypeOf`](/api/expect-typeof) 或 [`assertType`](/api/assert-type) 。 +如果表达式没有类型错误,则 `expect` 对测试类型没有影响。 如果你想使用 Vitest 作为 [类型检查器](/guide/testing-types),请使用 [`expectTypeOf`](/api/expect-typeof) 或 [`assertType`](/api/assert-type)。 ::: ## soft @@ -129,7 +129,7 @@ expect(input).not.toBe(2) // jest API - **类型:** `(value: any) => Awaitable` -`toBe` 可用于断言基元是否相等或对象共享相同的引用。 它相当于调用 `expect(Object.is(3, 3)).toBe(true)` 。 如果对象不相同,但你想检查它们的结构是否相同,可以使用 [`toEqual`](#toequal)。 +`toBe` 可用于断言基元是否相等或对象共享相同的引用。 它相当于调用 `expect(Object.is(3, 3)).toBe(true)`。 如果对象不相同,但你想检查它们的结构是否相同,可以使用 [`toEqual`](#toequal)。 例如,下面的代码检查交易者是否有 13 个苹果。 @@ -153,7 +153,7 @@ test('stocks are the same', () => { }) ``` -尽量不要将 `toBe` 与浮点数一起使用。 由于 JavaScript 对它们进行四舍五入,因此 `0.1 + 0.2` 并不严格是 `0.3` 。 要可靠地断言浮点数,请使用 [`toBeCloseTo`](#tobecloseto) 断言。 +尽量不要将 `toBe` 与浮点数一起使用。 由于 JavaScript 对它们进行四舍五入,因此 `0.1 + 0.2` 并不严格是 `0.3`。 要可靠地断言浮点数,请使用 [`toBeCloseTo`](#tobecloseto) 断言。 ## toBeCloseTo @@ -218,7 +218,7 @@ test('mary doesn\'t have a stock', () => { - **类型:** `() => Awaitable` -`toBeTruthy`断言值在转换为布尔值时为 true。如果你不关心值,只想知道它可以转换为`true`,这将非常有用。 +`toBeTruthy` 断言值在转换为布尔值时为 true。如果你不关心值,只想知道它可以转换为 `true`,这将非常有用。 例如,假设有以下代码,我们不关心 `stocks.getInfo` 的返回值 - 它可能是一个复杂对象、一个字符串或其他任何值。代码仍然可以正常工作。 @@ -252,7 +252,7 @@ test('if we know Bill stock, sell apples to him', () => { - **类型:** `() => Awaitable` -`toBeFalsy` 断言值在转换为布尔值时为 false。如果你不关心值,只想知道它可以转换为`false`,这将非常有用。 +`toBeFalsy` 断言值在转换为布尔值时为 false。如果你不关心值,只想知道它可以转换为 `false`,这将非常有用。 例如,假设有以下代码,我们不关心 `stocks.stockFailed` 的返回值 - 它可能返回任何假值,但代码仍然可以正常工作。 @@ -266,7 +266,7 @@ if (!stocks.stockFailed('Bill')) { } ``` -因此,如果要测试`stocks.stockFailed`是否是虚假的,可以这样写: +因此,如果要测试 `stocks.stockFailed` 是否是虚假的,可以这样写: ```ts import { expect, test } from 'vitest' @@ -286,7 +286,7 @@ test('if Bill stock hasn\'t failed, sell apples to him', () => { - **类型:** `() => Awaitable` -`toBeNull` 只是断言某些内容是否为 `null`。 `.toBe(null)` 的别名。 +`toBeNull` 只是断言某些内容是否为 `null`。`.toBe(null)` 的别名。 ```ts import { expect, test } from 'vitest' @@ -501,8 +501,8 @@ expect(new Error('hi')).toEqual(new Error('hi', { cause: 'x' })) 与 [`.toEqual`](#toequal) 的区别: -- 检查具有 `undefined` 属性的键。 例如 使用 `.toStrictEqual` 时, `{a: undefined, b: 2}` 与 `{b: 2}` 不匹配。 -- 检查数组稀疏性。 例如 使用 `.toStrictEqual` 时, `[, 1]` 与 `[undefined, 1]` 不匹配。 +- 检查具有 `undefined` 属性的键。 例如 使用 `.toStrictEqual` 时,`{a: undefined, b: 2}` 与 `{b: 2}` 不匹配。 +- 检查数组稀疏性。 例如 使用 `.toStrictEqual` 时,`[, 1]` 与 `[undefined, 1]` 不匹配。 - 检查对象类型是否相等。 例如 具有字段 `a` 和 ` b` 的类实例不等于具有字段 `a` 和 ` b` 的文字对象。 ```ts @@ -716,12 +716,14 @@ test('the number of elements must match exactly', () => { 必须将代码包装在一个函数中,否则错误将无法被捕获,测试将失败。 这不适用于异步调用,因为 [rejects](#rejects) 正确地解开了 promise: + ```ts test('expect rejects toThrow', async ({ expect }) => { const promise = Promise.reject(new Error('Test')) await expect(promise).rejects.toThrowError() }) ``` + ::: 例如,如果我们想要测试 `getFruitStock('pineapples')` 是否会抛出错误,我们可以这样写: @@ -1196,7 +1198,7 @@ test('spy function resolved a value', async () => { - **类型**: `(amount: number) => Awaitable` -此断言检查函数是否已成功解析值精确次数(即未 reject)。需要将 spy 函数传递给`expect`。 +此断言检查函数是否已成功解析值精确次数(即未 reject)。需要将 spy 函数传递给 `expect`。 这只会计算已 resolved 的 promises。如果函数返回了一个 promise,但尚未 resolved,则不会计算在内。 @@ -1217,7 +1219,7 @@ test('spy function resolved a value two times', async () => { - **类型**: `(returnValue: any) => Awaitable` -您可以调用此断言来检查函数是否至少成功解析过一次某个值。需要将 spy 函数传递给`expect`。 +您可以调用此断言来检查函数是否至少成功解析过一次某个值。需要将 spy 函数传递给 `expect`。 如果函数返回了一个 promise,但尚未 resolved,则将会失败。 @@ -1237,7 +1239,7 @@ test('spy function resolved a product', async () => { - **Type**: `(returnValue: any) => Awaitable` -您可以调用此断言来检查函数在上次调用时是否已成功解析某个值。需要将 spy 函数传递给`expect`。 +您可以调用此断言来检查函数在上次调用时是否已成功解析某个值。需要将 spy 函数传递给 `expect`。 如果函数返回了一个 promise,但尚未 resolved,则将会失败。 @@ -1489,7 +1491,7 @@ test('object has "apples" key', () => { - **类型:** `(constructor: unknown) => any` -这个不对称的匹配器在与相等性检查一起使用时,只有当该值是指定构造函数的实例时才会返回`true`。 +这个不对称的匹配器在与相等性检查一起使用时,只有当该值是指定构造函数的实例时才会返回 `true`。 如果我们有一个每次生成的值,并且只想知道它是否存在,这将非常有用。 ```ts @@ -1505,9 +1507,9 @@ test('"id" is a number', () => { - **类型:** `(expected: any, precision?: number) => any` -在比较对象属性或数组项中的浮点数时,`expect.closeTo` 非常有用。 如果需要比较数字,请改用 `.toBeCloseTo` 。 +在比较对象属性或数组项中的浮点数时,`expect.closeTo` 非常有用。 如果需要比较数字,请改用 `.toBeCloseTo`。 -可选的 `precision` 参数限制要检查小数点**后**的位数。 对于默认值 `2` ,测试标准为 `Math.abs(expected - received) < 0.005 (that is, 10 ** -2 / 2)` 。 +可选的 `precision` 参数限制要检查小数点 **后** 的位数。 对于默认值 `2`,测试标准为 `Math.abs(expected - received) < 0.005 (that is, 10 ** -2 / 2)`。 例如,此测试以 5 位精度通过: @@ -1580,7 +1582,7 @@ test('basket has empire apples', () => { - **类型:** `(expected: any) => any` -当与相等性检查一起使用时,这个不对称的匹配器将在值为字符串且包含指定子字符串时返回`true`。 +当与相等性检查一起使用时,这个不对称的匹配器将在值为字符串且包含指定子字符串时返回 `true`。 ```ts import { expect, test } from 'vitest' @@ -1605,7 +1607,7 @@ test('variety has "Emp" in its name', () => { - **类型:** `(expected: any) => any` -当与相等性检查一起使用时,这个不对称的匹配器将在值为字符串且包含指定子字符串,或者字符串与正则表达式匹配时返回 `true` 。 +当与相等性检查一起使用时,这个不对称的匹配器将在值为字符串且包含指定子字符串,或者字符串与正则表达式匹配时返回 `true`。 ```ts import { expect, test } from 'vitest' @@ -1630,7 +1632,7 @@ test('variety ends with "re"', () => { - **类型:** `(plugin: PrettyFormatPlugin) => void` -这个方法添加了在创建快照时调用的自定义序列化程序。这是一个高级功能 - 如果想了解更多,请阅读有关[自定义序列化程序的指南](/guide/snapshot#custom-serializer)。 +这个方法添加了在创建快照时调用的自定义序列化程序。这是一个高级功能 - 如果想了解更多,请阅读有关 [自定义序列化程序的指南](/guide/snapshot#custom-serializer)。 如果需要添加自定义序列化程序,应该在 [`setupFiles`](/config/#setupfiles) 中调用此方法。这将影响每个快照。 diff --git a/api/index.md b/api/index.md index 466632cd0..5766eb6c1 100644 --- a/api/index.md +++ b/api/index.md @@ -280,7 +280,7 @@ describe('suite', () => { }) ``` -`test.skip`、 `test.only` 和 `test.todo` 适用于并发测试。以下所有组合均有效: +`test.skip`、`test.only` 和 `test.todo` 适用于并发测试。以下所有组合均有效: ```ts test.concurrent(/* ... */) @@ -504,7 +504,7 @@ test.for([ }) ``` -第二个参数是 [`TestContext`](/guide/test-context) ,你可以用它来执行并发快照等操作,例如: +第二个参数是 [`TestContext`](/guide/test-context),你可以用它来执行并发快照等操作,例如: ```ts test.concurrent.for([ @@ -873,7 +873,7 @@ describe.skipIf(isDev)('prod only test suite', () => { ``` ::: warning -将 Vitest 用作[类型检查器](/guide/testing-types)时,你不能使用此语法。 +将 Vitest 用作 [类型检查器](/guide/testing-types) 时,你不能使用此语法。 ::: ### describe.runIf @@ -894,7 +894,7 @@ describe.runIf(isDev)('dev only test suite', () => { ``` ::: warning -将 Vitest 用作[类型检查器](/guide/testing-types)时,你不能使用此语法。 +将 Vitest 用作 [类型检查器](/guide/testing-types) 时,你不能使用此语法。 ::: ### describe.only @@ -954,7 +954,7 @@ describe.concurrent('suite', () => { }) ``` -`.skip`、`.only`和`.todo`适用于并发测试套件。以下所有组合都有效: +`.skip`、`.only` 和 `.todo` 适用于并发测试套件。以下所有组合都有效: ```ts describe.concurrent(/* ... */) @@ -963,7 +963,7 @@ describe.only.concurrent(/* ... */) // 或 describe.concurrent.only(/* ... */) describe.todo.concurrent(/* ... */) // 或 describe.concurrent.todo(/* ... */) ``` -运行并发测试时,快照和断言必须使用本地 [测试上下文](/guide/test-context.md) 中的 `expect` ,以确保检测到正确的测试。 +运行并发测试时,快照和断言必须使用本地 [测试上下文](/guide/test-context.md) 中的 `expect`,以确保检测到正确的测试。 ```ts describe.concurrent('suite', () => { @@ -1032,7 +1032,7 @@ describe.shuffle('suite', () => { // 顺序取决于配置中的 `sequence.seed` 选项(默认为 `Date.now()`) ``` -`.skip`、 `.only` 和 `.todo` 适用于随机测试套件。 +`.skip`、`.only` 和 `.todo` 适用于随机测试套件。 ::: warning 在将 Vitest 用作 [类型检查器](/guide/testing-types) 时,不能使用此语法。 @@ -1167,7 +1167,7 @@ beforeEach(async () => { }) ``` -这里, `beforeEach` 确保每次测试都会添加用户。 +这里,`beforeEach` 确保每次测试都会添加用户。 `beforeEach` 还接受一个可选的清理函数(相当于 `afterEach`)。 @@ -1285,7 +1285,7 @@ test('performs a query', () => { ``` ::: warning -如果要并发运行测试,应该始终使用测试上下文中的 `onTestFinished` ,因为 Vitest 不会在全局 hook 中跟踪并发测试: +如果要并发运行测试,应该始终使用测试上下文中的 `onTestFinished`,因为 Vitest 不会在全局 hook 中跟踪并发测试: ```ts {3,5} import { test } from 'vitest' @@ -1341,7 +1341,7 @@ test('performs a query', () => { ``` ::: warning -如果要并发运行测试,应始终使用测试上下文中的 `onTestFailed` ,因为 Vitest 不会在全局 hook 中跟踪并发测试: +如果要并发运行测试,应始终使用测试上下文中的 `onTestFailed`,因为 Vitest 不会在全局 hook 中跟踪并发测试: ```ts {3,5-7} import { test } from 'vitest' diff --git a/eslint.config.js b/eslint.config.js index 88862c03a..7cfe56a2d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -45,6 +45,7 @@ export default antfu( 'no-self-compare': 'off', 'import/no-mutable-exports': 'off', 'markdown/no-multiple-h1': 'off', + 'markdown/no-missing-link-fragments': 'off', }, }, ) diff --git a/guide/reporters.md b/guide/reporters.md index 5a58c0188..81ef8e232 100644 --- a/guide/reporters.md +++ b/guide/reporters.md @@ -5,7 +5,7 @@ outline: deep # 报告器 {#reporters} -Vitest 提供了几种内置报告器,以不同格式显示测试输出,以及使用自定义报告器的能力。你可以使用 `--reporter` 命令行选项,或者在你的 `outputFile`[配置选项](https://vitest.dev/config/#reporters) 中加入 `reporters` 属性来选择不同的报告器。如果没有指定报告器,Vitest 将使用下文所述的默认报告器。 +Vitest 提供了几种内置报告器,以不同格式显示测试输出,以及使用自定义报告器的能力。你可以使用 `--reporter` 命令行选项,或者在你的 `outputFile` [配置选项](https://vitest.dev/config/#reporters) 中加入 `reporters` 属性来选择不同的报告器。如果没有指定报告器,Vitest 将使用下文所述的默认报告器。 通过命令行使用报告器: @@ -37,7 +37,7 @@ export default defineConfig({ ## 报告器输出 {#reporter-output} -默认情况下,Vitest 的报告器会将输出打印到终端。当使用 `json` 、`html` 或 `junit` 报告器时,你可以在 Vite 配置文件中或通过 CLI 加入 `outputFile` [配置选项](https://vitest.dev/config/#outputfile),将测试输出写入文件。 +默认情况下,Vitest 的报告器会将输出打印到终端。当使用 `json`、`html` 或 `junit` 报告器时,你可以在 Vite 配置文件中或通过 CLI 加入 `outputFile` [配置选项](https://vitest.dev/config/#outputfile),将测试输出写入文件。 :::code-group @@ -102,6 +102,7 @@ export default defineConfig({ 我们可以通过配置报告器来禁用摘要: :::code-group + ```ts [vitest.config.ts] export default defineConfig({ test: { @@ -111,6 +112,7 @@ export default defineConfig({ }, }) ``` + ::: 项目中的测试输出示例: @@ -304,6 +306,7 @@ AssertionError: expected 5 to be 4 // Object.is equality 输出的 XML 包含嵌套的 `testsuites` 和 `testcase` 标签。这些也可以通过报告选项 `suiteName` 和 `classnameTemplate` 进行自定义。`classnameTemplate` 可以是一个模板字符串或者一个函数。 `classnameTemplate` 选项支持的占位符有: + - filename - filepath @@ -409,7 +412,7 @@ export default defineConfig({ ::: ::: tip -该报告器需要安装 [`@vitest/ui`](/guide/ui) 。 +该报告器需要安装 [`@vitest/ui`](/guide/ui)。 ::: ### TAP 报告器 {#tap-reporter} @@ -515,7 +518,7 @@ export default defineConfig({ ### GitHub Actions Reporter {#github-actions-reporter} 输出 [工作流命令](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-error-message) -为测试失败提供注释。当 `process.env.GITHUB_ACTIONS === 'true'` 时,会自动启用 [`default`](#default-reporter)报告器。 +为测试失败提供注释。当 `process.env.GITHUB_ACTIONS === 'true'` 时,会自动启用 [`default`](#default-reporter) 报告器。 GitHub Actions GitHub Actions @@ -587,10 +590,10 @@ export default defineConfig({ ::: -此外,你还可以定义自己的[自定义报告器](/advanced/reporters),并通过指定文件路径来使用它们: +此外,你还可以定义自己的 [自定义报告器](/advanced/reporters),并通过指定文件路径来使用它们: ```bash npx vitest --reporter=./path/to/reporter.ts ``` -自定义报告器应实现[报告器接口](https://github.com/vitest-dev/vitest/blob/main/packages/vitest/src/node/types/reporter.ts)。 +自定义报告器应实现 [报告器接口](https://github.com/vitest-dev/vitest/blob/main/packages/vitest/src/node/types/reporter.ts)。 diff --git a/guide/test-annotations.md b/guide/test-annotations.md index 6bd3b7a15..cff268dbd 100644 --- a/guide/test-annotations.md +++ b/guide/test-annotations.md @@ -5,7 +5,7 @@ outline: deep # 测试注释 {#test-annotations} -Vitest 支持通过 [`context.annotate`](/guide/test-context#annotate) API 为测试添加自定义消息和文件注释,这些测试注释将附加到测试用例上,并通过 [`onTestAnnotate`](/advanced/api/reporters#ontestannotate) 钩子传递给报告器。 +Vitest 支持通过 [`context.annotate`](/guide/test-context#annotate) API 为测试添加自定义消息和文件注释,这些测试注释将附加到测试用例上,并通过 [`onTestAnnotate`](/advanced/api/reporters#ontestannotate) 钩子传递给报告器。 ```ts test('hello world', async ({ annotate }) => { @@ -27,6 +27,7 @@ test('hello world', async ({ annotate }) => { 根据使用的报告器不同,这些测试注释的显示方式也会有所差异。 ## 内置报告器 {#built-in-reporters} + ### default `默认报告器` 仅在测试失败时打印注解: @@ -67,7 +68,7 @@ Error: thrown error ### html -HTML 报告器会以与 UI模式 相同的方式显示测试注释。您可以在调用那行看到测试注释。目前,如果测试文件中没有调用测试注释,您将无法在 UI模式 中看到它。我们计划支持一个单独的测试摘要视图,届时这些测试注释将会显示。 +HTML 报告器会以与 UI 模式 相同的方式显示测试注释。您可以在调用那行看到测试注释。目前,如果测试文件中没有调用测试注释,您将无法在 UI 模式 中看到它。我们计划支持一个单独的测试摘要视图,届时这些测试注释将会显示。 Vitest UI Vitest UI diff --git a/guide/testing-types.md b/guide/testing-types.md index 0c4736edb..d19b9f897 100644 --- a/guide/testing-types.md +++ b/guide/testing-types.md @@ -61,7 +61,7 @@ test/test.ts:999:999 - error TS2344: Type '{ a: string; }' does not satisfy the 999 expectTypeOf({a: 1}).toEqualTypeOf<{a: string}>() ``` -请注意,报告的类型约束是一个可读性强的消息,指定了"期望"和"实际"类型。不要字面上解读句子 `Types of property 'a' are incompatible // Type 'string' is not assignable to type "Expected: string, Actual: number"` ,而是看属性名(`'a'`)和消息内容:`Expected: string, Actual: number`。这将告诉你出了什么问题,在大多数情况下。当然,对于非常复杂的类型,调试可能需要更多的努力,并且可能需要一些试验。如果错误消息实际上是误导性的,请 [提出问题](https://github.com/mmkal/expect-type)。 +请注意,报告的类型约束是一个可读性强的消息,指定了"期望"和"实际"类型。不要字面上解读句子 `Types of property 'a' are incompatible // Type 'string' is not assignable to type "Expected: string, Actual: number"`,而是看属性名(`'a'`)和消息内容:`Expected: string, Actual: number`。这将告诉你出了什么问题,在大多数情况下。当然,对于非常复杂的类型,调试可能需要更多的努力,并且可能需要一些试验。如果错误消息实际上是误导性的,请 [提出问题](https://github.com/mmkal/expect-type)。 对于像 `expectTypeOf(1).toBeString()` 这样的断言,`toBe...` 方法(如 `toBeString`、`toBeNumber`、`toBeVoid` 等)在被测试的 `Actual` 类型不匹配时会解析为一个不可调用的类型。例如,失败的断言可能会显示如下内容: @@ -77,7 +77,7 @@ test/test.ts:999:999 - error TS2349: This expression is not callable. 如果 TypeScript 添加了对 ["throw" 类型](https://github.com/microsoft/TypeScript/pull/40468) 的支持,这些错误消息将会显著改进。在那之前,它们需要一定程度的仔细观察。 -#### 具体的 "expected " 对象与类型参数 {#concrete-expected-objects-vs-typeargs} +### 具体的 "expected" 对象与类型参数 {#concrete-expected-objects-vs-typeargs} 像这样的断言的错误消息: @@ -111,7 +111,7 @@ assertType(answer) ``` ::: tip -使用 `@ts-expect-error` 语法时,你可能想确保没有输入错误。你可以通过在 [`test.include`](/config/#include) 配置选项中包含你的类型文件来做到这一点,因此 Vitest 实际上也会*运行*这些测试并因 `ReferenceError` 而失败。 +使用 `@ts-expect-error` 语法时,你可能想确保没有输入错误。你可以通过在 [`test.include`](/config/#include) 配置选项中包含你的类型文件来做到这一点,因此 Vitest 实际上也会 _运行_ 这些测试并因 `ReferenceError` 而失败。 这将通过,因为它预计会出现错误,但 “answer” 这个词有错别字,所以这是一个误报错误: diff --git a/guide/ui.md b/guide/ui.md index 3936397a9..2f473767d 100644 --- a/guide/ui.md +++ b/guide/ui.md @@ -16,7 +16,7 @@ npm i -D @vitest/ui vitest --ui ``` -最后,你可以访问 Vitest UI 界面,通过 `http://localhost:51204/__vitest__/` +最后,你可以访问 Vitest UI 界面,通过 `http://localhost:51204/__vitest__/` ::: warning UI 是交互式的,需要一个正在运行的 Vite 服务器,因此请确保在 `watch` 模式(默认模式)下运行 Vitest。或者,你可以通过在配置的 `reporters` 选项中指定 `html` 来生成一个与 Vitest UI 完全相同的静态 HTML 报告。 diff --git a/guide/using-plugins.md b/guide/using-plugins.md index bcc15ba8a..e75f1e06b 100644 --- a/guide/using-plugins.md +++ b/guide/using-plugins.md @@ -2,7 +2,7 @@ title: 使用插件 | 指南 --- -# 使用插件 +# 使用插件 {#using-plugins} Vitest 可以使用插件进行扩展,类似于 Vite 插件的工作方式。这允许你使用相同的 API 和 Vite 插件概念来增强和自定义 Vitest 的功能。 diff --git a/guide/why.md b/guide/why.md index 696c17151..6358f1390 100644 --- a/guide/why.md +++ b/guide/why.md @@ -5,14 +5,14 @@ title: 为什么是 Vitest | 指南 # 为什么是 Vitest {#why-vitest} :::tip 提示 -该文档假设你是熟悉 Vite 的。开始阅读之前建议先浏览 [为什么选 Vite](https://cn.vitejs.dev/guide/why.html) 和 [下一代前端工具 ViteJS](https://www.bilibili.com/video/BV1kh411Q7WN) ,在视频中 [尤雨溪](https://bsky.app/profile/evanyou.me) 做了一个示范来解释 Vite 的主要概念。 +该文档假设你是熟悉 Vite 的。开始阅读之前建议先浏览 [为什么选 Vite](https://cn.vitejs.dev/guide/why.html) 和 [下一代前端工具 ViteJS](https://www.bilibili.com/video/BV1kh411Q7WN),在视频中 [尤雨溪](https://bsky.app/profile/evanyou.me) 做了一个示范来解释 Vite 的主要概念。 ::: ## Vite 原生测试运行器的必要性 {#the-need-for-a-vite-native-test-runner} Vite 天然支持常见的 Web 模式,同时支持 glob 导入和 SSR 等功能,而且它拥有许多插件和集成框架,从而慢慢形成一个活跃的生态社区。它的开发和构建模式是其成功的关键。对于文档构建框架,Vite 提供了一些基于 SSG 的替代方案。但是 Vite 的单元测试形式还不是十分清晰,而对于目前一些现有方案,比如 [Jest](https://jestjs.io/zh-Hans/) 而言,它们会在不同的上下文环境中被创建的。并且 Jest 和 Vite 之间有很多重复的部分,让用户不得不创建两个不同的配置文件。 -使用 Vite 开发服务器在测试过程中对文件进行转换,使得创建一个简单的测试运行器变得更加容易。该测试运行器无需处理源文件转换的复杂性,只需专注于提供最佳的开发体验。Vitest 与你的应用使用相同的配置(通过 `vite.config.js` ),在开发、构建和测试过程中共享相同的转换流水线。它还提供了可扩展的插件 API ,让你和你的工具维护者能够与 Vite 进行一流的集成。Vitest 从一开始就考虑了与 Vite 的协同工作,充分利用了 Vite 在开发体验方面的改进,如即时的热模块重载( HMR )。这就是 Vitest ,一个由 Vite 驱动的下一代测试框架。 +使用 Vite 开发服务器在测试过程中对文件进行转换,使得创建一个简单的测试运行器变得更加容易。该测试运行器无需处理源文件转换的复杂性,只需专注于提供最佳的开发体验。Vitest 与你的应用使用相同的配置(通过 `vite.config.js`),在开发、构建和测试过程中共享相同的转换流水线。它还提供了可扩展的插件 API ,让你和你的工具维护者能够与 Vite 进行一流的集成。Vitest 从一开始就考虑了与 Vite 的协同工作,充分利用了 Vite 在开发体验方面的改进,如即时的热模块重载( HMR )。这就是 Vitest ,一个由 Vite 驱动的下一代测试框架。 由于 Jest 的大规模使用,Vitest 提供了与之兼容的 API,允许大家在大多数项目中将其作为备选使用。同时还包括了单元测试时最常见的功能(模拟,快照以及覆盖率)。Vitest 非常注重性能,尽可能多地使用 Worker 线程进行并发运行。并且在一些端口的测试运行速度提高了一个数量级。监听模式默认启用,与 Vite 推动开发者优先体验的理念保持一致。 即使在开发体验上进行了改进,Vitest 通过仔细挑选其依赖项(或直接内联所需的部分)来保持轻量级。 From 6dfa0256552c835dbbdf90a8132d5030377ca97b Mon Sep 17 00:00:00 2001 From: noise Date: Tue, 21 Jul 2026 20:02:00 +0800 Subject: [PATCH 3/6] fix: document style --- advanced/api/reporters-life-cycle.md | 21 +++ advanced/api/reporters.md | 28 +-- advanced/api/test-collection.md | 1 + advanced/api/test-specification.md | 3 + advanced/reporters.md | 1 + api/mock.md | 4 +- api/vi.md | 46 ++--- blog/vitest-3-2.md | 13 +- blog/vitest-3.md | 6 +- config/file.md | 10 +- config/index.md | 100 ++++++----- eslint.config.js | 1 + guide/browser/assertion-api.md | 13 +- guide/browser/commands.md | 12 +- guide/browser/config.md | 5 +- guide/browser/context.md | 3 +- guide/browser/examples.md | 11 +- guide/browser/index.md | 65 ++++++- guide/browser/interactivity-api.md | 15 +- guide/browser/locators.md | 24 +-- guide/browser/multiple-setups.md | 6 + guide/browser/playwright.md | 2 +- guide/browser/retry-ability.md | 9 +- guide/browser/webdriverio.md | 2 +- guide/cli-generated.md | 24 +-- guide/cli-table.md | 248 +++++++++++++-------------- guide/cli.md | 7 +- guide/common-errors.md | 6 +- guide/comparisons.md | 4 +- guide/coverage.md | 6 +- guide/debugging.md | 17 +- guide/extending-matchers.md | 22 ++- guide/features.md | 18 +- guide/filtering.md | 1 + guide/ide.md | 10 +- guide/improving-performance.md | 8 +- guide/in-source.md | 4 +- guide/index.md | 42 ++--- guide/migration.md | 41 +++-- guide/mocking.md | 26 ++- guide/parallelism.md | 6 +- guide/profiling-test-performance.md | 30 ++-- guide/projects.md | 15 ++ guide/test-context.md | 9 +- public/cover.png | Bin 0 -> 21781 bytes public/vitest-jb.png | Bin 0 -> 18287 bytes public/vitest_cover.png | Bin 0 -> 35549 bytes 47 files changed, 558 insertions(+), 387 deletions(-) create mode 100644 advanced/api/reporters-life-cycle.md create mode 100644 public/cover.png create mode 100644 public/vitest-jb.png create mode 100644 public/vitest_cover.png diff --git a/advanced/api/reporters-life-cycle.md b/advanced/api/reporters-life-cycle.md new file mode 100644 index 000000000..8da8416e3 --- /dev/null +++ b/advanced/api/reporters-life-cycle.md @@ -0,0 +1,21 @@ +- [`onInit`](#oninit) +- [`onTestRunStart`](#ontestrunstart) + - [`onTestModuleQueued`](#ontestmodulequeued) + - [`onTestModuleCollected`](#ontestmodulecollected) + - [`onTestModuleStart`](#ontestmodulestart) + - [`onTestSuiteReady`](#ontestsuiteready) + - [`onHookStart(beforeAll)`](#onhookstart) + - [`onHookEnd(beforeAll)`](#onhookend) + - [`onTestCaseReady`](#ontestcaseready) + - [`onTestAnnotate`](#ontestannotate) 3.2.0 + - [`onHookStart(beforeEach)`](#onhookstart) + - [`onHookEnd(beforeEach)`](#onhookend) + - [`onHookStart(afterEach)`](#onhookstart) + - [`onHookEnd(afterEach)`](#onhookend) + - [`onTestCaseResult`](#ontestcaseresult) + - [`onHookStart(afterAll)`](#onhookstart) + - [`onHookEnd(afterAll)`](#onhookend) + - [`onTestSuiteResult`](#ontestsuiteresult) + - [`onTestModuleEnd`](#ontestmoduleend) + - [`onCoverage`](#oncoverage) +- [`onTestRunEnd`](#ontestrunend) diff --git a/advanced/api/reporters.md b/advanced/api/reporters.md index 632376fe8..ba9e84775 100644 --- a/advanced/api/reporters.md +++ b/advanced/api/reporters.md @@ -6,27 +6,7 @@ Vitest 拥有自己的测试运行生命周期。这些生命周期通过报告器的方法来表示: -- [`onInit`](#oninit) -- [`onTestRunStart`](#ontestrunstart) - - [`onTestModuleQueued`](#ontestmodulequeued) - - [`onTestModuleCollected`](#ontestmodulecollected) - - [`onTestModuleStart`](#ontestmodulestart) - - [`onTestSuiteReady`](#ontestsuiteready) - - [`onHookStart(beforeAll)`](#onhookstart) - - [`onHookEnd(beforeAll)`](#onhookend) - - [`onTestCaseReady`](#ontestcaseready) - - [`onTestAnnotate`](#ontestannotate) 3.2.0 - - [`onHookStart(beforeEach)`](#onhookstart) - - [`onHookEnd(beforeEach)`](#onhookend) - - [`onHookStart(afterEach)`](#onhookstart) - - [`onHookEnd(afterEach)`](#onhookend) - - [`onTestCaseResult`](#ontestcaseresult) - - [`onHookStart(afterAll)`](#onhookstart) - - [`onHookEnd(afterAll)`](#onhookend) - - [`onTestSuiteResult`](#ontestsuiteresult) - - [`onTestModuleEnd`](#ontestmoduleend) - - [`onCoverage`](#oncoverage) -- [`onTestRunEnd`](#ontestrunend) + 除非被跳过,否则单个模块中的测试和 reporters 将按顺序报告。所有跳过的测试将在 reporters /模块的末尾报告。 @@ -60,6 +40,7 @@ function onInit(vitest: Vitest): Awaitable 请注意,我们还可以通过 [`project`](/advanced/api/test-project) 属性从测试用例、套件和测试模块中访问 `vitest` 实例,但在此方法中存储对 `vitest` 的引用也可能有用。 ::: details 示例 + ```ts import type { Reporter, TestSpecification, Vitest } from 'vitest/node' @@ -81,6 +62,7 @@ class MyReporter implements Reporter { export default new MyReporter() ``` + ::: ## onBrowserInit 实验性 {#onbrowserinit} @@ -104,6 +86,7 @@ function onTestRunStart( 如果 Vitest 没有找到任何要运行的测试文件,此事件将以空数组调用,然后 [`onTestRunEnd`](#ontestrunend) 将立即被调用。 ::: details 示例 + ```ts import type { Reporter, TestSpecification } from 'vitest/node' @@ -115,6 +98,7 @@ class MyReporter implements Reporter { export default new MyReporter() ``` + ::: ::: tip 弃用通知 @@ -146,6 +130,7 @@ function onTestRunEnd( 如果 Vitest 没有找到任何要运行的测试文件,此事件将以空的模块和错误数组调用,状态将取决于 [`config.passWithNoTests`](/config/#passwithnotests) 的值。 ::: details 示例 + ```ts import type { Reporter, @@ -182,6 +167,7 @@ class MyReporter implements Reporter { export default new MyReporter() ``` + ::: ::: tip 弃用通知 diff --git a/advanced/api/test-collection.md b/advanced/api/test-collection.md index f7dd40de6..0a8e33744 100644 --- a/advanced/api/test-collection.md +++ b/advanced/api/test-collection.md @@ -12,6 +12,7 @@ for (const child of module.children) { console.log(child.type, child.name) } ``` + ::: ## size diff --git a/advanced/api/test-specification.md b/advanced/api/test-specification.md index 6d7a65e44..2f1cf28ba 100644 --- a/advanced/api/test-specification.md +++ b/advanced/api/test-specification.md @@ -50,12 +50,14 @@ Vite 模块图中的模块 ID。通常,它是一个使用 POSIX 分隔符的 请注意,如果这些行中的至少一行没有测试,整个测试套件将会失败。以下是一个正确的 `testLines` 配置示例: ::: code-group + ```ts [script.js] const specification = project.createSpecification( resolve('./example.test.ts'), [3, 8, 9], ) ``` + ```ts:line-numbers{3,8,9} [example.test.js] import { test, describe } from 'vitest' @@ -68,6 +70,7 @@ describe('a group of tests', () => { // [!code error] test.skip('skipped test') }) ``` + ::: ## toJSON diff --git a/advanced/reporters.md b/advanced/reporters.md index 004b91837..b5be3978d 100644 --- a/advanced/reporters.md +++ b/advanced/reporters.md @@ -57,6 +57,7 @@ export default defineConfig({ }, }) ``` + ## 报告的任务 {#reported-tasks} 建议使用 Reported Tasks API,而不是使用报告器接收到的任务。 diff --git a/api/mock.md b/api/mock.md index 70f93cec3..172027bda 100644 --- a/api/mock.md +++ b/api/mock.md @@ -18,7 +18,7 @@ market.getApples() getApplesSpy.mock.calls.length === 1 ``` -我们应该在 [`expect`](/api/expect) 上使用 mock 断言(例如 [`toHaveBeenCalled`](/api/expect#tohavebeencalled) )来断言 mock 结果。在这里我们介绍了用于操作 mock 行为的可用属性和方法。 +我们应该在 [`expect`](/api/expect) 上使用 mock 断言(例如 [`toHaveBeenCalled`](/api/expect#tohavebeencalled))来断言 mock 结果。在这里我们介绍了用于操作 mock 行为的可用属性和方法。 ::: tip 下列类型中的自定义函数实现通过泛型 `` 标记。 @@ -425,7 +425,7 @@ const results: MockResult>[] - `'throw'`:函数执行过程中抛出了异常。 - `'incomplete'`:函数尚未结束,仍在运行。 -`value` 属性包含返回值或抛出的错误。如果函数返回一个 `Promise`,那么即使Promise rejected,`result` 也将始终为 `'return'`。 +`value` 属性包含返回值或抛出的错误。如果函数返回一个 `Promise`,那么即使 Promise rejected,`result` 也将始终为 `'return'`。 ```js const fn = vi diff --git a/api/vi.md b/api/vi.md index 221a80fe3..56a5ae0cb 100644 --- a/api/vi.md +++ b/api/vi.md @@ -19,14 +19,14 @@ import { vi } from 'vitest' - **类型**: `(path: string, factory?: MockOptions | ((importOriginal: () => unknown) => unknown)) => void` - **类型**: `(path: Promise, factory?: MockOptions | ((importOriginal: () => T) => T | Promise)) => void` -用另一个模块替换提供的 `path` 中的所有导入模块。我们可以在路径内使用配置的 Vite 别名。对 `vi.mock` 的调用是悬挂式的,因此在何处调用并不重要。它总是在所有导入之前执行。如果需要在其作用域之外引用某些变量,可以在 [`vi.hoisted`](/api/vi#vi-hoisted)中定义它们,并在 `vi.mock` 中引用它们。 +用另一个模块替换提供的 `path` 中的所有导入模块。我们可以在路径内使用配置的 Vite 别名。对 `vi.mock` 的调用是悬挂式的,因此在何处调用并不重要。它总是在所有导入之前执行。如果需要在其作用域之外引用某些变量,可以在 [`vi.hoisted`](/api/vi#vi-hoisted) 中定义它们,并在 `vi.mock` 中引用它们。 ::: warning `vi.mock` 仅对使用 `import` 关键字导入的模块有效。它对 `require` 无效。 -为了提升 `vi.mock` ,Vitest 会静态分析文件。它会指出不能使用未直接从 `vitest` 软件包导入的 `vi` (例如,从某个实用程序文件导入)。使用 `vi.mock` 与从 `vitest` 导入的 `vi` 一起使用,或者启用 [`globals`](/config/#globals) 配置选项。 +为了提升 `vi.mock`,Vitest 会静态分析文件。它会指出不能使用未直接从 `vitest` 软件包导入的 `vi`(例如,从某个实用程序文件导入)。使用 `vi.mock` 与从 `vitest` 导入的 `vi` 一起使用,或者启用 [`globals`](/config/#globals) 配置选项。 -Vitest 不会模拟 [setup file](/config/#setupfiles) 中导入的模块,因为这些模块在运行测试文件时已被缓存。我们可以在 [`vi.hoisted`](#vi-hoisted) 中调用 [`vi.resetModules()`](#vi-resetmodules) ,在运行测试文件前清除所有模块缓存。 +Vitest 不会模拟 [setup file](/config/#setupfiles) 中导入的模块,因为这些模块在运行测试文件时已被缓存。我们可以在 [`vi.hoisted`](#vi-hoisted) 中调用 [`vi.resetModules()`](#vi-resetmodules),在运行测试文件前清除所有模块缓存。 ::: 如果定义了 `factory` 函数,所有导入都将返回其结果。Vitest 只调用一次 factory,并缓存所有后续导入的结果,直到 [`vi.unmock`](#vi-unmock) 或 [`vi.doUnmock`](#vi-dounmock) 被调用。 @@ -48,6 +48,7 @@ expect(result).toBe(3) expect(calculator).toHaveBeenCalledWith(1, 2) expect(calculator).toHaveReturned(3) ``` + Vitest 还在 `vi.mock` 和 `vi.doMock` 方法中支持 module promise 而非字符串,以获得更好的集成开发环境支持。当文件被移动时,路径会被更新,`importOriginal` 也会自动继承类型。使用此签名还将强制工厂返回类型与原始模块兼容(但每次导出都是可选的)。 ```ts @@ -68,11 +69,11 @@ vi.mock(import('./path/to/module.js'), async (importOriginal) => { 例如,使用 `import('./path/to/module.js')`,而不是 `import('@/module')`。 ::: warning -`vi.mock` 被提升(换句话说,_移动_)到**文件的顶部**。这意味着无论何时写入它(无论是在 `beforeEach` 还是 `test`),它都会在此之前被调用。 +`vi.mock` 被提升(换句话说,_移动_)到 **文件的顶部**。这意味着无论何时写入它(无论是在 `beforeEach` 还是 `test`),它都会在此之前被调用。 这也意味着不能在 factory 内部使用任何在 factory 外部定义的变量。 -如果需要在 factory 内部使用变量,请尝试 [`vi.doMock`](#vi-domock) 。它以同样的方式工作,但不会被吊起。请注意,它只能模拟后续的导入。 +如果需要在 factory 内部使用变量,请尝试 [`vi.doMock`](#vi-domock)。它以同样的方式工作,但不会被吊起。请注意,它只能模拟后续的导入。 如果在 `vi.mock` 之前声明了 `vi.hoisted` 方法,也可以引用该方法定义的变量: @@ -113,7 +114,7 @@ vi.mock('./path/to/module.js', () => { ``` ::: -如果要模拟的文件旁边有一个 `__mocks__` 文件夹,且没有提供工厂,Vitest 将尝试在 `__mocks__` 子文件夹中找到一个同名文件,并将其作为实际模块使用。如果模拟的是依赖关系,Vitest 会尝试在项目的 [root](/config/#root)(默认为 `process.cwd()` )中找到 `__mocks__` 文件夹。我们可以通过 [`deps.moduleDirectories`](/config/#deps-moduledirectories) 配置选项告诉 Vitest 依赖项的位置。 +如果要模拟的文件旁边有一个 `__mocks__` 文件夹,且没有提供工厂,Vitest 将尝试在 `__mocks__` 子文件夹中找到一个同名文件,并将其作为实际模块使用。如果模拟的是依赖关系,Vitest 会尝试在项目的 [root](/config/#root)(默认为 `process.cwd()`)中找到 `__mocks__` 文件夹。我们可以通过 [`deps.moduleDirectories`](/config/#deps-moduledirectories) 配置选项告诉 Vitest 依赖项的位置。 例如,我们有这样的文件结构: @@ -128,7 +129,7 @@ vi.mock('./path/to/module.js', () => { - increment.test.js ``` -如果在没有提供工厂或选项的测试文件中调用 `vi.mock` ,它会在 `__mocks__` 文件夹中找到一个文件作为模块使用: +如果在没有提供工厂或选项的测试文件中调用 `vi.mock`,它会在 `__mocks__` 文件夹中找到一个文件作为模块使用: ```ts [increment.test.js] import { vi } from 'vitest' @@ -147,7 +148,7 @@ axios.get(`/apples/${increment(1)}`) ::: warning -请注意,如果不调用 `vi.mock` ,模块**不会**被自动模拟。要复制 Jest 的自动锁定行为,可以在 [`setupFiles`](/config/#setupfiles) 中为每个所需的模块调用 `vi.mock` 。 +请注意,如果不调用 `vi.mock`,模块 **不会** 被自动模拟。要复制 Jest 的自动锁定行为,可以在 [`setupFiles`](/config/#setupfiles) 中为每个所需的模块调用 `vi.mock`。 ::: 如果没有提供 `__mocks__` 文件夹或工厂,Vitest 将导入原始模块并自动模拟其所有输出。有关应用的规则,请参阅 [模块](/guide/mocking#automocking-algorithm)。 @@ -333,7 +334,7 @@ test('module has old state', async () => { ``` ::: warning -不会重置 mock 注册表。要清除 mock 注册表,请使用 [`vi.unmock`](#vi-unmock) 或 [`vi.doUnmock`](#vi-dounmock) 。 +不会重置 mock 注册表。要清除 mock 注册表,请使用 [`vi.unmock`](#vi-unmock) 或 [`vi.doUnmock`](#vi-dounmock)。 ::: ### vi.dynamicImportSettled @@ -441,7 +442,7 @@ expect(mocked.nested.method()).toBe('mocked nested') - **类型:** `(object: T, method: K, accessType?: 'get' | 'set') => MockInstance` -创建与 [`vi.fn()`](#vi-fn) 类似的对象的方法或 getter/setter 的监听(spy) 。它会返回一个 [mock 函数](/api/mock) 。 +创建与 [`vi.fn()`](#vi-fn) 类似的对象的方法或 getter/setter 的监听(spy) 。它会返回一个 [mock 函数](/api/mock)。 ```ts let apples = 0 @@ -459,7 +460,7 @@ expect(spy).toHaveReturnedWith(1) ``` ::: tip -若运行环境支持 [显式资源管理](https://github.com/tc39/proposal-explicit-resource-management) ,可将 `const` 替换为 `using`。离开当前块级作用域时,系统会自动对被 mock 的函数调用 `mockRestore`,特别适用于已打 spy 的方法。 +若运行环境支持 [显式资源管理](https://github.com/tc39/proposal-explicit-resource-management),可将 `const` 替换为 `using`。离开当前块级作用域时,系统会自动对被 mock 的函数调用 `mockRestore`,特别适用于已打 spy 的方法。 ```ts it('calls console.log', () => { @@ -469,10 +470,11 @@ it('calls console.log', () => { }) // console.log is restored here ``` + ::: ::: tip -你可以在 [`afterEach`](/api/#aftereach)(或启用 [`test.restoreMocks`](/config/#restoreMocks) )中调用 [`vi.restoreAllMocks`](#vi-restoreallmocks) ,将所有方法还原为原始实现。这将还原原始的 [object descriptor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) ,因此无法更改方法的实现: +你可以在 [`afterEach`](/api/#aftereach)(或启用 [`test.restoreMocks`](/config/#restoreMocks))中调用 [`vi.restoreAllMocks`](#vi-restoreallmocks),将所有方法还原为原始实现。这将还原原始的 [object descriptor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty),因此无法更改方法的实现: ```ts const cart = { @@ -774,7 +776,7 @@ vi.runAllTimers() - **类型:** `() => Promise` 该方法将异步调用每个已启动的定时器,直到定时器队列为空。这意味着在 `runAllTimersAsync` 期间调用的每个定时器都会被触发,即使是异步定时器。如果我们有一个无限的时间间隔、 -会在尝试 10000 次后抛出(可使用 [`fakeTimers.loopLimit`](/config/#faketimers-looplimit) )。 +会在尝试 10000 次后抛出(可使用 [`fakeTimers.loopLimit`](/config/#faketimers-looplimit))。 ```ts setTimeout(async () => { @@ -832,7 +834,7 @@ await vi.runOnlyPendingTimersAsync() - **类型**: `(date: string | number | Date) => void` -如果启用了伪计时器,此方法将模拟用户更改系统时钟(将影响与日期相关的 API,如 `hrtime` 、`performance.now` 或 `new Date()` ),但不会触发任何计时器。如果未启用假定时器,该方法将仅模拟 `Date.*` 调用。 +如果启用了伪计时器,此方法将模拟用户更改系统时钟(将影响与日期相关的 API,如 `hrtime`、`performance.now` 或 `new Date()`),但不会触发任何计时器。如果未启用假定时器,该方法将仅模拟 `Date.*` 调用。 适用于需要测试依赖当前日期的场景,例如代码中的 [Luxon](https://github.com/moment/luxon/) 库调用。 @@ -853,22 +855,22 @@ vi.useRealTimers() - **类型:** `(config?: FakeTimerInstallOpts) => Vitest` -要启用模拟定时器,需要调用此方法。在调用 [`vi.useRealTimers()`](#vi-userealtimers) 之前,它将封装所有对定时器的进一步调用(如 `setTimeout` 、`setInterval` 、`clearTimeout` 、`clearInterval` 、`setImmediate` 、`clearImmediate` 和 `Date`)。 +要启用模拟定时器,需要调用此方法。在调用 [`vi.useRealTimers()`](#vi-userealtimers) 之前,它将封装所有对定时器的进一步调用(如 `setTimeout`、`setInterval`、`clearTimeout`、`clearInterval`、`setImmediate`、`clearImmediate` 和 `Date`)。 -在 `node:child_process` 中使用 `--pool=forks` 运行 Vitest 时,不支持模拟 `nextTick` 。NodeJS 在 `node:child_process` 中内部使用了 `process.nextTick` ,当模拟它时会挂起。使用 `--pool=threads` 运行 Vitest 时支持模拟 `nextTick`。 +在 `node:child_process` 中使用 `--pool=forks` 运行 Vitest 时,不支持模拟 `nextTick`。NodeJS 在 `node:child_process` 中内部使用了 `process.nextTick`,当模拟它时会挂起。使用 `--pool=threads` 运行 Vitest 时支持模拟 `nextTick`。 -内部实现基于 [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers) 。 +内部实现基于 [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers)。 ::: tip -`vi.useFakeTimers()` 不再自动模拟 `process.nextTick` 。 -仍然可以通过在 `toFake` 参数中指定选项来模拟: `vi.useFakeTimers({ toFake: ['nextTick', 'queueMicrotask'] })` 。 +`vi.useFakeTimers()` 不再自动模拟 `process.nextTick`。 +仍然可以通过在 `toFake` 参数中指定选项来模拟:`vi.useFakeTimers({ toFake: ['nextTick', 'queueMicrotask'] })`。 ::: ### vi.isFakeTimers {#vi-isfaketimers} - **类型:** `() => boolean` -如果启用了模拟计时器,则返回 `true` 。 +如果启用了模拟计时器,则返回 `true`。 ### vi.useRealTimers @@ -943,7 +945,7 @@ test('Element exists in a DOM', async () => { }) ``` -如果使用了 `vi.useFakeTimers` , `vi.waitFor` 会在每次检查回调中自动调用 `vi.advanceTimersByTime(interval)` 。 +如果使用了 `vi.useFakeTimers`, `vi.waitFor` 会在每次检查回调中自动调用 `vi.advanceTimersByTime(interval)`。 ### vi.waitUntil @@ -1073,4 +1075,4 @@ vi.setConfig({ - **类型**: `RuntimeConfig` -如果之前调用过 [`vi.setConfig`](#vi-setconfig) ,则会将配置重置为原始状态。 +如果之前调用过 [`vi.setConfig`](#vi-setconfig),则会将配置重置为原始状态。 diff --git a/blog/vitest-3-2.md b/blog/vitest-3-2.md index 7c8130c1f..69b3b6db1 100644 --- a/blog/vitest-3-2.md +++ b/blog/vitest-3-2.md @@ -25,7 +25,7 @@ head: content: summary_large_image --- -# Vitest 3.2 发布了! +# Vitest 3.2 发布了! {#vitest-3-2-is-out} _2025 年 6 月 2 日_ @@ -47,7 +47,7 @@ Vitest 3.2 专注于改进浏览器模式和 TypeScript 支持。此版本还包 新的 [注释 API](/guide/test-annotations) 允许你为任何测试添加自定义消息和附件。这些注释在 UI、HTML、junit、tap 和 GitHub Actions 报告器中可见。如果测试失败,Vitest 还会在 CLI 中打印相关注释。 - + ## 作用域固定装置 {#scoped-fixtures} @@ -75,6 +75,7 @@ const test = baseTest.extend({ 使用 `projects` 时,你现在可以设置自定义 [颜色](/config/#name): ::: details 配置示例 + ```ts{6-9,14-17} export default defineConfig({ test: { @@ -104,9 +105,10 @@ export default defineConfig({ }, }) ``` + ::: - + ## 自定义浏览器定位器 API {#custom-browser-locators-api} @@ -122,7 +124,7 @@ locators.extend({ }) ``` -返回 Playwright [定位器字符串](https://playwright.dev/docs/other-locators)来构造新的定位器。请注意,从此方法返回的字符串将用作于父定位器范围内(如果有的话)。 +返回 Playwright [定位器字符串](https://playwright.dev/docs/other-locators) 来构造新的定位器。请注意,从此方法返回的字符串将用作于父定位器范围内(如果有的话)。 现在你可以直接在 `page` 对象或任何其他定位器上调用 `getByCommentsCount`: @@ -320,8 +322,9 @@ export default defineConfig({ 1. flaky |> 在 slow 和 fast 之后单独运行 ``` + ::: ----- +--- 完整的更改列表请查看 [Vitest 3.2 更新日志](https://github.com/vitest-dev/vitest/releases/tag/v3.2.0)。 diff --git a/blog/vitest-3.md b/blog/vitest-3.md index 2d2c355d1..a178421c7 100644 --- a/blog/vitest-3.md +++ b/blog/vitest-3.md @@ -50,7 +50,7 @@ _2025 年 1 月 17 日_ 如果你要开始参与,我们建议你帮助 [分类问题](https://github.com/vitest-dev/vitest/issues)、[审查 PR](https://github.com/vitest-dev/vitest/pulls)、基于开放的问题发送包含失败测试的 PR,并在 [Discussions](https://github.com/vitest-dev/vitest/discussions) 和 Vitest Land 的帮助论坛中 [帮助其他人](https://discord.com/channels/917386801235247114/1057959614160851024)。如果你想与我们交流,请加入我们的 [Discord 社区](http://chat.vitest.dev/),并在 [#contributing 频道](https://discord.com/channels/917386801235247114/1057959614160851024) 上打个招呼。 -要获取关于 Vitest 生态系统和 Vitest Core 的最新消息,请在 [Bluesky](https://bsky.app/profile/vitest.dev) 或 [Mastodon](https://webtoo.ls/@vitest) 上关注我们。 +要获取关于 Vitest 生态系统和 Vitest Core 的最新消息,请在 [Bluesky](https://bsky.app/profile/vitest.dev) 或 [Mastodon](https://webtoo.ls/@vitest) 上关注我们。 ## 报告器更新 {#reporter-updates} @@ -62,12 +62,12 @@ _2025 年 1 月 17 日_ -伴随此更改,我们还重新设计了公共报告器 API(reporters 字段),使[生命周期](/advanced/api/reporters)更容易理解。 +伴随此更改,我们还重新设计了公共报告器 API(reporters 字段),使 [生命周期](/advanced/api/reporters) 更容易理解。 你可以在 [#7069](https://github.com/vitest-dev/vitest/pull/7069) PR 中关注设计过程。为了逆向工程之前的 onTaskUpdate API 并实现这个新的优雅生命周期,我们经历了一番艰难的努力。
- +
## 内联工作区 {#inline-workspace} diff --git a/config/file.md b/config/file.md index bc4a239a9..fa7c3e661 100644 --- a/config/file.md +++ b/config/file.md @@ -2,15 +2,15 @@ outline: deep --- -# 管理 Vitest 配置文件 +# 管理 Vitest 配置文件 {#configuring-vitest} 如果你正在使用 Vite,并且有一个 `vite.config` 文件,Vitest 会读取它并以插件匹配,并将其设置为你的 Vite 应用程序。如果你想使用不同的配置进行测试,或者你的主应用程序不特别依赖 Vite,你可以: -- 创建 `vitest.config.ts`,它将具有更高的优先级,并**覆盖** `vite.config.ts` 中的配置(Vitest 支持所有传统的 JS 和 TS 扩展,但不支持 `json`)-这意味着 `vite.config` 中的所有选项都将被**忽略** +- 创建 `vitest.config.ts`,它将具有更高的优先级,并 **覆盖** `vite.config.ts` 中的配置(Vitest 支持所有传统的 JS 和 TS 扩展,但不支持 `json`)-这意味着 `vite.config` 中的所有选项都将被 **忽略** - 将 `--config` 选项传递给 CLI,例如 `vitest --config ./path/to/vitest.config.ts` -- 使用`process.env.VITEST` 或者 `defineConfig` 上的 `mode` 属性(如果未被`mode`覆盖,则将设置为`test`/`benchmark`),以有条件地应用 `vite.config.ts` 中的不同配置 +- 使用 `process.env.VITEST` 或者 `defineConfig` 上的 `mode` 属性(如果未被 `mode` 覆盖,则将设置为 `test`/`benchmark`),以有条件地应用 `vite.config.ts` 中的不同配置 -要配置 `vitest` 本身,请在 Vite 配置中添加 `test` 属性。如果你要从 `vite` 本身导入`defineConfig`,你还需要使用[三斜杠命令](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html#-reference-types-)添加对 Vitest 类型的引用。 +要配置 `vitest` 本身,请在 Vite 配置中添加 `test` 属性。如果你要从 `vite` 本身导入 `defineConfig`,你还需要使用 [三斜杠命令](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html#-reference-types-) 添加对 Vitest 类型的引用。 使用 `vite` 中的 `defineConfig`,你应该如下配置: @@ -25,7 +25,7 @@ export default defineConfig({ }) ``` -`` 将在 Vitest 3 中停止工作,但您可以在 Vitest 2.1 中开始迁移到 `vitest/config`: +`` 将在 Vitest 3 中停止工作,但您可以在 Vitest 2.1 中开始迁移到 `vitest/config`: ```ts /// diff --git a/config/index.md b/config/index.md index 7d807c9b9..bb1a256af 100644 --- a/config/index.md +++ b/config/index.md @@ -6,11 +6,11 @@ outline: deep 如果我们正在使用 Vite 并且拥有一个 `vite.config` 文件,Vitest 会读取它来匹配我们的 Vite 应用的插件和设置。如果我们想要为测试配置不同的设置,或者我们的并不特别依赖于 Vite,我们我们可以选择: -- 创建 `vitest.config.ts`,它将具有更高的优先级,并且会**覆盖** `vite.config.ts` 中的配置(Vitest 支持所有传统的 JS 和 TS 文件扩展名,但不支持 `json`) - 这意味着我们在 `vite.config` 中的所有选项将被**忽略**。 +- 创建 `vitest.config.ts`,它将具有更高的优先级,并且会 **覆盖** `vite.config.ts` 中的配置(Vitest 支持所有传统的 JS 和 TS 文件扩展名,但不支持 `json`) - 这意味着我们在 `vite.config` 中的所有选项将被 **忽略**。 - 向 CLI 传递 `--config` 选项,例如 `vitest --config ./path/to/vitest.config.ts`。 - 使用 `process.env.VITEST` 或在 `defineConfig` 上的 `mode` 属性(如果没有用 `--mode` 覆盖,默认设置为 `test`/`benchmark`)来在 `vite.config.ts` 中有条件地应用不同的配置。请注意,像任何其他环境变量一样,`VITEST` 也会在测试中的 `import.meta.env` 上暴露出来。 -要配置 Vitest 本身,请在我们的 Vite 配置中添加 `test` 属性。如果我们是从 `vite` 本身导入 `defineConfig`,我们还需要在配置文件顶部使用[三斜杠指令](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html#-reference-types-)添加对 Vitest 类型引用。 +要配置 Vitest 本身,请在我们的 Vite 配置中添加 `test` 属性。如果我们是从 `vite` 本身导入 `defineConfig`,我们还需要在配置文件顶部使用 [三斜杠指令](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html#-reference-types-) 添加对 Vitest 类型引用。 ::: details 打开配置示例 使用 `vite` 中的 `defineConfig` 时使用以下步骤: @@ -91,6 +91,7 @@ export default defineConfig(configEnv => mergeConfig( }) )) ``` + ::: ::: warning @@ -109,7 +110,7 @@ export default defineConfig({ 在 [项目](/guide/projects) 配置里不被支持的选项,会在旁边标注 。这表示这些选项只能在 Vitest 的根配置中进行设置。 ::: -### include +## include - **类型:** `string[]` - **默认值:** `['**/*.{test,spec}.?(c|m)[jt]s?(x)']` @@ -195,9 +196,9 @@ Vite-Node 调试器选项。 - **类型:** `(string | RegExp)[]` - **默认值:** `[/\/node_modules\//]` -外部化(Externalize)意味着 Vite 将绕过原生 Node 的包。外部化依赖不会应用于 Vite 的转换器和解析器,因此它们不支持重新加载时的 HMR。 `node_modules` 下的所有包都被外部化。 +外部化(Externalize)意味着 Vite 将绕过原生 Node 的包。外部化依赖不会应用于 Vite 的转换器和解析器,因此它们不支持重新加载时的 HMR。`node_modules` 下的所有包都被外部化。 -这些选项支持在 `node_modules` 中编写的包名称或在 [`deps.moduleDirectories`](#deps-moduledirectories) 中指定的包名称。例如,位于 `packages/some-name` 内的包`@company/some-name` 应指定为 `some-name`,并且 `packages` 应包含在 `deps.moduleDirectories` 中。基本上,Vitest 总是检查文件路径,而不是实际的包名称。 +这些选项支持在 `node_modules` 中编写的包名称或在 [`deps.moduleDirectories`](#deps-moduledirectories) 中指定的包名称。例如,位于 `packages/some-name` 内的包 `@company/some-name` 应指定为 `some-name`,并且 `packages` 应包含在 `deps.moduleDirectories` 中。基本上,Vitest 总是检查文件路径,而不是实际的包名称。 如果使用正则匹配,Vitest 会在 _file path_ 上调用它,而不是包名称。 @@ -262,6 +263,7 @@ Vite 将处理内联模块。这可能有助于处理以 ESM 格式传送 `.js` 启用依赖优化。 #### deps.web + - **类型:** `{ transformAssets?, ... }` 当转换模式设置为 `web` 时应用于外部文件的选项。默认情况下,`jsdom` 和 `happy-dom` 使用 `web` 模式,而 `node` 和 `edge` 环境使用 `ssr` 转换模式,因此这些选项不会影响这些环境中的文件。 @@ -356,7 +358,7 @@ export default defineConfig({ ### runner - **类型**: `VitestRunnerConstructor` -- **默认值**: 运行测试时为`node`,运行基准测试时为 `benchmark` +- **默认值**: 运行测试时为 `node`,运行基准测试时为 `benchmark` 自定义测试运行器的路径。这是一项高级功能,应与自定义库运行器一起使用。你可以在 [文档](/advanced/runner) 中阅读更多相关信息。 @@ -438,6 +440,7 @@ Vitest 使用 Vite SSR 基元来运行测试,这有 [一定的缺陷](https:// 1. 别名只影响由 [inlined](#server-deps-inline) 模块直接用 `import` 关键字导入的模块(默认情况下所有源代码都是内联的)。 2. Vitest 不支持对 `require` 调用进行别名。 3. 如果我们要别名外部依赖(例如,`react` -> `preact`),我们可能需要别名实际的 `node_modules` 包,以使其适用于外部依赖。[Yarn](https://classic.yarnpkg.com/en/docs/cli/add/#toc-yarn-add-alias) 和 [pnpm](https://pnpm.io/aliases/) 都支持通过 `npm:` 前缀进行别名。 + ::: ### globals @@ -468,7 +471,7 @@ export default defineConfig({ } ``` -如果你在 TypeScript 配置中修改了 [`typeRoots`](https://www.typescriptlang.org/tsconfig/#typeRoots) ,以便编译时引入更多类型,那么你需要重新把 `node_modules` 加回到 `typeRoots` 中,这样才能让 `vitest/globals` 被正确识别。 +如果你在 TypeScript 配置中修改了 [`typeRoots`](https://www.typescriptlang.org/tsconfig/#typeRoots),以便编译时引入更多类型,那么你需要重新把 `node_modules` 加回到 `typeRoots` 中,这样才能让 `vitest/globals` 被正确识别。 ```json [tsconfig.json] { @@ -571,7 +574,7 @@ export default { Vitest 还通过 `vitest/environments` 入口导出 `builtinEnvironments`,以防你只想扩展它。 你可以在 [测试环境指南](/guide/environment) 中阅读有关扩展测试环境的更多信息。 ::: tip -jsdom 环境变量导出了等同于当前 [JSDOM](https://github.com/jsdom/jsdom) 的 `jsdom` 全局变量实例。如果你想让 TypeScript 识别它,可以在使用此环境时将 `vitest/jsdom`添加到 `tsconfig.json` 中: +jsdom 环境变量导出了等同于当前 [JSDOM](https://github.com/jsdom/jsdom) 的 `jsdom` 全局变量实例。如果你想让 TypeScript 识别它,可以在使用此环境时将 `vitest/jsdom` 添加到 `tsconfig.json` 中: ```json [tsconfig.json] { @@ -615,6 +618,7 @@ export default defineConfig({ }, }) ``` + ::: 基于 globs 自动匹配执行环境。将使用第一个匹配项。 @@ -662,6 +666,7 @@ export default defineConfig({ }, }) ``` + ::: 基于 globs 模式来匹配运行池中的测试并运行,将使用第一个匹配项。 @@ -776,11 +781,11 @@ export default defineConfig({ #### threads -使用 [tinypool](https://github.com/tinylibs/tinypool)(一个轻量级的 [Piscina](https://github.com/piscinajs/piscina) 分支)来启用多线程。当使用线程时,你无法使用与进程相关的 API,如 `process.chdir()` 。一些使用原生语言编写的库,如 Prisma 、`bcrypt` 和 `canvas` ,在多线程环境下可能会遇到问题并导致段错误。在这些情况下,建议使用 `forks` 线程池。 +使用 [tinypool](https://github.com/tinylibs/tinypool)(一个轻量级的 [Piscina](https://github.com/piscinajs/piscina) 分支)来启用多线程。当使用线程时,你无法使用与进程相关的 API,如 `process.chdir()`。一些使用原生语言编写的库,如 Prisma 、`bcrypt` 和 `canvas`,在多线程环境下可能会遇到问题并导致段错误。在这些情况下,建议使用 `forks` 线程池。 #### forks -与 `threads` 线程池类似,但是使用 `child_process` 而不是 `worker_threads` ,通过 [tinypool](https://github.com/tinylibs/tinypool) 实现。与 `threads` 线程池相比,测试与主进程之间的通信速度不够快。在 `forks` 线程池中,可以使用与进程相关的 API ,如 `process.chdir()` 。 +与 `threads` 线程池类似,但是使用 `child_process` 而不是 `worker_threads`,通过 [tinypool](https://github.com/tinylibs/tinypool) 实现。与 `threads` 线程池相比,测试与主进程之间的通信速度不够快。在 `forks` 线程池中,可以使用与进程相关的 API ,如 `process.chdir()`。 #### vmThreads @@ -791,7 +796,7 @@ export default defineConfig({ ::: warning 在沙箱中运行代码有一些优点(测试速度更快),但也有许多缺点。 -- 原生模块中的全局变量,例如(`fs`、`path`等),与测试环境中存在的全局变量不同。因此,这些原生模块引发的任何错误都将引用与代码中使用的错误构造函数不同的错误构造函数: +- 原生模块中的全局变量,例如(`fs`、`path` 等),与测试环境中存在的全局变量不同。因此,这些原生模块引发的任何错误都将引用与代码中使用的错误构造函数不同的错误构造函数: ```ts try { @@ -803,14 +808,14 @@ catch (err) { ``` - 导入 ES 模块会无限期地缓存它们,如果你有很多上下文(测试文件),这会导致内存泄漏。Node.js 中没有可以清除该缓存的 API。 -- 在沙盒环境中访问全局变量[需要更长的时间](https://github.com/nodejs/node/issues/31658)。 +- 在沙盒环境中访问全局变量 [需要更长的时间](https://github.com/nodejs/node/issues/31658)。 使用此选项时请注意这些问题。Vitest 团队无法解决我们这边的任何问题。 ::: #### vmForks -与 `vmThreads` 池类似,但通过 [tinypool](https://github.com/tinylibs/tinypool) 使用 `child_process` 而不使用 `worker_threads`。测试与主进程之间的通信速度虽然不如 `vmThreads` 快。但进程相关的 API(如 `process.chdir()` )在 `vmForks` 中却可以使用。请注意,这个与 `vmThreads` 中列出的池具有相同的缺陷。 +与 `vmThreads` 池类似,但通过 [tinypool](https://github.com/tinylibs/tinypool) 使用 `child_process` 而不使用 `worker_threads`。测试与主进程之间的通信速度虽然不如 `vmThreads` 快。但进程相关的 API(如 `process.chdir()`)在 `vmForks` 中却可以使用。请注意,这个与 `vmThreads` 中列出的池具有相同的缺陷。 ### poolOptions @@ -840,14 +845,14 @@ export default defineConfig({ - **类型:** `number | string` - **默认值:** _可用 CPU 核心数_ -最大线程数或百分比。还可以使用`VITEST_MAX_THREADS`环境变量进行设置。 +最大线程数或百分比。还可以使用 `VITEST_MAX_THREADS` 环境变量进行设置。 ##### poolOptions.threads.minThreads - **类型:** `number | string` - **默认值:** _可用 CPU 核心数_ -最小线程数或百分比。还可以使用`VITEST_MIN_THREADS`环境变量进行设置。 +最小线程数或百分比。还可以使用 `VITEST_MIN_THREADS` 环境变量进行设置。 ##### poolOptions.threads.singleThread @@ -883,7 +888,7 @@ export default defineConfig({ - **类型:** `string[]` - **默认值:** `[]` -在线程中向 `node` 传递附加参数。更多信息,具体可以浏览 [Command-line API | Node.js](https://nodejs.org/docs/latest/api/cli.html) 。 +在线程中向 `node` 传递附加参数。更多信息,具体可以浏览 [Command-line API | Node.js](https://nodejs.org/docs/latest/api/cli.html)。 ::: warning 使用时要小心,因为某些选项(如--prof、--title)可能会导致 worker 崩溃。具体信息可以浏览 https://github.com/nodejs/node/issues/41103。 @@ -946,7 +951,7 @@ export default defineConfig({ - **类型:** `string[]` - **默认值:** `[]` -向子进程中的 `node` 进程传递附加参数。更多信息,详细信息可以浏览 [Command-line API | Node.js](https://nodejs.org/docs/latest/api/cli.html) 。 +向子进程中的 `node` 进程传递附加参数。更多信息,详细信息可以浏览 [Command-line API | Node.js](https://nodejs.org/docs/latest/api/cli.html)。 :::warning 使用时要小心,因为某些选项(如 --prof、--title )可能会导致 worker 崩溃。详细信息可以浏览 https://github.com/nodejs/node/issues/41103。 @@ -975,14 +980,14 @@ export default defineConfig({ - **类型:** `number | string` - **默认值:** _可用 CPU 核心数_ -最大线程数或百分比。还可以使用`VITEST_MAX_THREADS`环境变量进行设置。 +最大线程数或百分比。还可以使用 `VITEST_MAX_THREADS` 环境变量进行设置。 ##### poolOptions.vmThreads.minThreads - **类型:** `number | string` - **默认值:** _可用 CPU 核心数_ -最小线程数或百分比。还可以使用`VITEST_MAX_THREADS`环境变量进行设置。 +最小线程数或百分比。还可以使用 `VITEST_MAX_THREADS` 环境变量进行设置。 ##### poolOptions.vmThreads.memoryLimit @@ -1001,11 +1006,11 @@ export default defineConfig({ - 有单位时 - `50%` - 如上,占系统总内存的百分比 - `100KB`, `65MB`, 等 - 用单位表示固定的内存限制 - - `K` / `KB` - 千字节 (x1000) + - `K`/`KB` - 千字节 (x1000) - `KiB` - 千字节 (x1024) - - `M` / `MB`- 千字节 + - `M`/`MB` - 千字节 - `MiB` - 兆字节 - - `G` / `GB` - 千兆字节 + - `G`/`GB` - 千兆字节 - `GiB` - 千兆字节 ::: @@ -1028,7 +1033,7 @@ export default defineConfig({ - **类型:** `string[]` - **默认值:** `[]` -将附加参数传递给虚拟机上下文中的 `node` 进程。更多信息,详细信息可以浏览 [Command-line API | Node.js](https://nodejs.org/docs/latest/api/cli.html) 。 +将附加参数传递给虚拟机上下文中的 `node` 进程。更多信息,详细信息可以浏览 [Command-line API | Node.js](https://nodejs.org/docs/latest/api/cli.html)。 :::warning 使用时要小心,因为某些选项(如 --prof、--title )可能会导致 worker 崩溃。详细信息可以浏览 https://github.com/nodejs/node/issues/41103。 @@ -1081,7 +1086,7 @@ export default defineConfig({ 将附加参数传递给虚拟机上下文中的 `node` 进程。更多信息,查看 [Command-line API | Node.js](https://nodejs.org/docs/latest/api/cli.html) 了解更多详情。。 :::warning -使用时要小心,因为某些选项(如 `--prof` 、`--title`)可能会导致 worker 崩溃。查看 https://github.com/nodejs/node/issues/41103 了解更多详情。 +使用时要小心,因为某些选项(如 `--prof`、`--title`)可能会导致 worker 崩溃。查看 https://github.com/nodejs/node/issues/41103 了解更多详情。 ::: ### fileParallelism @@ -1155,7 +1160,7 @@ setup 文件的路径。它们将在每个测试文件之前运行。 你可以在全局设置文件中使用 `process.env.VITEST_POOL_ID`(类似整数的字符串)来区分不同的线程。 :::tip -请注意,如果运行 [`--isolate=false`](#isolate) ,这个配置文件将在全局范围内多次运行。这意味着每次测试前都要访问同一个全局对象,因此请确保不要重复做同一件事。 +请注意,如果运行 [`--isolate=false`](#isolate),这个配置文件将在全局范围内多次运行。这意味着每次测试前都要访问同一个全局对象,因此请确保不要重复做同一件事。 ::: 比如,你可能依赖于一个全局变量: @@ -1184,6 +1189,7 @@ globalThis.resetBeforeEachTest = true 使用 `inject` 方法定义可在测试中访问的值。 :::code-group + ```ts [vitest.config.js] import { defineConfig } from 'vitest/config' @@ -1195,6 +1201,7 @@ export default defineConfig({ }, }) ``` + ```ts [api.test.js] import { expect, inject, test } from 'vitest' @@ -1202,6 +1209,7 @@ test('api key is defined', () => { expect(inject('API_KEY')).toBe('123') }) ``` + ::: 可以参考 如何在覆盖率报告中包含或排除文件 里的示例。 @@ -1223,6 +1231,7 @@ declare module 'vitest' { // 将此文件标记为模块,以便增强正常工作 export {} ``` + ::: ### globalSetup @@ -1243,11 +1252,13 @@ export {} 请注意,全局设置在不同的全局范围内运行,因此你的测试无法访问此处定义的变量。悬停,从 1.0.0 开始,你可以通过 [`provide`](#provide) 方法将可序列化数据传递给测试: :::code-group + ```ts [example.test.js] import { inject } from 'vitest' inject('wsPort') === 3000 ``` + ```ts [globalSetup.ts 3.0.0] import type { TestProject } from 'vitest/node' @@ -1261,6 +1272,7 @@ declare module 'vitest' { } } ``` + ```ts [globalSetup.ts 2.0.0] import type { GlobalSetupContext } from 'vitest/node' @@ -1274,8 +1286,9 @@ declare module 'vitest' { } } ``` + ::: -自 Vitest 3起,我们可以定义一个自定义回调函数,在 Vitest 重新运行测试时被调用。如果该函数是异步的,运行器将在执行测试前等待其完成。请注意,我们不能像 `{ onTestsRerun }` 那样解构 `project` ,因为它依赖于上下文环境。 +自 Vitest 3 起,我们可以定义一个自定义回调函数,在 Vitest 重新运行测试时被调用。如果该函数是异步的,运行器将在执行测试前等待其完成。请注意,我们不能像 `{ onTestsRerun }` 那样解构 `project`,因为它依赖于上下文环境。 ```ts [globalSetup.ts] import type { TestProject } from 'vitest/node' @@ -1304,12 +1317,12 @@ test('execute a script', async () => { ``` :::tip 提醒 -请确保我们的文件没有被 [`server.watch.ignored`](https://vitejs.dev/config/server-options.html#server-watch)排除在外。 +请确保我们的文件没有被 [`server.watch.ignored`](https://vitejs.dev/config/server-options.html#server-watch) 排除在外。 ::: ### coverage -你可以选择 [`v8`](/guide/coverage.html#v8-provider)、[`istanbul`](/guide/coverage.html#istanbul-provider) ,或者 [自定义覆盖率工具](/guide/coverage#custom-coverage-provider) 来进行代码覆盖率统计。 +你可以选择 [`v8`](/guide/coverage.html#v8-provider)、[`istanbul`](/guide/coverage.html#istanbul-provider),或者 [自定义覆盖率工具](/guide/coverage#custom-coverage-provider) 来进行代码覆盖率统计。 你可以使用点符号向 CLI 提供覆盖选项: @@ -1337,6 +1350,7 @@ npx vitest --coverage.enabled --coverage.provider=istanbul - **命令行终端:** `--coverage.enabled`, `--coverage.enabled=false` 是否启用收集测试覆盖率。可以使用 `--coverage` 覆盖 CLI 选项。 + #### coverage.include - **类型:** `string[]` @@ -1539,6 +1553,7 @@ Vitest 会自动将测试文件的 `include` 模式添加到 `coverage.exclude` 如果将阈值设置为负数,则将其视为允许的最大未覆盖项数量。例如,将行阈值设置为 `-10` 意味着未覆盖的行数不得超过 10 行。 + ```ts { coverage: { @@ -1664,6 +1679,7 @@ Vitest 会将所有文件,包括那些被 glob 模式覆盖的文件,计入 将匹配全局模式的文件的阈值设置为 100。 + ```ts { coverage: { @@ -1733,6 +1749,7 @@ export default defineConfig({ #### coverage.watermarks - **类型:** + ```ts @@ -1745,6 +1762,7 @@ export default defineConfig({ ``` - **默认值:** + ```ts @@ -1757,7 +1775,7 @@ export default defineConfig({ ``` - **可用的测试提供者:** `'v8' | 'istanbul'` -- **命令行终端:** `--coverage.watermarks.statements=50,80`, `--coverage.watermarks.branches=50,80` +- **命令行终端:** `--coverage.watermarks.statements=50,80`,`--coverage.watermarks.branches=50,80` 语句、行、分支和函数的水印。有关更多信息,请参见 [istanbul 文档](https://github.com/istanbuljs/nyc#high-and-low-watermarks)。 @@ -1989,8 +2007,8 @@ export default defineConfig({ 如果你决定处理 CSS 文件,你可以配置 CSS 模块中的类名是否在限定范围内。 默认情况下,Vitest 会导出一个代理,绕过 CSS 模块处理。 你可以选择以下选项之一: -- `stable`: 类名将生成为`_${name}_${hashedFilename}`,这意味着如果 CSS 内容发生变化,生成的类将保持不变,但如果文件名被修改,或者文件名将发生变化 被移动到另一个文件夹。 如果你使用快照功能,此设置很有用。 -- `scoped`: 类名将照常生成,遵照 `css.modules.generateScopedName` 方法,如果你有的话。 默认情况下,文件名将生成为`_${name}_${hash}`,其中 hash 包括文件名和文件内容。 +- `stable`: 类名将生成为 `_${name}_${hashedFilename}`,这意味着如果 CSS 内容发生变化,生成的类将保持不变,但如果文件名被修改,或者文件名将发生变化 被移动到另一个文件夹。 如果你使用快照功能,此设置很有用。 +- `scoped`: 类名将照常生成,遵照 `css.modules.generateScopedName` 方法,如果你有的话。 默认情况下,文件名将生成为 `_${name}_${hash}`,其中 hash 包括文件名和文件内容。 - `non-scoped`: 类名将保留 CSS 中定义的名称。 ::: warning @@ -2118,6 +2136,7 @@ export default defineConfig({ 3. flaky |> 在 slow 和 fast 之后单独运行 ``` + ::: #### sequence.shuffle @@ -2271,7 +2290,7 @@ Vitest 通常使用缓存对测试进行排序,因此长时间运行的测试 - **类型**: `number` - **默认值**: `300` -- **命令行终端:**:`--slow-test-threshold=`, `--slowTestThreshold=` +- **命令行终端:**: `--slow-test-threshold=`, `--slowTestThreshold=` 测试或测试套件执行超过该毫秒数即被视为缓慢,并在结果中相应标注。 @@ -2333,7 +2352,7 @@ function onConsoleLog( ): boolean | void ``` -用于自定义处理测试中调用的 `console` 方法。如果返回值是 `false` , Vitest 将不会将日志打印到控制台。需要注意的是, Vitest 会忽略除 `false` 之外的其他假值。 +用于自定义处理测试中调用的 `console` 方法。如果返回值是 `false`, Vitest 将不会将日志打印到控制台。需要注意的是, Vitest 会忽略除 `false` 之外的其他假值。 这在过滤掉来自第三方库的日志时会非常有用。 @@ -2405,6 +2424,7 @@ export default defineConfig({ Or as a module: :::code-group + ```ts [vitest.config.js] import { defineConfig } from 'vitest/config' @@ -2425,6 +2445,7 @@ export default { omitAnnotationLines: true, } satisfies DiffOptions ``` + ::: #### diff.expand @@ -2469,7 +2490,7 @@ Expand all common lines. #### diff.maxDepth - **类型**: `number` -- **默认值**: `20`(当比较不同类型时或 `8` ) +- **默认值**: `20`(当比较不同类型时或 `8`) 打印嵌套对象时限制递归深度 @@ -2477,7 +2498,7 @@ Expand all common lines. - **类型:** `FakeTimerInstallOpts` -当使用 [`vi.useFakeTimers()`](/api/vi#vi-usefaketimers)时,Vitest 将向 [`@sinon/fake-timers`](https://www.npmjs.com/package/@sinonjs/fake-timers) 传递的选项。 +当使用 [`vi.useFakeTimers()`](/api/vi#vi-usefaketimers) 时,Vitest 将向 [`@sinon/fake-timers`](https://www.npmjs.com/package/@sinonjs/fake-timers) 传递的选项。 #### fakeTimers.now @@ -2493,7 +2514,7 @@ Expand all common lines. 包含要伪造的全局方法和 API 名称的数组。 -要只模拟 `setTimeout()` 和 `nextTick()` ,请将此属性指定为 `['setTimeout','nextTick']`。 +要只模拟 `setTimeout()` 和 `nextTick()`,请将此属性指定为 `['setTimeout','nextTick']`。 使用 `--pool=forks` 在 `node:child_process` 内运行 Vitest 时,不支持模拟 `nextTick`。NodeJS 在 `node:child_process` 中内部使用了 `process.nextTick`,当模拟它时会挂起。使用 `--pool=threads` 运行 Vitest 时支持模拟 `nextTick`。 @@ -2531,7 +2552,7 @@ Expand all common lines. - **命令行终端:** `--workspace=./file.js` - **默认值:** 配置文件或根目录附近的 `vitest.{workspace,projects}.{js,ts,json}` -相对于[root](#root) 的 [workspace](/guide/projects) 配置文件的路径。 +相对于 [root](#root) 的 [workspace](/guide/projects) 配置文件的路径。 自 Vitest 3 起,您也可以在根配置中直接定义 `workspace` 数组。若手动在配置中声明了 workspace 参数,Vitest 将忽略项目根目录下的 `vitest.workspace` 文件。 @@ -2566,6 +2587,7 @@ Vitest API 在 [reporters](#reporters) 中接收任务时是否应包含 `locati `location` 属性的 `列` 和 `行` 值与原始文件中的 `test` 或 `describe` 位置相对应。 如果我们没有明确禁用该选项,并且在运行 Vitest 时使用了该选项,则该选项将自动启用: + - [Vitest UI](/guide/ui) - 或使用不带 [无头模式](/guide/browser/#headless) 的 [浏览器](/guide/browser/) - 或使用 [HTML 报告器](/guide/reporters#html-reporter) @@ -2594,7 +2616,7 @@ export interface SnapshotEnvironment { } ``` -如果只需覆盖部分 API,可从 `vitest/snapshot` 入口扩展默认的 `VitestSnapshotEnvironment` 。 +如果只需覆盖部分 API,可从 `vitest/snapshot` 入口扩展默认的 `VitestSnapshotEnvironment`。 ::: warning 这是一个低级选项,仅适用于无法访问默认 Node.js API 的高级情况。 @@ -2620,7 +2642,7 @@ export interface SnapshotEnvironment { 与每次测试开始时调用 [`expect.hasAssertions()`](/api/expect#expect-hasassertions) 相同。这可确保不会意外通过任何测试。 ::: tip -这仅适用于 Vitest 的`expect`。如果我们使用`assert`或`.should`断言,它们将不计算在内,并且我们的测试将因缺少 expect 断言而失败。 +这仅适用于 Vitest 的 `expect`。如果我们使用 `assert` 或 `.should` 断言,它们将不计算在内,并且我们的测试将因缺少 expect 断言而失败。 我们可以通过调用 `vi.setConfig({ expect: { requireAssertions: false } })` 来更改此值。该配置将应用于每个后续 `expect` 调用,直到手动调用 `vi.resetConfig`。 ::: diff --git a/eslint.config.js b/eslint.config.js index 7cfe56a2d..1e9ff039f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -24,6 +24,7 @@ export default antfu( // uses invalid js example 'advanced/api/import-example.md', 'guide/examples/*.md', + 'reporters-life-cycle.md', 'README.md', '.github/*.md', ], diff --git a/guide/browser/assertion-api.md b/guide/browser/assertion-api.md index 598e367f0..7632bbc7d 100644 --- a/guide/browser/assertion-api.md +++ b/guide/browser/assertion-api.md @@ -6,15 +6,16 @@ title: Assertion API | Browser Mode Vitest 默认提供了一组丰富的 DOM 断言,这些断言源自 [`@testing-library/jest-dom`](https://github.com/testing-library/jest-dom) 库,并增加了对定位器的支持以及内置的重试能力。 -::: tip TypeScript Support +::: tip TypeScript 支持 如果你正在使用 [TypeScript](/guide/browser/#typescript) 或希望在 `expect` 中获得正确的类型提示,请确保在某个地方引用了 `vitest/browser`。如果你从未从该模块导入过,可以在 `tsconfig.json` 覆盖范围内的任何文件中添加一个 `reference` 注释: ```ts /// ``` + ::: -浏览器中的测试由于其异步特性,可能会不一致地失败。因此,即使条件延迟(如超时、网络请求或动画),也必须有办法保证断言成功。为此,Vitest 通过 [`expect.poll`](/api/expect#poll)和 `expect.element` API 提供了可重试的断言: +浏览器中的测试由于其异步特性,可能会不一致地失败。因此,即使条件延迟(如超时、网络请求或动画),也必须有办法保证断言成功。为此,Vitest 通过 [`expect.poll`](/api/expect#poll) 和 `expect.element` API 提供了可重试的断言: ```ts import { expect, test } from 'vitest' @@ -54,7 +55,7 @@ interface ExpectPollOptions { ``` ::: tip -`expect.element` 是 `expect.poll(() => element)`的简写,工作方式完全相同。 +`expect.element` 是 `expect.poll(() => element)` 的简写,工作方式完全相同。 `toHaveTextContent` 以及其他所有断言在常规的 `expect` 中仍然可用,但没有内置的重试机制: @@ -62,6 +63,7 @@ interface ExpectPollOptions { // 如果 .textContent 不是 `'Error!'`,则会立即失败。 expect(banner).toHaveTextContent('Error!') ``` + ::: ## toBeDisabled @@ -410,7 +412,7 @@ function toHaveAccessibleErrorMessage(message?: string | RegExp): Promise 这允许你断言一个元素具有预期的 [可访问错误消息](https://w3c.github.io/aria/#aria-errormessage)。 -你可以传递预期的可访问错误消息的确切字符串。或者,你可以通过传递正则表达式或使用 [`expect.stringContaining`](/api/expect#expect-stringcontaining) 或 [`expect.stringMatching`](/api/expect#expect-stringmatching)来进行部分匹配。 +你可以传递预期的可访问错误消息的确切字符串。或者,你可以通过传递正则表达式或使用 [`expect.stringContaining`](/api/expect#expect-stringcontaining) 或 [`expect.stringMatching`](/api/expect#expect-stringmatching) 来进行部分匹配。 ```html ``` -这允许断言某个元素具有一个[文本选择](https://developer.mozilla.org/en-US/docs/Web/API/Selection)。 +这允许断言某个元素具有一个 [文本选择](https://developer.mozilla.org/en-US/docs/Web/API/Selection)。 这在检查元素内是否选择了文本或部分文本时非常有用。该元素可以是文本类型的输入框、`textarea`,或者是任何包含文本的其他元素,例如段落、`span`、`div` 等。 diff --git a/guide/browser/commands.md b/guide/browser/commands.md index d7d2595c8..6cb54345f 100644 --- a/guide/browser/commands.md +++ b/guide/browser/commands.md @@ -56,12 +56,12 @@ expect(input).toHaveValue('a') ``` ::: warning -CDP session仅适用于 `playwright` provider,并且仅在使用 `chromium` 浏览器时有效。有关详细信息,请参阅 playwright 的 [`CDPSession`](https://playwright.dev/docs/api/class-cdpsession)文档。 +CDP session 仅适用于 `playwright` provider,并且仅在使用 `chromium` 浏览器时有效。有关详细信息,请参阅 playwright 的 [`CDPSession`](https://playwright.dev/docs/api/class-cdpsession) 文档。 ::: ## 自定义命令 {#custom-commands} -我们也可以通过 [`browser.commands`](/guide/browser/config#browser-commands) 配置选项添加自己的命令。如果我们正在开发一个库,可以通过插件内的`config`钩子来提供它们: +我们也可以通过 [`browser.commands`](/guide/browser/config#browser-commands) 配置选项添加自己的命令。如果我们正在开发一个库,可以通过插件内的 `config` 钩子来提供它们: ```ts import type { Plugin } from 'vitest/config' @@ -123,14 +123,14 @@ declare module 'vitest/browser' { 如果自定义命令具有相同的名称,则它们将覆盖内置命令。 ::: -### 自定义 `playwright` 命令 {#custom-playwright-commands} +### 自定义 `playwright` 命令 {#custom-playwright-commands} -Vitest 在命令上下文中公开了几个`playwright`特定属性。 +Vitest 在命令上下文中公开了几个 `playwright` 特定属性。 -- `page`引用包含测试 iframe 的完整页面。这是协调器 HTML,为避免出现问题,最好不要碰它。 +- `page` 引用包含测试 iframe 的完整页面。这是协调器 HTML,为避免出现问题,最好不要碰它。 - `frame` 是一个异步方法,用于解析测试器 [`Frame`](https://playwright.dev/docs/api/class-frame)。它的 API 与 `page` 类似,但不支持某些方法。如果您需要查询元素,应优先使用 `context.iframe` 代替,因为它更稳定、更快速。 - `iframe` 是一个 [`FrameLocator`](https://playwright.dev/docs/api/class-framelocator),用于查询页面上的其他元素。 -- `context` 是指唯一的[BrowserContext](https://playwright.dev/docs/api/class-browsercontext)。 +- `context` 是指唯一的 [BrowserContext](https://playwright.dev/docs/api/class-browsercontext)。 ```ts import { BrowserCommand } from 'vitest/node' diff --git a/guide/browser/config.md b/guide/browser/config.md index b8ee8eb71..7d1bc675d 100644 --- a/guide/browser/config.md +++ b/guide/browser/config.md @@ -33,6 +33,7 @@ export default defineConfig({ }, }) ``` + ::: ## browser.enabled @@ -60,9 +61,10 @@ export default defineConfig({ /// /// ``` + ::: -你可以指定大部分 [配置选项](/config/) (未标记图标的选项)和一些 `browser` 选项,如`browser.testerHtmlPath`。 +你可以指定大部分 [配置选项](/config/) (未标记图标的选项)和一些 `browser` 选项,如 `browser.testerHtmlPath`。 ::: warning 每个浏览器配置都从根配置继承选项: @@ -212,6 +214,7 @@ export default defineConfig({ /// /// ``` + ::: ## browser.ui diff --git a/guide/browser/context.md b/guide/browser/context.md index 105fd8d69..1161b69ef 100644 --- a/guide/browser/context.md +++ b/guide/browser/context.md @@ -64,6 +64,7 @@ export const commands: BrowserCommands ::: 如需操作 Playwright 的 `page` 对象,请使用 [Commands API](/guide/browser/commands)。 + ```ts export const page: { /** @@ -115,7 +116,7 @@ export const page: { `cdp` 导出返回当前的 Chrome DevTools 协议会话。它主要用于库作者在其基础上构建工具。 ::: warning -CDP 会话仅适用于 `playwright` provider,并且仅在使用 `chromium` 浏览器时有效。有关详细信息,请参阅 playwright 的 [`CDPSession`](https://playwright.dev/docs/api/class-cdpsession)文档。 +CDP 会话仅适用于 `playwright` provider,并且仅在使用 `chromium` 浏览器时有效。有关详细信息,请参阅 playwright 的 [`CDPSession`](https://playwright.dev/docs/api/class-cdpsession) 文档。 ::: ```ts diff --git a/guide/browser/examples.md b/guide/browser/examples.md index 3695b0038..fd590cb7b 100644 --- a/guide/browser/examples.md +++ b/guide/browser/examples.md @@ -6,7 +6,7 @@ title: Examples | Browser Mode 浏览器模式与框架无关,因此不提供任何渲染组件的方法。不过,你应该可以使用框架的测试工具包。 -我们建议根据您的框架使用 `testing-library` packages: +我们建议根据您的框架使用 `testing-library` packages: - [`@testing-library/dom`](https://testing-library.com/docs/dom-testing-library/intro) if you don't use a framework - [`@testing-library/vue`](https://testing-library.com/docs/vue-testing-library/intro) to render [vue](https://vuejs.org) components @@ -17,10 +17,11 @@ title: Examples | Browser Mode - [`@marko/testing-library`](https://testing-library.com/docs/marko-testing-library/intro) to render [marko](https://markojs.com) components ::: warning -`testing-library` 提供了一个包`@testing-library/user-event`。我们不建议直接使用它,因为它会模拟事件而非实际触发事件--相反,请使用从 `@vitest/browser/context`导入的 [`userEvent`](#interactivity-api),它使用 Chrome DevTools 协议或 Webdriver(取决于provider)。 +`testing-library` 提供了一个包 `@testing-library/user-event`。我们不建议直接使用它,因为它会模拟事件而非实际触发事件--相反,请使用从 `@vitest/browser/context` 导入的 [`userEvent`](#interactivity-api),它使用 Chrome DevTools 协议或 Webdriver(取决于 provider)。 ::: ::: code-group + ```ts [vue] // based on @testing-library/vue example // https://testing-library.com/docs/vue-testing-library/examples @@ -45,6 +46,7 @@ test('properly handles v-model', async () => { expect(screen.getByText('Hi, my name is Alice')).toBeInTheDocument() }) ``` + ```ts [svelte] // based on @testing-library/svelte // https://testing-library.com/docs/svelte-testing-library/example @@ -66,6 +68,7 @@ test('greeting appears on click', async () => { expect(greeting).toBeInTheDocument() }) ``` + ```tsx [react] // based on @testing-library/react example // https://testing-library.com/docs/react-testing-library/example-intro @@ -87,6 +90,7 @@ test('loads and displays greeting', async () => { expect(screen.getByRole('button')).toBeDisabled() }) ``` + ```tsx [preact] // based on @testing-library/preact example // https://testing-library.com/docs/preact-testing-library/example @@ -115,6 +119,7 @@ test('shows the children when the checkbox is checked', async () => { expect(getByText(testMessage)).toBeInTheDocument() }) ``` + ```tsx [solid] // baed on @testing-library/solid API // https://testing-library.com/docs/solid-testing-library/api @@ -140,6 +145,7 @@ it('uses params', async () => { expect(await findByText('Id: 1234')).toBeInTheDocument() }) ``` + ```ts [marko] // baed on @testing-library/marko API // https://testing-library.com/docs/marko-testing-library/api @@ -155,4 +161,5 @@ test('renders a message', async () => { `) }) ``` + ::: diff --git a/guide/browser/index.md b/guide/browser/index.md index daf87bb6d..3bd35b9e9 100644 --- a/guide/browser/index.md +++ b/guide/browser/index.md @@ -8,7 +8,7 @@ outline: deep 此页面提供有关 Vitest API 中实验性浏览器模式功能的信息,该功能允许你在浏览器中本地运行测试,提供对窗口和文档等浏览器全局变量的访问。此功能目前正在开发中,API 未来可能会更改。 ::: tip -如果你需要 `expect` 、`vi` ,或者像测试项目、类型测试等通用 API 的文档,请查看 [“快速起步” 指南](/guide/)。 +如果你需要 `expect`、`vi`,或者像测试项目、类型测试等通用 API 的文档,请查看 [“快速起步” 指南](/guide/)。 ::: Vitest UI @@ -19,18 +19,23 @@ outline: deep 为方便设置,可使用 `vitest init browser` 命令安装所需的依赖项并创建浏览器配置。 ::: code-group + ```bash [npm] npx vitest init browser ``` + ```bash [yarn] yarn exec vitest init browser ``` + ```bash [pnpm] pnpx vitest init browser ``` + ```bash [bun] bunx vitest init browser ``` + ::: ### 手动安装 {#manual-installation} @@ -38,59 +43,74 @@ bunx vitest init browser 我们也可以手动安装软件包。默认情况下,浏览器模式不需要任何额外的端到端 provider 就能在本地运行测试,因为它会复用你现有的浏览器。 ::: code-group + ```bash [npm] npm install -D vitest @vitest/browser ``` + ```bash [yarn] yarn add -D vitest @vitest/browser ``` + ```bash [pnpm] pnpm add -D vitest @vitest/browser ``` + ```bash [bun] bun add -D vitest @vitest/browser ``` + ::: ::: warning -不过,要在 CI 中运行测试,我们需要安装 [`playwright`](https://npmjs.com/package/playwright) 或 [`webdriverio`](https://www.npmjs.com/package/webdriverio) 。我们还建议在本地测试时切换到这两个选项中的一个,而不是使用默认的 `preview` 提供程序,因为它依赖于模拟事件而不是使用 Chrome DevTools 协议。 +不过,要在 CI 中运行测试,我们需要安装 [`playwright`](https://npmjs.com/package/playwright) 或 [`webdriverio`](https://www.npmjs.com/package/webdriverio)。我们还建议在本地测试时切换到这两个选项中的一个,而不是使用默认的 `preview` 提供程序,因为它依赖于模拟事件而不是使用 Chrome DevTools 协议。 -如果我们尚未使用这些工具中的任何一个,我们建议从 Playwright 开始,因为它支持并行执行,这可以使我们的测试运行得更快。此外,Playwright 使用的是 [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/) ,通常比 WebDriver 更快。 +如果我们尚未使用这些工具中的任何一个,我们建议从 Playwright 开始,因为它支持并行执行,这可以使我们的测试运行得更快。此外,Playwright 使用的是 [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/),通常比 WebDriver 更快。 ::: tabs key:provider == Playwright [Playwright](https://npmjs.com/package/playwright) 是一个用于网络测试和自动化的框架。 ::: code-group + ```bash [npm] npm install -D vitest @vitest/browser playwright ``` + ```bash [yarn] yarn add -D vitest @vitest/browser playwright ``` + ```bash [pnpm] pnpm add -D vitest @vitest/browser playwright ``` + ```bash [bun] bun add -D vitest @vitest/browser playwright ``` + == WebdriverIO [WebdriverIO](https://www.npmjs.com/package/webdriverio) 允许我们使用 WebDriver 协议在本地运行测试。 ::: code-group + ```bash [npm] npm install -D vitest @vitest/browser webdriverio ``` + ```bash [yarn] yarn add -D vitest @vitest/browser webdriverio ``` + ```bash [pnpm] pnpm add -D vitest @vitest/browser webdriverio ``` + ```bash [bun] bun add -D vitest @vitest/browser webdriverio ``` + ::: ## 配置 {#configuration} @@ -124,6 +144,7 @@ Vitest 默认分配端口号 `63315` 以避免与开发服务器冲突,允许 如果之前未使用过 Vite,请确保已安装框架插件并在配置中指定。有些框架可能需要额外配置才能运行,请查看其 Vite 相关文档以确定。 ::: code-group + ```ts [react] import react from '@vitejs/plugin-react' import { playwright } from '@vitest/browser-playwright' @@ -141,6 +162,7 @@ export default defineConfig({ } }) ``` + ```ts [vue] import { defineConfig } from 'vitest/config' import { playwright } from '@vitest/browser-playwright' @@ -159,6 +181,7 @@ export default defineConfig({ } }) ``` + ```ts [svelte] import { svelte } from '@sveltejs/vite-plugin-svelte' import { playwright } from '@vitest/browser-playwright' @@ -176,6 +199,7 @@ export default defineConfig({ } }) ``` + ```ts [solid] import solidPlugin from 'vite-plugin-solid' import { playwright } from '@vitest/browser-playwright' @@ -193,6 +217,7 @@ export default defineConfig({ } }) ``` + ```ts [marko] import marko from '@marko/vite' import { playwright } from '@vitest/browser-playwright' @@ -210,6 +235,7 @@ export default defineConfig({ } }) ``` + ::: 如果你想让部分测试通过基于 Node 的运行器执行,可以在配置中使用 [`projects`](/guide/projects) 选项,并为不同的测试策略提供独立的配置: @@ -261,6 +287,7 @@ export default defineConfig({ ## 浏览器选项类型 {#browser-option-types} Vitest 中的浏览器选项取决于 provider。如果在配置文件中传递 `--browser` 且未指定其名称,则 Vitest 将失败。可用选项: + - `webdriverio` 支持这些浏览器: - `firefox` - `chrome` @@ -276,20 +303,25 @@ Vitest 中的浏览器选项取决于 provider。如果在配置文件中传递 默认情况下,TypeScript 无法识别 providers 选项和额外的 `expect` 属性。如果我们不使用任何 providers ,请确保在测试、[设置文件](/config/#setupfiles) 或 [配置文件](/config/) 中引用 `@vitest/browser/matchers`,以获取额外的 `expect` 定义。如果我们使用自定义 providers ,请确保在同一文件中添加 `@vitest/browser/providers/playwright` 或 `@vitest/browser/providers/webdriverio`,以便 TypeScript 可以获取自定义选项的定义: ::: code-group + ```ts [default] /// ``` + ```ts [playwright] /// ``` + ```ts [webdriverio] /// ``` + ::: 或者,我们也可以将它们添加到 `tsconfig.json` 文件中的 `compilerOptions.types` 字段。请注意,在此字段中指定任何内容将禁用 `@types/*` 包的 [自动加载](https://www.typescriptlang.org/tsconfig/#types) 功能。 ::: code-group + ```json [default] { "compilerOptions": { @@ -297,6 +329,7 @@ Vitest 中的浏览器选项取决于 provider。如果在配置文件中传递 } } ``` + ```json [playwright] { "compilerOptions": { @@ -304,6 +337,7 @@ Vitest 中的浏览器选项取决于 provider。如果在配置文件中传递 } } ``` + ```json [webdriverio] { "compilerOptions": { @@ -311,13 +345,14 @@ Vitest 中的浏览器选项取决于 provider。如果在配置文件中传递 } } ``` + ::: ## 浏览器兼容性 {#browser-compatibility} -Vitest 使用 [Vite dev server](https://cn.vitejs.dev/guide/#browser-support) 来运行我们的测试,因此我们只支持 [`esbuild.target`](https://cn.vitejs.dev/config/shared-options#esbuild)选项(默认为 `esnext`)中指定的功能。 +Vitest 使用 [Vite dev server](https://cn.vitejs.dev/guide/#browser-support) 来运行我们的测试,因此我们只支持 [`esbuild.target`](https://cn.vitejs.dev/config/shared-options#esbuild) 选项(默认为 `esnext`)中指定的功能。 -默认情况下,Vite 的目标浏览器支持原生 [ES Modules](https://caniuse.com/es6-module)、原生 [ESM 动态导入](https://caniuse.com/es6-module-dynamic-import) 和 [`import.meta`](https://caniuse.com/mdn-javascript_operators_import_meta)。此外,我们还利用 [`BroadcastChannel`](https://caniuse.com/?search=BroadcastChannel)在 iframe 之间进行通信: +默认情况下,Vite 的目标浏览器支持原生 [ES Modules](https://caniuse.com/es6-module)、原生 [ESM 动态导入](https://caniuse.com/es6-module-dynamic-import) 和 [`import.meta`](https://caniuse.com/mdn-javascript_operators_import_meta)。此外,我们还利用 [`BroadcastChannel`](https://caniuse.com/?search=BroadcastChannel) 在 iframe 之间进行通信: - Chrome >=87 - Firefox >=78 @@ -350,7 +385,7 @@ Vitest 默认会在开发模式下自动打开浏览器界面,测试会在页 无头模式是浏览器模式下可用的另一个选项。在无头模式下,浏览器在没有用户界面的情况下在后台运行,这对于运行自动化测试非常有用。Vitest 中的 headless 选项可以设置为布尔值以启用或禁用无头模式。 -在使用无头模式时,Vitest 不会自动打开用户界面。如果我们希望继续使用用户界面,同时让测试以 无头模式运行,我们可以安装 [`@vitest/ui`](/guide/ui) 包,并在运行Vitest时传递 `--ui` 标志。 +在使用无头模式时,Vitest 不会自动打开用户界面。如果我们希望继续使用用户界面,同时让测试以 无头模式运行,我们可以安装 [`@vitest/ui`](/guide/ui) 包,并在运行 Vitest 时传递 `--ui` 标志。 这是启用无头模式的示例配置: @@ -440,6 +475,7 @@ await page.getByLabelText(/username/i).fill('Alice') ``` ::: code-group + ```ts [vue] import { render } from 'vitest-browser-vue' import Component from './Component.vue' @@ -460,6 +496,7 @@ test('properly handles v-model', async () => { await expect.element(screen.getByText('Hi, my name is Bob')).toBeInTheDocument() }) ``` + ```ts [svelte] import { expect, test } from 'vitest' import { render } from 'vitest-browser-svelte' @@ -476,6 +513,7 @@ test('greeting appears on click', async () => { await expect.element(greeting).toBeInTheDocument() }) ``` + ```tsx [react] import { render } from 'vitest-browser-react' import Fetch from './fetch' @@ -493,6 +531,7 @@ test('loads and displays greeting', async () => { await expect.element(screen.getByRole('button')).toBeDisabled() }) ``` + ```ts [lit] import { html } from 'lit' import { render } from 'vitest-browser-lit' @@ -508,6 +547,7 @@ test('greeting appears on click', async () => { await expect.element(greeting).toBeInTheDocument() }) ``` + ```tsx [preact] import Greeting from '.Greeting' import { createElement } from 'preact' @@ -523,6 +563,7 @@ test('greeting appears on click', async () => { await expect.element(greeting).toBeInTheDocument() }) ``` + ::: Vitest 并不支持所有开箱即用的框架,但我们可以使用外部工具来运行这些框架的测试。我们还鼓励社区创建他们自己的 `vitest-browser` 封装程序,如果我们有这样的封装程序,请随时将其添加到上述示例中。 @@ -535,10 +576,11 @@ Vitest 并不支持所有开箱即用的框架,但我们可以使用外部工 我们还可以在 [`browser-examples`](https://github.com/vitest-tests/browser-examples) 中查看更多的案例。 ::: warning -`testing-library` 提供了一个软件包 `@testing-library/user-event`。我们不建议直接使用它,因为它会模拟事件而非实际触发事件--相反,请使用从 `vitest/browser`导入的 [`userEvent`](/guide/browser/interactivity-api),它在引擎盖下使用 Chrome DevTools 协议或 Webdriver(取决于provider)。 +`testing-library` 提供了一个软件包 `@testing-library/user-event`。我们不建议直接使用它,因为它会模拟事件而非实际触发事件--相反,请使用从 `vitest/browser` 导入的 [`userEvent`](/guide/browser/interactivity-api),它在引擎盖下使用 Chrome DevTools 协议或 Webdriver(取决于 provider)。 ::: ::: code-group + ```tsx [solid] // based on @testing-library/solid API // https://testing-library.com/docs/solid-testing-library/api @@ -566,6 +608,7 @@ it('uses params', async () => { await expect.screen(screen.getByText('Id: 1234')).toBeInTheDocument() }) ``` + ```ts [marko] // based on @testing-library/marko API // https://testing-library.com/docs/marko-testing-library/api @@ -582,6 +625,7 @@ test('renders a message', async () => { `) }) ``` + ::: ## 限制 {#limitations} @@ -594,7 +638,7 @@ test('renders a message', async () => { ### 对模块的导出内容进行监听(Spy) {#spying-on-module-exports} -在浏览器模式下,Vitest 依赖浏览器自身对 ESM 模块的原生支持来加载模块。此时,模块的命名空间对象是不可修改的,这与 Node.js 测试中 Vitest 能够对模块执行打补丁不同。因此,你不能对通过 import 导入的对象使用 `vi.spyOn` : +在浏览器模式下,Vitest 依赖浏览器自身对 ESM 模块的原生支持来加载模块。此时,模块的命名空间对象是不可修改的,这与 Node.js 测试中 Vitest 能够对模块执行打补丁不同。因此,你不能对通过 import 导入的对象使用 `vi.spyOn`: ```ts import { vi } from 'vitest' @@ -616,15 +660,17 @@ vi.mocked(module.method).mockImplementation(() => { }) ``` -不过,如果你想模拟导出的 _变量_ ,唯一可行的方式是让模块额外导出一个能修改该变量内部值的方法: +不过,如果你想模拟导出的 _变量_,唯一可行的方式是让模块额外导出一个能修改该变量内部值的方法: ::: code-group + ```js [module.js] export let MODE = 'test' export function changeMode(newMode) { MODE = newMode } ``` + ```js [module.test.ts] import { expect } from 'vitest' import { changeMode, MODE } from './module.js' @@ -632,4 +678,5 @@ import { changeMode, MODE } from './module.js' changeMode('production') expect(MODE).toBe('production') ``` + ::: diff --git a/guide/browser/interactivity-api.md b/guide/browser/interactivity-api.md index fa63689f6..e025a3226 100644 --- a/guide/browser/interactivity-api.md +++ b/guide/browser/interactivity-api.md @@ -12,15 +12,18 @@ import { userEvent } from 'vitest/browser' await userEvent.click(document.querySelector('.button')) ``` -几乎所有的 `userEvent` 方法都继承了其提供者的选项。要在我们的 IDE 中查看所有可用选项,请根据我们的提供者,将 `webdriver` 或 `playwright` 类型添加到我们的 [setup 文件](/config/#setupfile) 或 [配置文件](/config/)中(取决于我们的 `tsconfig.json` 中 `included` 部分包含的内容): +几乎所有的 `userEvent` 方法都继承了其提供者的选项。要在我们的 IDE 中查看所有可用选项,请根据我们的提供者,将 `webdriver` 或 `playwright` 类型添加到我们的 [setup 文件](/config/#setupfile) 或 [配置文件](/config/) 中(取决于我们的 `tsconfig.json` 中 `included` 部分包含的内容): ::: code-group + ```ts [playwright] /// ``` + ```ts [webdriverio] /// ``` + ::: ## userEvent.setup @@ -177,7 +180,7 @@ test('update input', async () => { 该方法聚焦元素、填充元素并在填充后触发一个 `input` 事件。您可以使用空字符串来清除字段。 ::: tip -该 API 比使用 [`userEvent.type`](#userevent-type) 或 [`userEvent.keyboard`](#userevent-keyboard) 更快,但**不支持** [user-event `keyboard` syntax](https://testing-library.com/docs/user-event/keyboard) (例如,`{Shift}{selectall}`)。 +该 API 比使用 [`userEvent.type`](#userevent-type) 或 [`userEvent.keyboard`](#userevent-keyboard) 更快,但 **不支持** [user-event `keyboard` syntax](https://testing-library.com/docs/user-event/keyboard)(例如,`{Shift}{selectall}`)。 在不需要输入特殊字符或对按键事件进行细粒度控制的情况下,我们建议使用此 API 而不是 [`userEvent.type`](#userevent-type)。 ::: @@ -222,7 +225,7 @@ test('trigger keystrokes', async () => { function tab(options?: UserEventTabOptions): Promise ``` -发送一个 `Tab` 键事件。这是`userEvent.keyboard('{tab}')`的简写。 +发送一个 `Tab` 键事件。这是 `userEvent.keyboard('{tab}')` 的简写。 ```ts import { page, userEvent } from 'vitest/browser' @@ -264,7 +267,7 @@ function type( `type` 方法在 [`keyboard`](https://testing-library.com/docs/user-event/keyboard) API 的基础上实现了 `@testing-library/user-event` 的 [`type`](https://testing-library.com/docs/user-event/utility/#type) 工具。 -你可以使用此函数向 `input` 、`textarea` 或 `contenteditable` 元素中模拟键盘输入。它兼容 [user-event 提供的 `keyboard` 语法](https://testing-library.com/docs/user-event/keyboard)。 +你可以使用此函数向 `input`、`textarea` 或 `contenteditable` 元素中模拟键盘输入。它兼容 [user-event 提供的 `keyboard` 语法](https://testing-library.com/docs/user-event/keyboard)。 如果只需按下字符而无需输入,请使用 [`userEvent.keyboard`](#userevent-keyboard) API。 @@ -425,7 +428,7 @@ function unhover( 其作用与 [`userEvent.hover`](#userevent-hover) 相同,但会将光标移至 `document.body` 元素。 ::: warning -默认情况下,光标位置位于 body 元素的 "某个" 可见位置(在 `playwright` provider中)或中心位置(在 `webdriverio` provider中),因此如果当前悬停的元素已经位于相同位置,本方法将不起作用。 +默认情况下,光标位置位于 body 元素的 "某个" 可见位置(在 `playwright` provider 中)或中心位置(在 `webdriverio` provider 中),因此如果当前悬停的元素已经位于相同位置,本方法将不起作用。 ::: ```ts @@ -513,7 +516,7 @@ test('drag and drop works', async () => { ``` ::: warning - `preview` provider不支持此 API。 +`preview` provider 不支持此 API。 ::: 相关链接: diff --git a/guide/browser/locators.md b/guide/browser/locators.md index 57403e147..e7ee585ce 100644 --- a/guide/browser/locators.md +++ b/guide/browser/locators.md @@ -65,7 +65,7 @@ await page.getByRole('button', { name: /submit/i }).click() 根据 ARIA 指南,**强烈不建议** 通过 `role` 或 `aria-*` 属性为已经具有隐式角色的内置元素提供角色。 ::: -##### Options +### Options - `exact: boolean` @@ -189,7 +189,7 @@ await page.getByRole('button', { name: /submit/i }).click() page.getByRole('button', { selected: false }) // ❌ ``` -##### 更多内容请参阅 {#see-also} +#### 更多内容请参阅 {#see-also} - [MDN 上的 ARIA 角色列表](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles) - [w3.org 上的 ARIA 角色列表](https://www.w3.org/TR/wai-aria-1.2/#role_definitions) @@ -213,7 +213,7 @@ page.getByAltText(/incredibles.*? poster/i) // ✅ page.getByAltText('non existing alt text') // ❌ ``` -#### Options +### Options - `exact: boolean` @@ -260,7 +260,7 @@ function getByLabelText( ``` -#### Options +### Options - `exact: boolean` @@ -292,7 +292,7 @@ page.getByPlaceholder('not found') // ❌ 通常情况下,使用 [`getByLabelText`](#getbylabeltext) 依赖标签比依赖占位符更好。 ::: -#### Options +### Options - `exact: boolean` @@ -324,7 +324,7 @@ page.getByText('about', { exact: true }) // ❌ 此定位器适用于定位非交互式元素。如果你需要定位交互式元素,比如按钮或输入框,建议使用 [`getByRole`](#getbyrole)。 ::: -#### Options +### Options - `exact: boolean` @@ -352,7 +352,7 @@ page.getByTitle('Delete') // ✅ page.getByTitle('Create') // ❌ ``` -#### Options +### Options - `exact: boolean` @@ -381,7 +381,7 @@ page.getByTestId('non-existing-element') // ❌ 建议仅在其他定位器不适用于你的使用场景时才使用此方法。使用 `data-testid` 属性并不符合用户实际使用软件的方式,因此如果可能应避免使用。 ::: -#### Options +### Options - `exact: boolean` @@ -487,6 +487,7 @@ page.getByRole('button') .or(page.getByRole('link')) .click() // ❌ 匹配到多个元素 ``` + ::: ## filter @@ -540,6 +541,7 @@ page.getByRole('article') .filter({ has: page.getByRole('button', { name: 'delete row' }) }) .filter({ has: page.getByText('Vitest') }) ``` + ::: ### hasNot @@ -704,7 +706,7 @@ await page.getByRole('img', { name: 'Rose' }).unhover() function fill(text: string, options?: UserEventFillOptions): Promise ``` -为当前的 `input` 、`textarea` 或 `contenteditable` 元素赋值。 +为当前的 `input`、`textarea` 或 `contenteditable` 元素赋值。 ```ts import { page } from 'vitest/browser' @@ -856,6 +858,7 @@ function element(): Element ```ts await expect.element(page.getByRole('button')).toBeDisabled() ``` + ::: 考虑以下 DOM 结构: @@ -923,7 +926,7 @@ function all(): Locator[] 在内部,此方法调用 `.elements` 并使用 [`page.elementLocator`](/guide/browser/context#page) 包装每个元素。 -- [更多内容请参阅 `locator.elements()`](#elements) +- [更多内容请参阅 `locator.elements()`](#elements) ## Properties @@ -955,6 +958,7 @@ test('works correctly', async () => { await commands.test(page.getByText('Hello')) // ✅ }) ``` + ::: ### length diff --git a/guide/browser/multiple-setups.md b/guide/browser/multiple-setups.md index 925e83b5b..ef314e76c 100644 --- a/guide/browser/multiple-setups.md +++ b/guide/browser/multiple-setups.md @@ -33,6 +33,7 @@ export default defineConfig({ 你还可以独立于浏览器指定不同的配置选项(尽管,实例也可以有 `browser` 字段): ::: code-group + ```ts [vitest.config.ts] import { defineConfig } from 'vitest/config' import { playwright } from '@vitest/browser-playwright' @@ -64,6 +65,7 @@ export default defineConfig({ }, }) ``` + ```ts [example.test.ts] import { expect, inject, test } from 'vitest' import { globalSetupModifier } from './example.js' @@ -72,6 +74,7 @@ test('ratio works', () => { expect(inject('ratio') * globalSetupModifier).toBe(14) }) ``` + ::: 在这个例子中,Vitest 将在 `chromium` 浏览器中运行所有测试,但仅在第一个配置中执行 `'./ratio-setup.ts'` 文件,并根据 [`provide` 字段](/config/#provide) 注入不同的 `ratio` 值。 @@ -89,6 +92,7 @@ $ vitest --project=chromium ``` ::: code-group + ```ts{6,8} [default] export default defineConfig({ test: { @@ -103,6 +107,7 @@ export default defineConfig({ } }) ``` + ```ts{3,7,9} [custom] export default defineConfig({ test: { @@ -118,6 +123,7 @@ export default defineConfig({ } }) ``` + ::: ::: warning diff --git a/guide/browser/playwright.md b/guide/browser/playwright.md index 59f93cba0..cbf633445 100644 --- a/guide/browser/playwright.md +++ b/guide/browser/playwright.md @@ -16,7 +16,7 @@ } ``` -Vitest 打开一个页面以在同一文件中运行所有测试。我们可以在 `instances` 中配置 `launch` 、`connect` 和 `context` 属性: +Vitest 打开一个页面以在同一文件中运行所有测试。我们可以在 `instances` 中配置 `launch`、`connect` 和 `context` 属性: ```ts{9-11} [vitest.config.ts] import { defineConfig } from 'vitest/config' diff --git a/guide/browser/retry-ability.md b/guide/browser/retry-ability.md index 8b6a90f93..aae5b3a2e 100644 --- a/guide/browser/retry-ability.md +++ b/guide/browser/retry-ability.md @@ -1,10 +1,10 @@ --- -title: Retry-ability | Browser Mode +title: Retry-ability | 浏览器模式 --- # Retry-ability -浏览器中的测试由于其异步特性,可能会不一致地失败。因此,即使条件延迟(如超时、网络请求或动画),也必须有办法保证断言成功。为此,Vitest 通过 [`expect.poll`](/api/expect#poll)和 `expect.element` API 提供了可重试的断言: +浏览器中的测试由于其异步特性,可能会不一致地失败。因此,即使条件延迟(如超时、网络请求或动画),也必须有办法保证断言成功。为此,Vitest 通过 [`expect.poll`](/api/expect#poll) 和 `expect.element` API 提供了可重试的断言: ```ts import { screen } from '@testing-library/dom' @@ -26,12 +26,13 @@ test('error banner is rendered', async () => { ``` ::: tip -`expect.element` 是 `expect.poll(() => element)`的简写,工作方式完全相同。 +`expect.element` 是 `expect.poll(() => element)` 的简写,工作方式完全相同。 -`toHaveTextContent` 和所有其他 [`@testing-library/jest-dom`](https://github.com/testing-library/jest-dom)断言在没有内置重试机制的常规`expect`中仍然可用: +`toHaveTextContent` 和所有其他 [`@testing-library/jest-dom`](https://github.com/testing-library/jest-dom) 断言在没有内置重试机制的常规 `expect` 中仍然可用: ```ts // will fail immediately if .textContent is not `'Error!'` expect(banner).toHaveTextContent('Error!') ``` + ::: diff --git a/guide/browser/webdriverio.md b/guide/browser/webdriverio.md index 213f65535..46744a33c 100644 --- a/guide/browser/webdriverio.md +++ b/guide/browser/webdriverio.md @@ -1,4 +1,4 @@ -# 配置 WebdriverIO {#configuring-webdriverio} +# 配置 WebdriverIO {#configuring-webdriverio} ::: info 对比 Playwright 与 WebdriverIO 如果我们的项目尚未使用 WebdriverIO,我们建议从 [Playwright](/guide/browser/playwright) 开始,因为它更易于配置且 API 更灵活。 diff --git a/guide/cli-generated.md b/guide/cli-generated.md index afc5cae4f..a5b3f04e8 100644 --- a/guide/cli-generated.md +++ b/guide/cli-generated.md @@ -57,7 +57,7 @@ - **命令行终端:** `--api.port [port]` -指定服务器端口。注意,如果端口已被使用,Vite 会自动尝试下一个可用端口,因此这可能不是服务器最终监听的实际端口。如果为 `true`,将设置为`51204` +指定服务器端口。注意,如果端口已被使用,Vite 会自动尝试下一个可用端口,因此这可能不是服务器最终监听的实际端口。如果为 `true`,将设置为 `51204` ### api.host @@ -187,7 +187,7 @@ - **命令行终端:** `--coverage.skipFull` - **配置:** [coverage.skipFull](/config/#coverage-skipfull) - 不显示语句、分支和函数覆盖率为 100% 的文件(默认值:`false`) +不显示语句、分支和函数覆盖率为 100% 的文件(默认值:`false`) ### coverage.thresholds.100 @@ -201,7 +201,7 @@ - **命令行终端:** `--coverage.thresholds.perFile` - **配置:** [coverage.thresholds.perFile](/config/#coverage-thresholds-perfile) -检查每个文件的阈值。 `--coverage.thresholds.lines`, `--coverage.thresholds.functions`, `--coverage.thresholds.branches`, `--coverage.thresholds.statements` 为实际阈值(默认值:`false`) +检查每个文件的阈值。`--coverage.thresholds.lines`, `--coverage.thresholds.functions`, `--coverage.thresholds.branches`, `--coverage.thresholds.statements` 为实际阈值(默认值:`false`) ### coverage.thresholds.autoUpdate @@ -239,7 +239,7 @@ - **命令行终端:** `--coverage.ignoreClassMethods ` - **配置:** [coverage.ignoreClassMethods](/config/#coverage-ignoreclassmethods) -覆盖时要忽略的类方法名称数组。更多信息请访问 [istanbuljs](https://github.com/istanbuljs/nyc#ignoring-methods) 。该选项仅适用于 istanbul providers(默认值:`[]`)。 +覆盖时要忽略的类方法名称数组。更多信息请访问 [istanbuljs](https://github.com/istanbuljs/nyc#ignoring-methods)。该选项仅适用于 istanbul providers(默认值:`[]`)。 ### coverage.processingConcurrency @@ -325,7 +325,7 @@ High and low watermarks for functions in the format of `,` - **命令行终端:** `--browser.name ` - **配置:** [browser.name](/guide/browser/config#browser-name) -在特定浏览器中运行所有测试。某些浏览器仅适用于特定提供商(请参阅 `--browser.provider` )。访问 [`browser.name`](https://vitest.dev/guide/browser/config/#browser-name) 了解更多信息 +在特定浏览器中运行所有测试。某些浏览器仅适用于特定提供商(请参阅 `--browser.provider`)。访问 [`browser.name`](https://vitest.dev/guide/browser/config/#browser-name) 了解更多信息 ### browser.headless @@ -455,7 +455,7 @@ High and low watermarks for functions in the format of `,` - **命令行终端:** `--poolOptions.vmThreads.maxThreads ` - **配置:** [poolOptions.vmThreads.maxThreads](/config/#pooloptions-vmthreads-maxthreads) -运行测试的最大线程数或百分比 + 运行测试的最大线程数或百分比 ### poolOptions.vmThreads.minThreads @@ -623,7 +623,7 @@ VM forks pool 的内存限制。如果你观察到内存泄漏问题,可以尝 - **命令行终端:** `--sequence.seed ` - **配置:** [sequence.seed](/config/#sequence-seed) -设置随机化种子。如果 --sequence.shuffle(随机序列)是`false`,则此选项无效。 t 通过 ["Random Seed" page](https://en.wikipedia.org/wiki/Random_seed) 查看更多信息 +设置随机化种子。如果 --sequence.shuffle(随机序列)是 `false`,则此选项无效。 t 通过 ["Random Seed" page](https://en.wikipedia.org/wiki/Random_seed) 查看更多信息 ### sequence.hooks @@ -637,7 +637,7 @@ VM forks pool 的内存限制。如果你观察到内存泄漏问题,可以尝 - **命令行终端:** `--sequence.setupFiles ` - **配置:** [sequence.setupFiles](/config/#sequence-setupfiles) - 更改设置文件的执行顺序。可接受的值有 "list" 和 "parallel"。如果设置为"list",将按照定义的顺序运行设置文件。如果设置为 "parallel",将并行运行设置文件(默认值:`"parallel"`)。 +更改设置文件的执行顺序。可接受的值有 "list" 和 "parallel"。如果设置为"list",将按照定义的顺序运行设置文件。如果设置为 "parallel",将并行运行设置文件(默认值:`"parallel"`)。 ### inspect @@ -679,7 +679,7 @@ VM forks pool 的内存限制。如果你观察到内存泄漏问题,可以尝 - **命令行终端:** `--retry ` - **配置:** [retry](/config/#retry) -如果测试失败,重试特定次数(默认值: `0`)。 +如果测试失败,重试特定次数(默认值:`0`)。 ### diff.aAnnotation @@ -896,14 +896,14 @@ Minimum time in milliseconds it takes to spawn the typechecker - **命令行终端:** `--expect.poll.timeout ` - **配置:** [expect.poll.timeout](/config/#expect-poll-timeout) -断言的轮询超时(以毫秒为单位) `expect.poll()` (默认值: `1000`) +断言的轮询超时(以毫秒为单位)`expect.poll()` (默认值: `1000`) ### printConsoleTrace - **命令行终端:** `--printConsoleTrace` - **配置:** [printConsoleTrace](/config/#printconsoletrace) - 始终打印控制台堆栈跟踪 +始终打印控制台堆栈跟踪 ### includeTaskLocation @@ -935,7 +935,7 @@ The directory where attachments from `context.annotate` are stored in (default: - **命令行终端:** `--clearScreen` - watch 模式下重新运行测试时清除终端屏幕(默认值:`true`)。 +watch 模式下重新运行测试时清除终端屏幕(默认值:`true`)。 ### configLoader diff --git a/guide/cli-table.md b/guide/cli-table.md index 096dfdc1d..fe4205db9 100644 --- a/guide/cli-table.md +++ b/guide/cli-table.md @@ -1,125 +1,125 @@ -| 选项 | | -| ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `-r, --root ` | 根路径 | -| `-c, --config ` | 配置文件的路径 | -| `-u, --update` | 更新快照 | -| `-w, --watch` | 启用 watch 模式 | -| `-t, --testNamePattern ` | 使用符合指定 regexp 模式的全名运行测试 | -| `--dir ` | 扫描测试文件的基本目录 | -| `--ui` | 启用用户界面 | -| `--open` | 自动打开用户界面 (默认: `!process.env.CI`) | -| `--api.port [port]` | 自动打开用户界面指定服务器端口。请注意,如果端口已被使用,Vite 会自动尝试下一个可用端口,因此这可能不是服务器最终监听的实际端口。如果为 "true",将设置为 `51204` | -| `--api.host [host]` | 指定服务器应该监听哪些 IP 地址。设为 `0.0.0.0` 或 `true` 则监听所有地址,包括局域网地址和公共地址 | -| `--api.strictPort` | 设置为 true 时,如果端口已被使用,则退出,而不是自动尝试下一个可用端口 | -| `--silent` | 测试控制台输出 | -| `--hideSkippedTests` | 隐藏跳过测试的日志 | -| `--reporter ` | 指定报告 | -| `--outputFile ` | 如果还指定了支持报告程序,则将测试结果写入文件,使用 cac 的点符号表示多个报告程序的单个输出结果 (比如: --outputFile.tap=./tap.txt) | -| `--coverage.all` | 是否在报告中包含所有文件,包括未测试的文件 | -| `--coverage.provider ` | 选择覆盖范围采集工具,可用值为 "V8"、"istanbul"和 "custom"。 | -| `--coverage.enabled` | 启用覆盖范围收集。可使用 `--coverage` CLI 选项覆盖(默认值:`false`)。 | -| `--coverage.include ` | 作为 glob 模式包含在覆盖范围内的文件。使用多个模式时,可指定多次(默认值:`**`)。 | -| `--coverage.exclude ` | 覆盖范围中要排除的文件。使用多个扩展名时,可指定多次(默认情况下: 访问 [`coverage.exclude`](https://vitest.dev/config/#coverage-exclude) | -| `--coverage.extension ` | 包含在覆盖范围内的扩展名。使用多个扩展名时,可指定多次 (默认: `[".js", ".cjs", ".mjs", ".ts", ".mts", ".tsx", ".jsx", ".vue", ".svelte"]`) | -| `--coverage.clean` | 运行测试前清除覆盖结果(默认值:true) | -| `--coverage.cleanOnRerun` | 重新运行监视时清理覆盖率报告(默认值:true) | -| `--coverage.reportsDirectory ` | 将覆盖率报告写入的目录(默认值: ./coverage) | -| `--coverage.reporter ` | 使用的报告。更多信息请访问 [`coverage.reporter`](https://vitest.dev/config/#coverage-reporter)。 (默认值: `["text", "html", "clover", "json"]`) | -| `--coverage.reportOnFailure` | 即使测试失败也能生成覆盖率报告 (默认值: `false`) | -| `--coverage.allowExternal` | 收集项目根目录外文件的覆盖范围(默认值:`false`) | -| `--coverage.skipFull` | 不显示语句、分支和函数覆盖率为 100% 的文件(默认值:`false`) | -| `--coverage.thresholds.100` | 将所有覆盖率阈值设置为 100 的快捷方式(默认值:`false`) | -| `--coverage.thresholds.perFile` | 检查每个文件的阈值。 `--coverage.thresholds.lines`, `--coverage.thresholds.functions`, `--coverage.thresholds.branches`, `--coverage.thresholds.statements` 为实际阈值(默认值:`false`) | -| `--coverage.thresholds.autoUpdate` | 更新阈值: 当当前覆盖率高于配置的阈值时,将 "lines"、"functions"、"branches"和 "statements"更新到配置文件(默认值:`false`) | -| `--coverage.thresholds.lines ` | 针对代码行的覆盖度阈值设定,请访问 [istanbuljs](https://github.com/istanbuljs/nyc#coverage-thresholds) 了解更多信息。此选项不适用于自定义 providers | -| `--coverage.thresholds.functions ` | 针对函数的覆盖度阈值设定,请访问 [istanbuljs](https://github.com/istanbuljs/nyc#coverage-thresholds) 了解更多信息。 此选项不适用于自定义 providers | -| `--coverage.thresholds.branches ` | 针对 branches 的覆盖度阈值设定,请访问 [istanbuljs](https://github.com/istanbuljs/nyc#coverage-thresholds) 了解更多信息。 此选项不适用于自定义 providers | -| `--coverage.thresholds.statements ` | 针对 statements 的覆盖度阈值设定,请访问 [istanbuljs](https://github.com/istanbuljs/nyc#coverage-thresholds) 了解更多信息。 此选项不适用于自定义 providers | -| `--coverage.ignoreClassMethods ` | 覆盖时要忽略的类方法名称数组。更多信息请访问 [istanbuljs](https://github.com/istanbuljs/nyc#ignoring-methods) 。该选项仅适用于 istanbul providers(默认值:`[]`)。 | -| `--coverage.processingConcurrency ` | 处理覆盖率结果时使用的并发限制。 (默认最小值介于 20 和 CPU 数量之间) | -| `--coverage.customProviderModule ` | 指定自定义覆盖范围提供程序模块的模块名称或路径。 请访问[自定义 providers 覆盖范围](https://vitest.dev/guide/coverage#custom-coverage-provider) 了解更多信息。 此选项仅适用于自定义 providers | -| `--coverage.watermarks.statements ` | High and low watermarks for statements in the format of `,` | -| `--coverage.watermarks.lines ` | High and low watermarks for lines in the format of `,` | -| `--coverage.watermarks.branches ` | High and low watermarks for branches in the format of `,` | -| `--coverage.watermarks.functions ` | High and low watermarks for functions in the format of `,` | -| `--mode ` | 覆盖 Vite 模式 (默认值: `test` 或 `benchmark`) | -| `--workspace ` | 工作区配置文件的路径 | -| `--isolate` | 隔离运行每个测试文件。要禁用隔离, 使用 `--no-isolate` (默认值: `true`) | -| `--globals` | 全局注入 | -| `--dom` | 使用 happy-dom 模拟浏览器 API | -| `--browser.enabled` | 在浏览器中运行测试。 相当于 `--browser.enabled` (默认值: `false`) | -| `--browser.name ` | 在特定浏览器中运行所有测试。某些浏览器只适用于特定的 providers (比如 `--browser.provider`). 通过 [`browser.name`](https://vitest.dev/config/#browser-name) 查看更多信息 | -| `--browser.headless` | 在无头模式下运行浏览器(即不打开图形用户界面)。如果在 CI 中运行 Vitest,默认情况下将启用无头模式 (默认值: `process.env.CI`) | -| `--browser.api.port [port]` | 指定服务器端口。注意,如果端口已被使用,Vite 会自动尝试下一个可用端口,因此这可能不是服务器最终监听的实际端口。如果为 `true`,将设置为 `63315` | -| `--browser.api.host [host]` | 指定服务器应该监听哪些 IP 地址。设为 `0.0.0.0` 或 `true` 则监听所有地址,包括局域网地址和公共地址 | -| `--browser.api.strictPort` | 设置为 true 时,如果端口已被使用,则退出,而不是自动尝试下一个可用端口 | +| 选项 | | +| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `-r, --root ` | 根路径 | +| `-c, --config ` | 配置文件的路径 | +| `-u, --update` | 更新快照 | +| `-w, --watch` | 启用 watch 模式 | +| `-t, --testNamePattern ` | 使用符合指定 regexp 模式的全名运行测试 | +| `--dir ` | 扫描测试文件的基本目录 | +| `--ui` | 启用用户界面 | +| `--open` | 自动打开用户界面 (默认: `!process.env.CI`) | +| `--api.port [port]` | 自动打开用户界面指定服务器端口。请注意,如果端口已被使用,Vite 会自动尝试下一个可用端口,因此这可能不是服务器最终监听的实际端口。如果为 "true",将设置为 `51204` | +| `--api.host [host]` | 指定服务器应该监听哪些 IP 地址。设为 `0.0.0.0` 或 `true` 则监听所有地址,包括局域网地址和公共地址 | +| `--api.strictPort` | 设置为 true 时,如果端口已被使用,则退出,而不是自动尝试下一个可用端口 | +| `--silent` | 测试控制台输出 | +| `--hideSkippedTests` | 隐藏跳过测试的日志 | +| `--reporter ` | 指定报告 | +| `--outputFile ` | 如果还指定了支持报告程序,则将测试结果写入文件,使用 cac 的点符号表示多个报告程序的单个输出结果 (比如: --outputFile.tap=./tap.txt) | +| `--coverage.all` | 是否在报告中包含所有文件,包括未测试的文件 | +| `--coverage.provider ` | 选择覆盖范围采集工具,可用值为 "V8"、"istanbul"和 "custom"。 | +| `--coverage.enabled` | 启用覆盖范围收集。可使用 `--coverage` CLI 选项覆盖(默认值:`false`)。 | +| `--coverage.include ` | 作为 glob 模式包含在覆盖范围内的文件。使用多个模式时,可指定多次(默认值:`**`)。 | +| `--coverage.exclude ` | 覆盖范围中要排除的文件。使用多个扩展名时,可指定多次(默认情况下: 访问 [`coverage.exclude`](https://vitest.dev/config/#coverage-exclude) | +| `--coverage.extension ` | 包含在覆盖范围内的扩展名。使用多个扩展名时,可指定多次 (默认: `[".js", ".cjs", ".mjs", ".ts", ".mts", ".tsx", ".jsx", ".vue", ".svelte"]`) | +| `--coverage.clean` | 运行测试前清除覆盖结果(默认值:true) | +| `--coverage.cleanOnRerun` | 重新运行监视时清理覆盖率报告(默认值:true) | +| `--coverage.reportsDirectory ` | 将覆盖率报告写入的目录(默认值: ./coverage) | +| `--coverage.reporter ` | 使用的报告。更多信息请访问 [`coverage.reporter`](https://vitest.dev/config/#coverage-reporter)。 (默认值: `["text", "html", "clover", "json"]`) | +| `--coverage.reportOnFailure` | 即使测试失败也能生成覆盖率报告 (默认值: `false`) | +| `--coverage.allowExternal` | 收集项目根目录外文件的覆盖范围(默认值:`false`) | +| `--coverage.skipFull` | 不显示语句、分支和函数覆盖率为 100% 的文件(默认值:`false`) | +| `--coverage.thresholds.100` | 将所有覆盖率阈值设置为 100 的快捷方式(默认值:`false`) | +| `--coverage.thresholds.perFile` | 检查每个文件的阈值。`--coverage.thresholds.lines`, `--coverage.thresholds.functions`, `--coverage.thresholds.branches`, `--coverage.thresholds.statements` 为实际阈值(默认值:`false`) | +| `--coverage.thresholds.autoUpdate` | 更新阈值: 当当前覆盖率高于配置的阈值时,将 "lines"、"functions"、"branches"和 "statements"更新到配置文件(默认值:`false`) | +| `--coverage.thresholds.lines ` | 针对代码行的覆盖度阈值设定,请访问 [istanbuljs](https://github.com/istanbuljs/nyc#coverage-thresholds) 了解更多信息。此选项不适用于自定义 providers | +| `--coverage.thresholds.functions ` | 针对函数的覆盖度阈值设定,请访问 [istanbuljs](https://github.com/istanbuljs/nyc#coverage-thresholds) 了解更多信息。 此选项不适用于自定义 providers | +| `--coverage.thresholds.branches ` | 针对 branches 的覆盖度阈值设定,请访问 [istanbuljs](https://github.com/istanbuljs/nyc#coverage-thresholds) 了解更多信息。 此选项不适用于自定义 providers | +| `--coverage.thresholds.statements ` | 针对 statements 的覆盖度阈值设定,请访问 [istanbuljs](https://github.com/istanbuljs/nyc#coverage-thresholds) 了解更多信息。 此选项不适用于自定义 providers | +| `--coverage.ignoreClassMethods ` | 覆盖时要忽略的类方法名称数组。更多信息请访问 [istanbuljs](https://github.com/istanbuljs/nyc#ignoring-methods)。该选项仅适用于 istanbul providers(默认值:`[]`)。 | +| `--coverage.processingConcurrency ` | 处理覆盖率结果时使用的并发限制。 (默认最小值介于 20 和 CPU 数量之间) | +| `--coverage.customProviderModule ` | 指定自定义覆盖范围提供程序模块的模块名称或路径。 请访问 [自定义 providers 覆盖范围](https://vitest.dev/guide/coverage#custom-coverage-provider) 了解更多信息。 此选项仅适用于自定义 providers | +| `--coverage.watermarks.statements ` | High and low watermarks for statements in the format of `,` | +| `--coverage.watermarks.lines ` | High and low watermarks for lines in the format of `,` | +| `--coverage.watermarks.branches ` | High and low watermarks for branches in the format of `,` | +| `--coverage.watermarks.functions ` | High and low watermarks for functions in the format of `,` | +| `--mode ` | 覆盖 Vite 模式 (默认值: `test` 或 `benchmark`) | +| `--workspace ` | 工作区配置文件的路径 | +| `--isolate` | 隔离运行每个测试文件。要禁用隔离, 使用 `--no-isolate` (默认值: `true`) | +| `--globals` | 全局注入 | +| `--dom` | 使用 happy-dom 模拟浏览器 API | +| `--browser.enabled` | 在浏览器中运行测试。 相当于 `--browser.enabled` (默认值: `false`) | +| `--browser.name ` | 在特定浏览器中运行所有测试。某些浏览器只适用于特定的 providers (比如 `--browser.provider`). 通过 [`browser.name`](https://vitest.dev/config/#browser-name) 查看更多信息 | +| `--browser.headless` | 在无头模式下运行浏览器(即不打开图形用户界面)。如果在 CI 中运行 Vitest,默认情况下将启用无头模式 (默认值: `process.env.CI`) | +| `--browser.api.port [port]` | 指定服务器端口。注意,如果端口已被使用,Vite 会自动尝试下一个可用端口,因此这可能不是服务器最终监听的实际端口。如果为 `true`,将设置为 `63315` | +| `--browser.api.host [host]` | 指定服务器应该监听哪些 IP 地址。设为 `0.0.0.0` 或 `true` 则监听所有地址,包括局域网地址和公共地址 | +| `--browser.api.strictPort` | 设置为 true 时,如果端口已被使用,则退出,而不是自动尝试下一个可用端口 | | `--browser.provider ` | 用于运行浏览器测试的 Provider。某些浏览器只适用于特定的提供 Provider,可以是"webdriverio", "playwright", "preview",或自定义 provider. 通过 [`browser.provider`](https://vitest.dev/config/#browser-provider) 查看更多信息 (默认值: `"preview"`) | -| `--browser.isolate` | 隔离运行每个浏览器测试文件。要禁用隔离请使用 `--browser.isolate=false` (默认值: `true`) | -| `--browser.ui` | 运行测试时显示 Vitest UI(默认值: `!process.env.CI`) | -| `--browser.fileParallelism` | 浏览器测试文件是否应并行运行。使用 `--browser.fileParallelism=false` 可禁用 (默认值: `true`) | -| `--pool ` | 如果未在浏览器中运行,则指定 pool (默认值: `threads`) | -| `--poolOptions.threads.isolate` | 在线程池中隔离测试 (默认值: `true`) | -| `--poolOptions.threads.singleThread` | 在单线程内运行测试 (默认值: `false`) | -| `--poolOptions.threads.maxThreads ` | 运行测试的最大线程数或百分比 | -| `--poolOptions.threads.minThreads ` | 运行测试的最小线程数或百分比 | -| `--poolOptions.threads.useAtomics` | 使用 Atomics 同步线程。这在某些情况下可以提高性能,但在较旧的 Node 版本中可能会导致 segfault。 (默认值: `false`) | -| `--poolOptions.vmThreads.isolate` | 在线程池中隔离测试 (默认值: `true`) | -| `--poolOptions.vmThreads.singleThread` | 在单线程内运行测试(默认值:`false`) | -| `--poolOptions.vmThreads.maxThreads ` | 运行测试的最大线程数或百分比 | -| `--poolOptions.vmThreads.minThreads ` | 运行测试的最小线程数或百分比 | -| `--poolOptions.vmThreads.useAtomics` | 使用 Atomics 同步线程。这在某些情况下可以提高性能,但在较旧的 Node 版本中可能会导致 segfault。 (默认值: `false`) | -| `--poolOptions.vmThreads.memoryLimit ` | 虚拟机线程池的内存限制。如果发现内存泄漏,请尝试调整该值。 | -| `--poolOptions.forks.isolate` | 在 forks pool 中隔离测试 (默认值: `true`) | -| `--poolOptions.forks.singleFork` | 单个子进程内运行测试 (default: `false`) | -| `--poolOptions.forks.maxForks ` | 运行测试的最大进程数 | -| `--poolOptions.forks.minForks ` | 运行测试的最小进程数 | -| `--poolOptions.vmForks.isolate` | 在 forks pool 中隔离测试 (default: `true`) | -| `--poolOptions.vmForks.singleFork` | 在单个子进程内运行测试 (default: `false`) | -| `--poolOptions.vmForks.maxForks ` | 运行测试的最大进程数 | -| `--poolOptions.vmForks.minForks ` | 运行测试的最小进程数 | -| `--poolOptions.vmForks.memoryLimit ` | VM forks pool 的内存限制。如果你观察到内存泄漏问题,可以尝试调整这个值。 | -| `--fileParallelism` | 是否所有测试文件都应并行运行. 使用 `--no-file-parallelism` 去禁用 (默认值: `true`) | -| `--maxWorkers ` | 同时并发执行测试任务的最大线程数或百分比 | -| `--minWorkers ` | 同时并发执行测试任务的最小线程数或百分比 | -| `--environment ` | 如果不在浏览器中运行,则指定运行环境 (默认值: `node`) | -| `--passWithNoTests` | 未发现测试时通过 | -| `--logHeapUsage` | 在节点中运行时,显示每个测试的堆大小 | -| `--allowOnly` | 允许执行那些被标记为"only"的测试用例或测试套件 (默认值: `!process.env.CI`) | -| `--dangerouslyIgnoreUnhandledErrors` | 忽略任何未处理的错误 | -| `--shard ` | 测试套件分区的执行格式为 `/` | -| `--changed [since]` | 运行受更改文件影响的测试 (默认值: `false`) | -| `--sequence.shuffle.files` | 以随机顺序运行文件。如果启用此选项,长时间运行的测试将不会提前开始。 (默认值: `false`) | -| `--sequence.shuffle.tests` | 以随机方式运行测试(默认值:`false`) | -| `--sequence.concurrent` | 使测试并行运行(默认值:`false`) | -| `--sequence.seed ` | 设置随机化种子。如果 --sequence.shuffle(随机序列)是`false`,则此选项无效。 t 通过 ["Random Seed" page](https://en.wikipedia.org/wiki/Random_seed) 查看更多信息 | -| `--sequence.hooks ` | 更改钩子的执行顺序。 可接受的值有: "stack", "list" and "parallel". 通过 [`sequence.hooks`](https://vitest.dev/config/#sequence-hooks) 查看更多信息 (默认值: `"parallel"`) | -| `--sequence.setupFiles ` | 更改设置文件的执行顺序。可接受的值有 "list" 和 "parallel"。如果设置为"list",将按照定义的顺序运行设置文件。如果设置为 "parallel",将并行运行设置文件(默认值:`"parallel"`)。 | -| `--inspect [[host:]port]` | 启用 Node.js 检查器(默认值:`127.0.0.1:9229`) | -| `--inspectBrk [[host:]port]` | 启用 Node.js 检查器并在测试开始前中断 | -| `--testTimeout ` | 测试的默认超时(毫秒)(默认值:`5000`)。 | -| `--hookTimeout ` | 默认钩子超时(以毫秒为单位)(默认值:`10000`) | -| `--bail ` | 当指定数量的测试失败时停止测试执行(默认值:`0`) | -| `--retry ` | 如果测试失败,重试特定次数(默认值: `0`)。 | -| `--diff ` | 用于生成差异界面的差异配置的路径 | -| `--exclude ` | 测试中排除的其他文件路径匹配模式 | -| `--expandSnapshotDiff` | 快照失败时显示完整差异 | -| `--disableConsoleIntercept` | 禁用自动拦截控制台日志(默认值:`false`) | -| `--typecheck.enabled` | 在测试的同时启用类型检查(默认值:`false`) | -| `--typecheck.only` | 仅运行类型检查测试。这将自动启用类型检查(默认值:`false`) | -| `--typecheck.checker ` | 指定要使用的类型检查器。可用值为 "tsc"和 "vue-tsc "以及一个可执行文件的路径(默认值:`tsc`) | -| `--typecheck.allowJs` | 允许对 JavaScript 文件进行类型检查。默认值取自 tsconfig.json | -| `--typecheck.ignoreSourceErrors` | 忽略源文件中的类型错误 | -| `--typecheck.tsconfig ` | 自定义 tsconfig 文件的路径 | -| `--project ` | 如果使用 Vitest 工作区功能,则为要运行的项目名称。多个项目可重复此操作: `project=1--project=2`。也可以使用通配符过滤项目,如 `--project=packages*` 。 | -| `--slowTestThreshold ` | 测试速度慢的阈值(以毫秒为单位)(默认值:`300`) | -| `--teardownTimeout ` | 拆卸函数的默认超时(以毫秒为单位)(默认值:`10000`) | -| `--maxConcurrency ` | 套件中并发测试的最大次数(默认值:`5) | -| `--expect.requireAssertions` | 要求所有测试至少有一个断言 | -| `--expect.poll.interval ` | 断言的轮询间隔 `expect.poll()` (默认值: `50`) | -| `--expect.poll.timeout ` | 断言的轮询超时(以毫秒为单位) `expect.poll()` (默认值: `1000`) | -| `--printConsoleTrace` | 始终打印控制台堆栈跟踪 | -| `--run` | 禁用 watch 模式 | -| `--no-color` | 删除控制台输出中的颜色 | -| `--clearScreen` | 在 watch 模式下重新运行测试时清除终端屏幕(默认值:`true`)。 | -| `--standalone` | 启动 Vitest 而不运行测试。文件过滤器将被忽略,只有在发生变化时才会运行测试。(默认值:`false`) | -| `--mergeReports [path]` | blob 报告目录的路径。如果使用此选项,Vitest 将不会运行任何测试,它将只报告以前记录的测试 | +| `--browser.isolate` | 隔离运行每个浏览器测试文件。要禁用隔离请使用 `--browser.isolate=false` (默认值: `true`) | +| `--browser.ui` | 运行测试时显示 Vitest UI(默认值: `!process.env.CI`) | +| `--browser.fileParallelism` | 浏览器测试文件是否应并行运行。使用 `--browser.fileParallelism=false` 可禁用 (默认值: `true`) | +| `--pool ` | 如果未在浏览器中运行,则指定 pool (默认值: `threads`) | +| `--poolOptions.threads.isolate` | 在线程池中隔离测试 (默认值: `true`) | +| `--poolOptions.threads.singleThread` | 在单线程内运行测试 (默认值: `false`) | +| `--poolOptions.threads.maxThreads ` | 运行测试的最大线程数或百分比 | +| `--poolOptions.threads.minThreads ` | 运行测试的最小线程数或百分比 | +| `--poolOptions.threads.useAtomics` | 使用 Atomics 同步线程。这在某些情况下可以提高性能,但在较旧的 Node 版本中可能会导致 segfault。 (默认值: `false`) | +| `--poolOptions.vmThreads.isolate` | 在线程池中隔离测试 (默认值: `true`) | +| `--poolOptions.vmThreads.singleThread` | 在单线程内运行测试(默认值:`false`) | +| `--poolOptions.vmThreads.maxThreads ` | 运行测试的最大线程数或百分比 | +| `--poolOptions.vmThreads.minThreads ` | 运行测试的最小线程数或百分比 | +| `--poolOptions.vmThreads.useAtomics` | 使用 Atomics 同步线程。这在某些情况下可以提高性能,但在较旧的 Node 版本中可能会导致 segfault。 (默认值: `false`) | +| `--poolOptions.vmThreads.memoryLimit ` | 虚拟机线程池的内存限制。如果发现内存泄漏,请尝试调整该值。 | +| `--poolOptions.forks.isolate` | 在 forks pool 中隔离测试 (默认值: `true`) | +| `--poolOptions.forks.singleFork` | 单个子进程内运行测试 (default: `false`) | +| `--poolOptions.forks.maxForks ` | 运行测试的最大进程数 | +| `--poolOptions.forks.minForks ` | 运行测试的最小进程数 | +| `--poolOptions.vmForks.isolate` | 在 forks pool 中隔离测试 (default: `true`) | +| `--poolOptions.vmForks.singleFork` | 在单个子进程内运行测试 (default: `false`) | +| `--poolOptions.vmForks.maxForks ` | 运行测试的最大进程数 | +| `--poolOptions.vmForks.minForks ` | 运行测试的最小进程数 | +| `--poolOptions.vmForks.memoryLimit ` | VM forks pool 的内存限制。如果你观察到内存泄漏问题,可以尝试调整这个值。 | +| `--fileParallelism` | 是否所有测试文件都应并行运行. 使用 `--no-file-parallelism` 去禁用 (默认值: `true`) | +| `--maxWorkers ` | 同时并发执行测试任务的最大线程数或百分比 | +| `--minWorkers ` | 同时并发执行测试任务的最小线程数或百分比 | +| `--environment ` | 如果不在浏览器中运行,则指定运行环境 (默认值: `node`) | +| `--passWithNoTests` | 未发现测试时通过 | +| `--logHeapUsage` | 在节点中运行时,显示每个测试的堆大小 | +| `--allowOnly` | 允许执行那些被标记为"only"的测试用例或测试套件 (默认值: `!process.env.CI`) | +| `--dangerouslyIgnoreUnhandledErrors` | 忽略任何未处理的错误 | +| `--shard ` | 测试套件分区的执行格式为 `/` | +| `--changed [since]` | 运行受更改文件影响的测试 (默认值: `false`) | +| `--sequence.shuffle.files` | 以随机顺序运行文件。如果启用此选项,长时间运行的测试将不会提前开始。 (默认值: `false`) | +| `--sequence.shuffle.tests` | 以随机方式运行测试(默认值:`false`) | +| `--sequence.concurrent` | 使测试并行运行(默认值:`false`) | +| `--sequence.seed ` | 设置随机化种子。如果 --sequence.shuffle(随机序列)是 `false`,则此选项无效。 t 通过 ["Random Seed" page](https://en.wikipedia.org/wiki/Random_seed) 查看更多信息 | +| `--sequence.hooks ` | 更改钩子的执行顺序。 可接受的值有: "stack", "list" and "parallel". 通过 [`sequence.hooks`](https://vitest.dev/config/#sequence-hooks) 查看更多信息 (默认值: `"parallel"`) | +| `--sequence.setupFiles ` | 更改设置文件的执行顺序。可接受的值有 "list" 和 "parallel"。如果设置为"list",将按照定义的顺序运行设置文件。如果设置为 "parallel",将并行运行设置文件(默认值:`"parallel"`)。 | +| `--inspect [[host:]port]` | 启用 Node.js 检查器(默认值:`127.0.0.1:9229`) | +| `--inspectBrk [[host:]port]` | 启用 Node.js 检查器并在测试开始前中断 | +| `--testTimeout ` | 测试的默认超时(毫秒)(默认值:`5000`)。 | +| `--hookTimeout ` | 默认钩子超时(以毫秒为单位)(默认值:`10000`) | +| `--bail ` | 当指定数量的测试失败时停止测试执行(默认值:`0`) | +| `--retry ` | 如果测试失败,重试特定次数(默认值:`0`)。 | +| `--diff ` | 用于生成差异界面的差异配置的路径 | +| `--exclude ` | 测试中排除的其他文件路径匹配模式 | +| `--expandSnapshotDiff` | 快照失败时显示完整差异 | +| `--disableConsoleIntercept` | 禁用自动拦截控制台日志(默认值:`false`) | +| `--typecheck.enabled` | 在测试的同时启用类型检查(默认值:`false`) | +| `--typecheck.only` | 仅运行类型检查测试。这将自动启用类型检查(默认值:`false`) | +| `--typecheck.checker ` | 指定要使用的类型检查器。可用值为 "tsc"和 "vue-tsc "以及一个可执行文件的路径(默认值:`tsc`) | +| `--typecheck.allowJs` | 允许对 JavaScript 文件进行类型检查。默认值取自 tsconfig.json | +| `--typecheck.ignoreSourceErrors` | 忽略源文件中的类型错误 | +| `--typecheck.tsconfig ` | 自定义 tsconfig 文件的路径 | +| `--project ` | 如果使用 Vitest 工作区功能,则为要运行的项目名称。多个项目可重复此操作:`project=1--project=2`。也可以使用通配符过滤项目,如 `--project=packages*`。 | +| `--slowTestThreshold ` | 测试速度慢的阈值(以毫秒为单位)(默认值:`300`) | +| `--teardownTimeout ` | 拆卸函数的默认超时(以毫秒为单位)(默认值:`10000`) | +| `--maxConcurrency ` | 套件中并发测试的最大次数(默认值:`5) | +| `--expect.requireAssertions` | 要求所有测试至少有一个断言 | +| `--expect.poll.interval ` | 断言的轮询间隔 `expect.poll()` (默认值: `50`) | +| `--expect.poll.timeout ` | 断言的轮询超时(以毫秒为单位)`expect.poll()` (默认值: `1000`) | +| `--printConsoleTrace` | 始终打印控制台堆栈跟踪 | +| `--run` | 禁用 watch 模式 | +| `--no-color` | 删除控制台输出中的颜色 | +| `--clearScreen` | 在 watch 模式下重新运行测试时清除终端屏幕(默认值:`true`)。 | +| `--standalone` | 启动 Vitest 而不运行测试。文件过滤器将被忽略,只有在发生变化时才会运行测试。(默认值: `false`) | +| `--mergeReports [path]` | blob 报告目录的路径。如果使用此选项,Vitest 将不会运行任何测试,它将只报告以前记录的测试 | diff --git a/guide/cli.md b/guide/cli.md index 34035652e..9a8d7fef2 100644 --- a/guide/cli.md +++ b/guide/cli.md @@ -42,6 +42,7 @@ $ vitest ./basic/foo:10 # ❌ $ vitest basic/foo.test.ts:10, basic/foo.test.ts:25 # ✅ $ vitest basic/foo.test.ts:10-25 # ❌ ``` + ::: ### `vitest run` @@ -159,7 +160,7 @@ vitest --api=false 与代码覆盖一起使用时,报告将只包含与更改相关的文件。 - 如果与 [`forceRerunTriggers`](/config/#forcereruntriggers)配置选项搭配使用,则在 `forceRerunTriggers` 列表中列出的文件至少有一个发生变化时,将运行整个测试套件。默认情况下,Vitest 配置文件和 `package.json` 的更改将始终重新运行整个套件。 + 如果与 [`forceRerunTriggers`](/config/#forcereruntriggers) 配置选项搭配使用,则在 `forceRerunTriggers` 列表中列出的文件至少有一个发生变化时,将运行整个测试套件。默认情况下,Vitest 配置文件和 `package.json` 的更改将始终重新运行整个套件。 ### shard @@ -191,10 +192,8 @@ vitest run --shard=3/3 - **类型:** `boolean | string` -合并位于指定文件夹中的每个 blob 报告(默认情况下为`.vitest-reports`)。你可以将任何报告程序与此命令一起使用([`blob`](/guide/reporters#blob-reporter) 除外): +合并位于指定文件夹中的每个 blob 报告(默认情况下为 `.vitest-reports`)。你可以将任何报告程序与此命令一起使用([`blob`](/guide/reporters#blob-reporter) 除外): ```sh vitest --merge-reports --reporter=junit ``` - -[cac's dot notation]: https://github.com/cacjs/cac#dot-nested-options diff --git a/guide/common-errors.md b/guide/common-errors.md index 888d32890..0ccefb5f6 100644 --- a/guide/common-errors.md +++ b/guide/common-errors.md @@ -8,8 +8,8 @@ title: 常见错误 | 指南 如果你收到一个 **module cannot be found** 的报错,则可能意味着几种不同情况: -- 1.你拼错了路径。确保路径正确。 -- 2.你可能依赖于 `tsconfig.json` 中的 `baseUrl`。默认情况下,Vite 不考虑 `tsconfig.json`,因此如果你依赖此行为,你可能需要自己安装 [`vite-tsconfig-paths`](https://www.npmjs.com/package/vite-tsconfig-paths) 。 +1. 你拼错了路径。确保路径正确。 +2. 你可能依赖于 `tsconfig.json` 中的 `baseUrl`。默认情况下,Vite 不考虑 `tsconfig.json`,因此如果你依赖此行为,你可能需要自己安装 [`vite-tsconfig-paths`](https://www.npmjs.com/package/vite-tsconfig-paths)。 ```ts import tsconfigPaths from 'vite-tsconfig-paths' @@ -27,7 +27,7 @@ export default defineConfig({ + import helpers from '../src/helpers' ``` -- 3. 确保你没有使用相对路径的 [别名](/config/#alias)。Vite 将它们视为相对于导入所在的文件而不是根目录。 +3. 确保你没有使用相对路径的 [别名](/config/#alias)。Vite 将它们视为相对于导入所在的文件而不是根目录。 ```ts import { defineConfig } from 'vitest/config' diff --git a/guide/comparisons.md b/guide/comparisons.md index 910574194..00d6e29be 100644 --- a/guide/comparisons.md +++ b/guide/comparisons.md @@ -8,7 +8,7 @@ title: 与其他测试框架对比 | 指南 [Jest](https://jestjs.io/) 在测试框架领域占据了主导地位,因为它为大多数 JavaScript 项目提供开箱即用的支持,具备舒适的 API(`it` 和 `expect`),且覆盖了大多数测试的需求(例如快照、模拟和覆盖率)。我们感谢 Jest 团队和社区创建了一个令人愉悦的测试 API,并引入了许多已成为 Web 生态系统标准的测试模式。 -在 Vite 项目中使用 Jest 是可能的。[@sodatea](https://bsky.app/profile/haoqun.dev) 开发了 [vite-jest](https://github.com/sodatea/vite-jest#readme) ,旨在为 [Jest](https://jestjs.io/) 提供一流的 Vite 集成。[Jest 中最后的阻碍](https://github.com/sodatea/vite-jest/blob/main/packages/vite-jest/README.md#vite-jest) 已经解决。因此,在 Vite 项目的单元测试中,Jest 仍是一个可用选项。 +在 Vite 项目中使用 Jest 是可能的。[@sodatea](https://bsky.app/profile/haoqun.dev) 开发了 [vite-jest](https://github.com/sodatea/vite-jest#readme),旨在为 [Jest](https://jestjs.io/) 提供一流的 Vite 集成。[Jest 中最后的阻碍](https://github.com/sodatea/vite-jest/blob/main/packages/vite-jest/README.md#vite-jest) 已经解决。因此,在 Vite 项目的单元测试中,Jest 仍是一个可用选项。 然而,在 [Vite](https://vitejs.dev) 已为最常见的 Web 工具(TypeScript、JSX、最流行的 UI 框架)提供了支持的情况下,引入 Jest 会增添不必要的复杂性。如果你的应用由 Vite 驱动,那么配置和维护两个不同的管道是不合理的。如果使用 Vitest,你可以在同一个管道中进行开发、构建和测试环境的配置,它们共享相同的插件和 `vite.config.js` 文件。 @@ -24,7 +24,7 @@ Cypress 作为端到端测试工具而广为人知,但他们 [最新的组件 Cypress 的测试更加专注于确定元素是否可见,是否可以访问和交互。Cypress 专门为 UI 开发和测试而构建,它的开发体验围绕于可见的组件。项目组件和测试报告一起出现,测试完成后,组件将保持交互状态,你可以使用浏览器开发工具调试发生的任何故障。 -相比之下,Vitest 专注于为非浏览器逻辑提供最佳的、快速的开发体验。像 Vitest 这样的基于 Node.js 的测试框架支持各种实现部分浏览器环境的第三方包,例如 `jsdom` 。一般而言,它们能提供一个可用度足够高的浏览器环境,从而我们可以快速地对引使用了浏览器 API 的代码进行单元测试。然而,这些浏览器环境在实现上仍有一些局限性。例如,[jsdom 缺少相当数量的特性](https://github.com/jsdom/jsdom/issues?q=is%3Aissue+is%3Aopen+sort%3Acomments-desc),诸如 `window.navigation` 或者布局引擎( `offsetTop` 等)。 +相比之下,Vitest 专注于为非浏览器逻辑提供最佳的、快速的开发体验。像 Vitest 这样的基于 Node.js 的测试框架支持各种实现部分浏览器环境的第三方包,例如 `jsdom`。一般而言,它们能提供一个可用度足够高的浏览器环境,从而我们可以快速地对引使用了浏览器 API 的代码进行单元测试。然而,这些浏览器环境在实现上仍有一些局限性。例如,[jsdom 缺少相当数量的特性](https://github.com/jsdom/jsdom/issues?q=is%3Aissue+is%3Aopen+sort%3Acomments-desc),诸如 `window.navigation` 或者布局引擎(`offsetTop` 等)。 最后,与 Web Test Runner 相比,Cypress 更像是一个 IDE 而不是测试框架,因为你不仅能在浏览器中看到测试结果和日志,还可以看到真实呈现的组件。 diff --git a/guide/coverage.md b/guide/coverage.md index 8f4597aaf..d8f2d475d 100644 --- a/guide/coverage.md +++ b/guide/coverage.md @@ -44,7 +44,7 @@ npm i -D @vitest/coverage-istanbul ::: info 以下对 V8 覆盖率的说明仅适用于 Vitest,并不适用于其他测试工具。 -从 `v3.2.0` 版本开始,Vitest 在 V8 覆盖率中采用了 [基于 AST 的重映射技术](/blog/vitest-3-2#coverage-v8-ast-aware-remapping) ,从而生成与 Istanbul 一致的覆盖率报告。 +从 `v3.2.0` 版本开始,Vitest 在 V8 覆盖率中采用了 [基于 AST 的重映射技术](/blog/vitest-3-2#coverage-v8-ast-aware-remapping),从而生成与 Istanbul 一致的覆盖率报告。 这让用户在享受 V8 覆盖率高速执行的同时,也能获得 Istanbul 覆盖率的高准确度。 ::: @@ -290,7 +290,7 @@ export default defineConfig({ - 启用 [`experimentalAstAwareRemapping: true`](/config/#coverage-experimentalAstAwareRemapping) `v8` 的覆盖率工具,详见 [ast-v8-to-istanbul | 代码忽略](https://github.com/AriPerkkio/ast-v8-to-istanbul?tab=readme-ov-file#ignoring-code) 使用 TypeScript 时,源码使用 `esbuild` 进行转译,这会从源码中删除所有注释([esbuild#516](https://github.com/evanw/esbuild/issues/516))。 -被视为[合法注释](https://esbuild.github.io/api/#legal-comments)的注释将被保留。 +被视为 [合法注释](https://esbuild.github.io/api/#legal-comments) 的注释将被保留。 你可以在忽略提示里加入 `@preserve` 关键字。 但要小心,这些忽略提示有可能会被打包进最终的生产环境构建中。 @@ -319,7 +319,7 @@ if (condition) { UI 模式 会在以下情况下启用覆盖率报告: -- 显式启用覆盖率报告:在配置文件中设置 `coverage.enabled=true` ,或运行 Vitest 时添加 `--coverage.enabled=true` 标志。 +- 显式启用覆盖率报告:在配置文件中设置 `coverage.enabled=true`,或运行 Vitest 时添加 `--coverage.enabled=true` 标志。 - 添加 HTML 报告器:将 `html` 添加到 `coverage.reporter` 列表中,我们还可以启用 `subdir` 选项,将覆盖率报告放在子目录中。 html coverage activation in Vitest UI diff --git a/guide/debugging.md b/guide/debugging.md index 9bc5b6a5f..a51fef815 100644 --- a/guide/debugging.md +++ b/guide/debugging.md @@ -9,10 +9,12 @@ title: 调试 | 指南 - [`--test-timeout=0`](/guide/cli#testtimeout) 以防止测试在断点处停止时超时 - [`--no-file-parallelism`](/guide/cli#fileparallelism) 以防止测试文件并行运行 + ::: + ## VS Code -在 VSCode 中快速调试测试的方法是通过 `JavaScript Debug Terminal` 。打开一个新的 `JavaScript Debug Terminal` 并直接运行 `npm run test` 或 `vitest` 。*这适用于在 Node 中运行的任何代码,因此将适用于大多数 JS 测试框架*。 +在 VSCode 中快速调试测试的方法是通过 `JavaScript Debug Terminal`。打开一个新的 `JavaScript Debug Terminal` 并直接运行 `npm run test` 或 `vitest`。_这适用于在 Node 中运行的任何代码,因此将适用于大多数 JS 测试框架_。 ![image](https://user-images.githubusercontent.com/5594348/212169143-72bf39ce-f763-48f5-822a-0c8b2e6a8484.png) @@ -45,9 +47,11 @@ title: 调试 | 指南 要调试 [Vitest 浏览器模式](/guide/browser/index.md),请在 CLI 中传递 `--inspect` 或 `--inspect-brk`,或在 Vitest 配置中定义它: ::: code-group + ```bash [CLI] vitest --inspect-brk --browser --no-file-parallelism ``` + ```ts [vitest.config.js] import { playwright } from '@vitest/browser-playwright' import { defineConfig } from 'vitest/config' @@ -63,9 +67,10 @@ export default defineConfig({ }, }) ``` + ::: -默认情况下,Vitest 将使用端口 `9229` 作为调试端口。您可以通过在 `--inspect-brk`中传递值来覆盖它: +默认情况下,Vitest 将使用端口 `9229` 作为调试端口。您可以通过在 `--inspect-brk` 中传递值来覆盖它: ```bash vitest --inspect-brk=127.0.0.1:3000 --browser --no-file-parallelism @@ -106,13 +111,13 @@ vitest --inspect-brk=127.0.0.1:3000 --browser --no-file-parallelism 创建一个 [vitest](https://www.jetbrains.com/help/idea/vitest.html#createRunConfigVitest) 运行配置。使用以下配置在调试模式下运行所有测试: -| 配置参数 | 设置值 | -| ---------------------- | ---------------------------------- | -| Working directory | `/path/to/your-project-root` | +| 配置参数 | 设置值 | +| ----------------- | ---------------------------- | +| Working directory | `/path/to/your-project-root` | 然后在调试模式下运行此配置。IDE 将在编辑器中设置的 JS/TS 断点处停止。 -## Node 解释器, 例如 Chrome开发者工具 {#node-inspector-e-g-chrome-devtools} +## Node 解释器, 例如 Chrome 开发者工具 {#node-inspector-e-g-chrome-devtools} Vitest 还支持在没有 IDE 的情况下调试测试。然而,这要求测试不是并行运行的。可以使用以下命令之一启动 Vitest。 diff --git a/guide/extending-matchers.md b/guide/extending-matchers.md index f2e9b12cd..5b1eb5953 100644 --- a/guide/extending-matchers.md +++ b/guide/extending-matchers.md @@ -26,6 +26,7 @@ expect.extend({ 如果你使用 TypeScript,你可以使用以下代码在环境声明文件(例如:`vitest.d.ts`)中扩展默认的 `Assertion` 接口: ::: code-group + ```ts [3.2.0] import 'vitest' @@ -37,6 +38,7 @@ declare module 'vitest' { interface Matchers extends CustomMatchers {} } ``` + ```ts [3.0.0] import 'vitest' @@ -49,10 +51,11 @@ declare module 'vitest' { interface AsymmetricMatchersContaining extends CustomMatchers {} } ``` + ::: ::: tip -从 Vitest 3.2 版本开始,你可以通过扩展 `Matchers` 接口,让 `expect.extend` 、`expect().*` 和 `expect.*` 方法同时具备类型安全的断言支持。而在此之前,你需要为这几种用法分别单独定义接口。 +从 Vitest 3.2 版本开始,你可以通过扩展 `Matchers` 接口,让 `expect.extend`、`expect().*` 和 `expect.*` 方法同时具备类型安全的断言支持。而在此之前,你需要为这几种用法分别单独定义接口。 ::: ::: warning @@ -73,7 +76,7 @@ interface ExpectationResult { ``` ::: warning -如果你实现了一个异步匹配器,记得在测试里对它的结果使用 `await` (例如:`await expect('foo').toBeFoo()` ),否则可能不会按预期执行: +如果你实现了一个异步匹配器,记得在测试里对它的结果使用 `await`(例如:`await expect('foo').toBeFoo()`),否则可能不会按预期执行: ```ts expect.extend({ @@ -84,34 +87,35 @@ expect.extend({ await expect().toBeAsyncAssertion() ``` + ::: 断言的第一个参数是接收值(即 `expect(received)` 中的 received ),其余参数将直接传给断言。 断言方法可以访问上下文 `this` 对象中的这些属性: -### `isNot` +## `isNot` -如果断言是在 `not` 方法上调用的( `expect(received).not.toBeFoo()` ),则返回 true。 +如果断言是在 `not` 方法上调用的(`expect(received).not.toBeFoo()`),则返回 true。 -### `promise` +## `promise` 如果断言是在 `resolved/rejected` 中调用的,它的值将包含此断言的名称。否则,它将是一个空字符串。 -### `equals` +## `equals` 这是一个工具函数,他可以帮助你比较两个值。如果是相同的则返回 true,反之返回 false。这个方法几乎在每个断言内部都有使用。默认情况下,它支持非对称的断言。 -### `utils` +## `utils` 它包含了一系列工具函数,你可以使用它们来显示信息。 `this` 上下文也包含了当前测试的信息,你可以通过调用 `expect.getState()` 来获取它,其中最有用的属性是: -### `currentTestName` +## `currentTestName` 当前测试的全称(包括 describe 块)。 -### `testPath` +## `testPath` 当前正在执行的测试文件路径。 diff --git a/guide/features.md b/guide/features.md index b17db28bb..e1276d095 100644 --- a/guide/features.md +++ b/guide/features.md @@ -15,7 +15,7 @@ outline: deep 与 Vite 的配置、转换器、解析器和插件通用,将会使用应用中的相同配置来运行测试。 -了解更多信息 [配置 Vitest](/guide/#configuring-vitest) 。 +了解更多信息 [配置 Vitest](/guide/#configuring-vitest)。 ## 监听模式(watch mode) {#watch-mode} @@ -46,7 +46,7 @@ Vitest 还隔离了每个测试文件的运行环境,因此一个文件中的 Vitest 提供了许多缩小测试范围的方法,以便在开发过程中加快速度并集中精力。 -了解更多信息 [测试筛选](/guide/filtering) 。 +了解更多信息 [测试筛选](/guide/filtering)。 ## 同时运行多个测试 {#running-tests-concurrently} @@ -138,12 +138,15 @@ expect(fn.mock.results[1].value).toBe('world') Vitest 支持 [happy-dom](https://github.com/capricorn86/happy-dom) 或 [jsdom](https://github.com/jsdom/jsdom) 来模拟 DOM 和浏览器 API。Vitest 并不内置它们,所以你可能需要安装: ::: code-group + ```bash [happy-dom] $ npm i -D happy-dom ``` + ```bash [jsdom] $ npm i -D jsdom ``` + ::: 然后,更改 `environment` 配置文件中的选项: @@ -158,7 +161,7 @@ export default defineConfig({ }) ``` -了解更多信息 [模拟对象](/guide/mocking) 。 +了解更多信息 [模拟对象](/guide/mocking)。 ## 测试覆盖率 {#coverage} @@ -188,7 +191,7 @@ export default defineConfig({ }) ``` -了解更多信息 [覆盖率](/guide/coverage) 。 +了解更多信息 [覆盖率](/guide/coverage)。 ## 源码内联测试 {#in-source-testing} @@ -212,7 +215,7 @@ if (import.meta.vitest) { } ``` -了解更多信息 [源码内联测试](/guide/in-source) 。 +了解更多信息 [源码内联测试](/guide/in-source)。 ## 基准测试 实验性 {#benchmarking} @@ -260,7 +263,7 @@ test('my types work properly', () => { ## 分片 {#sharding} -使用 [`--shard`](/guide/cli#shard) 和 [`--reporter=blob`](/guide/reporters#blob-reporter)标志在不同的计算机上运行测试。可以使用 `--merge-reports` 命令在 CI 管道的末尾合并所有测试结果: +使用 [`--shard`](/guide/cli#shard) 和 [`--reporter=blob`](/guide/reporters#blob-reporter) 标志在不同的计算机上运行测试。可以使用 `--merge-reports` 命令在 CI 管道的末尾合并所有测试结果: ```bash vitest --shard=1/2 --reporter=blob --coverage @@ -293,6 +296,7 @@ export default defineConfig(({ mode }) => ({ 您可以通过手动捕获这些错误来禁用此行为。Vitest 会认为回调已由您处理,不会再报告该错误。 ::: code-group + ```ts [setup.node.js] // 在 Node.js process.on('unhandledRejection', () => { @@ -303,6 +307,7 @@ process.on('uncaughtException', () => { // 你自己的处理程序 }) ``` + ```ts [setup.browser.js] // 在浏览器 window.addEventListener('error', () => { @@ -313,6 +318,7 @@ window.addEventListener('unhandledrejection', () => { // 你自己的处理程序 }) ``` + ::: 或者,你也可以使用 [`dangerouslyIgnoreUnhandledErrors`](/config/#dangerouslyignoreunhandlederrors) 选项来忽略报告的错误。Vitest 仍会报告它们,但它们不会影响测试结果(退出码不会改变)。 diff --git a/guide/filtering.md b/guide/filtering.md index be82a69d7..2120acc85 100644 --- a/guide/filtering.md +++ b/guide/filtering.md @@ -47,6 +47,7 @@ $ vitest ./basic/foo:10 # ❌ $ vitest basic/foo.test.ts:10, basic/foo.test.ts:25 # ✅ $ vitest basic/foo.test.ts:10-25 # ❌ ``` + ::: ## 指定超时阈值 {#specifying-a-timeout} diff --git a/guide/ide.md b/guide/ide.md index 125ea0172..7c2f76587 100644 --- a/guide/ide.md +++ b/guide/ide.md @@ -7,19 +7,19 @@ title: IDE 插件 | 指南 ## VS Code Official {#vs-code}

- +Vitest & VS Code

[GitHub](https://github.com/vitest-dev/vscode) | [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=vitest.explorer) -![](https://i.ibb.co/bJCbCf2/202203292020.gif) +![使用 VSCode 运行测试](https://i.ibb.co/bJCbCf2/202203292020.gif) ## JetBrains IDE WebStorm、PhpStorm、IntelliJ IDEA Ultimate 和其他 JetBrains IDE 内置了对 Vitest 的支持。

- +Vitest & JetBrains

[WebStorm Help](https://www.jetbrains.com/help/webstorm/vitest.html) | [IntelliJ IDEA Ultimate Help](https://www.jetbrains.com/help/idea/vitest.html) | [PhpStorm Help](https://www.jetbrains.com/help/phpstorm/vitest.html) @@ -28,12 +28,12 @@ WebStorm、PhpStorm、IntelliJ IDEA Ultimate 和其他 JetBrains IDE 内置了 ## Wallaby.js Paid (free for OSS) -由 [The Wallaby Team](https://wallabyjs.com) 团队创建。 +由 [Wallaby](https://wallabyjs.com) 团队创建。 [Wallaby.js](https://wallabyjs.com) 在你键入时立即运行 Vitest 测试,在代码旁边高亮显示 IDE 中的结果。

- +Vitest & Wallaby

[VS Code](https://marketplace.visualstudio.com/items?itemName=WallabyJs.wallaby-vscode) | [JetBrains](https://plugins.jetbrains.com/plugin/15742-wallaby) | diff --git a/guide/improving-performance.md b/guide/improving-performance.md index 3e7b40c96..64b454cdd 100644 --- a/guide/improving-performance.md +++ b/guide/improving-performance.md @@ -6,7 +6,7 @@ title: 性能优化 | 指南 ## 测试隔离 {#test-isolation} -默认情况下,Vitest 在基于[pool](/config/#pool) 的隔离环境中运行每个测试文件: +默认情况下,Vitest 在基于 [pool](/config/#pool) 的隔离环境中运行每个测试文件: - `threads` 池在单独的 [`Worker`](https://nodejs.org/api/worker_threads.html#class-worker) 中运行每个测试文件 - `forks` 池在单独的 [子进程](https://nodejs.org/api/child_process.html#child_processforkmodulepath-args-options) 中运行每个测试文件 @@ -42,7 +42,7 @@ export default defineConfig({ 如果使用的是 `vmThreads` 池,则不能禁用隔离。请改用 `threads` 池来提高测试性能。 ::: -对于某些项目,可能还需要禁用并行性以缩短启动时间。为此,请向 CLI 提供 `--no-file-parallelism` 标志,或将 config 中的[`test.fileParallelism`](/config/#fileParallelism) 属性设置为 `false`。 +对于某些项目,可能还需要禁用并行性以缩短启动时间。为此,请向 CLI 提供 `--no-file-parallelism` 标志,或将 config 中的 [`test.fileParallelism`](/config/#fileParallelism) 属性设置为 `false`。 ::: code-group @@ -64,7 +64,7 @@ export default defineConfig({ ## 运行池 {#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'` 稍慢。 +默认情况下,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'` 稍慢。 你可以尝试通过切换配置中的 `pool` 选项来改善测试运行时间: @@ -181,7 +181,7 @@ jobs: 测试分片在多核心 CPU 机器上也很有用。 Vitest 将只在其主线程中运行一个 Vite 服务器。其余的线程用于运行测试文件。 -在多核心 CPU 机器中,主线程可能会成为瓶颈,因为它无法处理来自其余线程的所有请求。例如,在 32核 CPU 机器中,主线程负责处理来自 31 个测试线程的负载。 +在多核心 CPU 机器中,主线程可能会成为瓶颈,因为它无法处理来自其余线程的所有请求。例如,在 32 核 CPU 机器中,主线程负责处理来自 31 个测试线程的负载。 为了减少主线程的 Vite 服务器的负载,可以使用测试分片。将负载平均到多个 Vite 服务器上。 diff --git a/guide/in-source.md b/guide/in-source.md index 4194766be..268d7dcb3 100644 --- a/guide/in-source.md +++ b/guide/in-source.md @@ -74,6 +74,7 @@ export default defineConfig({ ### 其他的打包器 {#other-bundlers} ::: details unbuild + ```ts [build.config.ts] import { defineBuildConfig } from 'unbuild' @@ -90,6 +91,7 @@ export default defineBuildConfig({ ::: ::: details Rollup + ```ts [rollup.config.js] import replace from '@rollup/plugin-replace' // [!code ++] @@ -132,4 +134,4 @@ export default { - 原型设计 - 内联断言 -对于更复杂的测试,比如组件测试或 E2E 测试,建议**使用单独的测试文件取而代之**。 +对于更复杂的测试,比如组件测试或 E2E 测试,建议 **使用单独的测试文件取而代之**。 diff --git a/guide/index.md b/guide/index.md index 61d070ac0..6dff9b2c0 100644 --- a/guide/index.md +++ b/guide/index.md @@ -42,7 +42,7 @@ bun add -D vitest Vitest 需要 Vite >=v5.0.0 和 Node >=v20.0.0 ::: -如果在 `package.json` 中安装一份 `vitest` 的副本,可以使用上面列出的方法之一。然而,如果更倾向于直接运行 `vitest` ,可以使用 `npx vitest`( `npx` 是会随着 npm 和 Node.js 一起被安装)。 +如果在 `package.json` 中安装一份 `vitest` 的副本,可以使用上面列出的方法之一。然而,如果更倾向于直接运行 `vitest`,可以使用 `npx vitest`(`npx` 是会随着 npm 和 Node.js 一起被安装)。 `npx` 是一个命令行工具,用于执行指定的命令。默认情况下,`npx` 会首先检查本地项目的二进制文件中是否存在该命令。如果在那里没有找到,`npx` 会在系统的 `$PATH` 中查找并执行该命令(如果找到的话)。如果两个位置都没有找到该命令,`npx` 会在执行之前将其安装在临时位置。 @@ -50,13 +50,13 @@ Vitest 需要 Vite >=v5.0.0 和 Node >=v20.0.0 例如,我们将编写一个简单的测试来验证将两个数字相加的函数的输出。 -``` js [sum.js] +```js [sum.js] export function sum(a, b) { return a + b } ``` -``` js [sum.test.js] +```js [sum.test.js] import { expect, test } from 'vitest' import { sum } from './sum.js' @@ -66,7 +66,7 @@ test('adds 1 + 2 to equal 3', () => { ``` ::: tip 提示 -一般情况下,执行测试的文件名中必须包含 `.test.` 或 `.spec.` 。 +一般情况下,执行测试的文件名中必须包含 `.test.` 或 `.spec.`。 ::: 接下来,为了执行测试,请将以下部分添加到你的 `package.json` 文件中: @@ -139,7 +139,7 @@ export default defineConfig({ 可以参阅 [配置索引](../config/) 中的配置选项列表 ::: warning -如果你决定为 Vite 和 Vitest 使用两个单独的配置文件,请确保在 Vitest 配置文件中定义相同的 Vite 选项,因为它将覆盖你的 Vite 文件,而不是扩展它。你还可以使用 `vite` 或`vitest/config` 条目中的 `mergeConfig` 方法将 Vite 配置与 Vitest 配置合并: +如果你决定为 Vite 和 Vitest 使用两个单独的配置文件,请确保在 Vitest 配置文件中定义相同的 Vite 选项,因为它将覆盖你的 Vite 文件,而不是扩展它。你还可以使用 `vite` 或 `vitest/config` 条目中的 `mergeConfig` 方法将 Vite 配置与 Vitest 配置合并: :::code-group @@ -237,22 +237,22 @@ export default defineConfig({ ## 示例 {#examples} -| 示例 | 源代码 | 演练场 | -|---|---|---| -| `basic` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/basic) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/basic?initialPath=__vitest__/) | -| `fastify` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/fastify) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/fastify?initialPath=__vitest__/) | -| `in-source-test` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/in-source-test) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/in-source-test?initialPath=__vitest__/) | -| `lit` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/lit) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/lit?initialPath=__vitest__/) | -| `vue` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/vue) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/vue?initialPath=__vitest__/) | -| `marko` | [GitHub](https://github.com/marko-js/examples/tree/master/examples/library-ts) | [在线演示](https://stackblitz.com/fork/github/marko-js/examples/tree/master/examples/library-ts/) | -| `preact` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/preact) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/preact?initialPath=__vitest__/) | -| `react` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/react) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/react?initialPath=__vitest__/) | -| `solid` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/solid) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/solid?initialPath=__vitest__/) | -| `svelte` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/svelte) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/svelte?initialPath=__vitest__/) | -| `sveltekit` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/sveltekit) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/sveltekit?initialPath=__vitest__/) | -| `profiling` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/profiling) | 暂无 | -| `typecheck` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/typecheck) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/typecheck?initialPath=__vitest__/) | -| `projects` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/projects) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/projects?initialPath=__vitest__/) | +| 示例 | 源代码 | 演练场 | +| ---------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | +| `basic` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/basic) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/basic?initialPath=__vitest__/) | +| `fastify` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/fastify) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/fastify?initialPath=__vitest__/) | +| `in-source-test` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/in-source-test) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/in-source-test?initialPath=__vitest__/) | +| `lit` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/lit) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/lit?initialPath=__vitest__/) | +| `vue` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/vue) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/vue?initialPath=__vitest__/) | +| `marko` | [GitHub](https://github.com/marko-js/examples/tree/master/examples/library-ts) | [在线演示](https://stackblitz.com/fork/github/marko-js/examples/tree/master/examples/library-ts/) | +| `preact` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/preact) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/preact?initialPath=__vitest__/) | +| `react` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/react) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/react?initialPath=__vitest__/) | +| `solid` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/solid) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/solid?initialPath=__vitest__/) | +| `svelte` | [GitHub](https://github.com/vitest-tests/browser-examples/tree/main/examples/svelte) | [在线演示](https://stackblitz.com/fork/github/vitest-tests/browser-examples/tree/main/examples/svelte?initialPath=__vitest__/) | +| `sveltekit` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/sveltekit) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/sveltekit?initialPath=__vitest__/) | +| `profiling` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/profiling) | 暂无 | +| `typecheck` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/typecheck) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/typecheck?initialPath=__vitest__/) | +| `projects` | [GitHub](https://github.com/vitest-dev/vitest/tree/main/examples/projects) | [在线演示](https://stackblitz.com/fork/github/vitest-dev/vitest/tree/main/examples/projects?initialPath=__vitest__/) | ## 使用 Vitest 的项目 {#projects-using-vitest} diff --git a/guide/migration.md b/guide/migration.md index 98fbf4e21..f0de92c33 100644 --- a/guide/migration.md +++ b/guide/migration.md @@ -187,7 +187,7 @@ import { ### 默认数据池为 `forks` {#default-pool-is-forks} -为了提高稳定性,Vitest 2.0 将 `pool` 的默认配置改为 `'fork'`。您可以在 [PR](https://github.com/vitest-dev/vitest/pull/5047)中阅读完整的动机。 +为了提高稳定性,Vitest 2.0 将 `pool` 的默认配置改为 `'fork'`。您可以在 [PR](https://github.com/vitest-dev/vitest/pull/5047) 中阅读完整的动机。 如果使用了 `poolOptions` 而未指定一个 `pool`,则可能需要更新配置: @@ -224,7 +224,7 @@ export default defineConfig({ ### `suite.concurrent` 同时运行所有测试 {#suite-concurrent-runs-all-tests-concurrently} -以前,在套件上指定 `concurrent` 时,并发测试仍会按套件分组并逐个运行。现在,它会遵循 jest 的行为,一次运行所有测试(仍受 [`maxConcurrency`](/config/#maxConcurrency)限制)。 +以前,在套件上指定 `concurrent` 时,并发测试仍会按套件分组并逐个运行。现在,它会遵循 jest 的行为,一次运行所有测试(仍受 [`maxConcurrency`](/config/#maxConcurrency) 限制)。 ### 默认启用 V8 覆盖的 `coverage.ignoreEmptyLines` {#v8-coverage-s-coverage-ignoreemptylines-is-enabled-by-default} @@ -246,19 +246,19 @@ export default defineConfig({ ### 移除 `--segfault-retry` {#segfault-retry-removed} -默认程序池更改后,不再需要此选项。如果遇到分离故障错误,请尝试切换到`'forks'`池。如果问题仍然存在,请重现问题并打开一个新问题。 +默认程序池更改后,不再需要此选项。如果遇到分离故障错误,请尝试切换到 `'forks'` 池。如果问题仍然存在,请重现问题并打开一个新问题。 ### 删除套件任务中的空任务 {#empty-task-in-suite-tasks-removed} -这是对高级[task API](/advanced/runner#your-task-function)的更改。以前,遍历 `.suite`最终会导致使用空的内部套件,而不是文件任务。 +这是对高级 [task API](/advanced/runner#your-task-function) 的更改。以前,遍历 `.suite` 最终会导致使用空的内部套件,而不是文件任务。 -这使得 `.suite`成为可选项;如果任务是在顶层定义的,则不会有 suite。您可以回退到 `.file`属性,该属性现在存在于所有任务中(包括文件任务本身,因此要小心不要陷入无休止的递归)。 +这使得 `.suite` 成为可选项;如果任务是在顶层定义的,则不会有 suite。您可以回退到 `.file` 属性,该属性现在存在于所有任务中(包括文件任务本身,因此要小心不要陷入无休止的递归)。 这一更改还删除了 `expect.getState().currentTestName` 中的文件,并使 `expect.getState().testPath` 成为必填项。 ### `task.meta` 已添加到 JSON 报告器中 {#task-meta-is-added-to-the-json-reporter} -JSON 报告器现在会为每个断言结果打印 `task.meta` 。 +JSON 报告器现在会为每个断言结果打印 `task.meta`。 ### 简化的模拟函数通用类型 (e.g. `vi.fn`, `Mock`) {#simplified-generic-types-of-mock-functions-e-g-vi-fn-t-mock-t} @@ -305,7 +305,7 @@ expect(fn).toHaveResolved('result') // [!code ++] ### 浏览器模式 {#browser-mode} -Vitest 浏览器模式在测试周期内发生了很多变化。您可以在[GitHub discussion](https://github.com/vitest-dev/vitest/discussions/5828)上阅读我们关于浏览器模式的理念。 +Vitest 浏览器模式在测试周期内发生了很多变化。您可以在 [GitHub discussion](https://github.com/vitest-dev/vitest/discussions/5828) 上阅读我们关于浏览器模式的理念。 大多数改动都是附加的,但也有一些小的突破性改动: @@ -353,11 +353,11 @@ expect({ foo: 'bar' }).toMatchInlineSnapshot(` + expect('some string').toMatchInlineSnapshot(`"some string"`) ``` -对 `@vitest/snapshot` 也有[修改](https://github.com/vitest-dev/vitest/pull/4076)。如果不直接使用它,则无需做任何更改。 +对 `@vitest/snapshot` 也有 [修改](https://github.com/vitest-dev/vitest/pull/4076)。如果不直接使用它,则无需做任何更改。 - 我们不再需要扩展 `SnapshotClient` 以覆盖 `equalityCheck` 方法:只需在启动实例时将其作为 `isEqual` 传递即可。 - `client.setTest` 更名为 `client.startCurrentRun` -- `client.resetCurrent` 更名为 `client.finishCurrentRun` 。 +- `client.resetCurrent` 更名为 `client.finishCurrentRun`。 ### Pools 标准化 [#4172](https://github.com/vitest-dev/vitest/pull/4172) {#pools-are-standardized-4172} @@ -456,15 +456,15 @@ export default defineConfig({ ``` ::: warning -`SpyInstance` 已被弃用,取而代之的是 `MockInstance` ,并会在下一个主要版本中移除。 +`SpyInstance` 已被弃用,取而代之的是 `MockInstance`,并会在下一个主要版本中移除。 ::: ### 模拟计时器 [#3925](https://github.com/vitest-dev/vitest/pull/3925) {#timer-mocks-3925} -`vi.useFakeTimers()` 不再自动模拟 [`process.nextTick`](https://nodejs.org/api/process.html#processnexttickcallback-args) 。 +`vi.useFakeTimers()` 不再自动模拟 [`process.nextTick`](https://nodejs.org/api/process.html#processnexttickcallback-args)。 仍然可以通过使用 `vi.useFakeTimers({ toFake: ['nextTick'] })` 明确指定来模拟 `process.nextTick`。 -但是,在使用 `--pool=forks` 时,无法模拟 `process.nextTick` 。如果需要模拟 `process.nextTick` ,请使用不同的 `--pool` 选项。 +但是,在使用 `--pool=forks` 时,无法模拟 `process.nextTick`。如果需要模拟 `process.nextTick`,请使用不同的 `--pool` 选项。 ## 从 Jest 迁移 {#jest} @@ -472,7 +472,7 @@ Vitest 设计了与 Jest 兼容的 API ,方便你从 Jest 的迁移尽可能 ### 全局变量作为默认值 {#globals-as-a-default} -Jest 默认启用 [全局 API](https://jestjs.io/zh-Hans/docs/api) 。然而 Vitest 没有。你既可以通过 [`globals` 配置选项](/config/#globals) 启用全局 API,也可以通过更新你的代码以便使用来自 `vitest` 模块的导入。 +Jest 默认启用 [全局 API](https://jestjs.io/zh-Hans/docs/api)。然而 Vitest 没有。你既可以通过 [`globals` 配置选项](/config/#globals) 启用全局 API,也可以通过更新你的代码以便使用来自 `vitest` 模块的导入。 如果你决定禁用全局 API,请注意像 [`testing-library`](https://testing-library.com/) 这样的通用库不会自动运行 DOM [cleanup](https://testing-library.com/docs/svelte-testing-library/api/#cleanup)。 @@ -511,7 +511,7 @@ const { cloneDeep } = await vi.importActual('lodash/cloneDeep') // [!code ++] ### 将模拟扩展到外部库 {#extends-mocking-to-external-libraries} -在 Jest 的默认情况下,当模拟一个模块并希望将此模拟扩展到使用相同模块的其他外部库时,您应该明确告知您希望模拟哪个第三方库,这样外部库就会成为您源代码的一部分,方法是使用 [server.deps.inline](https://vitest.dev/config/#server-deps-inline). +在 Jest 的默认情况下,当模拟一个模块并希望将此模拟扩展到使用相同模块的其他外部库时,您应该明确告知您希望模拟哪个第三方库,这样外部库就会成为您源代码的一部分,方法是使用 [server.deps.inline](https://vitest.dev/config/#server-deps-inline). ``` server.deps.inline: ["lib-name"] @@ -528,20 +528,21 @@ Vitest 的 `test` 名称用 `>` 符号连接,以便于区分测试和套件, ### 环境变量 {#envs} -与 Jest 类似,如果未提前设置,Vitest 会将 `NODE_ENV` 设置为 `"test"`。 Vitest 还提供了与 `JEST_WORKER_ID` 对应的 `VITEST_POOL_ID` (该值始终大于等于 `maxThreads`),如果你依赖它请记得重命名。此外,Vitest 还会暴露 `VITEST_WORKER_ID` 作为运行中 worker的唯一标识 —— 此数值不受 `maxThreads`限制,并且随着 worker 创建递增。 +与 Jest 类似,如果未提前设置,Vitest 会将 `NODE_ENV` 设置为 `"test"`。 Vitest 还提供了与 `JEST_WORKER_ID` 对应的 `VITEST_POOL_ID` (该值始终大于等于 `maxThreads`),如果你依赖它请记得重命名。此外,Vitest 还会暴露 `VITEST_WORKER_ID` 作为运行中 worker 的唯一标识 —— 此数值不受 `maxThreads` 限制,并且随着 worker 创建递增。 ### 属性替换 {#replace-property} 如果你想修改测试环境,你会在 Jest 中使用 [replaceProperty API](https://jestjs.io/docs/jest-object#jestreplacepropertyobject-propertykey-value),你可以使用 [vi.stubEnv](/api/vi#vi-stubenv) 或者 [`vi.spyOn`](/api/vi#vi-spyon) 也可以在 Vitest 中执行此操作。 ### Done 回调函数 {#done-callback} + 从 Vitest v0.10.0 开始,声明测试的回调样式被弃用。建议改用 `async`/`await` 函数,或者使用 Promise 回调风格。 ### 钩子 {#hooks} -`beforeAll`/`beforeEach` 钩子可能在 Vitest 的 [teardown 函数](/api/#setup-and-teardown)中返回。因此,如果它们返回的不是 `undefined` 或 `null`,你可能需要重写你的钩子声明: +`beforeAll`/`beforeEach` 钩子可能在 Vitest 的 [teardown 函数](/api/#setup-and-teardown) 中返回。因此,如果它们返回的不是 `undefined` 或 `null`,你可能需要重写你的钩子声明: ```ts beforeEach(() => setActivePinia(createTestingPinia())) // [!code --] @@ -572,11 +573,12 @@ let fn: Mock<(name: string) => number> // [!code ++] ``` ### Timers {#timers} -Vitest 不支持 Jest的 传统计时器。 + +Vitest 不支持 Jest 的 传统计时器。 ### 定时器 {#timeout} -如果你之前在测试中使用了 jest.setTimeout ,那么你需要迁移到 Vitest 中的`vi.setConfig` : +如果你之前在测试中使用了 jest.setTimeout ,那么你需要迁移到 Vitest 中的 `vi.setConfig`: ```ts jest.setTimeout(5_000) // [!code --] @@ -588,6 +590,7 @@ vi.setConfig({ testTimeout: 5_000 }) // [!code ++] 如果你以前在 vue-cli preset 中使用 Jest,那么这不是一个 Jest 独有的新特性。你可能需要安装 [`jest-serializer-vue`](https://github.com/eddyerburgh/jest-serializer-vue) 包,然后在 [setupFiles](/config/#setupfiles) 中配置: :::code-group + ```js [vite.config.js] import { defineConfig } from 'vite' export default defineConfig({ @@ -596,10 +599,12 @@ export default defineConfig({ }, }) ``` + ```js [tests/unit/setup.js] import vueSnapshotSerializer from 'jest-serializer-vue' expect.addSnapshotSerializer(vueSnapshotSerializer) ``` + ::: 否则你的快照将出现大量的 `"` 字符。 diff --git a/guide/mocking.md b/guide/mocking.md index ce570a506..3fa6947ce 100644 --- a/guide/mocking.md +++ b/guide/mocking.md @@ -4,13 +4,13 @@ title: 模拟对象 | 指南 # 模拟对象 {#mocking} -在编写测试时,迟早会需要创建一个内部或外部服务的 "fake" 版本。这通常被称为**mocking**。Vitest 通过其 `vi` 辅助工具提供了实用函数来帮助您。我们可以从 `vitest` 中导入它,或者如果启用了 [`global` 配置](/config/#globals),也可以全局访问它。 +在编写测试时,迟早会需要创建一个内部或外部服务的 "fake" 版本。这通常被称为 **mocking**。Vitest 通过其 `vi` 辅助工具提供了实用函数来帮助您。我们可以从 `vitest` 中导入它,或者如果启用了 [`global` 配置](/config/#globals),也可以全局访问它。 ::: warning 不要忘记在每次测试运行前后清除或恢复模拟对象,以撤消运行测试时模拟对象状态的更改!有关更多信息,请参阅 [`mockReset`](/api/mock.html#mockreset) 文档。 ::: -如果你不熟悉 `vi.fn`、`vi.mock` 或 `vi.spyOn` 方法,请先查看 [API部分](/api/vi)。 +如果你不熟悉 `vi.fn`、`vi.mock` 或 `vi.spyOn` 方法,请先查看 [API 部分](/api/vi)。 ## 日期 {#dates} @@ -260,7 +260,7 @@ export function foobar(injectedFoo) { } ``` -这就是预期行为。当以这种方式包含 mock 时,这通常是不良代码的标志。考虑将代码重构为多个文件,或者使用[依赖项注入](https://en.wikipedia.org/wiki/dependency_injection)等技术来改进应用体系结构。 +这就是预期行为。当以这种方式包含 mock 时,这通常是不良代码的标志。考虑将代码重构为多个文件,或者使用 [依赖项注入](https://en.wikipedia.org/wiki/dependency_injection) 等技术来改进应用体系结构。 ### 示例 {#example-2} @@ -365,6 +365,7 @@ Vitest 并不提供任何文件系统模拟 API。您可以使用 `vi.mock` 手 要自动将每个 `fs` 调用重定向到 `memfs`,可以在项目根目录下创建 `__mocks__/fs.cjs` 和 `__mocks__/fs/promises.cjs` 文件: ::: code-group + ```ts [__mocks__/fs.cjs] // 也可以使用 import,但这样 // 每个导出都需要显式定义 @@ -380,6 +381,7 @@ module.exports = fs const { fs } = require('memfs') module.exports = fs.promises ``` + ::: ```ts [read-hello-world.js] @@ -433,7 +435,7 @@ it('can return a value multiple times', () => { 因为 Vitest 运行在 Node 环境中,所以模拟网络请求是一件非常棘手的事情;由于没有办法使用 Web API,因此我们需要一些可以为我们模拟网络行为的包。推荐使用 [Mock Service Worker](https://mswjs.io/) 来进行这个操作。它可以模拟 `http`、`WebSocket` 和 `GraphQL` 网络请求,并且与框架无关。 -Mock Service Worker (MSW) 的工作原理是拦截测试请求,让我们可以在不更改任何应用代码的情况下使用它。在浏览器中,它使用 [Service Worker API](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) 。在 Node.js 和 Vitest 中,它使用 [`@mswjs/interceptors`](https://github.com/mswjs/interceptors) 库。要了解有关 MSW 的更多信息,请阅读他们的 [介绍部分](https://mswjs.io/docs/) 。 +Mock Service Worker (MSW) 的工作原理是拦截测试请求,让我们可以在不更改任何应用代码的情况下使用它。在浏览器中,它使用 [Service Worker API](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API)。在 Node.js 和 Vitest 中,它使用 [`@mswjs/interceptors`](https://github.com/mswjs/interceptors) 库。要了解有关 MSW 的更多信息,请阅读他们的 [介绍部分](https://mswjs.io/docs/)。 ### 配置 {#configuration} @@ -537,6 +539,7 @@ afterAll(() => server.close()) // 在每个测试后重置处理程序以实现测试隔离 afterEach(() => server.resetHandlers()) ``` + ::: > 将 server 配置为 `onUnhandledRequest: 'error'` 可确保在遇到没有对应请求处理程序的请求时抛出错误。 @@ -660,6 +663,7 @@ const Newt = new IncorrectDogClass('Newt') Marti instanceof CorrectDogClass // ✅ true Newt instanceof IncorrectDogClass // ❌ false! ``` + ::: ::: tip 何时使用? @@ -683,6 +687,7 @@ function feed(dog: Dog) { // ... } ``` + ```ts [tests/dog.test.ts] import { expect, test, vi } from 'vitest' import { feed } from '../src/feed.js' @@ -699,6 +704,7 @@ test('can feed dogs', () => { expect(dogMax.isHungry()).toBe(false) }) ``` + ::: 现在,当我们创建一个新的 `Dog` 类实例时,它的 `speak` 方法(与 `feed` 并列)已经被模拟: @@ -757,9 +763,11 @@ expect(nameSpy).toHaveBeenCalledTimes(1) 我想…… ### 模拟导出变量 {#mock-exported-variables} + ```js [example.js] export const getter = 'variable' ``` + ```ts [example.test.ts] import * as exports from './example.js' @@ -805,9 +813,11 @@ vi.spyOn(exports, 'method').mockImplementation(() => {}) ### 模拟导出类的实现 {#mock-an-exported-class-implementation} 1. 一个使用假 class 的示例: + ```ts [example.js] export class SomeClass {} ``` + ```ts import { SomeClass } from './example.js' @@ -895,7 +905,7 @@ mocked() // 是一个 spy 函数 ### 模拟当前日期 {#mock-the-current-date} -要模拟 `Date` 的时间,你可以使用 `vi.setSystemTime` 辅助函数。 该值将**不会**在不同的测试之间自动重置。 +要模拟 `Date` 的时间,你可以使用 `vi.setSystemTime` 辅助函数。 该值将 **不会** 在不同的测试之间自动重置。 请注意,使用 `vi.useFakeTimers` 也会更改 `Date` 的时间。 @@ -910,7 +920,7 @@ vi.useRealTimers() ### 模拟全局变量 {#mock-a-global-variable} -你可以通过为 `globalThis` 赋值或使用 [`vi.stubGlobal`](/api/vi#vi-stubglobal) 助手来设置全局变量。 使用 `vi.stubGlobal` 时,**不会**在不同的测试之间自动重置,除非你启用 [`unstubGlobals`](/config/#unstubglobals) 配置选项或调用 [`vi.unstubAllGlobals`](/api/vi#vi-unstuballglobals)。 +你可以通过为 `globalThis` 赋值或使用 [`vi.stubGlobal`](/api/vi#vi-stubglobal) 助手来设置全局变量。 使用 `vi.stubGlobal` 时,**不会** 在不同的测试之间自动重置,除非你启用 [`unstubGlobals`](/config/#unstubglobals) 配置选项或调用 [`vi.unstubAllGlobals`](/api/vi#vi-unstuballglobals)。 ```ts vi.stubGlobal('__VERSION__', '1.0.0') @@ -919,10 +929,10 @@ expect(__VERSION__).toBe('1.0.0') ### 模拟 `import.meta.env` {#mock-import-meta-env} -1. 要更改环境变量,你只需为其分配一个新值即可。 该值将**不会**在不同的测试之间自动重置。 +1. 要更改环境变量,你只需为其分配一个新值即可。 该值将 **不会** 在不同的测试之间自动重置。 ::: warning -环境变量值将在不同的测试之间**不会**自动重置。 +环境变量值将在不同的测试之间 **不会** 自动重置。 ::: ```ts diff --git a/guide/parallelism.md b/guide/parallelism.md index 814db2fcd..2dad046dc 100644 --- a/guide/parallelism.md +++ b/guide/parallelism.md @@ -14,11 +14,11 @@ outline: deep "子进程"和"工作线程"都被称为"工作者"。你可以通过 [`maxWorkers`](/config/#maxworkers) 选项配置运行的工作者数量,或者通过 [`poolOptions`](/config/#pooloptions) 配置进行更精细的控制。 -如果项目包含大量测试文件,通常并行执行会大幅提升速度。但具体效果还要看项目本身、运行环境以及是否启用了 [隔离](/config/#isolate)。若需要关闭文件级并行化,可以将 [`fileParallelism`](/config/#fileparallelism) 设为 `false` 。更多性能优化技巧,请参考 [性能指南](/guide/improving-performance) 。 +如果项目包含大量测试文件,通常并行执行会大幅提升速度。但具体效果还要看项目本身、运行环境以及是否启用了 [隔离](/config/#isolate)。若需要关闭文件级并行化,可以将 [`fileParallelism`](/config/#fileparallelism) 设为 `false`。更多性能优化技巧,请参考 [性能指南](/guide/improving-performance)。 ## 测试级并行 {#test-parallelism} -与 _测试文件_ 不同, Vitest 在同一个文件中会顺序执行 _测试用例_ 。也就是说,同一个文件里的测试会按定义顺序一个接一个地执行。 +与 _测试文件_ 不同, Vitest 在同一个文件中会顺序执行 _测试用例_。也就是说,同一个文件里的测试会按定义顺序一个接一个地执行。 如果希望让同一文件中的多个测试并行执行,可以使用 [`concurrent`](/api/#test-concurrent) 选项。启用后, Vitest 会将同一文件中的并发测试分组,并基于 maxConcurrency 控制并行度,然后通过 [`Promise.all`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) 一起执行。 @@ -34,4 +34,4 @@ test.concurrent('the second test', () => { }) ``` -如果希望所有测试用例都并发执行,可以将 [`sequence.concurrent`](/config/#sequence-concurrent) 配置项设为 `true` 。 +如果希望所有测试用例都并发执行,可以将 [`sequence.concurrent`](/config/#sequence-concurrent) 配置项设为 `true`。 diff --git a/guide/profiling-test-performance.md b/guide/profiling-test-performance.md index 639fe9397..5b4889287 100644 --- a/guide/profiling-test-performance.md +++ b/guide/profiling-test-performance.md @@ -15,12 +15,12 @@ > # Time metrics ^^ > ``` -- Transform :转换文件所用的时间。详见 [文件转换](#file-transform)。 -- Setup :执行 [`setupFiles`](/config/#setupfiles) 配置文件所花的时间。 -- Collect :收集测试文件中所有用例的时间,包括导入文件依赖的耗时。 -- Tests :实际执行测试用例所用的时间。 -- Environment : [配置测试](/config/#environment) 环境(比如 JSDOM )所需的时间。 -- Prepare : Vitest 用于准备测试运行环境的时间。在 Node 环境下,包括导入并执行内部工具;在浏览器中,还包含初始化 iframe 的时间。 +- Transform:转换文件所用的时间。详见 [文件转换](#file-transform)。 +- Setup:执行 [`setupFiles`](/config/#setupfiles) 配置文件所花的时间。 +- Collect:收集测试文件中所有用例的时间,包括导入文件依赖的耗时。 +- Tests:实际执行测试用例所用的时间。 +- Environment:[配置测试](/config/#environment) 环境(比如 JSDOM )所需的时间。 +- Prepare:Vitest 用于准备测试运行环境的时间。在 Node 环境下,包括导入并执行内部工具;在浏览器中,还包含初始化 iframe 的时间。 ## 测试运行器 {#test-runner} @@ -31,12 +31,13 @@ - [`--prof`](https://nodejs.org/api/cli.html#--prof) :::warning -由于 `node:worker_threads` 的限制, `--prof` 不能与 `pool: 'threads'` 一起使用。 +由于 `node:worker_threads` 的限制,`--prof` 不能与 `pool: 'threads'` 一起使用。 ::: 要将这些选项传递给 Vitest ,可以在 Vitest 的配置中定义 `poolOptions..execArgv`: ::: code-group + ```ts [Forks] import { defineConfig } from 'vitest/config' @@ -59,6 +60,7 @@ export default defineConfig({ }, }) ``` + ```ts [Threads] import { defineConfig } from 'vitest/config' @@ -81,11 +83,12 @@ export default defineConfig({ }, }) ``` + ::: 测试运行后,应该会生成 `test-runner-profile/*.cpuprofile` 和 `test-runner-profile/*.heapprofile` 文件。想要知道如何分析这些文件,可以仔细查看 [性能分析记录](#inspecting-profiling-records)。 -也可以看看 [性能分析 | 示例](https://github.com/vitest-dev/vitest/tree/main/examples/profiling) 。 +也可以看看 [性能分析 | 示例](https://github.com/vitest-dev/vitest/tree/main/examples/profiling)。 ## 主线程 {#main-thread} @@ -106,7 +109,7 @@ $ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs - # NodeJS arguments Vitest arguments ``` -测试运行后会生成一个 `main-profile/*.cpuprofile` 文件。有关如何分析这些文件的说明,可以查看[检查分析记录](#inspecting-profiling-records)。 +测试运行后会生成一个 `main-profile/*.cpuprofile` 文件。有关如何分析这些文件的说明,可以查看 [检查分析记录](#inspecting-profiling-records)。 ## 文件转换 {#file-transform} @@ -128,13 +131,14 @@ $ DEBUG=vite-node:* vitest --run ... ``` -这种分析策略是识别由[「 桶文件 / barrel files 」](https://cn.vitejs.dev/guide/performance#avoid-barrel-files)引起的不必要转换的好方法。如果这些日志包含了在运行测试时不应该加载的文件,你可能有桶文件在不必要地导入文件。 +这种分析策略是识别由 [「 桶文件 / barrel files 」](https://cn.vitejs.dev/guide/performance#avoid-barrel-files) 引起的不必要转换的好方法。如果这些日志包含了在运行测试时不应该加载的文件,你可能有桶文件在不必要地导入文件。 也可以使用 [Vitest UI](/guide/ui) 来调试由打包文件引起的缓慢问题。 -下面的例子展示了不使用打包文件导入文件可以减少约85%的转换文件数量。 +下面的例子展示了不使用打包文件导入文件可以减少约 85% 的转换文件数量。 ::: code-group -``` [File tree] + +```[File tree] ├── src │ └── utils │ ├── currency.ts @@ -148,6 +152,7 @@ $ DEBUG=vite-node:* vitest --run │ └── formatters.test.ts └── vitest.config.ts ``` + ```ts [example.test.ts] import { expect, test } from 'vitest' import { formatter } from '../src/utils' // [!code --] @@ -157,6 +162,7 @@ test('formatter works', () => { expect(formatter).not.toThrow() }) ``` + ::: Vitest UI demonstrating barrel file issues diff --git a/guide/projects.md b/guide/projects.md index 56086c920..8394c375d 100644 --- a/guide/projects.md +++ b/guide/projects.md @@ -130,53 +130,68 @@ export default defineProject({ 然后使用包管理器运行测试: ::: code-group + ```bash [npm] npm run test ``` + ```bash [yarn] yarn test ``` + ```bash [pnpm] pnpm run test ``` + ```bash [bun] bun run test ``` + ::: 如果只想运行某个单独项目中的测试,可以使用 `--project` CLI 选项: ::: code-group + ```bash [npm] npm run test --project e2e ``` + ```bash [yarn] yarn test --project e2e ``` + ```bash [pnpm] pnpm run test --project e2e ``` + ```bash [bun] bun run test --project e2e ``` + ::: ::: tip CLI 选项 `--project` 可以多次使用,以筛选多个项目: ::: code-group + ```bash [npm] npm run test --project e2e --project unit ``` + ```bash [yarn] yarn test --project e2e --project unit ``` + ```bash [pnpm] pnpm run test --project e2e --project unit ``` + ```bash [bun] bun run test --project e2e --project unit ``` + ::: ## 配置说明 {#configuration} diff --git a/guide/test-context.md b/guide/test-context.md index 8b1703f3e..e618c2246 100644 --- a/guide/test-context.md +++ b/guide/test-context.md @@ -22,7 +22,7 @@ it('should work', ({ task }) => { ## 内置测试上下文 {#built-in-test-context} -#### `task` +### `task` 包含关于测试的元数据的只读对象。 @@ -94,7 +94,7 @@ function annotate( ): Promise ``` -添加一个[测试注解](/guide/test-annotations),它将由你的[报告器](/config/#reporters)显示。 +添加一个 [测试注解](/guide/test-annotations),它将由你的 [报告器](/config/#reporters) 显示。 ```ts test('annotations API', async ({ annotate }) => { @@ -104,7 +104,7 @@ test('annotations API', async ({ annotate }) => { #### `signal` 3.2.0 {#signal} -一个由 Vitest 控制的 [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) ,在以下场景下会被触发中止: +一个由 Vitest 控制的 [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal),在以下场景下会被触发中止: - 测试用例超时 - 用户使用 Ctrl+C 手动终止了测试 @@ -258,6 +258,7 @@ test('works correctly') 从 Vitest 3 开始,你可以在不同的 [项目](/guide/projects) 中提供不同的值。要启用此功能,请在选项中传递 `{ injected: true }`。如果在 [项目配置](/config/#provide) 中未指定该键,则将使用默认值。 :::code-group + ```ts [fixtures.test.ts] import { test as base } from 'vitest' @@ -276,6 +277,7 @@ test('works correctly', ({ url }) => { // 在"project-empty"中,url是"/empty" }) ``` + ```ts [vitest.config.ts] import { defineConfig } from 'vitest/config' @@ -307,6 +309,7 @@ export default defineConfig({ }, }) ``` + ::: #### 将值限定到套件范围 3.1.0 {#scoping-values-to-suite} diff --git a/public/cover.png b/public/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..2545e9f63f399ca720d63f481c9b33db2a895192 GIT binary patch literal 21781 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

! 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 literal 0 HcmV?d00001 diff --git a/public/vitest_cover.png b/public/vitest_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce0b2b87a33eeb070128ba4e14b7f5cb1664d80 GIT binary patch literal 35549 zcmdpdhdZ0!`#)8sYE)4xp@bTxrB-58tpqh{#40U~+9R>4nysCO7^Oyw)QnM-s#QB^ zDJreKq9{sZ)Tr^x`}6%Te&@=STuIJzpZnb7b&vBr@%N1oEKGb%G&D3Udb--CG&Bq# z8X8(xMmp**ICLeMhUOgQzJa+80&P%?d6gZK?UBQ6>_^;xtxZo)kICV$3HzlK)OFM& z6Qp0c`4IKt#UCRhqwDd5{{|F%a`>?}#DAY|L!S4nTexF#K{4j-|32Roj3(l6IG-F) zb?DkQ#t8SQ-_X!VrFioxyy5usEy3{iO;fK1_uC)iws8&vyJ1@Ye#nQwKlJIu3nYC{ zwC)uQsLAmd{nvGiNAI)efNlRnnY5i}8pkWJ-#S6}Yj>heTd72R za{2$*KgQV)P_Grij)DAZsC1|+#+&x%dXD^m!u~D5Mn^~gO(-9IQ$8A0KI~OKCf;aiX*p<6*{@KcUbSDS(v`W} zk-poG+x?rV+LpX~m?eDh-|O0brcg`LPEk?OUW#gS{LW5>(8rjat<-CKajGApw%1Yw zP3v~+Ber)V)QoC&sC)m36|8$kp>m~Py|a)guoI#VuiTl56WH;CYY?`#(T1t1spBs| zYGvDlFQh51NLcCiXcRxi(N?i|`*soK&m+g1cuF4n+rTrvxVX42D-Vf$N{;);mI)g2 z`cGqkT$c0jrhzY20vV{UoAAI}X`~d#t~C3hO^pyK90_>bxvBO{B4unt?HSg-BgJ-5 zHLgVr7|TOLCpDfY+O>;dzX4XCN3>%5;0a1GE%6UNebU8VOZ*mR)20&rzEM9p5ji0D zyt(!sF4n3IgTa8}N2#KgkF38H_3;I=l_z#2*0@h9qA|*(`F3a(=kwthr#s@$KCnf7 z6%DB?&-MMo|N=iydNQi@jgKGRVN2g}gca)#0kr@pGJHMc? zi1e-7%6D`Sx<c(%Xk!)@Kp=@vO{XO`1dOFg$afOB^7OJPM zVIDNO(fTyVe6Mv&UGBQ{Whuo7q55~17UcC=uJM0R*^DXHg_XrFZ@_hnKJk2hsqUg+ zBdY5ZGXSP6scIIy1S@Wsrl*QsV~pg9jxgb5SA0jOdN~dzfA?B`Tm<*=`hMuvo2{lV z{*~75PHkHXbxxHEH?r@ha&LY8y-pFA`2S&u+P->rRH}Yn^nc^#T)rz3iR557920y& z^@7yYD;O*XA?~_UxjOUzP3h|`FOMHkk^JB0gH>NUAT^`M1Y`dLh) z-?(@li8CK8|KDGu?6FH_rgT>uHC`cp3}mW_e9C|Kw!-5Cq)kMG`JA1oA200B>{hNJJ>>n9%M6L9 zR1r%Q(>A}8;b#K{(P>+n2_(1G@cVU!f~wl2ZTXgXQj_}{D?O$fJl6@b0yWS4*af)w zwStJ|Myh-lkX)cN>yOP)P#_qJw }N+6pIC|1!$lKc|@uO}!C*+pSet}{*`{4YEA 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 literal 0 HcmV?d00001 From 61f6bf202cf317d757e624fc9c40c476949e489f Mon Sep 17 00:00:00 2001 From: noise Date: Tue, 21 Jul 2026 20:03:51 +0800 Subject: [PATCH 4/6] fix: english document link --- .vitepress/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vitepress/config.ts b/.vitepress/config.ts index 53d31cd23..98a8d7031 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -42,7 +42,7 @@ export default ({ mode }: { mode: string }) => { zh: { label: 'English', lang: 'en-US', - link: 'https://vitest.dev/', + link: 'https://v3.vitest.dev/', }, }, head: [ From d104d94f0adabed5dac4b42d065f8c2e3a0735ee Mon Sep 17 00:00:00 2001 From: noise Date: Tue, 21 Jul 2026 20:07:31 +0800 Subject: [PATCH 5/6] ci: fix `autofix.yml` hash value --- .github/workflows/autofix.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 9c1d52e36..920d94347 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -11,10 +11,10 @@ jobs: timeout-minutes: 10 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Use Node.js lts/* - uses: actions/setup-node@v4 + uses: ctions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: lts/* From 95960b5333ea1a0dccc0a67ff9b6ae611ca295d9 Mon Sep 17 00:00:00 2001 From: noise Date: Tue, 21 Jul 2026 20:09:33 +0800 Subject: [PATCH 6/6] typo --- .github/workflows/autofix.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 920d94347..92662400b 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Use Node.js lts/* - uses: ctions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: lts/*