diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 66c268145..e10c85f4f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -9,7 +9,7 @@ body: id: reproduction attributes: label: Reproduction - description: "If possible, provide a boiled down editable reproduction using a service like [JSFiddle](https://jsfiddle.net/posva/3yq6ojLv), Codepen, [CodeSandbox](https://codesandbox.io/s/vue-router-4-reproduction-s1sqc), or a GitHub repository. A failing unit test is even better! Otherwise provide as much information as possible to reproduce the problem. If we can't reproduce the problem, we won't be able to give it a look **and the issue will be converted into a question and moved to discussions**." + description: "If possible, provide a boiled down editable reproduction with the [Vue.js Playground](https://play.vuejs.org/#eNqlVG1P2zAQ/iu3bFKLRuNSEB+yUMEQGpv2gti0L8s+pInbGhLbsp1SVPW/72znrVD4MlVp7Lvn7p67x/EmKFPGwzsdRAErpVAGNpApmhp6ISVsYa5ECYNVRQcJbwFKVIaq1hsSb+ggNrbxpVKGPj7hbeYhPgcJBwgrTYc+3O9LUXEzHLzFsMFBcBjU4cgvNrSUBcZPLTBeHk2vaVEIW+xNTHDrzNK9cKGNEnwxvayUotx4ziBTs4xiUvtgs4F3zhHOq6K4QSdsty4N8Xlinq6ahLeO5VfG78GIsyQgSTD9JHAN16KkMen8L0akM7S0YRd29ywuJk3N2Gqzm+s3ow9Aalztjkk7GJyXn2Vo9ij6jZZCPV4zbfB1WBt93r7So1bNVk/boCvdiNoYamUb2W1DO7jW0h4BunbQTHBdi6LgbIfLcGPbW3qa0T7uw4NDC3HROoI/fkQbry4MyACbE0iJo/BRR37rovpAp8cuuuvBw//i/xaPJo6237Q9jzpTTBrQ1FQSipQvUGKjUV6riXfiEjdPDu5k2mTCYzt5puDOzP6vTptqbyGv2qhMJV4AgmMpN/mkdmCFCJzF2rqDYc1JsDRG6oiQisv7RYgDJB3i/CQ8DsckR7V61pDqcjRT4kHj+g6z13IkwTmCSE5XRohCj1LJXirxDHh+Gp6GR6RgM4LZCeM5XbvcNjV+yVts02g8bHO2eNKk1ZwVVP2QhuFh3Gk2xXvl4YuzGVXRlmi2pNn9HvudXnvKN4pidyvaa86kakHxo7fuq5/f6RrXrbMUeVUg+hXnLdWiqCxHD/tY8Rxp93CO7WenGeOLX/pqbSjXTVOWqJuGwzshL19pvaN7HJ70pqjNY0F1mGl7seANdQj2+vFxM6FyqiKYyDUgWZbD2/F4/MG6SkzH+GgmjBFlBEdjuXZ2meY5km0tWCXhmBamkMJ7fFziOrqgc/wy+8jlpF+5S98RyLKsRyCCMf4mdYZg+w+goli8), or an **editable** and **up to date** [CodeSandbox](https://codesandbox.io/s/vue-router-4-reproduction-s1sqc), Stackblitz, or a GitHub repository. A failing unit test is even better! Otherwise provide as much information as possible to reproduce the problem. If we can't reproduce the problem, we won't be able to give it a look **and the issue will be converted into a question and moved to discussions**." placeholder: Reproduction validations: required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 36c8163d4..53668b5df 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,9 +1,15 @@ blank_issues_enabled: false contact_links: - - name: Help and Question + - name: 👨‍💻 Support + url: https://cal.com/posva/consultancy + about: Get direct help from the author of Vue Router with your project + - name: ❓ Help & Questions url: https://github.com/vuejs/router/discussions/new?category=help-and-questions about: Ask a question or discuss about Vue Router - - name: GitHub Sponsors + - name: 💡 Ideas + url: https://github.com/vuejs/router/discussions/new?category=ideas + about: Start a discussion to improve Vue Router + - name: 🌟 GitHub Sponsors url: https://github.com/sponsors/posva about: Like this project? Please consider supporting the author. - name: Open Collective diff --git a/.github/contributing.md b/.github/contributing.md index 087e09b95..1bdb74077 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -34,9 +34,9 @@ Hi! I'm really excited that you are interested in contributing to Vue Router. Be - Make sure tests pass! -- Commit messages must follow the [commit message convention](./commit-convention.md) so that the changelog can be automatically generated. Commit messages are automatically validated before commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via [yorkie](https://github.com/yyx990803/yorkie)). +- Commit messages must follow the [commit message convention](./commit-convention.md) so that the changelog can be automatically generated. Commit messages are automatically validated before commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via [simple-git-hooks](https://github.com/toplenboren/simple-git-hooks)). -- No need to worry about code style as long as you have installed the dev dependencies - modified files are automatically formatted with Prettier on commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via [yorkie](https://github.com/yyx990803/yorkie)). +- No need to worry about code style as long as you have installed the dev dependencies - modified files are automatically formatted with Prettier on commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via [simple-git-hooks](https://github.com/toplenboren/simple-git-hooks)). ## Development Setup @@ -52,7 +52,7 @@ A high-level overview of tools used: - [TypeScript](https://www.typescriptlang.org/) as the development language - [Rollup](https://rollupjs.org) for bundling -- [Jest](https://jestjs.io/) for unit testing +- [Vitest](https://vitest.dev/) for unit testing - [Prettier](https://prettier.io/) for code formatting ## Scripts @@ -83,7 +83,7 @@ The `pnpm test` script runs all checks: $ pnpm test # run unit tests in watch mode -$ pnpm jest --watch +$ pnpm test:unit --watch ``` ## Project Structure @@ -102,7 +102,7 @@ Vue Router source code can be found in the `src` directory: ## Contributing Tests -Unit tests are located inside `__tests__`. Consult the [Jest docs](https://jestjs.io/docs/en/using-matchers) and existing test cases for how to write new test specs. Here are some additional guidelines: +Unit tests are located inside `__tests__`. Consult the [Vitest docs](https://vitest.dev/guide/) and existing test cases for how to write new test specs. Here are some additional guidelines: - Use the minimal API needed for a test case. For example, if a test can be written without involving the reactivity system or a component, it should be written so. This limits the test's exposure to changes in unrelated parts and makes it more stable. - Use the minimal API needed for a test case. For example, if a test concerns the `router-link` component, don't create a router instance, mock the required properties instead. diff --git a/.github/workflows/pkg.pr.new.yml b/.github/workflows/pkg.pr.new.yml new file mode 100644 index 000000000..47abd6026 --- /dev/null +++ b/.github/workflows/pkg.pr.new.yml @@ -0,0 +1,45 @@ +name: Publish Any Commit + +on: + pull_request: + branches: main + paths-ignore: + - 'packages/docs/**' + - 'packages/playground/**' + + push: + branches: + - '**' + tags: + - '!**' + paths-ignore: + - 'packages/docs/**' + - 'packages/playground/**' + +jobs: + build: + if: github.repository == 'vuejs/router' + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: pnpm + + - name: Install + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm -C packages/router build + + - name: Build DTS + run: pnpm -C packages/router build:dts + + - name: Release + run: pnpm dlx pkg-pr-new publish --compact --pnpm './packages/*' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 97255b0bf..5bbdc52fc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,10 +2,14 @@ name: test on: push: + branches: + - main paths-ignore: - 'packages/docs/**' - 'packages/playground/**' pull_request: + branches: + - main paths-ignore: - 'packages/docs/**' - 'packages/playground/**' @@ -15,34 +19,33 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 with: - version: 8.5.0 - - uses: actions/setup-node@v3 - with: - node-version: '18' - cache: 'pnpm' + node-version: 'lts/*' + cache: pnpm - name: 'BrowserStack Env Setup' uses: 'browserstack/github-actions/setup-env@master' # forks do not have access to secrets so just skip this - if: ${{ !github.event.pull_request.head.repo.fork }} + if: ${{ github.repository == 'vuejs/router' && !github.event.pull_request.head.repo.fork }} with: username: ${{ secrets.BROWSERSTACK_USERNAME }} access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} - run: pnpm install - run: pnpm run lint - - run: pnpm run -r test:types - - run: pnpm run -r test:unit - run: pnpm run -r build - run: pnpm run -r build:dts - - run: pnpm run -r test:dts + - run: pnpm run -r test:types + - run: pnpm run -r test:unit # e2e tests that that run locally - run: pnpm run -r test:e2e:ci - - uses: codecov/codecov-action@v2 + - uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} # - name: 'Start BrowserStackLocal Tunnel' # uses: 'browserstack/github-actions/setup-local@master' diff --git a/.prettierignore b/.prettierignore index fbe4183e8..dd4104bc7 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ __build__ dist coverage tests_output +packages/docs/.vitepress/cache diff --git a/README.md b/README.md index 578d76d97..25eef7b6c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# vue-router [![release candidate](https://img.shields.io/npm/v/vue-router.svg)](https://www.npmjs.com/package/vue-router) [![test](https://github.com/vuejs/router/actions/workflows/test.yml/badge.svg)](https://github.com/vuejs/router/actions/workflows/test.yml) +# vue-router [![release candidate](https://img.shields.io/npm/v/vue-router.svg)](https://www.npmjs.com/package/vue-router) [![test](https://github.com/vuejs/router/actions/workflows/test.yml/badge.svg)](https://github.com/vuejs/router/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/vuejs/router/graph/badge.svg?token=azNM3FI0d1)](https://codecov.io/gh/vuejs/router) > - This is the repository for Vue Router 4 (for Vue 3) > - For Vue Router 3 (for Vue 2) see [vuejs/vue-router](https://github.com/vuejs/vue-router). @@ -12,6 +12,16 @@ Vue Router is part of the Vue Ecosystem and is an MIT-licensed open source proje +

Gold Sponsors

+

+ + + + CodeRabbit + + +

+

Silver Sponsors

@@ -26,32 +36,38 @@ Vue Router is part of the Vue Ecosystem and is an MIT-licensed open source proje Prefect -

- -

Bronze Sponsors

-

- + - - Stanislas Ormières + + Controla - + - - Antony Konstantinidis + + Route Optimizer and Route Planner Software +

+ +

Bronze Sponsors

+

Storyblok - + - - Nuxt UI Pro Templates + + NuxtLabs + + + + + + Stanislas Ormières

diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..c0ca86836 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,5 @@ +# Reporting a Vulnerability + +To report a vulnerability, please email security@vuejs.org. + +While the discovery of new vulnerabilities is rare, we also recommend always using the latest versions of Vue and its official companion libraries to ensure your application remains as secure as possible. diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..74aac0d3f --- /dev/null +++ b/codecov.yml @@ -0,0 +1,6 @@ +coverage: + status: + patch: off + project: + default: + threshold: 2% diff --git a/package.json b/package.json index a839fede3..83c776139 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,10 @@ { "name": "@vue/router-root", "private": true, - "packageManager": "pnpm@8.10.2", + "packageManager": "pnpm@9.10.0", + "type": "module", "engines": { - "node": ">=18.14.0" + "node": ">=20.9.0" }, "workspaces": [ "packages/*" @@ -23,37 +24,44 @@ "play": "pnpm run -r play", "build:size": "pnpm run -r build:size", "lint": "pnpm run lint:script && pnpm run lint:html", - "lint:script": "prettier -c --parser typescript \"packages/*/{src,__tests__,e2e}/**/*.[jt]s?(x)\"", + "lint:script": "prettier -c --parser typescript \"packages/**/*.?(m)[jt]s?(x)\" \"scripts/*.mjs\"", "lint:html": "prettier -c --parser html \"packages/**/*.html\"", "lint:fix": "pnpm run lint:script --write && pnpm run lint:html --write", - "test": "pnpm run -r test" + "test": "pnpm run -r test", + "postinstall": "simple-git-hooks" }, "devDependencies": { + "@vitest/coverage-v8": "^2.1.9", + "@vitest/ui": "^2.1.9", "brotli": "^1.3.3", - "chalk": "^5.3.0", + "chalk": "^5.4.1", "enquirer": "^2.4.1", - "execa": "^8.0.1", - "globby": "^14.0.0", - "lint-staged": "^15.2.0", + "execa": "^9.5.2", + "globby": "^14.1.0", + "lint-staged": "^15.5.1", "minimist": "^1.2.8", "p-series": "^3.0.0", - "prettier": "^2.8.8", - "semver": "^7.5.4", - "typedoc": "^0.25.3", - "typedoc-plugin-markdown": "^3.17.1", - "typescript": "~5.3.3", - "yorkie": "^2.0.0" + "prettier": "^3.5.3", + "semver": "^7.7.1", + "simple-git-hooks": "^2.13.0", + "typedoc": "^0.26.11", + "typedoc-plugin-markdown": "^4.2.10", + "typescript": "~5.6.3", + "vitest": "^2.1.9" }, - "gitHooks": { - "pre-commit": "lint-staged", + "simple-git-hooks": { + "pre-commit": "pnpm lint-staged", "commit-msg": "node scripts/verifyCommit.mjs" }, "lint-staged": { - "*.js": [ + "*.?(m)js": [ "prettier --write" ], - "*.ts?(x)": [ + "*.?(m)ts?(x)": [ "prettier --parser=typescript --write" + ], + "*.html": [ + "prettier --parser=html --write" ] }, "pnpm": { @@ -66,6 +74,6 @@ } }, "volta": { - "node": "18.16.0" + "node": "20.11.1" } } diff --git a/packages/docs/.vitepress/config/en.ts b/packages/docs/.vitepress/config/en.ts index 70042ff08..b4e7f0e4b 100644 --- a/packages/docs/.vitepress/config/en.ts +++ b/packages/docs/.vitepress/config/en.ts @@ -46,7 +46,7 @@ export const enConfig: LocaleSpecificConfig = { }, { text: 'Vue.js Certification', - link: 'https://certification.vuejs.org/?friend=VUEROUTER', + link: 'https://certificates.dev/vuejs/?friend=VUEROUTER&utm_source=router_vuejs&utm_medium=link&utm_campaign=router_vuejs_links&utm_content=navbar', }, ], }, @@ -70,7 +70,6 @@ export const enConfig: LocaleSpecificConfig = { }, { text: 'Essentials', - collapsible: false, items: [ { text: 'Getting Started', @@ -84,6 +83,10 @@ export const enConfig: LocaleSpecificConfig = { text: "Routes' Matching Syntax", link: '/guide/essentials/route-matching-syntax.html', }, + { + text: 'Named Routes', + link: '/guide/essentials/named-routes.html', + }, { text: 'Nested Routes', link: '/guide/essentials/nested-routes.html', @@ -92,10 +95,6 @@ export const enConfig: LocaleSpecificConfig = { text: 'Programmatic Navigation', link: '/guide/essentials/navigation.html', }, - { - text: 'Named Routes', - link: '/guide/essentials/named-routes.html', - }, { text: 'Named Views', link: '/guide/essentials/named-views.html', @@ -108,6 +107,10 @@ export const enConfig: LocaleSpecificConfig = { text: 'Passing Props to Route Components', link: '/guide/essentials/passing-props.html', }, + { + text: 'Active links', + link: '/guide/essentials/active-links.html', + }, { text: 'Different History modes', link: '/guide/essentials/history-mode.html', @@ -116,7 +119,6 @@ export const enConfig: LocaleSpecificConfig = { }, { text: 'Advanced', - collapsible: false, items: [ { text: 'Navigation guards', diff --git a/packages/docs/.vitepress/config/index.ts b/packages/docs/.vitepress/config/index.ts index 4b680a48c..303993358 100644 --- a/packages/docs/.vitepress/config/index.ts +++ b/packages/docs/.vitepress/config/index.ts @@ -10,7 +10,15 @@ export default defineConfig({ root: { label: 'English', lang: 'en-US', link: '/', ...enConfig }, zh: { label: '简体中文', lang: 'zh-CN', link: '/zh/', ...zhConfig }, ko: { label: '한국어', lang: 'ko-KR', link: 'https://router.vuejs.kr/' }, - pt: { label: 'Português', lang: 'pt-PT', link: 'https://vue-router-docs-pt.netlify.app/' }, - ru: { label: 'Русский', lang: 'ru-RU', link: 'https://vue-router-ru.netlify.app' }, + pt: { + label: 'Português', + lang: 'pt-PT', + link: 'https://vue-router-docs-pt.netlify.app/', + }, + ru: { + label: 'Русский', + lang: 'ru-RU', + link: 'https://vue-router-ru.netlify.app', + }, }, }) diff --git a/packages/docs/.vitepress/config/shared.ts b/packages/docs/.vitepress/config/shared.ts index ee38ec511..17a194893 100644 --- a/packages/docs/.vitepress/config/shared.ts +++ b/packages/docs/.vitepress/config/shared.ts @@ -135,7 +135,8 @@ export const sharedConfig = defineConfig({ ], footer: { - copyright: 'Copyright © 2014-present Evan You, Eduardo San Martin Morote', + copyright: + 'Copyright © 2014-present Evan You, Eduardo San Martin Morote', message: 'Released under the MIT License.', }, diff --git a/packages/docs/.vitepress/config/zh.ts b/packages/docs/.vitepress/config/zh.ts index 7d7425c11..dbc6ba4ab 100644 --- a/packages/docs/.vitepress/config/zh.ts +++ b/packages/docs/.vitepress/config/zh.ts @@ -50,22 +50,16 @@ export const zhConfig: LocaleSpecificConfig = { }, { text: 'Vue.js 认证', - link: 'https://certification.vuejs.org/?friend=VUEROUTER', + link: 'https://certificates.dev/vuejs/?friend=VUEROUTER&utm_source=router_vuejs&utm_medium=link&utm_campaign=router_vuejs_links&utm_content=navbar', }, ], }, ], sidebar: { - '/zh/api/': [ - { - text: 'packages', - items: [{ text: 'vue-router', link: '/zh/api/' }], - }, - ], - '/zh/': [ { + text: '设置', items: [ { text: '介绍', @@ -79,7 +73,6 @@ export const zhConfig: LocaleSpecificConfig = { }, { text: '基础', - collapsible: false, items: [ { text: '入门', @@ -97,14 +90,14 @@ export const zhConfig: LocaleSpecificConfig = { text: '嵌套路由', link: '/zh/guide/essentials/nested-routes.html', }, - { - text: '编程式导航', - link: '/zh/guide/essentials/navigation.html', - }, { text: '命名路由', link: '/zh/guide/essentials/named-routes.html', }, + { + text: '编程式导航', + link: '/zh/guide/essentials/navigation.html', + }, { text: '命名视图', link: '/zh/guide/essentials/named-views.html', @@ -117,6 +110,10 @@ export const zhConfig: LocaleSpecificConfig = { text: '路由组件传参', link: '/zh/guide/essentials/passing-props.html', }, + { + text: '匹配当前路由的链接', + link: '/zh/guide/essentials/active-links.html', + }, { text: '不同的历史记录模式', link: '/zh/guide/essentials/history-mode.html', @@ -125,7 +122,6 @@ export const zhConfig: LocaleSpecificConfig = { }, { text: '进阶', - collapsible: false, items: [ { text: '导航守卫', @@ -190,6 +186,13 @@ export const zhConfig: LocaleSpecificConfig = { ], }, ], + + '/zh/api/': [ + { + text: 'packages', + items: [{ text: 'vue-router', link: '/zh/api/' }], + }, + ], }, }, } diff --git a/packages/docs/.vitepress/theme/components/AsideSponsors.vue b/packages/docs/.vitepress/theme/components/AsideSponsors.vue index 7066c8bab..d4e64cddc 100644 --- a/packages/docs/.vitepress/theme/components/AsideSponsors.vue +++ b/packages/docs/.vitepress/theme/components/AsideSponsors.vue @@ -1,6 +1,61 @@ + + diff --git a/packages/docs/.vitepress/theme/components/HomeSponsors.vue b/packages/docs/.vitepress/theme/components/HomeSponsors.vue index 458b02c7d..8bd5f1748 100644 --- a/packages/docs/.vitepress/theme/components/HomeSponsors.vue +++ b/packages/docs/.vitepress/theme/components/HomeSponsors.vue @@ -1,3 +1,16 @@ + + - - + + diff --git a/packages/docs/.vitepress/theme/components/RuleKitLink.vue b/packages/docs/.vitepress/theme/components/RuleKitLink.vue new file mode 100644 index 000000000..dde1ac989 --- /dev/null +++ b/packages/docs/.vitepress/theme/components/RuleKitLink.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/packages/docs/.vitepress/theme/components/VueMasteryBanner.vue b/packages/docs/.vitepress/theme/components/VueMasteryBanner.vue index 7db3f6124..4e8efebbf 100644 --- a/packages/docs/.vitepress/theme/components/VueMasteryBanner.vue +++ b/packages/docs/.vitepress/theme/components/VueMasteryBanner.vue @@ -1,3 +1,29 @@ + + - + diff --git a/packages/docs/.vitepress/theme/components/sponsors.json b/packages/docs/.vitepress/theme/components/sponsors.json index d4ef1030c..d455c43d4 100644 --- a/packages/docs/.vitepress/theme/components/sponsors.json +++ b/packages/docs/.vitepress/theme/components/sponsors.json @@ -1,6 +1,13 @@ { "platinum": [], - "gold": [], + "gold": [ + { + "alt": "CodeRabbit", + "href": "https://www.coderabbit.ai/?utm_source=vuerouter&utm_medium=sponsor", + "imgSrcDark": "https://posva-sponsors.pages.dev/logos/coderabbitai-dark.svg", + "imgSrcLight": "https://posva-sponsors.pages.dev/logos/coderabbitai-light.svg" + } + ], "silver": [ { "alt": "VueMastery", @@ -13,21 +20,21 @@ "href": "https://www.prefect.io/", "imgSrcDark": "https://posva-sponsors.pages.dev/logos/prefectlogo-dark.svg", "imgSrcLight": "https://posva-sponsors.pages.dev/logos/prefectlogo-light.svg" - } - ], - "bronze": [ - { - "alt": "Stanislas Ormières", - "href": "https://stormier.ninja", - "imgSrcDark": "https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4", - "imgSrcLight": "https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4" }, { - "alt": "Antony Konstantinidis", - "href": "https://www.vuejs.de", - "imgSrcDark": "https://avatars.githubusercontent.com/u/4183726?u=6b50a8ea16de29d2982f43c5640b1db9299ebcd1&v=4", - "imgSrcLight": "https://avatars.githubusercontent.com/u/4183726?u=6b50a8ea16de29d2982f43c5640b1db9299ebcd1&v=4" + "alt": "Controla", + "href": "https://www.controla.ai/?utm_source=posva", + "imgSrcDark": "https://posva-sponsors.pages.dev/logos/controla-dark.png", + "imgSrcLight": "https://posva-sponsors.pages.dev/logos/controla-light.png" }, + { + "alt": "Route Optimizer and Route Planner Software", + "href": "https://route4me.com", + "imgSrcDark": "https://posva-sponsors.pages.dev/logos/route4me.png", + "imgSrcLight": "https://posva-sponsors.pages.dev/logos/route4me.png" + } + ], + "bronze": [ { "alt": "Storyblok", "href": "https://storyblok.com", @@ -35,10 +42,16 @@ "imgSrcLight": "https://posva-sponsors.pages.dev/logos/storyblok.png" }, { - "alt": "Nuxt UI Pro Templates", - "href": "https://ui.nuxt.com/pro", - "imgSrcDark": "https://avatars.githubusercontent.com/u/81570812?v=4", - "imgSrcLight": "https://avatars.githubusercontent.com/u/81570812?v=4" + "alt": "NuxtLabs", + "href": "https://nuxtlabs.com", + "imgSrcDark": "https://posva-sponsors.pages.dev/logos/nuxt-dark.svg", + "imgSrcLight": "https://posva-sponsors.pages.dev/logos/nuxt-light.svg" + }, + { + "alt": "Stanislas Ormières", + "href": "https://stormier.ninja", + "imgSrcDark": "https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4", + "imgSrcLight": "https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4" } ] } diff --git a/packages/docs/.vitepress/theme/index.ts b/packages/docs/.vitepress/theme/index.ts index a024db948..c2797c6bf 100644 --- a/packages/docs/.vitepress/theme/index.ts +++ b/packages/docs/.vitepress/theme/index.ts @@ -5,17 +5,17 @@ import AsideSponsors from './components/AsideSponsors.vue' // import HomeSponsors from './components/HomeSponsors.vue' import TranslationStatus from 'vitepress-translation-helper/ui/TranslationStatus.vue' import './styles/vars.css' -import './styles/sponsors.css' import VueSchoolLink from './components/VueSchoolLink.vue' import VueMasteryLogoLink from './components/VueMasteryLogoLink.vue' import status from '../translation-status.json' +import RuleKitLink from './components/RuleKitLink.vue' const i18nLabels = { zh: '该翻译已同步到了 ${date} 的版本,其对应的 commit hash 是 ${hash}。', } const theme: Theme = { - ...DefaultTheme, + extends: DefaultTheme, Layout() { return h(DefaultTheme.Layout, null, { // 'home-features-after': () => h(HomeSponsors), @@ -26,6 +26,7 @@ const theme: Theme = { enhanceApp({ app }) { app.component('VueSchoolLink', VueSchoolLink) + app.component('RuleKitLink', RuleKitLink) app.component('VueMasteryLogoLink', VueMasteryLogoLink) }, diff --git a/packages/docs/.vitepress/theme/styles/home-links.css b/packages/docs/.vitepress/theme/styles/home-links.css index 87cdb063b..de0ef475f 100644 --- a/packages/docs/.vitepress/theme/styles/home-links.css +++ b/packages/docs/.vitepress/theme/styles/home-links.css @@ -52,6 +52,28 @@ a.cta.vueschool::after { border-left: 7px solid currentColor; } +a.cta.rulekit { + font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; +} + +a.cta.rulekit::before { + content: ''; + display: inline-block; + width: 16px; + height: 16px; + background-image: url('/rulekit-logo.svg'); + background-size: 16px; + background-repeat: no-repeat; + background-position: center; + margin-right: 0.5em; + vertical-align: middle; + filter: brightness(0); /* Make it black by default */ +} + +html.dark a.cta.rulekit::before { + filter: brightness(0) invert(1); /* Make it white in dark mode */ +} + @media (max-width: 420px) { a.cta.cta.vue-mastery { max-width: 320px; diff --git a/packages/docs/.vitepress/theme/styles/sponsors.css b/packages/docs/.vitepress/theme/styles/sponsors.css deleted file mode 100644 index 2929cdc80..000000000 --- a/packages/docs/.vitepress/theme/styles/sponsors.css +++ /dev/null @@ -1,26 +0,0 @@ -.become-sponsor { - font-size: 0.9em; - font-weight: 700; - width: auto; - text-align: center; - background-color: transparent; - padding: 0.75em 2em; - border-radius: 2em; - transition: all 0.15s ease; - box-sizing: border-box; - border: 2px solid var(--vp-c-brand-dark); -} - -.become-sponsor:hover { - background-color: var(--vp-c-brand); - text-decoration: none; - border-color: var(--vp-c-brand); - color: var(--vp-button-brand-text); -} - -.sponsors-top .become-sponsor { - font-size: 0.75em; - padding: 0.2em; - width: auto; - max-width: 150px; -} diff --git a/packages/docs/.vitepress/translation-status.json b/packages/docs/.vitepress/translation-status.json index ea46a9127..85dfe9122 100644 --- a/packages/docs/.vitepress/translation-status.json +++ b/packages/docs/.vitepress/translation-status.json @@ -1,6 +1,6 @@ { "zh": { - "hash": "35a9c1b", - "date": "2023-12-16" + "hash": "d842b6f", + "date": "2024-05-17" } } \ No newline at end of file diff --git a/packages/docs/api/enums/NavigationFailureType.md b/packages/docs/api/enums/NavigationFailureType.md deleted file mode 100644 index e7ccd2416..000000000 --- a/packages/docs/api/enums/NavigationFailureType.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / NavigationFailureType - -# Enumeration: NavigationFailureType - -Enumeration with all possible types for navigation failures. Can be passed to -[isNavigationFailure](../index.md#isNavigationFailure) to check for specific failures. - -## Enumeration Members - -### aborted - -• **aborted** = ``4`` - -An aborted navigation is a navigation that failed because a navigation -guard returned `false` or called `next(false)` - -___ - -### cancelled - -• **cancelled** = ``8`` - -A cancelled navigation is a navigation that failed because a more recent -navigation finished started (not necessarily finished). - -___ - -### duplicated - -• **duplicated** = ``16`` - -A duplicated navigation is a navigation that failed because it was -initiated while already being at the exact same location. diff --git a/packages/docs/api/index.md b/packages/docs/api/index.md deleted file mode 100644 index f52a63a3c..000000000 --- a/packages/docs/api/index.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -editLink: false ---- - -API Documentation - -# API Documentation - -## Enumerations - -- [NavigationFailureType](enums/NavigationFailureType.md) - -## Interfaces - -- [HistoryState](interfaces/HistoryState.md) -- [NavigationFailure](interfaces/NavigationFailure.md) -- [NavigationGuard](interfaces/NavigationGuard.md) -- [NavigationGuardNext](interfaces/NavigationGuardNext.md) -- [NavigationGuardWithThis](interfaces/NavigationGuardWithThis.md) -- [NavigationHookAfter](interfaces/NavigationHookAfter.md) -- [RouteLocation](interfaces/RouteLocation.md) -- [RouteLocationMatched](interfaces/RouteLocationMatched.md) -- [RouteLocationNormalized](interfaces/RouteLocationNormalized.md) -- [RouteLocationNormalizedLoaded](interfaces/RouteLocationNormalizedLoaded.md) -- [RouteLocationOptions](interfaces/RouteLocationOptions.md) -- [RouteMeta](interfaces/RouteMeta.md) -- [RouteRecordMultipleViews](interfaces/RouteRecordMultipleViews.md) -- [RouteRecordMultipleViewsWithChildren](interfaces/RouteRecordMultipleViewsWithChildren.md) -- [RouteRecordNormalized](interfaces/RouteRecordNormalized.md) -- [RouteRecordRedirect](interfaces/RouteRecordRedirect.md) -- [RouteRecordSingleView](interfaces/RouteRecordSingleView.md) -- [RouteRecordSingleViewWithChildren](interfaces/RouteRecordSingleViewWithChildren.md) -- [Router](interfaces/Router.md) -- [RouterHistory](interfaces/RouterHistory.md) -- [RouterLinkProps](interfaces/RouterLinkProps.md) -- [RouterOptions](interfaces/RouterOptions.md) -- [RouterScrollBehavior](interfaces/RouterScrollBehavior.md) -- [RouterViewProps](interfaces/RouterViewProps.md) -- [\_RouteRecordBase](interfaces/RouteRecordBase.md) - -## Type Aliases - -### LocationQuery - -Ƭ **LocationQuery**: `Record`\<`string`, `LocationQueryValue` \| `LocationQueryValue`[]\> - -Normalized query object that appears in [RouteLocationNormalized](interfaces/RouteLocationNormalized.md) - -___ - -### LocationQueryRaw - -Ƭ **LocationQueryRaw**: `Record`\<`string` \| `number`, `LocationQueryValueRaw` \| `LocationQueryValueRaw`[]\> - -Loose [LocationQuery](index.md#LocationQuery) object that can be passed to functions like -[Router.push](interfaces/Router.md#push) and [Router.replace](interfaces/Router.md#replace) or anywhere when creating a -[RouteLocationRaw](index.md#RouteLocationRaw) - -___ - -### PathParserOptions - -Ƭ **PathParserOptions**: `Pick`\<`_PathParserOptions`, ``"end"`` \| ``"sensitive"`` \| ``"strict"``\> - -___ - -### RouteComponent - -Ƭ **RouteComponent**: `Component` \| `DefineComponent` - -Allowed Component in [RouteLocationMatched](interfaces/RouteLocationMatched.md) - -___ - -### RouteLocationRaw - -Ƭ **RouteLocationRaw**: `string` \| `RouteLocationPathRaw` \| `RouteLocationNamedRaw` - -User-level route location - -___ - -### RouteParams - -Ƭ **RouteParams**: `Record`\<`string`, `RouteParamValue` \| `RouteParamValue`[]\> - -___ - -### RouteParamsRaw - -Ƭ **RouteParamsRaw**: `Record`\<`string`, `RouteParamValueRaw` \| `Exclude`\<`RouteParamValueRaw`, ``null`` \| `undefined`\>[]\> - -___ - -### RouteRecord - -Ƭ **RouteRecord**: [`RouteRecordNormalized`](interfaces/RouteRecordNormalized.md) - -Normalized version of a [route record](index.md#RouteRecord). - -___ - -### RouteRecordName - -Ƭ **RouteRecordName**: `string` \| `symbol` - -Possible values for a user-defined route record's name - -___ - -### RouteRecordRaw - -Ƭ **RouteRecordRaw**: [`RouteRecordSingleView`](interfaces/RouteRecordSingleView.md) \| [`RouteRecordSingleViewWithChildren`](interfaces/RouteRecordSingleViewWithChildren.md) \| [`RouteRecordMultipleViews`](interfaces/RouteRecordMultipleViews.md) \| [`RouteRecordMultipleViewsWithChildren`](interfaces/RouteRecordMultipleViewsWithChildren.md) \| [`RouteRecordRedirect`](interfaces/RouteRecordRedirect.md) - -___ - -### UseLinkOptions - -Ƭ **UseLinkOptions**: `VueUseOptions`\<`RouterLinkOptions`\> - -## Variables - -### RouterLink - -• `Const` **RouterLink**: `_RouterLinkI` - -Component to render a link that triggers a navigation on click. - -___ - -### RouterView - -• `Const` **RouterView**: () => \{ `$props`: `AllowedComponentProps` & `ComponentCustomProps` & `VNodeProps` & [`RouterViewProps`](interfaces/RouterViewProps.md) ; `$slots`: \{ `default?`: (`__namedParameters`: \{ `Component`: `VNode`\<`RendererNode`, `RendererElement`, \{ `[key: string]`: `any`; }\> ; `route`: [`RouteLocationNormalizedLoaded`](interfaces/RouteLocationNormalizedLoaded.md) }) => `VNode`\<`RendererNode`, `RendererElement`, \{ `[key: string]`: `any`; }\>[] } } - -#### Type declaration - -• **new RouterView**(): `Object` - -Component to display the current route the user is at. - -##### Returns - -`Object` - -| Name | Type | -| :------ | :------ | -| `$props` | `AllowedComponentProps` & `ComponentCustomProps` & `VNodeProps` & [`RouterViewProps`](interfaces/RouterViewProps.md) | -| `$slots` | \{ `default?`: (`__namedParameters`: \{ `Component`: `VNode`\<`RendererNode`, `RendererElement`, \{ `[key: string]`: `any`; }\> ; `route`: [`RouteLocationNormalizedLoaded`](interfaces/RouteLocationNormalizedLoaded.md) }) => `VNode`\<`RendererNode`, `RendererElement`, \{ `[key: string]`: `any`; }\>[] } | -| `$slots.default?` | (`__namedParameters`: \{ `Component`: `VNode`\<`RendererNode`, `RendererElement`, \{ `[key: string]`: `any`; }\> ; `route`: [`RouteLocationNormalizedLoaded`](interfaces/RouteLocationNormalizedLoaded.md) }) => `VNode`\<`RendererNode`, `RendererElement`, \{ `[key: string]`: `any`; }\>[] | - -___ - -### START\_LOCATION - -• `Const` **START\_LOCATION**: [`RouteLocationNormalizedLoaded`](interfaces/RouteLocationNormalizedLoaded.md) - -Initial route location where the router is. Can be used in navigation guards -to differentiate the initial navigation. - -**`Example`** - -```js -import { START_LOCATION } from 'vue-router' - -router.beforeEach((to, from) => { - if (from === START_LOCATION) { - // initial navigation - } -}) -``` - -## Functions - -### createMemoryHistory - -▸ **createMemoryHistory**(`base?`): [`RouterHistory`](interfaces/RouterHistory.md) - -Creates an in-memory based history. The main purpose of this history is to handle SSR. It starts in a special location that is nowhere. -It's up to the user to replace that location with the starter location by either calling `router.push` or `router.replace`. - -#### Parameters - -| Name | Type | Default value | Description | -| :------ | :------ | :------ | :------ | -| `base` | `string` | `''` | Base applied to all urls, defaults to '/' | - -#### Returns - -[`RouterHistory`](interfaces/RouterHistory.md) - -a history object that can be passed to the router constructor - -___ - -### createRouter - -▸ **createRouter**(`options`): [`Router`](interfaces/Router.md) - -Creates a Router instance that can be used by a Vue app. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `options` | [`RouterOptions`](interfaces/RouterOptions.md) | [RouterOptions](interfaces/RouterOptions.md) | - -#### Returns - -[`Router`](interfaces/Router.md) - -___ - -### createWebHashHistory - -▸ **createWebHashHistory**(`base?`): [`RouterHistory`](interfaces/RouterHistory.md) - -Creates a hash history. Useful for web applications with no host (e.g. `file://`) or when configuring a server to -handle any URL is not possible. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `base?` | `string` | optional base to provide. Defaults to `location.pathname + location.search` If there is a `` tag in the `head`, its value will be ignored in favor of this parameter **but note it affects all the history.pushState() calls**, meaning that if you use a `` tag, it's `href` value **has to match this parameter** (ignoring anything after the `#`). | - -#### Returns - -[`RouterHistory`](interfaces/RouterHistory.md) - -**`Example`** - -```js -// at https://example.com/folder -createWebHashHistory() // gives a url of `https://example.com/folder#` -createWebHashHistory('/folder/') // gives a url of `https://example.com/folder/#` -// if the `#` is provided in the base, it won't be added by `createWebHashHistory` -createWebHashHistory('/folder/#/app/') // gives a url of `https://example.com/folder/#/app/` -// you should avoid doing this because it changes the original url and breaks copying urls -createWebHashHistory('/other-folder/') // gives a url of `https://example.com/other-folder/#` - -// at file:///usr/etc/folder/index.html -// for locations with no `host`, the base is ignored -createWebHashHistory('/iAmIgnored') // gives a url of `file:///usr/etc/folder/index.html#` -``` - -___ - -### createWebHistory - -▸ **createWebHistory**(`base?`): [`RouterHistory`](interfaces/RouterHistory.md) - -Creates an HTML5 history. Most common history for single page applications. - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `base?` | `string` | - -#### Returns - -[`RouterHistory`](interfaces/RouterHistory.md) - -___ - -### isNavigationFailure - -▸ **isNavigationFailure**(`error`, `type?`): error is NavigationRedirectError - -Check if an object is a [NavigationFailure](interfaces/NavigationFailure.md). - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `error` | `any` | possible [NavigationFailure](interfaces/NavigationFailure.md) | -| `type?` | `NAVIGATION_GUARD_REDIRECT` | optional types to check for | - -#### Returns - -error is NavigationRedirectError - -**`Example`** - -```js -import { isNavigationFailure, NavigationFailureType } from 'vue-router' - -router.afterEach((to, from, failure) => { - // Any kind of navigation failure - if (isNavigationFailure(failure)) { - // ... - } - // Only duplicated navigations - if (isNavigationFailure(failure, NavigationFailureType.duplicated)) { - // ... - } - // Aborted or canceled navigations - if (isNavigationFailure(failure, NavigationFailureType.aborted | NavigationFailureType.canceled)) { - // ... - } -}) -``` - -▸ **isNavigationFailure**(`error`, `type?`): error is NavigationFailure - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `error` | `any` | -| `type?` | `ErrorTypes` \| [`NavigationFailureType`](enums/NavigationFailureType.md) | - -#### Returns - -error is NavigationFailure - -___ - -### loadRouteLocation - -▸ **loadRouteLocation**(`route`): `Promise`\<[`RouteLocationNormalizedLoaded`](interfaces/RouteLocationNormalizedLoaded.md)\> - -Ensures a route is loaded, so it can be passed as o prop to ``. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `route` | [`RouteLocationNormalized`](interfaces/RouteLocationNormalized.md) | resolved route to load | - -#### Returns - -`Promise`\<[`RouteLocationNormalizedLoaded`](interfaces/RouteLocationNormalizedLoaded.md)\> - -___ - -### onBeforeRouteLeave - -▸ **onBeforeRouteLeave**(`leaveGuard`): `void` - -Add a navigation guard that triggers whenever the component for the current -location is about to be left. Similar to beforeRouteLeave but can be -used in any component. The guard is removed when the component is unmounted. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `leaveGuard` | [`NavigationGuard`](interfaces/NavigationGuard.md) | [NavigationGuard](interfaces/NavigationGuard.md) | - -#### Returns - -`void` - -___ - -### onBeforeRouteUpdate - -▸ **onBeforeRouteUpdate**(`updateGuard`): `void` - -Add a navigation guard that triggers whenever the current location is about -to be updated. Similar to beforeRouteUpdate but can be used in any -component. The guard is removed when the component is unmounted. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `updateGuard` | [`NavigationGuard`](interfaces/NavigationGuard.md) | [NavigationGuard](interfaces/NavigationGuard.md) | - -#### Returns - -`void` - -___ - -### useLink - -▸ **useLink**(`props`): `Object` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `props` | `VueUseOptions`\<`RouterLinkOptions`\> | - -#### Returns - -`Object` - -| Name | Type | -| :------ | :------ | -| `href` | `ComputedRef`\<`string`\> | -| `isActive` | `ComputedRef`\<`boolean`\> | -| `isExactActive` | `ComputedRef`\<`boolean`\> | -| `navigate` | (`e`: `MouseEvent`) => `Promise`\<`void` \| [`NavigationFailure`](interfaces/NavigationFailure.md)\> | -| `route` | `ComputedRef`\<[`RouteLocation`](interfaces/RouteLocation.md) & \{ `href`: `string` }\> | - -___ - -### useRoute - -▸ **useRoute**(): [`RouteLocationNormalizedLoaded`](interfaces/RouteLocationNormalizedLoaded.md) - -Returns the current route location. Equivalent to using `$route` inside -templates. - -#### Returns - -[`RouteLocationNormalizedLoaded`](interfaces/RouteLocationNormalizedLoaded.md) - -___ - -### useRouter - -▸ **useRouter**(): [`Router`](interfaces/Router.md) - -Returns the router instance. Equivalent to using `$router` inside -templates. - -#### Returns - -[`Router`](interfaces/Router.md) diff --git a/packages/docs/api/interfaces/HistoryState.md b/packages/docs/api/interfaces/HistoryState.md deleted file mode 100644 index ab0ffc718..000000000 --- a/packages/docs/api/interfaces/HistoryState.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / HistoryState - -# Interface: HistoryState - -Allowed HTML history.state - -## Indexable - -▪ [x: `number`]: `HistoryStateValue` diff --git a/packages/docs/api/interfaces/NavigationFailure.md b/packages/docs/api/interfaces/NavigationFailure.md deleted file mode 100644 index c9e80423a..000000000 --- a/packages/docs/api/interfaces/NavigationFailure.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / NavigationFailure - -# Interface: NavigationFailure - -Extended Error that contains extra information regarding a failed navigation. - -## Hierarchy - -- `Error` - - ↳ **`NavigationFailure`** - -## Properties - -### cause - -• `Optional` **cause**: `unknown` - -#### Inherited from - -Error.cause - -___ - -### from - -• **from**: [`RouteLocationNormalized`](RouteLocationNormalized.md) - -Route location we were navigating from - -___ - -### message - -• **message**: `string` - -#### Inherited from - -Error.message - -___ - -### name - -• **name**: `string` - -#### Inherited from - -Error.name - -___ - -### stack - -• `Optional` **stack**: `string` - -#### Inherited from - -Error.stack - -___ - -### to - -• **to**: [`RouteLocationNormalized`](RouteLocationNormalized.md) - -Route location we were navigating to - -___ - -### type - -• **type**: `NAVIGATION_ABORTED` \| `NAVIGATION_CANCELLED` \| `NAVIGATION_DUPLICATED` - -Type of the navigation. One of [NavigationFailureType](../enums/NavigationFailureType.md) diff --git a/packages/docs/api/interfaces/NavigationGuard.md b/packages/docs/api/interfaces/NavigationGuard.md deleted file mode 100644 index 7a9a4865c..000000000 --- a/packages/docs/api/interfaces/NavigationGuard.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / NavigationGuard - -# Interface: NavigationGuard - -Navigation guard. See [Navigation -Guards](/guide/advanced/navigation-guards.md). - -## Callable - -### NavigationGuard - -▸ **NavigationGuard**(`to`, `from`, `next`): `NavigationGuardReturn` \| `Promise`\<`NavigationGuardReturn`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `to` | [`RouteLocationNormalized`](RouteLocationNormalized.md) | -| `from` | [`RouteLocationNormalized`](RouteLocationNormalized.md) | -| `next` | [`NavigationGuardNext`](NavigationGuardNext.md) | - -#### Returns - -`NavigationGuardReturn` \| `Promise`\<`NavigationGuardReturn`\> diff --git a/packages/docs/api/interfaces/NavigationGuardNext.md b/packages/docs/api/interfaces/NavigationGuardNext.md deleted file mode 100644 index b736b12d6..000000000 --- a/packages/docs/api/interfaces/NavigationGuardNext.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / NavigationGuardNext - -# Interface: NavigationGuardNext - -## Callable - -### NavigationGuardNext - -▸ **NavigationGuardNext**(): `void` - -#### Returns - -`void` - -### NavigationGuardNext - -▸ **NavigationGuardNext**(`error`): `void` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `error` | `Error` | - -#### Returns - -`void` - -### NavigationGuardNext - -▸ **NavigationGuardNext**(`location`): `void` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `location` | [`RouteLocationRaw`](../index.md#RouteLocationRaw) | - -#### Returns - -`void` - -### NavigationGuardNext - -▸ **NavigationGuardNext**(`valid`): `void` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `valid` | `undefined` \| `boolean` | - -#### Returns - -`void` - -### NavigationGuardNext - -▸ **NavigationGuardNext**(`cb`): `void` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `cb` | `NavigationGuardNextCallback` | - -#### Returns - -`void` diff --git a/packages/docs/api/interfaces/NavigationGuardWithThis.md b/packages/docs/api/interfaces/NavigationGuardWithThis.md deleted file mode 100644 index 4b4fae7b0..000000000 --- a/packages/docs/api/interfaces/NavigationGuardWithThis.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / NavigationGuardWithThis - -# Interface: NavigationGuardWithThis\ - -Navigation guard. See [Navigation -Guards](/guide/advanced/navigation-guards.md). - -## Type parameters - -| Name | -| :------ | -| `T` | - -## Callable - -### NavigationGuardWithThis - -▸ **NavigationGuardWithThis**(`this`, `to`, `from`, `next`): `NavigationGuardReturn` \| `Promise`\<`NavigationGuardReturn`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `this` | `T` | -| `to` | [`RouteLocationNormalized`](RouteLocationNormalized.md) | -| `from` | [`RouteLocationNormalized`](RouteLocationNormalized.md) | -| `next` | [`NavigationGuardNext`](NavigationGuardNext.md) | - -#### Returns - -`NavigationGuardReturn` \| `Promise`\<`NavigationGuardReturn`\> diff --git a/packages/docs/api/interfaces/NavigationHookAfter.md b/packages/docs/api/interfaces/NavigationHookAfter.md deleted file mode 100644 index 309d11311..000000000 --- a/packages/docs/api/interfaces/NavigationHookAfter.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / NavigationHookAfter - -# Interface: NavigationHookAfter - -## Callable - -### NavigationHookAfter - -▸ **NavigationHookAfter**(`to`, `from`, `failure?`): `any` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `to` | [`RouteLocationNormalized`](RouteLocationNormalized.md) | -| `from` | [`RouteLocationNormalized`](RouteLocationNormalized.md) | -| `failure?` | `void` \| [`NavigationFailure`](NavigationFailure.md) | - -#### Returns - -`any` diff --git a/packages/docs/api/interfaces/RouteLocation.md b/packages/docs/api/interfaces/RouteLocation.md deleted file mode 100644 index 0aa1986ec..000000000 --- a/packages/docs/api/interfaces/RouteLocation.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteLocation - -# Interface: RouteLocation - -[RouteLocationRaw](../index.md#RouteLocationRaw) resolved using the matcher - -## Hierarchy - -- `_RouteLocationBase` - - ↳ **`RouteLocation`** - -## Properties - -### fullPath - -• **fullPath**: `string` - -The whole location including the `search` and `hash`. This string is -percentage encoded. - -#### Inherited from - -\_RouteLocationBase.fullPath - -___ - -### hash - -• **hash**: `string` - -Hash of the current location. If present, starts with a `#`. - -#### Inherited from - -\_RouteLocationBase.hash - -___ - -### matched - -• **matched**: [`RouteRecordNormalized`](RouteRecordNormalized.md)[] - -Array of [RouteRecord](../index.md#RouteRecord) containing components as they were -passed when adding records. It can also contain redirect records. This -can't be used directly - -___ - -### meta - -• **meta**: [`RouteMeta`](RouteMeta.md) - -Merged `meta` properties from all the matched route records. - -#### Inherited from - -\_RouteLocationBase.meta - -___ - -### name - -• **name**: `undefined` \| ``null`` \| [`RouteRecordName`](../index.md#RouteRecordName) - -Name of the matched record - -#### Inherited from - -\_RouteLocationBase.name - -___ - -### params - -• **params**: [`RouteParams`](../index.md#RouteParams) - -Object of decoded params extracted from the `path`. - -#### Inherited from - -\_RouteLocationBase.params - -___ - -### path - -• **path**: `string` - -Percentage encoded pathname section of the URL. - -#### Inherited from - -\_RouteLocationBase.path - -___ - -### query - -• **query**: [`LocationQuery`](../index.md#LocationQuery) - -Object representation of the `search` property of the current location. - -#### Inherited from - -\_RouteLocationBase.query - -___ - -### redirectedFrom - -• **redirectedFrom**: `undefined` \| [`RouteLocation`](RouteLocation.md) - -Contains the location we were initially trying to access before ending up -on the current location. - -#### Inherited from - -\_RouteLocationBase.redirectedFrom diff --git a/packages/docs/api/interfaces/RouteLocationMatched.md b/packages/docs/api/interfaces/RouteLocationMatched.md deleted file mode 100644 index cf649dd73..000000000 --- a/packages/docs/api/interfaces/RouteLocationMatched.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteLocationMatched - -# Interface: RouteLocationMatched - -Normalized version of a [route record](../index.md#RouteRecord). - -## Hierarchy - -- [`RouteRecordNormalized`](RouteRecordNormalized.md) - - ↳ **`RouteLocationMatched`** - -## Properties - -### aliasOf - -• **aliasOf**: `undefined` \| [`RouteRecordNormalized`](RouteRecordNormalized.md) - -Defines if this record is the alias of another one. This property is -`undefined` if the record is the original one. - -#### Inherited from - -[RouteRecordNormalized](RouteRecordNormalized.md).[aliasOf](RouteRecordNormalized.md#aliasOf) - -___ - -### beforeEnter - -• **beforeEnter**: `undefined` \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\>[] - -Registered beforeEnter guards - -#### Inherited from - -[RouteRecordNormalized](RouteRecordNormalized.md).[beforeEnter](RouteRecordNormalized.md#beforeEnter) - -___ - -### children - -• **children**: [`RouteRecordRaw`](../index.md#RouteRecordRaw)[] - -Nested route records. - -#### Inherited from - -[RouteRecordNormalized](RouteRecordNormalized.md).[children](RouteRecordNormalized.md#children) - -___ - -### components - -• **components**: `undefined` \| ``null`` \| `Record`\<`string`, [`RouteComponent`](../index.md#RouteComponent)\> - -Components to display when the URL matches this route. Allow using named views. - -#### Overrides - -[RouteRecordNormalized](RouteRecordNormalized.md).[components](RouteRecordNormalized.md#components) - -___ - -### instances - -• **instances**: `Record`\<`string`, `undefined` \| ``null`` \| `ComponentPublicInstance`\> - -Mounted route component instances -Having the instances on the record mean beforeRouteUpdate and -beforeRouteLeave guards can only be invoked with the latest mounted app -instance if there are multiple application instances rendering the same -view, basically duplicating the content on the page, which shouldn't happen -in practice. It will work if multiple apps are rendering different named -views. - -#### Inherited from - -[RouteRecordNormalized](RouteRecordNormalized.md).[instances](RouteRecordNormalized.md#instances) - -___ - -### meta - -• **meta**: [`RouteMeta`](RouteMeta.md) - -Arbitrary data attached to the record. - -#### Inherited from - -[RouteRecordNormalized](RouteRecordNormalized.md).[meta](RouteRecordNormalized.md#meta) - -___ - -### name - -• **name**: `undefined` \| [`RouteRecordName`](../index.md#RouteRecordName) - -Name for the route record. Must be unique. - -#### Inherited from - -[RouteRecordNormalized](RouteRecordNormalized.md).[name](RouteRecordNormalized.md#name) - -___ - -### path - -• **path**: `string` - -Path of the record. Should start with `/` unless the record is the child of -another record. - -#### Inherited from - -[RouteRecordNormalized](RouteRecordNormalized.md).[path](RouteRecordNormalized.md#path) - -___ - -### props - -• **props**: `Record`\<`string`, `_RouteRecordProps`\> - -Allow passing down params as props to the component rendered by -`router-view`. Should be an object with the same keys as `components` or a -boolean to be applied to every component. - -#### Inherited from - -[RouteRecordNormalized](RouteRecordNormalized.md).[props](RouteRecordNormalized.md#props) - -___ - -### redirect - -• **redirect**: `undefined` \| `RouteRecordRedirectOption` - -Where to redirect if the route is directly matched. The redirection happens -before any navigation guard and triggers a new navigation with the new -target location. - -#### Inherited from - -[RouteRecordNormalized](RouteRecordNormalized.md).[redirect](RouteRecordNormalized.md#redirect) diff --git a/packages/docs/api/interfaces/RouteLocationNormalized.md b/packages/docs/api/interfaces/RouteLocationNormalized.md deleted file mode 100644 index 43949a3bd..000000000 --- a/packages/docs/api/interfaces/RouteLocationNormalized.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteLocationNormalized - -# Interface: RouteLocationNormalized - -Similar to [RouteLocation](RouteLocation.md) but its -[RouteLocationNormalized.matched](RouteLocationNormalized.md#matched) cannot contain redirect records - -## Hierarchy - -- `_RouteLocationBase` - - ↳ **`RouteLocationNormalized`** - -## Properties - -### fullPath - -• **fullPath**: `string` - -The whole location including the `search` and `hash`. This string is -percentage encoded. - -#### Inherited from - -\_RouteLocationBase.fullPath - -___ - -### hash - -• **hash**: `string` - -Hash of the current location. If present, starts with a `#`. - -#### Inherited from - -\_RouteLocationBase.hash - -___ - -### matched - -• **matched**: [`RouteRecordNormalized`](RouteRecordNormalized.md)[] - -Array of [RouteRecordNormalized](RouteRecordNormalized.md) - -___ - -### meta - -• **meta**: [`RouteMeta`](RouteMeta.md) - -Merged `meta` properties from all the matched route records. - -#### Inherited from - -\_RouteLocationBase.meta - -___ - -### name - -• **name**: `undefined` \| ``null`` \| [`RouteRecordName`](../index.md#RouteRecordName) - -Name of the matched record - -#### Inherited from - -\_RouteLocationBase.name - -___ - -### params - -• **params**: [`RouteParams`](../index.md#RouteParams) - -Object of decoded params extracted from the `path`. - -#### Inherited from - -\_RouteLocationBase.params - -___ - -### path - -• **path**: `string` - -Percentage encoded pathname section of the URL. - -#### Inherited from - -\_RouteLocationBase.path - -___ - -### query - -• **query**: [`LocationQuery`](../index.md#LocationQuery) - -Object representation of the `search` property of the current location. - -#### Inherited from - -\_RouteLocationBase.query - -___ - -### redirectedFrom - -• **redirectedFrom**: `undefined` \| [`RouteLocation`](RouteLocation.md) - -Contains the location we were initially trying to access before ending up -on the current location. - -#### Inherited from - -\_RouteLocationBase.redirectedFrom diff --git a/packages/docs/api/interfaces/RouteLocationNormalizedLoaded.md b/packages/docs/api/interfaces/RouteLocationNormalizedLoaded.md deleted file mode 100644 index 79b028385..000000000 --- a/packages/docs/api/interfaces/RouteLocationNormalizedLoaded.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteLocationNormalizedLoaded - -# Interface: RouteLocationNormalizedLoaded - -[RouteLocationRaw](../index.md#RouteLocationRaw) with - -## Hierarchy - -- `_RouteLocationBase` - - ↳ **`RouteLocationNormalizedLoaded`** - -## Properties - -### fullPath - -• **fullPath**: `string` - -The whole location including the `search` and `hash`. This string is -percentage encoded. - -#### Inherited from - -\_RouteLocationBase.fullPath - -___ - -### hash - -• **hash**: `string` - -Hash of the current location. If present, starts with a `#`. - -#### Inherited from - -\_RouteLocationBase.hash - -___ - -### matched - -• **matched**: [`RouteLocationMatched`](RouteLocationMatched.md)[] - -Array of [RouteLocationMatched](RouteLocationMatched.md) containing only plain components (any -lazy-loaded components have been loaded and were replaced inside the -`components` object) so it can be directly used to display routes. It -cannot contain redirect records either - -___ - -### meta - -• **meta**: [`RouteMeta`](RouteMeta.md) - -Merged `meta` properties from all the matched route records. - -#### Inherited from - -\_RouteLocationBase.meta - -___ - -### name - -• **name**: `undefined` \| ``null`` \| [`RouteRecordName`](../index.md#RouteRecordName) - -Name of the matched record - -#### Inherited from - -\_RouteLocationBase.name - -___ - -### params - -• **params**: [`RouteParams`](../index.md#RouteParams) - -Object of decoded params extracted from the `path`. - -#### Inherited from - -\_RouteLocationBase.params - -___ - -### path - -• **path**: `string` - -Percentage encoded pathname section of the URL. - -#### Inherited from - -\_RouteLocationBase.path - -___ - -### query - -• **query**: [`LocationQuery`](../index.md#LocationQuery) - -Object representation of the `search` property of the current location. - -#### Inherited from - -\_RouteLocationBase.query - -___ - -### redirectedFrom - -• **redirectedFrom**: `undefined` \| [`RouteLocation`](RouteLocation.md) - -Contains the location we were initially trying to access before ending up -on the current location. - -#### Inherited from - -\_RouteLocationBase.redirectedFrom diff --git a/packages/docs/api/interfaces/RouteLocationOptions.md b/packages/docs/api/interfaces/RouteLocationOptions.md deleted file mode 100644 index 59ece3525..000000000 --- a/packages/docs/api/interfaces/RouteLocationOptions.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteLocationOptions - -# Interface: RouteLocationOptions - -Common options for all navigation methods. - -## Properties - -### force - -• `Optional` **force**: `boolean` - -Triggers the navigation even if the location is the same as the current one. -Note this will also add a new entry to the history unless `replace: true` -is passed. - -___ - -### replace - -• `Optional` **replace**: `boolean` - -Replace the entry in the history instead of pushing a new entry - -___ - -### state - -• `Optional` **state**: [`HistoryState`](HistoryState.md) - -State to save using the History API. This cannot contain any reactive -values and some primitives like Symbols are forbidden. More info at -https://developer.mozilla.org/en-US/docs/Web/API/History/state diff --git a/packages/docs/api/interfaces/RouteMeta.md b/packages/docs/api/interfaces/RouteMeta.md deleted file mode 100644 index 5e6007b10..000000000 --- a/packages/docs/api/interfaces/RouteMeta.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteMeta - -# Interface: RouteMeta - -Interface to type `meta` fields in route records. - -**`Example`** - -```ts -// typings.d.ts or router.ts -import 'vue-router'; - -declare module 'vue-router' { - interface RouteMeta { - requiresAuth?: boolean - } - } -``` - -## Hierarchy - -- `Record`\<`string` \| `number` \| `symbol`, `unknown`\> - - ↳ **`RouteMeta`** diff --git a/packages/docs/api/interfaces/RouteRecordBase.md b/packages/docs/api/interfaces/RouteRecordBase.md deleted file mode 100644 index f64004047..000000000 --- a/packages/docs/api/interfaces/RouteRecordBase.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / \_RouteRecordBase - -# Interface: \_RouteRecordBase - -Internal type for common properties among all kind of [RouteRecordRaw](../index.md#RouteRecordRaw). - -## Hierarchy - -- [`PathParserOptions`](../index.md#PathParserOptions) - - ↳ **`_RouteRecordBase`** - - ↳↳ [`RouteRecordSingleView`](RouteRecordSingleView.md) - - ↳↳ [`RouteRecordSingleViewWithChildren`](RouteRecordSingleViewWithChildren.md) - - ↳↳ [`RouteRecordMultipleViews`](RouteRecordMultipleViews.md) - - ↳↳ [`RouteRecordMultipleViewsWithChildren`](RouteRecordMultipleViewsWithChildren.md) - - ↳↳ [`RouteRecordRedirect`](RouteRecordRedirect.md) - -## Properties - -### alias - -• `Optional` **alias**: `string` \| `string`[] - -Aliases for the record. Allows defining extra paths that will behave like a -copy of the record. Allows having paths shorthands like `/users/:id` and -`/u/:id`. All `alias` and `path` values must share the same params. - -___ - -### beforeEnter - -• `Optional` **beforeEnter**: [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\>[] - -Before Enter guard specific to this record. Note `beforeEnter` has no -effect if the record has a `redirect` property. - -___ - -### children - -• `Optional` **children**: [`RouteRecordRaw`](../index.md#RouteRecordRaw)[] - -Array of nested routes. - -___ - -### end - -• `Optional` **end**: `boolean` - -Should the RegExp match until the end by appending a `$` to it. - -**`Default Value`** - -`true` - -#### Inherited from - -PathParserOptions.end - -___ - -### meta - -• `Optional` **meta**: [`RouteMeta`](RouteMeta.md) - -Arbitrary data attached to the record. - -___ - -### name - -• `Optional` **name**: [`RouteRecordName`](../index.md#RouteRecordName) - -Name for the route record. Must be unique. - -___ - -### path - -• **path**: `string` - -Path of the record. Should start with `/` unless the record is the child of -another record. - -**`Example`** - -```ts -`/users/:id` matches `/users/1` as well as `/users/posva`. -``` - -___ - -### props - -• `Optional` **props**: `_RouteRecordProps` \| `Record`\<`string`, `_RouteRecordProps`\> - -Allow passing down params as props to the component rendered by `router-view`. - -___ - -### redirect - -• `Optional` **redirect**: `RouteRecordRedirectOption` - -Where to redirect if the route is directly matched. The redirection happens -before any navigation guard and triggers a new navigation with the new -target location. - -___ - -### sensitive - -• `Optional` **sensitive**: `boolean` - -Makes the RegExp case-sensitive. - -**`Default Value`** - -`false` - -#### Inherited from - -PathParserOptions.sensitive - -___ - -### strict - -• `Optional` **strict**: `boolean` - -Whether to disallow a trailing slash or not. - -**`Default Value`** - -`false` - -#### Inherited from - -PathParserOptions.strict diff --git a/packages/docs/api/interfaces/RouteRecordMultipleViews.md b/packages/docs/api/interfaces/RouteRecordMultipleViews.md deleted file mode 100644 index 2f5007aa5..000000000 --- a/packages/docs/api/interfaces/RouteRecordMultipleViews.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteRecordMultipleViews - -# Interface: RouteRecordMultipleViews - -Route Record defining multiple named components with the `components` option. - -## Hierarchy - -- [`_RouteRecordBase`](RouteRecordBase.md) - - ↳ **`RouteRecordMultipleViews`** - -## Properties - -### alias - -• `Optional` **alias**: `string` \| `string`[] - -Aliases for the record. Allows defining extra paths that will behave like a -copy of the record. Allows having paths shorthands like `/users/:id` and -`/u/:id`. All `alias` and `path` values must share the same params. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[alias](RouteRecordBase.md#alias) - -___ - -### beforeEnter - -• `Optional` **beforeEnter**: [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\>[] - -Before Enter guard specific to this record. Note `beforeEnter` has no -effect if the record has a `redirect` property. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[beforeEnter](RouteRecordBase.md#beforeEnter) - -___ - -### children - -• `Optional` **children**: `undefined` - -Array of nested routes. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[children](RouteRecordBase.md#children) - -___ - -### component - -• `Optional` **component**: `undefined` - -___ - -### components - -• **components**: `Record`\<`string`, `RawRouteComponent`\> - -Components to display when the URL matches this route. Allow using named views. - -___ - -### end - -• `Optional` **end**: `boolean` - -Should the RegExp match until the end by appending a `$` to it. - -**`Default Value`** - -`true` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[end](RouteRecordBase.md#end) - -___ - -### meta - -• `Optional` **meta**: [`RouteMeta`](RouteMeta.md) - -Arbitrary data attached to the record. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[meta](RouteRecordBase.md#meta) - -___ - -### name - -• `Optional` **name**: [`RouteRecordName`](../index.md#RouteRecordName) - -Name for the route record. Must be unique. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[name](RouteRecordBase.md#name) - -___ - -### path - -• **path**: `string` - -Path of the record. Should start with `/` unless the record is the child of -another record. - -**`Example`** - -```ts -`/users/:id` matches `/users/1` as well as `/users/posva`. -``` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[path](RouteRecordBase.md#path) - -___ - -### props - -• `Optional` **props**: `boolean` \| `Record`\<`string`, `_RouteRecordProps`\> - -Allow passing down params as props to the component rendered by -`router-view`. Should be an object with the same keys as `components` or a -boolean to be applied to every component. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[props](RouteRecordBase.md#props) - -___ - -### redirect - -• `Optional` **redirect**: `undefined` - -Where to redirect if the route is directly matched. The redirection happens -before any navigation guard and triggers a new navigation with the new -target location. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[redirect](RouteRecordBase.md#redirect) - -___ - -### sensitive - -• `Optional` **sensitive**: `boolean` - -Makes the RegExp case-sensitive. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[sensitive](RouteRecordBase.md#sensitive) - -___ - -### strict - -• `Optional` **strict**: `boolean` - -Whether to disallow a trailing slash or not. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[strict](RouteRecordBase.md#strict) diff --git a/packages/docs/api/interfaces/RouteRecordMultipleViewsWithChildren.md b/packages/docs/api/interfaces/RouteRecordMultipleViewsWithChildren.md deleted file mode 100644 index ddec0ecaf..000000000 --- a/packages/docs/api/interfaces/RouteRecordMultipleViewsWithChildren.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteRecordMultipleViewsWithChildren - -# Interface: RouteRecordMultipleViewsWithChildren - -Route Record defining multiple named components with the `components` option and children. - -## Hierarchy - -- [`_RouteRecordBase`](RouteRecordBase.md) - - ↳ **`RouteRecordMultipleViewsWithChildren`** - -## Properties - -### alias - -• `Optional` **alias**: `string` \| `string`[] - -Aliases for the record. Allows defining extra paths that will behave like a -copy of the record. Allows having paths shorthands like `/users/:id` and -`/u/:id`. All `alias` and `path` values must share the same params. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[alias](RouteRecordBase.md#alias) - -___ - -### beforeEnter - -• `Optional` **beforeEnter**: [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\>[] - -Before Enter guard specific to this record. Note `beforeEnter` has no -effect if the record has a `redirect` property. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[beforeEnter](RouteRecordBase.md#beforeEnter) - -___ - -### children - -• **children**: [`RouteRecordRaw`](../index.md#RouteRecordRaw)[] - -Array of nested routes. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[children](RouteRecordBase.md#children) - -___ - -### component - -• `Optional` **component**: `undefined` - -___ - -### components - -• `Optional` **components**: ``null`` \| `Record`\<`string`, `RawRouteComponent`\> - -Components to display when the URL matches this route. Allow using named views. - -___ - -### end - -• `Optional` **end**: `boolean` - -Should the RegExp match until the end by appending a `$` to it. - -**`Default Value`** - -`true` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[end](RouteRecordBase.md#end) - -___ - -### meta - -• `Optional` **meta**: [`RouteMeta`](RouteMeta.md) - -Arbitrary data attached to the record. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[meta](RouteRecordBase.md#meta) - -___ - -### name - -• `Optional` **name**: [`RouteRecordName`](../index.md#RouteRecordName) - -Name for the route record. Must be unique. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[name](RouteRecordBase.md#name) - -___ - -### path - -• **path**: `string` - -Path of the record. Should start with `/` unless the record is the child of -another record. - -**`Example`** - -```ts -`/users/:id` matches `/users/1` as well as `/users/posva`. -``` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[path](RouteRecordBase.md#path) - -___ - -### props - -• `Optional` **props**: `boolean` \| `Record`\<`string`, `_RouteRecordProps`\> - -Allow passing down params as props to the component rendered by -`router-view`. Should be an object with the same keys as `components` or a -boolean to be applied to every component. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[props](RouteRecordBase.md#props) - -___ - -### redirect - -• `Optional` **redirect**: `RouteRecordRedirectOption` - -Where to redirect if the route is directly matched. The redirection happens -before any navigation guard and triggers a new navigation with the new -target location. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[redirect](RouteRecordBase.md#redirect) - -___ - -### sensitive - -• `Optional` **sensitive**: `boolean` - -Makes the RegExp case-sensitive. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[sensitive](RouteRecordBase.md#sensitive) - -___ - -### strict - -• `Optional` **strict**: `boolean` - -Whether to disallow a trailing slash or not. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[strict](RouteRecordBase.md#strict) diff --git a/packages/docs/api/interfaces/RouteRecordNormalized.md b/packages/docs/api/interfaces/RouteRecordNormalized.md deleted file mode 100644 index 0107112b6..000000000 --- a/packages/docs/api/interfaces/RouteRecordNormalized.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteRecordNormalized - -# Interface: RouteRecordNormalized - -Normalized version of a [route record](../index.md#RouteRecord). - -## Hierarchy - -- **`RouteRecordNormalized`** - - ↳ [`RouteLocationMatched`](RouteLocationMatched.md) - -## Properties - -### aliasOf - -• **aliasOf**: `undefined` \| [`RouteRecordNormalized`](RouteRecordNormalized.md) - -Defines if this record is the alias of another one. This property is -`undefined` if the record is the original one. - -___ - -### beforeEnter - -• **beforeEnter**: `undefined` \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\>[] - -Registered beforeEnter guards - -___ - -### children - -• **children**: [`RouteRecordRaw`](../index.md#RouteRecordRaw)[] - -Nested route records. - -___ - -### components - -• **components**: `undefined` \| ``null`` \| `Record`\<`string`, `RawRouteComponent`\> - -Components to display when the URL matches this route. Allow using named views. - -___ - -### instances - -• **instances**: `Record`\<`string`, `undefined` \| ``null`` \| `ComponentPublicInstance`\> - -Mounted route component instances -Having the instances on the record mean beforeRouteUpdate and -beforeRouteLeave guards can only be invoked with the latest mounted app -instance if there are multiple application instances rendering the same -view, basically duplicating the content on the page, which shouldn't happen -in practice. It will work if multiple apps are rendering different named -views. - -___ - -### meta - -• **meta**: [`RouteMeta`](RouteMeta.md) - -Arbitrary data attached to the record. - -___ - -### name - -• **name**: `undefined` \| [`RouteRecordName`](../index.md#RouteRecordName) - -Name for the route record. Must be unique. - -___ - -### path - -• **path**: `string` - -Path of the record. Should start with `/` unless the record is the child of -another record. - -___ - -### props - -• **props**: `Record`\<`string`, `_RouteRecordProps`\> - -Allow passing down params as props to the component rendered by -`router-view`. Should be an object with the same keys as `components` or a -boolean to be applied to every component. - -___ - -### redirect - -• **redirect**: `undefined` \| `RouteRecordRedirectOption` - -Where to redirect if the route is directly matched. The redirection happens -before any navigation guard and triggers a new navigation with the new -target location. diff --git a/packages/docs/api/interfaces/RouteRecordRedirect.md b/packages/docs/api/interfaces/RouteRecordRedirect.md deleted file mode 100644 index 2f471ddd3..000000000 --- a/packages/docs/api/interfaces/RouteRecordRedirect.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteRecordRedirect - -# Interface: RouteRecordRedirect - -Route Record that defines a redirect. Cannot have `component` or `components` -as it is never rendered. - -## Hierarchy - -- [`_RouteRecordBase`](RouteRecordBase.md) - - ↳ **`RouteRecordRedirect`** - -## Properties - -### alias - -• `Optional` **alias**: `string` \| `string`[] - -Aliases for the record. Allows defining extra paths that will behave like a -copy of the record. Allows having paths shorthands like `/users/:id` and -`/u/:id`. All `alias` and `path` values must share the same params. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[alias](RouteRecordBase.md#alias) - -___ - -### beforeEnter - -• `Optional` **beforeEnter**: [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\>[] - -Before Enter guard specific to this record. Note `beforeEnter` has no -effect if the record has a `redirect` property. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[beforeEnter](RouteRecordBase.md#beforeEnter) - -___ - -### children - -• `Optional` **children**: [`RouteRecordRaw`](../index.md#RouteRecordRaw)[] - -Array of nested routes. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[children](RouteRecordBase.md#children) - -___ - -### component - -• `Optional` **component**: `undefined` - -___ - -### components - -• `Optional` **components**: `undefined` - -___ - -### end - -• `Optional` **end**: `boolean` - -Should the RegExp match until the end by appending a `$` to it. - -**`Default Value`** - -`true` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[end](RouteRecordBase.md#end) - -___ - -### meta - -• `Optional` **meta**: [`RouteMeta`](RouteMeta.md) - -Arbitrary data attached to the record. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[meta](RouteRecordBase.md#meta) - -___ - -### name - -• `Optional` **name**: [`RouteRecordName`](../index.md#RouteRecordName) - -Name for the route record. Must be unique. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[name](RouteRecordBase.md#name) - -___ - -### path - -• **path**: `string` - -Path of the record. Should start with `/` unless the record is the child of -another record. - -**`Example`** - -```ts -`/users/:id` matches `/users/1` as well as `/users/posva`. -``` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[path](RouteRecordBase.md#path) - -___ - -### props - -• `Optional` **props**: `undefined` - -Allow passing down params as props to the component rendered by `router-view`. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[props](RouteRecordBase.md#props) - -___ - -### redirect - -• **redirect**: `RouteRecordRedirectOption` - -Where to redirect if the route is directly matched. The redirection happens -before any navigation guard and triggers a new navigation with the new -target location. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[redirect](RouteRecordBase.md#redirect) - -___ - -### sensitive - -• `Optional` **sensitive**: `boolean` - -Makes the RegExp case-sensitive. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[sensitive](RouteRecordBase.md#sensitive) - -___ - -### strict - -• `Optional` **strict**: `boolean` - -Whether to disallow a trailing slash or not. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[strict](RouteRecordBase.md#strict) diff --git a/packages/docs/api/interfaces/RouteRecordSingleView.md b/packages/docs/api/interfaces/RouteRecordSingleView.md deleted file mode 100644 index 9a64196dc..000000000 --- a/packages/docs/api/interfaces/RouteRecordSingleView.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteRecordSingleView - -# Interface: RouteRecordSingleView - -Route Record defining one single component with the `component` option. - -## Hierarchy - -- [`_RouteRecordBase`](RouteRecordBase.md) - - ↳ **`RouteRecordSingleView`** - -## Properties - -### alias - -• `Optional` **alias**: `string` \| `string`[] - -Aliases for the record. Allows defining extra paths that will behave like a -copy of the record. Allows having paths shorthands like `/users/:id` and -`/u/:id`. All `alias` and `path` values must share the same params. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[alias](RouteRecordBase.md#alias) - -___ - -### beforeEnter - -• `Optional` **beforeEnter**: [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\>[] - -Before Enter guard specific to this record. Note `beforeEnter` has no -effect if the record has a `redirect` property. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[beforeEnter](RouteRecordBase.md#beforeEnter) - -___ - -### children - -• `Optional` **children**: `undefined` - -Array of nested routes. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[children](RouteRecordBase.md#children) - -___ - -### component - -• **component**: `RawRouteComponent` - -Component to display when the URL matches this route. - -___ - -### components - -• `Optional` **components**: `undefined` - -___ - -### end - -• `Optional` **end**: `boolean` - -Should the RegExp match until the end by appending a `$` to it. - -**`Default Value`** - -`true` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[end](RouteRecordBase.md#end) - -___ - -### meta - -• `Optional` **meta**: [`RouteMeta`](RouteMeta.md) - -Arbitrary data attached to the record. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[meta](RouteRecordBase.md#meta) - -___ - -### name - -• `Optional` **name**: [`RouteRecordName`](../index.md#RouteRecordName) - -Name for the route record. Must be unique. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[name](RouteRecordBase.md#name) - -___ - -### path - -• **path**: `string` - -Path of the record. Should start with `/` unless the record is the child of -another record. - -**`Example`** - -```ts -`/users/:id` matches `/users/1` as well as `/users/posva`. -``` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[path](RouteRecordBase.md#path) - -___ - -### props - -• `Optional` **props**: `_RouteRecordProps` - -Allow passing down params as props to the component rendered by `router-view`. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[props](RouteRecordBase.md#props) - -___ - -### redirect - -• `Optional` **redirect**: `undefined` - -Where to redirect if the route is directly matched. The redirection happens -before any navigation guard and triggers a new navigation with the new -target location. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[redirect](RouteRecordBase.md#redirect) - -___ - -### sensitive - -• `Optional` **sensitive**: `boolean` - -Makes the RegExp case-sensitive. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[sensitive](RouteRecordBase.md#sensitive) - -___ - -### strict - -• `Optional` **strict**: `boolean` - -Whether to disallow a trailing slash or not. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[strict](RouteRecordBase.md#strict) diff --git a/packages/docs/api/interfaces/RouteRecordSingleViewWithChildren.md b/packages/docs/api/interfaces/RouteRecordSingleViewWithChildren.md deleted file mode 100644 index 2216c0d92..000000000 --- a/packages/docs/api/interfaces/RouteRecordSingleViewWithChildren.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouteRecordSingleViewWithChildren - -# Interface: RouteRecordSingleViewWithChildren - -Route Record defining one single component with a nested view. - -## Hierarchy - -- [`_RouteRecordBase`](RouteRecordBase.md) - - ↳ **`RouteRecordSingleViewWithChildren`** - -## Properties - -### alias - -• `Optional` **alias**: `string` \| `string`[] - -Aliases for the record. Allows defining extra paths that will behave like a -copy of the record. Allows having paths shorthands like `/users/:id` and -`/u/:id`. All `alias` and `path` values must share the same params. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[alias](RouteRecordBase.md#alias) - -___ - -### beforeEnter - -• `Optional` **beforeEnter**: [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> \| [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\>[] - -Before Enter guard specific to this record. Note `beforeEnter` has no -effect if the record has a `redirect` property. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[beforeEnter](RouteRecordBase.md#beforeEnter) - -___ - -### children - -• **children**: [`RouteRecordRaw`](../index.md#RouteRecordRaw)[] - -Array of nested routes. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[children](RouteRecordBase.md#children) - -___ - -### component - -• `Optional` **component**: ``null`` \| `RawRouteComponent` - -Component to display when the URL matches this route. - -___ - -### components - -• `Optional` **components**: `undefined` - -___ - -### end - -• `Optional` **end**: `boolean` - -Should the RegExp match until the end by appending a `$` to it. - -**`Default Value`** - -`true` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[end](RouteRecordBase.md#end) - -___ - -### meta - -• `Optional` **meta**: [`RouteMeta`](RouteMeta.md) - -Arbitrary data attached to the record. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[meta](RouteRecordBase.md#meta) - -___ - -### name - -• `Optional` **name**: [`RouteRecordName`](../index.md#RouteRecordName) - -Name for the route record. Must be unique. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[name](RouteRecordBase.md#name) - -___ - -### path - -• **path**: `string` - -Path of the record. Should start with `/` unless the record is the child of -another record. - -**`Example`** - -```ts -`/users/:id` matches `/users/1` as well as `/users/posva`. -``` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[path](RouteRecordBase.md#path) - -___ - -### props - -• `Optional` **props**: `_RouteRecordProps` - -Allow passing down params as props to the component rendered by `router-view`. - -#### Overrides - -[_RouteRecordBase](RouteRecordBase.md).[props](RouteRecordBase.md#props) - -___ - -### redirect - -• `Optional` **redirect**: `RouteRecordRedirectOption` - -Where to redirect if the route is directly matched. The redirection happens -before any navigation guard and triggers a new navigation with the new -target location. - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[redirect](RouteRecordBase.md#redirect) - -___ - -### sensitive - -• `Optional` **sensitive**: `boolean` - -Makes the RegExp case-sensitive. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[sensitive](RouteRecordBase.md#sensitive) - -___ - -### strict - -• `Optional` **strict**: `boolean` - -Whether to disallow a trailing slash or not. - -**`Default Value`** - -`false` - -#### Inherited from - -[_RouteRecordBase](RouteRecordBase.md).[strict](RouteRecordBase.md#strict) diff --git a/packages/docs/api/interfaces/Router.md b/packages/docs/api/interfaces/Router.md deleted file mode 100644 index 9d7d79933..000000000 --- a/packages/docs/api/interfaces/Router.md +++ /dev/null @@ -1,421 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / Router - -# Interface: Router - -Router instance. - -## Properties - -### currentRoute - -• `Readonly` **currentRoute**: `Ref`\<[`RouteLocationNormalizedLoaded`](RouteLocationNormalizedLoaded.md)\> - -Current [RouteLocationNormalized](RouteLocationNormalized.md) - -___ - -### listening - -• **listening**: `boolean` - -Allows turning off the listening of history events. This is a low level api for micro-frontends. - -___ - -### options - -• `Readonly` **options**: [`RouterOptions`](RouterOptions.md) - -Original options object passed to create the Router - -## Methods - -### addRoute - -▸ **addRoute**(`parentName`, `route`): () => `void` - -Add a new [route record](../index.md#RouteRecordRaw) as the child of an existing route. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `parentName` | [`RouteRecordName`](../index.md#RouteRecordName) | Parent Route Record where `route` should be appended at | -| `route` | [`RouteRecordRaw`](../index.md#RouteRecordRaw) | Route Record to add | - -#### Returns - -`fn` - -▸ (): `void` - -Add a new [route record](../index.md#RouteRecordRaw) as the child of an existing route. - -##### Returns - -`void` - -▸ **addRoute**(`route`): () => `void` - -Add a new [route record](../index.md#RouteRecordRaw) to the router. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `route` | [`RouteRecordRaw`](../index.md#RouteRecordRaw) | Route Record to add | - -#### Returns - -`fn` - -▸ (): `void` - -Add a new [route record](../index.md#RouteRecordRaw) to the router. - -##### Returns - -`void` - -___ - -### afterEach - -▸ **afterEach**(`guard`): () => `void` - -Add a navigation hook that is executed after every navigation. Returns a -function that removes the registered hook. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `guard` | [`NavigationHookAfter`](NavigationHookAfter.md) | navigation hook to add | - -#### Returns - -`fn` - -a function that removes the registered hook - -▸ (): `void` - -Add a navigation hook that is executed after every navigation. Returns a -function that removes the registered hook. - -##### Returns - -`void` - -a function that removes the registered hook - -**`Example`** - -```js -router.afterEach((to, from, failure) => { - if (isNavigationFailure(failure)) { - console.log('failed navigation', failure) - } -}) -``` - -**`Example`** - -```js -router.afterEach((to, from, failure) => { - if (isNavigationFailure(failure)) { - console.log('failed navigation', failure) - } -}) -``` - -___ - -### back - -▸ **back**(): `void` - -Go back in history if possible by calling `history.back()`. Equivalent to -`router.go(-1)`. - -#### Returns - -`void` - -___ - -### beforeEach - -▸ **beforeEach**(`guard`): () => `void` - -Add a navigation guard that executes before any navigation. Returns a -function that removes the registered guard. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `guard` | [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> | navigation guard to add | - -#### Returns - -`fn` - -▸ (): `void` - -Add a navigation guard that executes before any navigation. Returns a -function that removes the registered guard. - -##### Returns - -`void` - -___ - -### beforeResolve - -▸ **beforeResolve**(`guard`): () => `void` - -Add a navigation guard that executes before navigation is about to be -resolved. At this state all component have been fetched and other -navigation guards have been successful. Returns a function that removes the -registered guard. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `guard` | [`NavigationGuardWithThis`](NavigationGuardWithThis.md)\<`undefined`\> | navigation guard to add | - -#### Returns - -`fn` - -a function that removes the registered guard - -▸ (): `void` - -Add a navigation guard that executes before navigation is about to be -resolved. At this state all component have been fetched and other -navigation guards have been successful. Returns a function that removes the -registered guard. - -##### Returns - -`void` - -a function that removes the registered guard - -**`Example`** - -```js -router.beforeResolve(to => { - if (to.meta.requiresAuth && !isAuthenticated) return false -}) -``` - -**`Example`** - -```js -router.beforeResolve(to => { - if (to.meta.requiresAuth && !isAuthenticated) return false -}) -``` - -___ - -### forward - -▸ **forward**(): `void` - -Go forward in history if possible by calling `history.forward()`. -Equivalent to `router.go(1)`. - -#### Returns - -`void` - -___ - -### getRoutes - -▸ **getRoutes**(): [`RouteRecordNormalized`](RouteRecordNormalized.md)[] - -Get a full list of all the [route records](../index.md#RouteRecord). - -#### Returns - -[`RouteRecordNormalized`](RouteRecordNormalized.md)[] - -___ - -### go - -▸ **go**(`delta`): `void` - -Allows you to move forward or backward through the history. Calls -`history.go()`. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `delta` | `number` | The position in the history to which you want to move, relative to the current page | - -#### Returns - -`void` - -___ - -### hasRoute - -▸ **hasRoute**(`name`): `boolean` - -Checks if a route with a given name exists - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `name` | [`RouteRecordName`](../index.md#RouteRecordName) | Name of the route to check | - -#### Returns - -`boolean` - -___ - -### isReady - -▸ **isReady**(): `Promise`\<`void`\> - -Returns a Promise that resolves when the router has completed the initial -navigation, which means it has resolved all async enter hooks and async -components that are associated with the initial route. If the initial -navigation already happened, the promise resolves immediately. - -This is useful in server-side rendering to ensure consistent output on both -the server and the client. Note that on server side, you need to manually -push the initial location while on client side, the router automatically -picks it up from the URL. - -#### Returns - -`Promise`\<`void`\> - -___ - -### onError - -▸ **onError**(`handler`): () => `void` - -Adds an error handler that is called every time a non caught error happens -during navigation. This includes errors thrown synchronously and -asynchronously, errors returned or passed to `next` in any navigation -guard, and errors occurred when trying to resolve an async component that -is required to render a route. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `handler` | `_ErrorListener` | error handler to register | - -#### Returns - -`fn` - -▸ (): `void` - -Adds an error handler that is called every time a non caught error happens -during navigation. This includes errors thrown synchronously and -asynchronously, errors returned or passed to `next` in any navigation -guard, and errors occurred when trying to resolve an async component that -is required to render a route. - -##### Returns - -`void` - -___ - -### push - -▸ **push**(`to`): `Promise`\<`undefined` \| `void` \| [`NavigationFailure`](NavigationFailure.md)\> - -Programmatically navigate to a new URL by pushing an entry in the history -stack. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `to` | [`RouteLocationRaw`](../index.md#RouteLocationRaw) | Route location to navigate to | - -#### Returns - -`Promise`\<`undefined` \| `void` \| [`NavigationFailure`](NavigationFailure.md)\> - -___ - -### removeRoute - -▸ **removeRoute**(`name`): `void` - -Remove an existing route by its name. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `name` | [`RouteRecordName`](../index.md#RouteRecordName) | Name of the route to remove | - -#### Returns - -`void` - -___ - -### replace - -▸ **replace**(`to`): `Promise`\<`undefined` \| `void` \| [`NavigationFailure`](NavigationFailure.md)\> - -Programmatically navigate to a new URL by replacing the current entry in -the history stack. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `to` | [`RouteLocationRaw`](../index.md#RouteLocationRaw) | Route location to navigate to | - -#### Returns - -`Promise`\<`undefined` \| `void` \| [`NavigationFailure`](NavigationFailure.md)\> - -___ - -### resolve - -▸ **resolve**(`to`, `currentLocation?`): [`RouteLocation`](RouteLocation.md) & \{ `href`: `string` } - -Returns the [normalized version](RouteLocation.md) of a -[route location](../index.md#RouteLocationRaw). Also includes an `href` property -that includes any existing `base`. By default, the `currentLocation` used is -`router.currentRoute` and should only be overridden in advanced use cases. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `to` | [`RouteLocationRaw`](../index.md#RouteLocationRaw) | Raw route location to resolve | -| `currentLocation?` | [`RouteLocationNormalizedLoaded`](RouteLocationNormalizedLoaded.md) | Optional current location to resolve against | - -#### Returns - -[`RouteLocation`](RouteLocation.md) & \{ `href`: `string` } diff --git a/packages/docs/api/interfaces/RouterHistory.md b/packages/docs/api/interfaces/RouterHistory.md deleted file mode 100644 index a7fb4b017..000000000 --- a/packages/docs/api/interfaces/RouterHistory.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouterHistory - -# Interface: RouterHistory - -Interface implemented by History implementations that can be passed to the -router as Router.history - -## Properties - -### base - -• `Readonly` **base**: `string` - -Base path that is prepended to every url. This allows hosting an SPA at a -sub-folder of a domain like `example.com/sub-folder` by having a `base` of -`/sub-folder` - -___ - -### location - -• `Readonly` **location**: `string` - -Current History location - -___ - -### state - -• `Readonly` **state**: [`HistoryState`](HistoryState.md) - -Current History state - -## Methods - -### createHref - -▸ **createHref**(`location`): `string` - -Generates the corresponding href to be used in an anchor tag. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `location` | `string` | history location that should create an href | - -#### Returns - -`string` - -___ - -### destroy - -▸ **destroy**(): `void` - -Clears any event listener attached by the history implementation. - -#### Returns - -`void` - -___ - -### go - -▸ **go**(`delta`, `triggerListeners?`): `void` - -Traverses history in a given direction. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `delta` | `number` | distance to travel. If delta is \< 0, it will go back, if it's \> 0, it will go forward by that amount of entries. | -| `triggerListeners?` | `boolean` | whether this should trigger listeners attached to the history | - -#### Returns - -`void` - -**`Example`** - -```js -myHistory.go(-1) // equivalent to window.history.back() -myHistory.go(1) // equivalent to window.history.forward() -``` - -___ - -### listen - -▸ **listen**(`callback`): () => `void` - -Attach a listener to the History implementation that is triggered when the -navigation is triggered from outside (like the Browser back and forward -buttons) or when passing `true` to RouterHistory.back and -RouterHistory.forward - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `callback` | `NavigationCallback` | listener to attach | - -#### Returns - -`fn` - -a callback to remove the listener - -▸ (): `void` - -Attach a listener to the History implementation that is triggered when the -navigation is triggered from outside (like the Browser back and forward -buttons) or when passing `true` to RouterHistory.back and -RouterHistory.forward - -##### Returns - -`void` - -a callback to remove the listener - -___ - -### push - -▸ **push**(`to`, `data?`): `void` - -Navigates to a location. In the case of an HTML5 History implementation, -this will call `history.pushState` to effectively change the URL. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `to` | `string` | location to push | -| `data?` | [`HistoryState`](HistoryState.md) | optional [HistoryState](HistoryState.md) to be associated with the navigation entry | - -#### Returns - -`void` - -___ - -### replace - -▸ **replace**(`to`, `data?`): `void` - -Same as [RouterHistory.push](RouterHistory.md#push) but performs a `history.replaceState` -instead of `history.pushState` - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `to` | `string` | location to set | -| `data?` | [`HistoryState`](HistoryState.md) | optional [HistoryState](HistoryState.md) to be associated with the navigation entry | - -#### Returns - -`void` diff --git a/packages/docs/api/interfaces/RouterLinkProps.md b/packages/docs/api/interfaces/RouterLinkProps.md deleted file mode 100644 index e8aa8778d..000000000 --- a/packages/docs/api/interfaces/RouterLinkProps.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouterLinkProps - -# Interface: RouterLinkProps - -## Hierarchy - -- `RouterLinkOptions` - - ↳ **`RouterLinkProps`** - -## Properties - -### activeClass - -• `Optional` **activeClass**: `string` - -Class to apply when the link is active - -___ - -### ariaCurrentValue - -• `Optional` **ariaCurrentValue**: ``"location"`` \| ``"time"`` \| ``"page"`` \| ``"step"`` \| ``"date"`` \| ``"true"`` \| ``"false"`` - -Value passed to the attribute `aria-current` when the link is exact active. - -**`Default Value`** - -`'page'` - -___ - -### custom - -• `Optional` **custom**: `boolean` - -Whether RouterLink should not wrap its content in an `a` tag. Useful when -using `v-slot` to create a custom RouterLink - -___ - -### exactActiveClass - -• `Optional` **exactActiveClass**: `string` - -Class to apply when the link is exact active - -___ - -### replace - -• `Optional` **replace**: `boolean` - -Calls `router.replace` instead of `router.push`. - -#### Inherited from - -RouterLinkOptions.replace - -___ - -### to - -• **to**: [`RouteLocationRaw`](../index.md#RouteLocationRaw) - -Route Location the link should navigate to when clicked on. - -#### Inherited from - -RouterLinkOptions.to diff --git a/packages/docs/api/interfaces/RouterOptions.md b/packages/docs/api/interfaces/RouterOptions.md deleted file mode 100644 index 039498275..000000000 --- a/packages/docs/api/interfaces/RouterOptions.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouterOptions - -# Interface: RouterOptions - -Options to initialize a [Router](Router.md) instance. - -## Hierarchy - -- [`PathParserOptions`](../index.md#PathParserOptions) - - ↳ **`RouterOptions`** - -## Properties - -### end - -• `Optional` **end**: `boolean` - -Should the RegExp match until the end by appending a `$` to it. - -**`Default Value`** - -`true` - -#### Inherited from - -PathParserOptions.end - -___ - -### history - -• **history**: [`RouterHistory`](RouterHistory.md) - -History implementation used by the router. Most web applications should use -`createWebHistory` but it requires the server to be properly configured. -You can also use a _hash_ based history with `createWebHashHistory` that -does not require any configuration on the server but isn't handled at all -by search engines and does poorly on SEO. - -**`Example`** - -```js -createRouter({ - history: createWebHistory(), - // other options... -}) -``` - -___ - -### linkActiveClass - -• `Optional` **linkActiveClass**: `string` - -Default class applied to active [RouterLink](../index.md#RouterLink). If none is provided, -`router-link-active` will be applied. - -___ - -### linkExactActiveClass - -• `Optional` **linkExactActiveClass**: `string` - -Default class applied to exact active [RouterLink](../index.md#RouterLink). If none is provided, -`router-link-exact-active` will be applied. - -___ - -### parseQuery - -• `Optional` **parseQuery**: (`search`: `string`) => [`LocationQuery`](../index.md#LocationQuery) - -#### Type declaration - -▸ (`search`): [`LocationQuery`](../index.md#LocationQuery) - -Custom implementation to parse a query. See its counterpart, -[RouterOptions.stringifyQuery](RouterOptions.md#stringifyQuery). - -##### Parameters - -| Name | Type | -| :------ | :------ | -| `search` | `string` | - -##### Returns - -[`LocationQuery`](../index.md#LocationQuery) - -**`Example`** - -Let's say you want to use the [qs package](https://github.com/ljharb/qs) -to parse queries, you can provide both `parseQuery` and `stringifyQuery`: -```js -import qs from 'qs' - -createRouter({ - // other options... - parseQuery: qs.parse, - stringifyQuery: qs.stringify, -}) -``` - -___ - -### routes - -• **routes**: readonly [`RouteRecordRaw`](../index.md#RouteRecordRaw)[] - -Initial list of routes that should be added to the router. - -___ - -### scrollBehavior - -• `Optional` **scrollBehavior**: [`RouterScrollBehavior`](RouterScrollBehavior.md) - -Function to control scrolling when navigating between pages. Can return a -Promise to delay scrolling. Check ScrollBehavior. - -**`Example`** - -```js -function scrollBehavior(to, from, savedPosition) { - // `to` and `from` are both route locations - // `savedPosition` can be null if there isn't one -} -``` - -___ - -### sensitive - -• `Optional` **sensitive**: `boolean` - -Makes the RegExp case-sensitive. - -**`Default Value`** - -`false` - -#### Inherited from - -PathParserOptions.sensitive - -___ - -### strict - -• `Optional` **strict**: `boolean` - -Whether to disallow a trailing slash or not. - -**`Default Value`** - -`false` - -#### Inherited from - -PathParserOptions.strict - -___ - -### stringifyQuery - -• `Optional` **stringifyQuery**: (`query`: [`LocationQueryRaw`](../index.md#LocationQueryRaw)) => `string` - -#### Type declaration - -▸ (`query`): `string` - -Custom implementation to stringify a query object. Should not prepend a leading `?`. -[parseQuery](RouterOptions.md#parseQuery) counterpart to handle query parsing. - -##### Parameters - -| Name | Type | -| :------ | :------ | -| `query` | [`LocationQueryRaw`](../index.md#LocationQueryRaw) | - -##### Returns - -`string` diff --git a/packages/docs/api/interfaces/RouterScrollBehavior.md b/packages/docs/api/interfaces/RouterScrollBehavior.md deleted file mode 100644 index 049a72503..000000000 --- a/packages/docs/api/interfaces/RouterScrollBehavior.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouterScrollBehavior - -# Interface: RouterScrollBehavior - -Type of the `scrollBehavior` option that can be passed to `createRouter`. - -## Callable - -### RouterScrollBehavior - -▸ **RouterScrollBehavior**(`to`, `from`, `savedPosition`): `Awaitable`\<``false`` \| `void` \| `ScrollPosition`\> - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `to` | [`RouteLocationNormalized`](RouteLocationNormalized.md) | Route location where we are navigating to | -| `from` | [`RouteLocationNormalizedLoaded`](RouteLocationNormalizedLoaded.md) | Route location where we are navigating from | -| `savedPosition` | ``null`` \| `_ScrollPositionNormalized` | saved position if it exists, `null` otherwise | - -#### Returns - -`Awaitable`\<``false`` \| `void` \| `ScrollPosition`\> diff --git a/packages/docs/api/interfaces/RouterViewProps.md b/packages/docs/api/interfaces/RouterViewProps.md deleted file mode 100644 index 30fc957d2..000000000 --- a/packages/docs/api/interfaces/RouterViewProps.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -editLink: false ---- - -[API Documentation](../index.md) / RouterViewProps - -# Interface: RouterViewProps - -## Properties - -### name - -• `Optional` **name**: `string` - -___ - -### route - -• `Optional` **route**: [`RouteLocationNormalized`](RouteLocationNormalized.md) diff --git a/packages/docs/guide/advanced/composition-api.md b/packages/docs/guide/advanced/composition-api.md index 3e9213f78..44e25251e 100644 --- a/packages/docs/guide/advanced/composition-api.md +++ b/packages/docs/guide/advanced/composition-api.md @@ -2,90 +2,86 @@ -The introduction of `setup` and Vue's [Composition API](https://vuejs.org/guide/extras/composition-api-faq.html), open up new possibilities but to be able to get the full potential out of Vue Router, we will need to use a few new functions to replace access to `this` and in-component navigation guards. +The introduction of Vue's [Composition API](https://vuejs.org/guide/extras/composition-api-faq.html) opened up new possibilities, but to be able to get the full potential out of Vue Router, we will need to use a few new functions to replace access to `this` and in-component navigation guards. ## Accessing the Router and current Route inside `setup` -Because we don't have access to `this` inside of `setup`, we cannot directly access `this.$router` or `this.$route` anymore. Instead we use the `useRouter` and `useRoute` functions: +Because we don't have access to `this` inside of `setup`, we cannot directly access `this.$router` or `this.$route`. Instead, we use the `useRouter` and `useRoute` composables: -```js +```vue + ``` -The `route` object is a reactive object, so any of its properties can be watched and you should **avoid watching the whole `route`** object. In most scenarios, you should directly watch the param you are expecting to change +The `route` object is a reactive object. In most scenarios, you should **avoid watching the whole `route`** object. Instead, you can directly watch the properties you are expecting to change: -```js + + +```vue + ``` -Note we still have access to `$router` and `$route` in templates, so there is no need to return `router` or `route` inside of `setup`. +Note we still have access to `$router` and `$route` in templates, so there's no need to use `useRouter` or `useRoute` if we only need those objects in the template. ## Navigation Guards -While you can still use in-component navigation guards with a `setup` function, Vue Router exposes update and leave guards as Composition API functions: +Vue Router exposes update and leave guards as Composition API functions: -```js +```vue + ``` Composition API guards can also be used in any component rendered by ``, they don't have to be used directly on the route component like in-component guards. @@ -94,40 +90,34 @@ Composition API guards can also be used in any component rendered by ` import { RouterLink, useLink } from 'vue-router' import { computed } from 'vue' -export default { - name: 'AppLink', - - props: { - // add @ts-ignore if using TypeScript - ...RouterLink.props, - inactiveClass: String, - }, - - setup(props) { - const { - // the resolved route object - route, - // the href to use in a link - href, - // boolean ref indicating if the link is active - isActive, - // boolean ref indicating if the link is exactly active - isExactActive, - // function to navigate to the link - navigate - } = useLink(props) - - const isExternalLink = computed( - () => typeof props.to === 'string' && props.to.startsWith('http') - ) - - return { isExternalLink, href, navigate, isActive } - }, -} +const props = defineProps({ + // add @ts-ignore if using TypeScript + ...RouterLink.props, + inactiveClass: String, +}) + +const { + // the resolved route object + route, + // the href to use in a link + href, + // boolean ref indicating if the link is active + isActive, + // boolean ref indicating if the link is exactly active + isExactActive, + // function to navigate to the link + navigate +} = useLink(props) + +const isExternalLink = computed( + () => typeof props.to === 'string' && props.to.startsWith('http') +) + ``` Note that the RouterLink's `v-slot` gives access to the same properties as the `useLink` composable. diff --git a/packages/docs/guide/advanced/data-fetching.md b/packages/docs/guide/advanced/data-fetching.md index e0725abeb..cc8227e6e 100644 --- a/packages/docs/guide/advanced/data-fetching.md +++ b/packages/docs/guide/advanced/data-fetching.md @@ -1,5 +1,7 @@ # Data Fetching + + Sometimes you need to fetch data from the server when a route is activated. For example, before rendering a user profile, you need to fetch the user's data from the server. We can achieve this in two different ways: - **Fetching After Navigation**: perform the navigation first, and fetch data in the incoming component's lifecycle hook. Display a loading state while data is being fetched. @@ -10,11 +12,13 @@ Technically, both are valid choices - it ultimately depends on the user experien ## Fetching After Navigation -When using this approach, we navigate and render the incoming component immediately, and fetch data in the component's `created` hook. It gives us the opportunity to display a loading state while the data is being fetched over the network, and we can also handle loading differently for each view. +When using this approach, we navigate and render the incoming component immediately, and fetch data in the component itself. It gives us the opportunity to display a loading state while the data is being fetched over the network, and we can also handle loading differently for each view. + +Let's assume we have a `Post` component that needs to fetch the data for a post based on `route.params.id`: -Let's assume we have a `Post` component that needs to fetch the data for a post based on `$route.params.id`: +::: code-group -```html +```vue [Composition API] + + ``` -```js +```vue [Options API] + + + ``` +::: + ## Fetching Before Navigation -With this approach we fetch the data before actually navigating to the new -route. We can perform the data fetching in the `beforeRouteEnter` guard in the incoming component, and only call `next` when the fetch is complete. The callback passed to `next` will be called **after the component is mounted**: +With this approach we fetch the data before actually navigating to the new route. We can perform the data fetching in the `beforeRouteEnter` guard in the incoming component, and only call `next` when the fetch is complete. The callback passed to `next` will be called **after the component is mounted**: ```js export default { @@ -81,29 +130,28 @@ export default { error: null, } }, - beforeRouteEnter(to, from, next) { - getPost(to.params.id, (err, post) => { - // `setData` is a method defined below - next(vm => vm.setData(err, post)) - }) + async beforeRouteEnter(to, from, next) { + try { + const post = await getPost(to.params.id) + // `setPost` is a method defined below + next(vm => vm.setPost(post)) + } catch (err) { + // `setError` is a method defined below + next(vm => vm.setError(err)) + } }, // when route changes and this component is already rendered, // the logic will be slightly different. - async beforeRouteUpdate(to, from) { + beforeRouteUpdate(to, from) { this.post = null - try { - this.post = await getPost(to.params.id) - } catch (error) { - this.error = error.toString() - } + getPost(to.params.id).then(this.setPost).catch(this.setError) }, methods: { - setData(error, post) { - if (error) { - this.error = error - } else { - this.post = post - } + setPost(post) { + this.post = post + }, + setError(err) { + this.error = err.toString() } } } diff --git a/packages/docs/guide/advanced/dynamic-routing.md b/packages/docs/guide/advanced/dynamic-routing.md index a2ad81a79..f8de03c13 100644 --- a/packages/docs/guide/advanced/dynamic-routing.md +++ b/packages/docs/guide/advanced/dynamic-routing.md @@ -5,7 +5,7 @@ title="Learn how to add routes at runtime" /> -Adding routes to your router is usually done via the `routes` option but in some situations, you might want to add or remove routes while the application is already running. Application with extensible interfaces like [Vue CLI UI](https://cli.vuejs.org/dev-guide/ui-api.html) can use this to make the application grow. +Adding routes to your router is usually done via the `routes` option but in some situations, you might want to add or remove routes while the application is already running. Applications with extensible interfaces like [Vue CLI UI](https://cli.vuejs.org/dev-guide/ui-api.html) can use this to make the application grow. ## Adding routes @@ -20,22 +20,24 @@ const router = createRouter({ }) ``` -Going to any page, `/about`, `/store`, or `/3-tricks-to-improve-your-routing-code` ends up rendering the `Article` component. If we are on `/about` and we add a new route: +Going to any page like `/about`, `/store`, or `/3-tricks-to-improve-your-routing-code` ends up rendering the `Article` component. If we are on `/about` and we add a new route: ```js router.addRoute({ path: '/about', component: About }) ``` -The page will still show the `Article` component, we need to manually call `router.replace()` to change the current location and overwrite where we were (instead of pushing a new entry, ending up in the same location twice in our history): +The page will still show the `Article` component. We need to manually call `router.replace()` to change the current location and overwrite where we were (instead of pushing a new entry, ending up in the same location twice in our history): ```js router.addRoute({ path: '/about', component: About }) -// we could also use this.$route or route = useRoute() (inside a setup) +// we could also use this.$route or useRoute() router.replace(router.currentRoute.value.fullPath) ``` Remember you can `await router.replace()` if you need to wait for the new route to be displayed. + + ## Adding routes inside navigation guards If you decide to add or remove routes inside of a navigation guard, you should not call `router.replace()` but trigger a redirection by returning the new location: @@ -50,7 +52,7 @@ router.beforeEach(to => { }) ``` -The example above assumes two things: first, the newly added route record will match the `to` location, effectively resulting in a different location from the one we were trying to access. Second, `hasNecessaryRoute()` returns `false` after adding the new route to avoid an infinite redirection. +The example above assumes two things: first, the newly added route record will match the `to` location, effectively resulting in a different location from the one we were trying to access. Second, `hasNecessaryRoute()` returns `true` after adding the new route to avoid an infinite redirection. Because we are redirecting, we are replacing the ongoing navigation, effectively behaving like the example shown before. In real world scenarios, adding is more likely to happen outside of navigation guards, e.g. when a view component mounts, it register new routes. @@ -89,7 +91,7 @@ Whenever a route is removed, **all of its aliases and children** are removed wit ## Adding nested routes -To add nested routes to an existing route, you can pass the _name_ of the route as its first parameter to `router.addRoute()`, this will effectively add the route as if it was added through `children`: +To add nested routes to an existing route, you can pass the _name_ of the route as its first parameter to `router.addRoute()`. This will effectively add the route as if it was added through `children`: ```js router.addRoute({ name: 'admin', path: '/admin', component: Admin }) @@ -111,5 +113,5 @@ router.addRoute({ Vue Router gives you two functions to look at existing routes: -- [`router.hasRoute()`](/api/interfaces/Router.md#hasRoute): check if a route exists +- [`router.hasRoute()`](/api/interfaces/Router.md#hasRoute): check if a route exists. - [`router.getRoutes()`](/api/interfaces/Router.md#getRoutes): get an array with all the route records. diff --git a/packages/docs/guide/advanced/extending-router-link.md b/packages/docs/guide/advanced/extending-router-link.md index 6b4ff25c4..0e72a24db 100644 --- a/packages/docs/guide/advanced/extending-router-link.md +++ b/packages/docs/guide/advanced/extending-router-link.md @@ -9,7 +9,28 @@ The RouterLink component exposes enough `props` to suffice most basic applicatio Let's extend RouterLink to handle external links as well and adding a custom `inactive-class` in an `AppLink.vue` file: -```vue +::: code-group + +```vue [Composition API] + + +``` +```vue [Options API] + + ``` +::: + If you prefer using a render function or create `computed` properties, you can use the `useLink` from the [Composition API](./composition-api.md): ```js @@ -78,6 +124,8 @@ export default { } ``` + + In practice, you might want to use your `AppLink` component for different parts of your application. e.g. using [Tailwind CSS](https://tailwindcss.com), you could create a `NavLink.vue` component with all the classes: ```vue diff --git a/packages/docs/guide/advanced/lazy-loading.md b/packages/docs/guide/advanced/lazy-loading.md index d33099c88..7cbb183fd 100644 --- a/packages/docs/guide/advanced/lazy-loading.md +++ b/packages/docs/guide/advanced/lazy-loading.md @@ -27,6 +27,8 @@ const router = createRouter({ The `component` (and `components`) option accepts a function that returns a Promise of a component and Vue Router **will only fetch it when entering the page for the first time**, then use the cached version. Which means you can also have more complex functions as long as they return a Promise: + + ```js const UserDetails = () => Promise.resolve({ @@ -63,7 +65,7 @@ webpack will group any async module with the same chunk name into the same async ### With Vite -In Vite you can define the chunks under the [`rollupOptions`](https://vitejs.dev/config/#build-rollupoptions): +In Vite you can define the chunks under the [`rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions): ```js // vite.config.js diff --git a/packages/docs/guide/advanced/meta.md b/packages/docs/guide/advanced/meta.md index 7c5f045d8..2099c8d27 100644 --- a/packages/docs/guide/advanced/meta.md +++ b/packages/docs/guide/advanced/meta.md @@ -38,7 +38,7 @@ First, each route object in the `routes` configuration is called a **route recor For example, with the above route config, the URL `/posts/new` will match both the parent route record (`path: '/posts'`) and the child route record (`path: 'new'`). -All route records matched by a route are exposed on the `$route` object (and also route objects in navigation guards) as the `$route.matched` Array. We could loop through that array to check all `meta` fields, but Vue Router also provides you a `$route.meta` that is a non-recursive merge of **all `meta`** fields from parent to child. Meaning you can simply write +All route records matched by a route are exposed on the `route` object (and also route objects in navigation guards) as the `route.matched` Array. We could loop through that array to check all `meta` fields, but Vue Router also provides you a `route.meta` that is a non-recursive merge of **all `meta`** fields from parent to child. Meaning you can simply write: ```js router.beforeEach((to, from) => { @@ -56,6 +56,8 @@ router.beforeEach((to, from) => { }) ``` + + ## TypeScript It is possible to type the meta field by extending the `RouteMeta` interface from `vue-router`: diff --git a/packages/docs/guide/advanced/navigation-failures.md b/packages/docs/guide/advanced/navigation-failures.md index fb43286b7..aee3f7e9a 100644 --- a/packages/docs/guide/advanced/navigation-failures.md +++ b/packages/docs/guide/advanced/navigation-failures.md @@ -33,6 +33,8 @@ Now the menu will close once the navigation is finished but it will also close i If a navigation is prevented, resulting in the user staying on the same page, the resolved value of the `Promise` returned by `router.push` will be a _Navigation Failure_. Otherwise, it will be a _falsy_ value (usually `undefined`). This allows us to differentiate the case where we navigated away from where we are or not: + + ```js const navigationResult = await router.push('/my-profile') diff --git a/packages/docs/guide/advanced/navigation-guards.md b/packages/docs/guide/advanced/navigation-guards.md index 1d0067f60..271add59f 100644 --- a/packages/docs/guide/advanced/navigation-guards.md +++ b/packages/docs/guide/advanced/navigation-guards.md @@ -5,6 +5,8 @@ title="Learn how to add navigation guards" /> + + As the name suggests, the navigation guards provided by Vue router are primarily used to guard navigations either by redirecting it or canceling it. There are a number of ways to hook into the route navigation process: globally, per-route, or in-component. ## Global Before Guards @@ -25,8 +27,8 @@ Global before guards are called in creation order, whenever a navigation is trig Every guard function receives two arguments: -- **`to`**: the target route location [in a normalized format](../../api/interfaces/RouteLocationNormalized.md) being navigated to. -- **`from`**: the current route location [in a normalized format](../../api/interfaces/RouteLocationNormalized.md) being navigated away from. +- **`to`**: the target route location [in a normalized format](../../api/#RouteLocationNormalized) being navigated to. +- **`from`**: the current route location [in a normalized format](../../api/#RouteLocationNormalized) being navigated away from. And can optionally return any of the following values: @@ -197,13 +199,34 @@ const routes = [ ] ``` -Note it is possible to achieve a similar behavior by using [route meta fields](./meta.md) and global navigation guards. +When working with [nested routes](../essentials/nested-routes), both parent and child routes can use `beforeEnter`. When placed on a parent route, it won't be triggered when moving between children with that same parent. For example: + +```js +const routes = [ + { + path: '/user', + beforeEnter() { + // ... + }, + children: [ + { path: 'list', component: UserList }, + { path: 'details', component: UserDetails }, + ], + }, +] +``` + +The `beforeEnter` in the example above won't be called when moving between `/user/list` and `/user/details`, as they share the same parent. If we put the `beforeEnter` guard directly on the `details` route instead, that would be called when moving between those two routes. + +::: tip +It is possible to achieve similar behavior to per-route guards by using [route meta fields](./meta) and global navigation guards. +::: ## In-Component Guards Finally, you can directly define route navigation guards inside route components (the ones passed to the router configuration) -### Using the options API +### Using the Options API You can add the following options to route components: @@ -211,9 +234,9 @@ You can add the following options to route components: - `beforeRouteUpdate` - `beforeRouteLeave` -```js -const UserDetails = { - template: `...`, +```vue + ``` The `beforeRouteEnter` guard does **NOT** have access to `this`, because the guard is called before the navigation is confirmed, thus the new entering component has not even been created yet. @@ -262,9 +286,9 @@ beforeRouteLeave (to, from) { } ``` -### Using the composition API +### Using the Composition API -If you are writing your component using the [composition API and a `setup` function](https://vuejs.org/api/composition-api-setup.html), you can add update and leave guards through `onBeforeRouteUpdate` and `onBeforeRouteLeave` respectively. Please refer to the [Composition API section](./composition-api.md#navigation-guards) for more details. +If you are writing your component using the Composition API, you can add update and leave guards through `onBeforeRouteUpdate` and `onBeforeRouteLeave` respectively. Please refer to the [Composition API section](./composition-api.md#navigation-guards) for more details. ## The Full Navigation Resolution Flow diff --git a/packages/docs/guide/advanced/router-view-slot.md b/packages/docs/guide/advanced/router-view-slot.md index ded51b493..79342b882 100644 --- a/packages/docs/guide/advanced/router-view-slot.md +++ b/packages/docs/guide/advanced/router-view-slot.md @@ -1,5 +1,7 @@ # RouterView slot + + The RouterView component exposes a slot that can be used to render the route component: ```vue-html diff --git a/packages/docs/guide/advanced/scroll-behavior.md b/packages/docs/guide/advanced/scroll-behavior.md index b4f766409..79855cc63 100644 --- a/packages/docs/guide/advanced/scroll-behavior.md +++ b/packages/docs/guide/advanced/scroll-behavior.md @@ -23,6 +23,8 @@ const router = createRouter({ The `scrollBehavior` function receives the `to` and `from` route objects, like [Navigation Guards](./navigation-guards.md). The third argument, `savedPosition`, is only available if this is a `popstate` navigation (triggered by the browser's back/forward buttons). + + The function can return a [`ScrollToOptions`](https://developer.mozilla.org/en-US/docs/Web/API/ScrollToOptions) position object: ```js @@ -92,7 +94,7 @@ const router = createRouter({ behavior: 'smooth', } } - } + }, }) ``` @@ -113,3 +115,29 @@ const router = createRouter({ ``` It's possible to hook this up with events from a page-level transition component to make the scroll behavior play nicely with your page transitions, but due to the possible variance and complexity in use cases, we simply provide this primitive to enable specific userland implementations. + +## Advanced offsets + +If your page has a fixed navbar or similar elements, you might need an offset to ensure the target element isn't hidden behind other content. +Using a static offset value may not always work. You might try CSS-based solutions, like adding offsets with `scroll-margin` or `scroll-padding`, or using `::before` and `::after` pseudo-elements. However, these approaches can lead to unexpected behavior. + +In such cases, it's better to calculate the offset manually. A simple way to do this is by combining CSS with JavaScript's `getComputedStyle()`. This lets each element define its own offset dynamically. Here's an example: + +```js +const router = createRouter({ + scrollBehavior(to, from, savedPosition) { + const mainElement = document.querySelector('#main') + if (mainElement) { + const marginTop = parseFloat( + getComputedStyle(mainElement).scrollMarginTop + ) + return { + el: mainElement, + top: marginTop, + } + } else { + return { top: 0 } + } + }, +}) +``` diff --git a/packages/docs/guide/advanced/transitions.md b/packages/docs/guide/advanced/transitions.md index 3af7f6ada..8d3dd6c77 100644 --- a/packages/docs/guide/advanced/transitions.md +++ b/packages/docs/guide/advanced/transitions.md @@ -45,6 +45,8 @@ const routes = [ ``` + + ## Route-Based Dynamic Transition It is also possible to determine the transition to use dynamically based on the relationship between the target route and current route. Using a very similar snippet to the one just before: @@ -80,5 +82,17 @@ Vue might automatically reuse components that look alike, avoiding any transitio ``` - +## Initial navigation and transitions + +Usually, enter animations are ignored by Vue's `` unless we add the `appear` prop. But you'll notice that, when using it alongside ``, transitions are **always** applied despite the `appear` prop not being set. This is because navigations are asynchronous in Vue Router, meaning that the Vue application renders once before the initial navigation is finished. There are different ways to adapt this. The easiest one is to await the initial navigation before mounting the app with [`isReady`](https://router.vuejs.org/api/interfaces/Router.html#isReady): + +```ts +const app = createApp(App) +app.use(router) + +// mount after the initial navigation is ready +await router.isReady() +app.mount('#app') +``` + diff --git a/packages/docs/guide/advanced/typed-routes.md b/packages/docs/guide/advanced/typed-routes.md index 55fd7044e..20ec46805 100644 --- a/packages/docs/guide/advanced/typed-routes.md +++ b/packages/docs/guide/advanced/typed-routes.md @@ -1,10 +1,77 @@ -# Typed Routes (v4.1.0+) +# Typed Routes -::: danger ‼️ Experimental feature - -Starting from v4.1.0, we are introducing a new feature called Typed Routes. This **experimental** feature is enabled through a Vite/webpack/Rollup plugin. + ![RouterLink to autocomplete](https://user-images.githubusercontent.com/664177/176442066-c4e7fa31-4f06-4690-a49f-ed0fd880dfca.png) -[Check the v4.1 release notes](https://github.com/vuejs/router/releases/tag/v4.1.0) for more information about this feature. -[Check out the plugin](https://github.com/posva/unplugin-vue-router) GitHub repository for installation instructions and documentation. +It's possible to configure the router to have a _map_ of typed routes. While this can be done manually, it is recommended to use the [unplugin-vue-router](https://github.com/posva/unplugin-vue-router) plugin to generate the routes and the types automatically. + +## Manual Configuration + +Here is an example of how to manually configure typed routes: + +```ts +// import the `RouteRecordInfo` type from vue-router to type your routes +import type { RouteRecordInfo } from 'vue-router' + +// Define an interface of routes +export interface RouteNamedMap { + // each key is a name + home: RouteRecordInfo< + // here we have the same name + 'home', + // this is the path, it will appear in autocompletion + '/', + // these are the raw params (what can be passed to router.push() and RouterLink's "to" prop) + // In this case, there are no params allowed + Record, + // these are the normalized params (what you get from useRoute()) + Record, + // this is a union of all children route names, in this case, there are none + never + > + // repeat for each route... + // Note you can name them whatever you want + 'named-param': RouteRecordInfo< + 'named-param', + '/:name', + { name: string | number }, // Allows string or number + { name: string }, // but always returns a string from the URL + 'named-param-edit' + > + 'named-param-edit': RouteRecordInfo< + 'named-param-edit', + '/:name/edit', + { name: string | number }, // we also include parent params + { name: string }, + never + > + 'article-details': RouteRecordInfo< + 'article-details', + '/articles/:id+', + { id: Array }, + { id: string[] }, + never + > + 'not-found': RouteRecordInfo< + 'not-found', + '/:path(.*)', + { path: string }, + { path: string }, + never + > +} + +// Last, you will need to augment the Vue Router types with this map of routes +declare module 'vue-router' { + interface TypesConfig { + RouteNamedMap: RouteNamedMap + } +} +``` + +::: tip + +This is indeed tedious and error-prone. That's why it's recommended to use [unplugin-vue-router](https://github.com/posva/unplugin-vue-router) to generate the routes and the types automatically. + +::: diff --git a/packages/docs/guide/essentials/active-links.md b/packages/docs/guide/essentials/active-links.md new file mode 100644 index 000000000..081bb3c79 --- /dev/null +++ b/packages/docs/guide/essentials/active-links.md @@ -0,0 +1,80 @@ +# Active links + +It's common for applications to have a navigation component that renders a list of RouterLink components. Within that list, we might want to style links to the currently active route differently from the others. + +The RouterLink component adds two CSS classes to active links, `router-link-active` and `router-link-exact-active`. To understand the difference between them, we first need to consider how Vue Router decides that a link is _active_. + +## When are links active? + +A RouterLink is considered to be **_active_** if: + +1. It matches the same route record (i.e. configured route) as the current location. +2. It has the same values for the `params` as the current location. + +If you're using [nested routes](./nested-routes), any links to ancestor routes will also be considered active if the relevant `params` match. + +Other route properties, such as the [`query`](../../api/interfaces/RouteLocationBase.html#query), are not taken into account. + +The path doesn't necessarily need to be a perfect match. For example, using an [`alias`](./redirect-and-alias#Alias) would still be considered a match, so long as it resolves to the same route record and `params`. + +If a route has a [`redirect`](./redirect-and-alias#Redirect), it won't be followed when checking whether a link is active. + +## Exact active links + +An **_exact_** match does not include ancestor routes. + +Let's imagine we have the following routes: + +```js +const routes = [ + { + path: '/user/:username', + component: User, + children: [ + { + path: 'role/:roleId', + component: Role, + }, + ], + }, +] +``` + +Then consider these two links: + +```vue-html + + User + + + Role + +``` + +If the current location path is `/user/erina/role/admin` then these would both be considered _active_, so the class `router-link-active` would be applied to both links. But only the second link would be considered _exact_, so only that second link would have the class `router-link-exact-active`. + + + +## Configuring the classes + +The RouterLink component has two props, `activeClass` and `exactActiveClass`, that can be used to change the names of the classes that are applied: + +```vue-html + +``` + +The default class names can also be changed globally by passing the `linkActiveClass` and `linkExactActiveClass` options to `createRouter()`: + +```js +const router = createRouter({ + linkActiveClass: 'border-indigo-500', + linkExactActiveClass: 'border-indigo-700', + // ... +}) +``` + +See [Extending RouterLink](../advanced/extending-router-link) for more advanced customization techniques using the `v-slot` API. diff --git a/packages/docs/guide/essentials/dynamic-matching.md b/packages/docs/guide/essentials/dynamic-matching.md index f74ab649d..42c05bfe1 100644 --- a/packages/docs/guide/essentials/dynamic-matching.md +++ b/packages/docs/guide/essentials/dynamic-matching.md @@ -8,9 +8,7 @@ Very often we will need to map routes with the given pattern to the same component. For example, we may have a `User` component which should be rendered for all users but with different user IDs. In Vue Router we can use a dynamic segment in the path to achieve that, we call that a _param_: ```js -const User = { - template: '
User
', -} +import User from './User.vue' // these are passed to `createRouter` const routes = [ @@ -21,22 +19,25 @@ const routes = [ Now URLs like `/users/johnny` and `/users/jolyne` will both map to the same route. -A _param_ is denoted by a colon `:`. When a route is matched, the value of its _params_ will be exposed as `this.$route.params` in every component. Therefore, we can render the current user ID by updating `User`'s template to this: +A _param_ is denoted by a colon `:`. When a route is matched, the value of its _params_ will be exposed as `route.params` in every component. Therefore, we can render the current user ID by updating `User`'s template to this: -```js -const User = { - template: '
User {{ $route.params.id }}
', -} +```vue + ``` -You can have multiple _params_ in the same route, and they will map to corresponding fields on `$route.params`. Examples: +You can have multiple _params_ in the same route, and they will map to corresponding fields on `route.params`. Examples: -| pattern | matched path | \$route.params | +| pattern | matched path | route.params | | ------------------------------ | ------------------------ | ---------------------------------------- | | /users/:username | /users/eduardo | `{ username: 'eduardo' }` | | /users/:username/posts/:postId | /users/eduardo/posts/123 | `{ username: 'eduardo', postId: '123' }` | -In addition to `$route.params`, the `$route` object also exposes other useful information such as `$route.query` (if there is a query in the URL), `$route.hash`, etc. You can check out the full details in the [API Reference](../../api/interfaces/RouteLocationNormalized.md). +In addition to `route.params`, the `route` object also exposes other useful information such as `route.query` (if there is a query in the URL), `route.hash`, etc. You can check out the full details in the [API Reference](../../api/#RouteLocationNormalized). A working demo of this example can be found [here](https://codesandbox.io/s/route-params-vue-router-examples-mlb14?from-embed&initialpath=%2Fusers%2Feduardo%2Fposts%2F1). @@ -55,36 +56,75 @@ A working demo of this example can be found [here](https://codesandbox.io/s/rout title="Learn how to react to param changes" /> -One thing to note when using routes with params is that when the user navigates from `/users/johnny` to `/users/jolyne`, **the same component instance will be reused**. Since both routes render the same component, this is more efficient than destroying the old instance and then creating a new one. **However, this also means that the lifecycle hooks of the component will not be called**. +One thing to note when using routes with params is that when the user navigates from `/users/johnny` to `/users/jolyne`, **the same component instance will be reused**. Since both routes render the same component, this is more efficient than destroying the old instance and then creating a new one. **However, this also means that some lifecycle hooks of the component will not be called**. -To react to params changes in the same component, you can simply watch anything on the `$route` object, in this scenario, the `$route.params`: +To react to params changes in the same component, you can simply watch anything on the `route` object, in this scenario, the `route.params`: -```js -const User = { - template: '...', +::: code-group + +```vue [Composition API] + +``` + +```vue [Options API] + ``` -Or, use the `beforeRouteUpdate` [navigation guard](../advanced/navigation-guards.md), which also allows to cancel the navigation: +::: -```js -const User = { - template: '...', +Or, use the `beforeRouteUpdate` [navigation guard](../advanced/navigation-guards.md), which also allows you to cancel the navigation: + +::: code-group + +```vue [Composition API] + +``` + +```vue [Options API] + ``` +::: + ## Catch all / 404 Not found Route + ## Advanced Matching Patterns Vue Router uses its own path matching syntax, inspired by the one used by `express`, so it supports many advanced matching patterns such as optional params, zero or more / one or more requirements, and even custom regex patterns. Please check the [Advanced Matching](./route-matching-syntax.md) documentation to explore them. diff --git a/packages/docs/guide/essentials/history-mode.md b/packages/docs/guide/essentials/history-mode.md index 8cb720e93..0bbdba94c 100644 --- a/packages/docs/guide/essentials/history-mode.md +++ b/packages/docs/guide/essentials/history-mode.md @@ -7,43 +7,43 @@ The `history` option when creating the router instance allows us to choose among different history modes. -## Hash Mode +## HTML5 Mode -The hash history mode is created with `createWebHashHistory()`: +The HTML5 mode is created with `createWebHistory()` and is the recommended mode: ```js -import { createRouter, createWebHashHistory } from 'vue-router' +import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ - history: createWebHashHistory(), + history: createWebHistory(), routes: [ //... ], }) ``` -It uses a hash character (`#`) before the actual URL that is internally passed. Because this section of the URL is never sent to the server, it doesn't require any special treatment on the server level. **It does however have a bad impact in SEO**. If that's a concern for you, use the HTML5 history mode. +When using `createWebHistory()`, the URL will look "normal," e.g. `https://example.com/user/id`. Beautiful! -## HTML5 Mode +Here comes a problem, though: Since our app is a single page client side app, without a proper server configuration, the users will get a 404 error if they access `https://example.com/user/id` directly in their browser. Now that's ugly. -The HTML5 mode is created with `createWebHistory()` and is the recommended mode: +Not to worry: To fix the issue, all you need to do is add a simple catch-all fallback route to your server. If the URL doesn't match any static assets, it should serve the same `index.html` page that your app lives in. Beautiful, again! + +## Hash Mode + +The hash history mode is created with `createWebHashHistory()`: ```js -import { createRouter, createWebHistory } from 'vue-router' +import { createRouter, createWebHashHistory } from 'vue-router' const router = createRouter({ - history: createWebHistory(), + history: createWebHashHistory(), routes: [ //... ], }) ``` -When using `createWebHistory()`, the URL will look "normal," e.g. `https://example.com/user/id`. Beautiful! - -Here comes a problem, though: Since our app is a single page client side app, without a proper server configuration, the users will get a 404 error if they access `https://example.com/user/id` directly in their browser. Now that's ugly. - -Not to worry: To fix the issue, all you need to do is add a simple catch-all fallback route to your server. If the URL doesn't match any static assets, it should serve the same `index.html` page that your app lives in. Beautiful, again! +It uses a hash character (`#`) before the actual URL that is internally passed. Because this section of the URL is never sent to the server, it doesn't require any special treatment on the server level. **It does however have a bad impact in SEO**. If that's a concern for you, use the HTML5 history mode. ## Memory mode @@ -203,6 +203,8 @@ Create a `vercel.json` file under the root directory of your project with the fo } ``` + + ## Caveat There is a caveat to this: Your server will no longer report 404 errors as all not-found paths now serve up your `index.html` file. To get around the issue, you should implement a catch-all route within your Vue app to show a 404 page: diff --git a/packages/docs/guide/essentials/named-routes.md b/packages/docs/guide/essentials/named-routes.md index 51d1cda1e..37dd763f8 100644 --- a/packages/docs/guide/essentials/named-routes.md +++ b/packages/docs/guide/essentials/named-routes.md @@ -5,39 +5,43 @@ title="Learn about the named routes" /> -Alongside the `path`, you can provide a `name` to any route. This has the following advantages: - -- No hardcoded URLs -- Automatic encoding/decoding of `params` -- Prevents you from having a typo in the url -- Bypassing path ranking (e.g. to display a ) +When creating a route, we can optionally give the route a `name`: ```js const routes = [ { path: '/user/:username', - name: 'user', + name: 'profile', // [!code highlight] component: User } ] ``` -To link to a named route, you can pass an object to the `router-link` component's `to` prop: +We can then use the `name` instead of the `path` when passing the `to` prop to ``: ```vue-html - - User + + User profile ``` -This is the exact same object used programmatically with `router.push()`: +The example above would create a link to `/user/erina`. -```js -router.push({ name: 'user', params: { username: 'erina' } }) -``` +- [See it in the Playground](https://play.vuejs.org/#eNqtVVtP2zAU/itWNqlFauNNIB6iUMEQEps0NjH2tOzBtKY1JLZlO6VTlP++4+PcelnFwyRofe7fubaKCiZk/GyjJBKFVsaRiswNZ45faU1q8mRUQUbrko8yuaPwlRfK/LkV1sHXpGHeq9JxMzScGmT19t5xkMaUaR1vOb9VBe+kntgWXz2Cs06O1LbCTwvRW7knGnEm50paRwIYcrEFd1xlkpBVyCQ5lN74ZOJV0Nom5JcnCFRCM7dKyIiOJkSygsNzBZiBmivAI7l0SUipRvuhCfPge7uWHBiGZPctS0iLJv7T2/YutFFPIt+JjgUJPn7DZ32CtWg7PIZ/4BASg7txKE6gC1VKNx69gw6NTqJJ1HQK5iR1vNA52M+8Yrr6OLuD+AuCtbQpBQYK9Oy6NAZAhLI1KKuKvEc69jSp65Tqw/oh3V7f00P9MsdveOWiecE75DDNhXwhiVMXWVRttYbUWdRpE2xOZ0sHxq1v2jl/a5jQyZ042Mv/HKjvt2aGFTCXFWmnAsTcCMkAxw4SHIjG9E2AUtpUusWyFvyVUGCltBsFmJB2W/dHZCHWswdYLwJ/XiulnrNr323zcQeodthDuAHTgmm4aEqCH1zsrBHYLIISheyyqD9Nnp1FK+e0TSgtpX5ZxrBBtNe4PItP4w8Q07oBN+a2mD4a9erPzDN4bzY1iy5BiS742imV2ynT4l8h9hQvz+Pz+COU/pGCdyrkgm/Qt3ddw/5Cms7CLXsSy50k/dJDT8037QTcuq1kWZ6r1y/Ic6bkHdD5is9fDvCf7SZA/m44ZLfmg+QcM0vugvjmxx3fwLsTFmpRwlwdE95zq/LSYwxqn0q5ANgDPUT7GXsm5PLB3mwcl7ZNygPFaqA+NvL6SOo93NP4bFDF9sfh+LThtgxvkF80fyxxy/Ac7U9i/RcYNWrd). + +Using a `name` has various advantages: -In both cases, the router will navigate to the path `/user/erina`. +- No hardcoded URLs. +- Automatic encoding of `params`. +- Avoids URL typos. +- Bypassing path ranking, e.g. to display a lower-ranked route that matches the same path. -Full example [here](https://github.com/vuejs/vue-router/blob/dev/examples/named-routes/app.js). + -Each name **must be unique** across all routes. If you add the same name to multiple routes, the router will only keep the last one. You can read more about this [in the Dynamic Routing](../advanced/dynamic-routing.md#Removing-routes) section. +Each name **must be unique** across all routes. If you add the same name to multiple routes, the router will only keep the last one. You can read more about this [in the Dynamic Routing](../advanced/dynamic-routing#Removing-routes) section. + +There are various other parts of Vue Router that can be passed a location, e.g. the methods `router.push()` and `router.replace()`. We'll go into more detail about those methods in the guide to [programmatic navigation](./navigation). Just like the `to` prop, these methods also support passing a location by `name`: + +```js +router.push({ name: 'profile', params: { username: 'erina' } }) +``` diff --git a/packages/docs/guide/essentials/named-views.md b/packages/docs/guide/essentials/named-views.md index 917b73bc5..03ca222ec 100644 --- a/packages/docs/guide/essentials/named-views.md +++ b/packages/docs/guide/essentials/named-views.md @@ -8,9 +8,9 @@ Sometimes you need to display multiple views at the same time instead of nesting them, e.g. creating a layout with a `sidebar` view and a `main` view. This is where named views come in handy. Instead of having one single outlet in your view, you can have multiple and give each of them a name. A `router-view` without a name will be given `default` as its name. ```vue-html - - - + + + ``` A view is rendered by using a component, therefore multiple views require @@ -78,17 +78,22 @@ Then you can achieve the layout above with this route configuration: path: '/settings', // You could also have named views at the top component: UserSettings, - children: [{ - path: 'emails', - component: UserEmailsSubscriptions - }, { - path: 'profile', - components: { - default: UserProfile, - helper: UserProfilePreview + children: [ + { + path: 'emails', + component: UserEmailsSubscriptions + }, + { + path: 'profile', + components: { + default: UserProfile, + helper: UserProfilePreview + } } - }] + ] } ``` A working demo of this example can be found [here](https://codesandbox.io/s/nested-named-views-vue-router-4-examples-re9yl?&initialpath=%2Fsettings%2Femails). + + diff --git a/packages/docs/guide/essentials/navigation.md b/packages/docs/guide/essentials/navigation.md index 70a8131b4..070c071d0 100644 --- a/packages/docs/guide/essentials/navigation.md +++ b/packages/docs/guide/essentials/navigation.md @@ -111,3 +111,5 @@ You may have noticed that `router.push`, `router.replace` and `router.go` are co Therefore, if you are already familiar with [Browser History APIs](https://developer.mozilla.org/en-US/docs/Web/API/History_API), manipulating history will feel familiar when using Vue Router. It is worth mentioning that Vue Router navigation methods (`push`, `replace`, `go`) work consistently no matter the `history` option passed when creating the router instance. + + diff --git a/packages/docs/guide/essentials/nested-routes.md b/packages/docs/guide/essentials/nested-routes.md index 6a8ec20f4..e966da535 100644 --- a/packages/docs/guide/essentials/nested-routes.md +++ b/packages/docs/guide/essentials/nested-routes.md @@ -8,30 +8,38 @@ Some applications' UIs are composed of components that are nested multiple levels deep. In this case, it is very common that the segments of a URL correspond to a certain structure of nested components, for example: ``` -/user/johnny/profile /user/johnny/posts -+------------------+ +-----------------+ -| User | | User | -| +--------------+ | | +-------------+ | -| | Profile | | +------------> | | Posts | | -| | | | | | | | -| +--------------+ | | +-------------+ | -+------------------+ +-----------------+ +/user/johnny/profile /user/johnny/posts +┌──────────────────┐ ┌──────────────────┐ +│ User │ │ User │ +│ ┌──────────────┐ │ │ ┌──────────────┐ │ +│ │ Profile │ │ ────────────> │ │ Posts │ │ +│ │ │ │ │ │ │ │ +│ └──────────────┘ │ │ └──────────────┘ │ +└──────────────────┘ └──────────────────┘ ``` With Vue Router, you can express this relationship using nested route configurations. Given the app we created in the last chapter: -```html -
- -
+```vue + + +``` + +```vue + + ``` ```js -const User = { - template: '
User {{ $route.params.id }}
', -} +import User from './User.vue' // these are passed to `createRouter` const routes = [{ path: '/user/:id', component: User }] @@ -39,15 +47,14 @@ const routes = [{ path: '/user/:id', component: User }] The `` here is a top-level `router-view`. It renders the component matched by a top level route. Similarly, a rendered component can also contain its own, nested ``. For example, if we add one inside the `User` component's template: -```js -const User = { - template: ` -
-

User {{ $route.params.id }}

- -
- `, -} +```vue + + ``` To render components into this nested `router-view`, we need to use the `children` option in any of the routes: @@ -99,6 +106,8 @@ const routes = [ A working demo of this example can be found [here](https://codesandbox.io/s/nested-views-vue-router-4-examples-hl326?initialpath=%2Fusers%2Feduardo). + + ## Nested Named Routes When dealing with [Named Routes](./named-routes.md), you usually **name the children routes**: @@ -128,3 +137,24 @@ const routes = [ }, ] ``` + +## Omitting parent components + +We can also take advantage of the parent-child relationship between routes without needing to nest route components. This can be useful for grouping together routes with a common path prefix, or when working with more advanced features, such as [per-route navigation guards](../advanced/navigation-guards#Per-Route-Guard) or [route meta fields](../advanced/meta). + +To achieve this, we omit the `component` and `components` options from the parent route: + +```js +const routes = [ + { + path: '/admin', + children: [ + { path: '', component: AdminOverview }, + { path: 'users', component: AdminUserList }, + { path: 'users/:id', component: AdminUserDetails }, + ], + }, +] +``` + +As the parent doesn't specify a route component, the top-level `` will skip over the parent and just use the component from the relevant child instead. diff --git a/packages/docs/guide/essentials/passing-props.md b/packages/docs/guide/essentials/passing-props.md index 65bfb85bd..88c473baa 100644 --- a/packages/docs/guide/essentials/passing-props.md +++ b/packages/docs/guide/essentials/passing-props.md @@ -5,26 +5,74 @@ title="Learn how to pass props to route components" /> -Using `$route` in your component creates a tight coupling with the route which limits the flexibility of the component as it can only be used on certain URLs. While this is not necessarily a bad thing, we can decouple this behavior with a `props` option: +Using `$route` or `useRoute()` in your component creates a tight coupling with the route which limits the flexibility of the component as it can only be used on certain URLs. While this is not necessarily a bad thing, we can decouple this behavior with a `props` option. -We can replace +Let's return to our earlier example: + +```vue + + +``` + +with: ```js -const User = { - template: '
User {{ $route.params.id }}
' +import User from './User.vue' + +// these are passed to `createRouter` +const routes = [ + { path: '/users/:id', component: User }, +] +``` + +We can remove the direct dependency on `$route` in `User.vue` by declaring a prop instead: + +::: code-group + +```vue [Composition API] + + + + +``` + +```vue [Options API] + + + + ``` -with +::: + +We can then configure the route to pass the `id` param as a prop by setting `props: true`: ```js -const User = { - // make sure to add a prop named exactly like the route param - props: ['id'], - template: '
User {{ id }}
' -} -const routes = [{ path: '/user/:id', component: User, props: true }] +const routes = [ + { path: '/user/:id', component: User, props: true } +] ``` This allows you to use the component anywhere, which makes the component easier to reuse and test. @@ -95,3 +143,5 @@ You can also pass any props via the [`` slot](../advanced/router-vie ::: warning In this case, **all view components** will receive `view-prop`. This is usually not a good idea as it means that all of the view components have declared a `view-prop` prop, which is not necessarily true. If possible, use any of the options above. ::: + + diff --git a/packages/docs/guide/essentials/redirect-and-alias.md b/packages/docs/guide/essentials/redirect-and-alias.md index 5bbb87fa3..48df9e376 100644 --- a/packages/docs/guide/essentials/redirect-and-alias.md +++ b/packages/docs/guide/essentials/redirect-and-alias.md @@ -54,9 +54,7 @@ const routes = [ path: '/users/:id/posts', redirect: to => { // the function receives the target route as the argument - // a relative location doesn't start with `/` - // or { path: 'profile'} - return 'profile' + return to.path.replace(/posts$/, 'profile') }, }, ] @@ -111,3 +109,5 @@ const routes = [ ``` **Note about SEO**: when using aliases, make sure to [define canonical links](https://support.google.com/webmasters/answer/139066?hl=en). + + diff --git a/packages/docs/guide/essentials/route-matching-syntax.md b/packages/docs/guide/essentials/route-matching-syntax.md index 52f8812a7..b18244983 100644 --- a/packages/docs/guide/essentials/route-matching-syntax.md +++ b/packages/docs/guide/essentials/route-matching-syntax.md @@ -24,7 +24,7 @@ const routes = [ ] ``` -But in some scenarios we don't want to add that static section `/o`/`p`. However, `orderId` is always a number while `productName` can be anything, so we can specify a custom regex for a param in parentheses: +But in some scenarios, we don't want to add that static section `/o` or `/p`. However, `orderId` is always a number while `productName` can be anything so we can specify a custom regex for a param in parentheses: ```js const routes = [ @@ -80,7 +80,7 @@ const routes = [ ] ``` -## Sensitive and strict route options +## Sensitive and strict route options By default, all routes are case-insensitive and match routes with or without a trailing slash. e.g. a route `/users` matches `/users`, `/users/`, and even `/Users/`. This behavior can be configured with the `strict` and `sensitive` options, they can be set both at a router and route level: @@ -114,6 +114,37 @@ const routes = [ Note that `*` technically also marks a parameter as optional but `?` parameters cannot be repeated. +If the route segment contains more than **just an optional parameter**, it won't match a path **without the trailing slash**. For example: + +- `/users/:uid?-:name?` won't match `/users`, only `/users/-` or even `/users/-/` +- `/users/:uid(\\d+)?:name?` won't match `/users`, only `/users/`, `/users/2`, `/users/2/`, etc + +You can play around with the matching syntax [in the playground](https://paths.esm.dev/?p=AAMsIPQg4AoKzidgQFoEXAmw-IEBBRYYOE0SkABTASiz1qgBpgQA1QTsFjAb3h2onsmlAmGIFsCXjXh4AIA.&t=/users/2/#) + ## Debugging If you need to dig how your routes are transformed into a regex to understand why a route isn't being matched or, to report a bug, you can use the [path ranker tool](https://paths.esm.dev/?p=AAMeJSyAwR4UbFDAFxAcAGAIJXMAAA..#). It supports sharing your routes through the URL. + + + +## Avoiding slow regex + +When using custom regex, make sure to avoid using slow regex patterns. For example, using `.*` will match any character and can lead to **serious performance issues** if it's combined with a repeatable modifier `*` or `+` and anything after it: + +```ts +const routes = [ + // This creates a very slow regex because of the greedy `.*` followed by `*` and a static string + { path: '/:pathMatch(.*)*/something-at-the-end' }, +] +``` + +In practice, use these _match everything_ params only **in the very end of the URL**. If you need them in the middle of the path, **do not make them repeatable**: + +```ts +const routes = [ + // This is fine because the `.*` is at the end + { path: '/:pathMatch(.*)/something-at-the-end' }, +] +``` + +This matches the same routes but without an array of params and it's much faster. diff --git a/packages/docs/guide/index.md b/packages/docs/guide/index.md index 2d826e71e..383780d5e 100644 --- a/packages/docs/guide/index.md +++ b/packages/docs/guide/index.md @@ -4,98 +4,207 @@ href="https://vueschool.io/courses/vue-router-4-for-everyone" title="Learn how to build powerful Single Page Applications with the Vue Router on Vue School">Watch a Free Vue Router Video Course
-Creating a Single-page Application with Vue + Vue Router feels natural: with Vue.js, we are already composing our application with components. When adding Vue Router to the mix, all we need to do is map our components to the routes and let Vue Router know where to render them. Here's a basic example: +Vue Router is the official client-side routing solution for Vue. -## HTML +Client-side routing is used by single-page applications (SPAs) to tie the browser URL to the content seen by the user. As users navigate around the application, the URL updates accordingly, but the page doesn't need to be reloaded from the server. -```html - - +Vue Router is built on Vue's component system. You configure **routes** to tell Vue Router which components to show for each URL path. -
+This guide will assume that you are already familiar with Vue itself. You don't need to be a Vue expert, but you may occasionally need to refer back to [the core Vue documentation](https://vuejs.org/) for more information about certain features. + + + +## An example + +To introduce some of the main ideas, we're going to consider this example: + +- [Vue Playground example](https://play.vuejs.org/#eNqFVVtv2zYU/itn6gArmC05btEHTXXTFcWyYZeiLfYy7UGWji02EsmRlOPA8H/fIambnaRD4Fg61++c7yN9DJqc8eirDpKANVIoA0coFOYG30kJJ9gq0cBs3+Is412AEq1B1Xmi2L+ObpvX+3IpI5+b8aFqSJ+rjANErcbQp/v3RrTchLMXlDa7CuZBl07YUoONrCl/bQPT6np9i3UtbLPv0phenVm6L3rQRgm+W79vlULeIQaZmypJ484HxyN87xzRtq3rj+SE08mViX2dlOf7vuAnh/I3xu/AiDdZEGfB+mdBz3ArGkzj0f9sRr4hy5D2zr49ykvjvmdqeTmv9RfDe4i7uM6dxsNiaF9+l0+y+Ts2Qj3cMm3oa94Zfd0py4uBzYFPO6Br3ZPaGzpme9rtQGdxg2WUgOC6Y0PDG/jbjnL0vMAsnhEsQcU4UZaMbU/z8zC3x/PYsbcN/ueilaJW03nDoy1Y+VUkT+0nvHI9PVB6PJE8M44HN2iJ27yt+9q09ek+rFR1oZg0RM5FgmvboKlEqRP/BrATX4SDH171JgBD4CIvThXJVldhP7Y7J9DtxP4nxZKk+470cnFQVuseHh2TlTduWmMEh5uiZsUdSXPAcKlOH/hIZmfEjhODRtPaozNKjyiiGcqn75Ej0Pl3lMyHp2fFeMHnEB/SRia+ict6ep/GXBWV1UGHyGtgh5O1K0KvuC8T/duieoi6tLdvYUYg+rXTmKH3jLmeKoW0owLDI7h8IrnvfAKrIargxfQ/lA0LHjmr8w3W3X3w2dVMIGWchoH9ohEl1pFRrCE2fccsgCY/1Mh3piLjaknc+pujr3TOqedk0eSSrg/BiVU3WtY5dBYMks2CkRtrzoLKGKmTOG65vNtFtON4jLh5Fb2MlnFJJ2tijVA3i40S99rdV1ngNmtr31BQXOLeCFHrRS7Zcy0eBd68jl5H13HNNjFVjxkv8eBq94unMY0mQWzZ7mJIKwtWo/pTGkaCORs2p9+Z+1+dzagWB6BFhcXdE/av+uAhf1RI0+1xMpzJFWnOuz98/gMP9Dw4icW2puhvOD+hFnVrMfqwn1peEuxJnEP7i+OM8d0X/eFgkOt+KAt0FLIj8v03Rh/hvoxeTbaozUONOiq0/aGhX6w5aY1xn7cRqkSVwEoegMCyEl4sl8sf3d1H5RhfbATdKk0C10t5cHaZlyWBHSzUJeNUFtaQww/08Tenz65xSzf+NLJaTTuP5UcARVFMACSwpL9VVyE4/QesCg/V) + +Let's start by looking at the root component, `App.vue`. + +### App.vue + +```vue + ``` -### `router-link` +This template is using two components provided by Vue Router, `RouterLink` and `RouterView`. -Note how instead of using regular `a` tags, we use a custom component `router-link` to create links. This allows Vue Router to change the URL without reloading the page, handle URL generation as well as its encoding. We will see later how to benefit from these features. +Instead of using regular `` tags, we use the custom component `RouterLink` to create links. This allows Vue Router to change the URL without reloading the page, handle URL generation, encoding, and various other features. We'll go into more detail about `RouterLink` in later sections of the guide. -### `router-view` +The `RouterView` component tells Vue Router where to render the current **route component**. That's the component that corresponds to the current URL path. It doesn't have to be in `App.vue`, you can put it anywhere to adapt it to your layout, but it does need to be included somewhere, otherwise Vue Router won't render anything. -`router-view` will display the component that corresponds to the URL. You can put it anywhere to adapt it to your layout. +The example above also uses {{ $route.fullPath }}. You can use `$route` in your component templates to access an object that represents the current route. -## JavaScript +### Creating the router instance + +The router instance is created by calling the function `createRouter()`: ```js -// 1. Define route components. -// These can be imported from other files -const Home = { template: '
Home
' } -const About = { template: '
About
' } - -// 2. Define some routes -// Each route should map to a component. -// We'll talk about nested routes later. +import { createMemoryHistory, createRouter } from 'vue-router' + +import HomeView from './HomeView.vue' +import AboutView from './AboutView.vue' + const routes = [ - { path: '/', component: Home }, - { path: '/about', component: About }, + { path: '/', component: HomeView }, + { path: '/about', component: AboutView }, ] -// 3. Create the router instance and pass the `routes` option -// You can pass in additional options here, but let's -// keep it simple for now. -const router = VueRouter.createRouter({ - // 4. Provide the history implementation to use. We are using the hash history for simplicity here. - history: VueRouter.createWebHashHistory(), - routes, // short for `routes: routes` +const router = createRouter({ + history: createMemoryHistory(), + routes, }) +``` -// 5. Create and mount the root instance. -const app = Vue.createApp({}) -// Make sure to _use_ the router instance to make the -// whole app router-aware. -app.use(router) +The `routes` option defines the routes themselves, mapping URL paths to components. The component specified by the `component` option is the one that will be rendered by the `` in our earlier `App.vue`. These route components are sometimes referred to as _views_, though they are just normal Vue components. -app.mount('#app') +It's worth noting that if you want to use _functional components_ as route components, you must give them a `displayName` so they can be differentiated from [lazy loaded routes](./advanced/lazy-loading.md): + +```ts +const AboutPage: FunctionalComponent = () => { + return h('h1', {}, 'About') +} +AboutPage.displayName = 'AboutPage' +``` + +Routes support various other options that we'll see later in the guide, but for now we only need `path` and `component`. + +The `history` option controls how routes are mapped onto URLs and vice versa. For the Playground example we're using `createMemoryHistory()`, which ignores the browser URL entirely and uses its own internal URL instead. That works well for the Playground, but it's unlikely to be what you'd want in a real application. Typically, you'd want to use `createWebHistory()` instead, or perhaps `createWebHashHistory()`. We'll cover that topic in more detail in the guide to [History modes](./essentials/history-mode). -// Now the app has started! +### Registering the router plugin + +Once we've created our router instance, we need to register it as a plugin by calling `use()` on our application: + +```js +createApp(App).use(router).mount('#app') +``` + +Or, equivalently: + +```js +const app = createApp(App) +app.use(router) +app.mount('#app') ``` -By calling `app.use(router)`, we are triggering the initial navigation and giving access to `this.$router` as well as the current route as `this.$route` inside of any component: +Like with most Vue plugins, the call to `use()` needs to happen before the call to `mount()`. + +If you're curious about what this plugin does, some of its responsibilities include: + +1. [Globally registering](https://vuejs.org/guide/components/registration.html#global-registration) the `RouterView` and `RouterLink` components. +2. Adding the global `$router` and `$route` properties. +3. Enabling the `useRouter()` and `useRoute()` composables. +4. Triggering the router to resolve the initial route. + +### Accessing the router and current route + +You'll likely want to access the router from elsewhere in your application. + +If you're exporting the router instance from an ES module, you could import the router instance directly where you need it. In some cases this is the best approach, but we have other options if we're inside a component. + +In component templates, the router instance is exposed as `$router`. This is similar to the `$route` property we saw earlier, but note the extra `r` on the end. + +If we're using the Options API, we can access these same two properties as `this.$router` and `this.$route` in our JavaScript code. The `HomeView.vue` component in the Playground example accesses the router that way: ```js -// Home.vue export default { - computed: { - username() { - // We will see what `params` is shortly - return this.$route.params.username - }, - }, methods: { - goToDashboard() { - if (isAuthenticated) { - this.$router.push('/dashboard') - } else { - this.$router.push('/login') - } + goToAbout() { + this.$router.push('/about') }, }, } ``` -To access the router or the route inside the `setup` function, call the `useRouter` or `useRoute` functions. We will learn more about this in [the Composition API](./advanced/composition-api.md#Accessing-the-Router-and-current-Route-inside-setup) +This method is calling `push()`, which is used for [programmatic navigation](./essentials/navigation). We'll learn more about that later. + +With the Composition API, we don't have access to the component instance via `this`, so Vue Router includes some composables that we can use instead. `AboutView.vue` in the Playground example is using that approach: + +```vue + +``` + +It's not necessary to understand all of that code right now. The key thing to notice is that the composables `useRouter()` and `useRoute()` are used to access the router instance and current route respectively. + +### Next steps + +If you'd like to see a complete example using Vite, you can use the [create-vue](https://github.com/vuejs/create-vue) scaffolding tool, which has the option to include Vue Router in its example project: + +::: code-group + +```bash [npm] +npm create vue@latest +``` + +```bash [yarn] +yarn create vue +``` + +```bash [pnpm] +pnpm create vue +``` + +::: + +The example project created by create-vue uses similar features to the ones we've seen here. You may find that a useful starting point for exploring the features introduced in the next few pages of this guide. + +## Conventions in this guide + +### Single-File Components + +Vue Router is most commonly used in applications built using a bundler (e.g. Vite) and [SFCs](https://vuejs.org/guide/introduction.html#single-file-components) (i.e. `.vue` files). Most of the examples in this guide will be written in that style, but Vue Router itself doesn't require you to use build tools or SFCs. + +For example, if you're using the _global builds_ of [Vue](https://vuejs.org/guide/quick-start.html#using-vue-from-cdn) and [Vue Router](../installation#Direct-Download-CDN), the libraries are exposed via global objects, rather than imports: + +```js +const { createApp } = Vue +const { createRouter, createWebHistory } = VueRouter +``` + +### Component API style + +Vue Router can be used with both the Composition API and the Options API. Where relevant, the examples in this guide will show components written in both styles. Composition API examples will typically use ` ``` -`route` 对象是一个响应式对象,所以它的任何属性都可以被监听,但你应该**避免监听整个 `route`** 对象。在大多数情况下,你应该直接监听你期望改变的参数。 +`route` 对象是一个响应式对象。在多数情况下,你应该**避免监听整个 `route`** 对象,同时直接监听你期望改变的参数。 -```js + + +```vue + ``` -请注意,在模板中我们仍然可以访问 `$router` 和 `$route`,所以不需要在 `setup` 中返回 `router` 或 `route`。 +请注意,在模板中我们仍然可以访问 `$router` 和 `$route`,所以如果你只在模板中使用这些对象的话,是不需要 `useRouter` 或 `useRoute` 的。 ## 导航守卫 -虽然你仍然可以通过 `setup` 函数来使用组件内的导航守卫,但 Vue Router 将更新和离开守卫作为 组合式 API 函数公开: +Vue Router 将更新和离开守卫作为组合式 API 函数公开: -```js +```vue + ``` 组合式 API 守卫也可以用在任何由 `` 渲染的组件中,它们不必像组件内守卫那样直接用在路由组件上。 @@ -94,40 +90,34 @@ export default { Vue Router 将 RouterLink 的内部行为作为一个组合式函数 (composable) 公开。它接收一个类似 `RouterLink` 所有 prop 的响应式对象,并暴露底层属性来构建你自己的 `RouterLink` 组件或生成自定义链接: -```js +```vue + ``` 注意在 RouterLink 的 `v-slot` 中可以访问与 `useLink` 组合式函数相同的属性。 diff --git a/packages/docs/zh/guide/advanced/data-fetching.md b/packages/docs/zh/guide/advanced/data-fetching.md index 521a6396f..8d4f94c90 100644 --- a/packages/docs/zh/guide/advanced/data-fetching.md +++ b/packages/docs/zh/guide/advanced/data-fetching.md @@ -1,5 +1,7 @@ # 数据获取 + + 有时候,进入某个路由后,需要从服务器获取数据。例如,在渲染用户信息时,你需要从服务器获取用户的数据。我们可以通过两种方式来实现: - **导航完成之后获取**:先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示“加载中”之类的指示。 @@ -10,11 +12,13 @@ ## 导航完成后获取数据 -当你使用这种方式时,我们会马上导航和渲染组件,然后在组件的 created 钩子中获取数据。这让我们有机会在数据获取期间展示一个 loading 状态,还可以在不同视图间展示不同的 loading 状态。 +当你使用这种方式时,我们会马上导航和渲染组件,然后在组件中获取数据。这让我们有机会在数据获取期间展示一个 loading 状态,还可以在不同视图间展示不同的 loading 状态。 + +假设我们有一个 `Post` 组件,需要基于 `route.params.id` 获取文章数据: -假设我们有一个 `Post` 组件,需要基于 `$route.params.id` 获取文章数据: +::: code-group -```html +```vue [Composition API] + + ``` -```js +```vue [Options API] + + + ``` +::: + ## 在导航完成前获取数据 通过这种方式,我们在导航转入新的路由前获取数据。我们可以在接下来的组件的 `beforeRouteEnter` 守卫中获取数据,当数据获取成功后只调用 `next` 方法: @@ -81,28 +131,27 @@ export default { } }, beforeRouteEnter(to, from, next) { - getPost(to.params.id, (err, post) => { - // `setData` 方法定义在下面的代码中 - next(vm => vm.setData(err, post)) - }) + try { + const post = await getPost(to.params.id) + // `setPost` 方法定义在下面的代码中 + next(vm => vm.setPost(post)) + } catch (err) { + // `setError` 方法定义在下面的代码中 + next(vm => vm.setError(err)) + } }, // 路由改变前,组件就已经渲染完了 // 逻辑稍稍不同 async beforeRouteUpdate(to, from) { this.post = null - try { - this.post = await getPost(to.params.id) - } catch (error) { - this.error = error.toString() - } + getPost(to.params.id).then(this.setPost).catch(this.setError) }, methods: { - setData(error, post) { - if (error) { - this.error = error - } else { - this.post = post - } + setPost(post) { + this.post = post + }, + setError(err) { + this.error = err.toString() } } } diff --git a/packages/docs/zh/guide/advanced/dynamic-routing.md b/packages/docs/zh/guide/advanced/dynamic-routing.md index 380b7f22a..3c0ceb2a5 100644 --- a/packages/docs/zh/guide/advanced/dynamic-routing.md +++ b/packages/docs/zh/guide/advanced/dynamic-routing.md @@ -30,12 +30,14 @@ router.addRoute({ path: '/about', component: About }) ```js router.addRoute({ path: '/about', component: About }) -// 我们也可以使用 this.$route 或 route = useRoute() (在 setup 中) +// 我们也可以使用 this.$route 或 useRoute() router.replace(router.currentRoute.value.fullPath) ``` 记住,如果你需要等待新的路由显示,可以使用 `await router.replace()`。 + + ## 在导航守卫中添加路由 如果你决定在导航守卫内部添加或删除路由,你不应该调用 `router.replace()`,而是通过返回新的位置来触发重定向: @@ -50,7 +52,7 @@ router.beforeEach(to => { }) ``` -上面的例子有两个假设:第一,新添加的路由记录将与 `to` 位置相匹配,实际上导致与我们试图访问的位置不同。第二,`hasNecessaryRoute()` 在添加新的路由后返回 `false`,以避免无限重定向。 +上面的例子有两个假设:第一,新添加的路由记录将与 `to` 位置相匹配,实际上导致与我们试图访问的位置不同。第二,`hasNecessaryRoute()` 在添加新的路由后返回 `true`,以避免无限重定向。 因为是在重定向中,所以我们是在替换将要跳转的导航,实际上行为就像之前的例子一样。而在实际场景中,添加路由的行为更有可能发生在导航守卫之外,例如,当一个视图组件挂载时,它会注册新的路由。 diff --git a/packages/docs/zh/guide/advanced/extending-router-link.md b/packages/docs/zh/guide/advanced/extending-router-link.md index 572302447..a7d931d32 100644 --- a/packages/docs/zh/guide/advanced/extending-router-link.md +++ b/packages/docs/zh/guide/advanced/extending-router-link.md @@ -9,7 +9,28 @@ RouterLink 组件提供了足够的 `props` 来满足大多数基本应用程序 让我们扩展 RouterLink 来处理外部链接,并在 `AppLink.vue` 文件中添加一个自定义的 `inactive-class`: -```vue +::: code-group + +```vue [Composition API] + + +``` +```vue [Options API] + + ``` +::: + 如果你喜欢使用渲染函数或创建 `computed` 属性,你可以使用 [Composition API](./composition-api.md) 中的 `useLink` : ```js @@ -78,6 +124,8 @@ export default { } ``` + + 在实践中,你可能希望将你的 `AppLink` 组件用于应用程序的不同部分。例如,使用 [Tailwind CSS](https://tailwindcss.com),你可以用所有的类创建一个 `NavLink.vue` 组件: ```vue diff --git a/packages/docs/zh/guide/advanced/lazy-loading.md b/packages/docs/zh/guide/advanced/lazy-loading.md index 80e2829d2..25990345e 100644 --- a/packages/docs/zh/guide/advanced/lazy-loading.md +++ b/packages/docs/zh/guide/advanced/lazy-loading.md @@ -7,7 +7,7 @@ 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效。 -Vue Router 支持开箱即用的[动态导入](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports),这意味着你可以用动态导入代替静态导入: +Vue Router 支持开箱即用的[动态导入](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import),这意味着你可以用动态导入代替静态导入: ```js // 将 @@ -27,6 +27,8 @@ const router = createRouter({ `component` (和 `components`) 配置接收一个返回 Promise 组件的函数,Vue Router **只会在第一次进入页面时才会获取这个函数**,然后使用缓存数据。这意味着你也可以使用更复杂的函数,只要它们返回一个 Promise : + + ```js const UserDetails = () => Promise.resolve({ @@ -63,7 +65,7 @@ webpack 会将任何一个异步模块与相同的块名称组合到相同的异 ### 使用 Vite -在Vite中,你可以在[`rollupOptions`](https://vitejs.dev/config/#build-rollupoptions)下定义分块: +在Vite中,你可以在[`rollupOptions`](https://cn.vite.dev/config/build-options.html#build-rollupoptions)下定义分块: ```js // vite.config.js diff --git a/packages/docs/zh/guide/advanced/meta.md b/packages/docs/zh/guide/advanced/meta.md index 939d5df09..c8a92db78 100644 --- a/packages/docs/zh/guide/advanced/meta.md +++ b/packages/docs/zh/guide/advanced/meta.md @@ -38,7 +38,7 @@ const routes = [ 例如,根据上面的路由配置,`/posts/new` 这个 URL 将会匹配父路由记录 (`path: '/posts'`) 以及子路由记录 (`path: 'new'`)。 -一个路由匹配到的所有路由记录会暴露为 `$route` 对象(还有在导航守卫中的路由对象)的`$route.matched` 数组。我们需要遍历这个数组来检查路由记录中的 `meta` 字段,但是 Vue Router 还为你提供了一个 `$route.meta` 方法,它是一个非递归合并**所有 `meta`** 字段(从父字段到子字段)的方法。这意味着你可以简单地写 +一个路由匹配到的所有路由记录会暴露为 `route` 对象(还有在导航守卫中的路由对象)的`route.matched` 数组。我们需要遍历这个数组来检查路由记录中的 `meta` 字段,但是 Vue Router 还为你提供了一个 `route.meta` 方法,它是一个非递归合并**所有 `meta`** 字段(从父字段到子字段)的方法。这意味着你可以简单地写 ```js router.beforeEach((to, from) => { @@ -56,6 +56,8 @@ router.beforeEach((to, from) => { }) ``` + + ## TypeScript 也可以继承来自 `vue-router` 中的 `RouteMeta` 来为 meta 字段添加类型: diff --git a/packages/docs/zh/guide/advanced/navigation-failures.md b/packages/docs/zh/guide/advanced/navigation-failures.md index fccc55941..e2710a9e2 100644 --- a/packages/docs/zh/guide/advanced/navigation-failures.md +++ b/packages/docs/zh/guide/advanced/navigation-failures.md @@ -33,6 +33,8 @@ this.isMenuOpen = false 如果导航被阻止,导致用户停留在同一个页面上,由 `router.push` 返回的 `Promise` 的解析值将是 _Navigation Failure_。否则,它将是一个 _falsy_ 值(通常是 `undefined`)。这样我们就可以区分我们导航是否离开了当前位置: + + ```js const navigationResult = await router.push('/my-profile') @@ -62,8 +64,6 @@ if (isNavigationFailure(failure, NavigationFailureType.aborted)) { 如果你忽略第二个参数: `isNavigationFailure(failure)`,那么就只会检查这个 `failure` 是不是一个 _Navigation Failure_。 ::: - - ## 全局导航故障 你可以用 [`router.afterEach()` 导航守卫](./navigation-guards.md#Global-After-Hooks)检测全局导航故障: diff --git a/packages/docs/zh/guide/advanced/navigation-guards.md b/packages/docs/zh/guide/advanced/navigation-guards.md index 7952384c3..d1d6e6259 100644 --- a/packages/docs/zh/guide/advanced/navigation-guards.md +++ b/packages/docs/zh/guide/advanced/navigation-guards.md @@ -5,6 +5,8 @@ title="Learn how to add navigation guards" /> + + 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。这里有很多方式植入路由导航中:全局的,单个路由独享的,或者组件级的。 ## 全局前置守卫 @@ -31,7 +33,7 @@ router.beforeEach((to, from) => { 可以返回的值如下: - `false`: 取消当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 `from` 路由对应的地址。 -- 一个[路由地址](../../api/#routelocationraw): 通过一个路由地址重定向到一个不同的地址,如同调用 `router.push()`,且可以传入诸如 `replace: true` 或 `name: 'home'` 之类的选项。它会中断当前的导航,同时用相同的 `from` 创建一个新导航。 +- 一个[路由地址](../../api/#Type-Aliases-RouteLocationRaw): 通过一个路由地址重定向到一个不同的地址,如同调用 `router.push()`,且可以传入诸如 `replace: true` 或 `name: 'home'` 之类的选项。它会中断当前的导航,同时用相同的 `from` 创建一个新导航。 ```js router.beforeEach(async (to, from) => { @@ -86,7 +88,7 @@ router.beforeEach((to, from, next) => { ## 全局解析守卫 -你可以用 `router.beforeResolve` 注册一个全局守卫。这和 `router.beforeEach` 类似,因为它在**每次导航**时都会触发,不同的是,解析守卫刚好会在导航被确认之前、**所有组件内守卫和异步路由组件被解析之后**调用。这里有一个例子,确保用户可以访问[自定义 meta](./meta.md) 属性 `requiresCamera` 的路由: +你可以用 `router.beforeResolve` 注册一个全局守卫。这和 `router.beforeEach` 类似,因为它在**每次导航**时都会触发,不同的是,解析守卫刚好会在导航被确认之前、**所有组件内守卫和异步路由组件被解析之后**调用。这里有一个例子,根据路由在[元信息](./meta.md)中的 `requiresCamera` 属性确保用户访问摄像头的权限: ```js router.beforeResolve(async to => { @@ -198,7 +200,28 @@ const routes = [ ] ``` -请注意,你也可以通过使用[路径 meta 字段](./meta.md)和全局导航守卫来实现类似的行为。 +当配合[嵌套路由](../essentials/nested-routes)使用时,父路由和子路由都可以使用 `beforeEnter`。如果放在父级路由上,路由在具有相同父级的子路由之间移动时,它不会被触发。例如: + +```js +const routes = [ + { + path: '/user', + beforeEnter() { + // ... + }, + children: [ + { path: 'list', component: UserList }, + { path: 'details', component: UserDetails }, + ], + }, +] +``` + +示例中的 `beforeEnter` 在 `/user/list` 和 `/user/details` 之间移动时不会被调用,因为它们共享相同的父级路由。如果我们直接将 `beforeEnter` 守卫放在 `details` 路由上,那么在这两个路由之间移动时就会被调用。 + +::: tip +你也可以通过使用[路由元信息字段](./meta.md)和全局导航守卫来实现类似的行为。 +::: ## 组件内的守卫 @@ -212,9 +235,9 @@ const routes = [ - `beforeRouteUpdate` - `beforeRouteLeave` -```js -const UserDetails = { - template: `...`, +```vue + ``` `beforeRouteEnter` 守卫 **不能** 访问 `this`,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。 @@ -265,7 +289,7 @@ beforeRouteLeave (to, from) { ### 使用组合 API -如果你正在使用[组合 API 和 `setup` 函数](https://cn.vuejs.org/api/composition-api-setup.html)来编写组件,你可以通过 `onBeforeRouteUpdate` 和 `onBeforeRouteLeave` 分别添加 update 和 leave 守卫。 请参考[组合 API 部分](./composition-api.md#导航守卫)以获得更多细节。 +如果你正在使用组合式 API 编写组件,你可以通过 `onBeforeRouteUpdate` 和 `onBeforeRouteLeave` 分别添加 update 和 leave 守卫。 请参考[组合式 API 部分](./composition-api.md#导航守卫)以获得更多细节。 ## 完整的导航解析流程 diff --git a/packages/docs/zh/guide/advanced/router-view-slot.md b/packages/docs/zh/guide/advanced/router-view-slot.md index eec3a4461..c0b352109 100644 --- a/packages/docs/zh/guide/advanced/router-view-slot.md +++ b/packages/docs/zh/guide/advanced/router-view-slot.md @@ -1,6 +1,8 @@ # RouterView 插槽 -RotuerView 组件暴露了一个插槽,可以用来渲染路由组件: + + +RouterView 组件暴露了一个插槽,可以用来渲染路由组件: ```vue-html diff --git a/packages/docs/zh/guide/advanced/scroll-behavior.md b/packages/docs/zh/guide/advanced/scroll-behavior.md index f0d77b19a..de976309c 100644 --- a/packages/docs/zh/guide/advanced/scroll-behavior.md +++ b/packages/docs/zh/guide/advanced/scroll-behavior.md @@ -1,4 +1,5 @@ # 滚动行为 + 该函数可以返回一个 [`ScrollToOptions`](https://developer.mozilla.org/en-US/docs/Web/API/ScrollToOptions) 位置对象: @@ -91,7 +94,7 @@ const router = createRouter({ behavior: 'smooth', } } - } + }, }) ``` @@ -112,3 +115,29 @@ const router = createRouter({ ``` 我们可以将其与页面级过渡组件的事件挂钩,以使滚动行为与你的页面过渡很好地结合起来,但由于使用场景可能存在的差异和复杂性,我们只是提供了这个基础来实现特定的用户场景。 + +## 高级偏移量 + +如果你的页面中有固定的导航栏或类似的元素,你可能需要设置偏移量,以确保目标元素不会被其他内容遮挡。 +使用静态偏移值并不总是有效。你可以尝试一些基于 CSS 的解决方案,比如使用 `scroll-margin` 或 `scroll-padding` 添加偏移,或者使用 `::before` 和 `::after` 伪元素。然而,这些方法有时会导致意想不到的行为。 + +在这种情况下,更好的做法是手动计算偏移量。一种简单的方法是结合 CSS 和 JavaScript 的 `getComputedStyle()`。这样每个元素都可以动态定义自己的偏移量。以下是一个示例: + +```js +const router = createRouter({ + scrollBehavior(to, from, savedPosition) { + const mainElement = document.querySelector('#main') + if (mainElement) { + const marginTop = parseFloat( + getComputedStyle(mainElement).scrollMarginTop + ) + return { + el: mainElement, + top: marginTop, + } + } else { + return { top: 0 } + } + }, +}) +``` diff --git a/packages/docs/zh/guide/advanced/transitions.md b/packages/docs/zh/guide/advanced/transitions.md index aaabd9e39..a0182c18f 100644 --- a/packages/docs/zh/guide/advanced/transitions.md +++ b/packages/docs/zh/guide/advanced/transitions.md @@ -45,6 +45,8 @@ const routes = [ ``` + + ## 基于路由的动态过渡 也可以根据目标路由和当前路由之间的关系,动态地确定使用的过渡。使用和刚才非常相似的片段: diff --git a/packages/docs/zh/guide/advanced/typed-routes.md b/packages/docs/zh/guide/advanced/typed-routes.md index 6397f1d23..8cb7edcf8 100644 --- a/packages/docs/zh/guide/advanced/typed-routes.md +++ b/packages/docs/zh/guide/advanced/typed-routes.md @@ -1,5 +1,7 @@ # 类型化路由 (v4.1.0+) + + ::: danger ‼️ 实验性功能 从 v4.1.0 开始,我们引入一个新的功能,称为类型化路由。这个**实验性**功能通过 Vite/webpack/Rollup 插件启用。 diff --git a/packages/docs/zh/guide/essentials/active-links.md b/packages/docs/zh/guide/essentials/active-links.md new file mode 100644 index 000000000..a70620dac --- /dev/null +++ b/packages/docs/zh/guide/essentials/active-links.md @@ -0,0 +1,80 @@ +# 匹配当前路由的链接 + +应用程序通常都会有一个渲染 RouterLink 列表的导航组件。我们也许想对这个列表中匹配当前路由的链接进行视觉区分。 + +RouterLink 组件会为匹配当前路由的链接添加两个 CSS 类,`router-link-active` 和 `router-link-exact-active`。要理解它们之间的区别,我们首先需要了解 Vue Router 如何判断一个链接是**匹配当前路由的**。 + +## 链接在什么时候匹配当前路由 + +当满足以下条件时,RouterLink 被认为是**匹配当前路由的**: + +1. 它与当前路径匹配相同的路由记录(即配置的路由)。 +2. 它的 `params` 与当前路径的 `params` 相同。 + +如果你使用了[嵌套路由](./nested-routes),任何指向祖先路由的链接也会被认为是匹配当前路由的,只要相关的 `params` 匹配。 + +其他路由属性,例如 [`query`](../../api/interfaces/RouteLocationNormalized#query),不会被考虑在内。 + +路径不一定需要完全匹配。例如,使用 [`alias`](./redirect-and-alias#Alias) 仍然会被认为是匹配的,只要它解析到相同的路由记录和 `params`。 + +如果一个路由有 [`redirect`](./redirect-and-alias#Redirect),在检查链接是否匹配当前路由时不会跟随重定向。 + +## 精确匹配当前路由的链接 + +**精确**匹配不包括祖先路由。 + +假设我们有以下路由: + +```js +const routes = [ + { + path: '/user/:username', + component: User, + children: [ + { + path: 'role/:roleId', + component: Role, + } + ] + } +] +``` + +然后考虑这两个链接: + +```vue-html + + User + + + Role + +``` + +如果当前路径是 `/user/erina/role/admin`,那么这两个链接都会被认为是**匹配当前路由的**,因此 `router-link-active` 类会应用于这两个链接。但只有第二个链接会被认为是**精确的**,因此只有第二个链接会有 `router-link-exact-active` 类。 + + + +## 配置类名 + +RouterLink 组件有两个属性,`activeClass` 和 `exactActiveClass`,可以用来更改应用的类名: + +```vue-html + +``` + +默认的类名也可以通过传递 `linkActiveClass` 和 `linkExactActiveClass` 选项给 `createRouter()` 来全局更改: + +```js +const router = createRouter({ + linkActiveClass: 'border-indigo-500', + linkExactActiveClass: 'border-indigo-700', + // ... +}) +``` + +参见[扩展 RouterLink](../advanced/extending-router-link) 以获取使用 `v-slot` API 进行更高级自定义的技术。 diff --git a/packages/docs/zh/guide/essentials/dynamic-matching.md b/packages/docs/zh/guide/essentials/dynamic-matching.md index 7d0646f1e..4a0b84a25 100644 --- a/packages/docs/zh/guide/essentials/dynamic-matching.md +++ b/packages/docs/zh/guide/essentials/dynamic-matching.md @@ -8,9 +8,7 @@ 很多时候,我们需要将给定匹配模式的路由映射到同一个组件。例如,我们可能有一个 `User` 组件,它应该对所有用户进行渲染,但用户 ID 不同。在 Vue Router 中,我们可以在路径中使用一个动态字段来实现,我们称之为 _路径参数_ : ```js -const User = { - template: '
User
', -} +import User from './User.vue' // 这些都会传递给 `createRouter` const routes = [ @@ -21,22 +19,25 @@ const routes = [ 现在像 `/users/johnny` 和 `/users/jolyne` 这样的 URL 都会映射到同一个路由。 -_路径参数_ 用冒号 `:` 表示。当一个路由被匹配时,它的 _params_ 的值将在每个组件中以 `this.$route.params` 的形式暴露出来。因此,我们可以通过更新 `User` 的模板来呈现当前的用户 ID: +_路径参数_ 用冒号 `:` 表示。当一个路由被匹配时,它的 _params_ 的值将在每个组件中以 `route.params` 的形式暴露出来。因此,我们可以通过更新 `User` 的模板来呈现当前的用户 ID: -```js -const User = { - template: '
User {{ $route.params.id }}
', -} +```vue + ``` 你可以在同一个路由中设置有多个 _路径参数_,它们会映射到 `$route.params` 上的相应字段。例如: -| 匹配模式 | 匹配路径 | \$route.params | +| 匹配模式 | 匹配路径 | route.params | | ------------------------------ | ------------------------ | ---------------------------------------- | | /users/:username | /users/eduardo | `{ username: 'eduardo' }` | | /users/:username/posts/:postId | /users/eduardo/posts/123 | `{ username: 'eduardo', postId: '123' }` | -除了 `$route.params` 之外,`$route` 对象还公开了其他有用的信息,如 `$route.query`(如果 URL 中存在参数)、`$route.hash` 等。你可以在 [API 参考](../../api/#routelocationnormalized)中查看完整的细节。 +除了 `route.params` 之外,`route` 对象还公开了其他有用的信息,如 `route.query`(如果 URL 中存在参数)、`route.hash` 等。你可以在 [API 参考](../../api/#routelocationnormalized)中查看完整的细节。 这个例子的 demo 可以在[这里](https://codesandbox.io/s/route-params-vue-router-examples-mlb14?from-embed&initialpath=%2Fusers%2Feduardo%2Fposts%2F1)找到。 @@ -59,32 +60,68 @@ const User = { 要对同一个组件中参数的变化做出响应的话,你可以简单地 watch `$route` 对象上的任意属性,在这个场景中,就是 `$route.params` : -```js -const User = { - template: '...', +::: code-group + +```vue [Composition API] + +``` + +```vue [Options API] + ``` -或者,使用 `beforeRouteUpdate` [导航守卫](../advanced/navigation-guards.md),它也可以取消导航: +::: -```js -const User = { - template: '...', +或者,使用 `beforeRouteUpdate` [导航守卫](../advanced/navigation-guards.md),它还允许你取消导航: + +::: code-group + +```vue [Composition API] + +``` + +```vue [Options API] + ``` +::: + ## 捕获所有路由或 404 Not found 路由 + ## 高级匹配模式 Vue Router 使用自己的路径匹配语法,其灵感来自于 `express`,因此它支持许多高级匹配模式,如可选的参数,零或多个 / 一个或多个,甚至自定义的正则匹配规则。请查看[高级匹配](./route-matching-syntax.md)文档来探索它们。 diff --git a/packages/docs/zh/guide/essentials/history-mode.md b/packages/docs/zh/guide/essentials/history-mode.md index 6410d0454..be426ed21 100644 --- a/packages/docs/zh/guide/essentials/history-mode.md +++ b/packages/docs/zh/guide/essentials/history-mode.md @@ -22,7 +22,7 @@ const router = createRouter({ }) ``` -它在内部传递的实际 URL 之前使用了一个哈希字符(`#`)。由于这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理。不过,**它在 SEO 中确实有不好的影响**。如果你担心这个问题,可以使用 HTML5 模式。 +它在内部传递的实际 URL 之前使用了一个井号(`#`)。由于这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理。不过,**它在 SEO 中确实有不好的影响**。如果你担心这个问题,可以使用 HTML5 模式。 ## Memory 模式 @@ -202,6 +202,8 @@ rewrite { } ``` + + ## 附加说明 这有一个注意事项。你的服务器将不再报告 404 错误,因为现在所有未找到的路径都会显示你的 `index.html` 文件。为了解决这个问题,你应该在你的 Vue 应用程序中实现一个万能的路由来显示 404 页面。 diff --git a/packages/docs/zh/guide/essentials/named-routes.md b/packages/docs/zh/guide/essentials/named-routes.md index 81bb0b60f..561a9b5ce 100644 --- a/packages/docs/zh/guide/essentials/named-routes.md +++ b/packages/docs/zh/guide/essentials/named-routes.md @@ -5,41 +5,43 @@ title="Learn about the named routes" /> -除了 `path` 之外,你还可以为任何路由提供 `name`。这有以下优点: - -- 没有硬编码的 URL -- `params` 的自动编码/解码。 -- 防止你在 url 中出现打字错误。 -- 绕过路径排序(如显示一个) +当创建一个路由时,我们可以选择给路由一个 `name`: ```js const routes = [ { path: '/user/:username', - name: 'user', - component: User, - }, + name: 'profile', // [!code highlight] + component: User + } ] ``` -要链接到一个命名的路由,可以向 `router-link` 组件的 `to` 属性传递一个对象: +然后我们可以使用 `name` 而不是 `path` 来传递 `to` 属性给 ``: -```html - - User +```vue-html + + User profile ``` -这跟代码调用 `router.push()` 是一回事: +上述示例将创建一个指向 `/user/erina` 的链接。 -```js -router.push({ name: 'user', params: { username: 'erina' } }) -``` +- [在演练场上查看](https://play.vuejs.org/#eNqtVVtP2zAU/itWNqlFauNNIB6iUMEQEps0NjH2tOzBtKY1JLZlO6VTlP++4+PcelnFwyRofe7fubaKCiZk/GyjJBKFVsaRiswNZ45faU1q8mRUQUbrko8yuaPwlRfK/LkV1sHXpGHeq9JxMzScGmT19t5xkMaUaR1vOb9VBe+kntgWXz2Cs06O1LbCTwvRW7knGnEm50paRwIYcrEFd1xlkpBVyCQ5lN74ZOJV0Nom5JcnCFRCM7dKyIiOJkSygsNzBZiBmivAI7l0SUipRvuhCfPge7uWHBiGZPctS0iLJv7T2/YutFFPIt+JjgUJPn7DZ32CtWg7PIZ/4BASg7txKE6gC1VKNx69gw6NTqJJ1HQK5iR1vNA52M+8Yrr6OLuD+AuCtbQpBQYK9Oy6NAZAhLI1KKuKvEc69jSp65Tqw/oh3V7f00P9MsdveOWiecE75DDNhXwhiVMXWVRttYbUWdRpE2xOZ0sHxq1v2jl/a5jQyZ042Mv/HKjvt2aGFTCXFWmnAsTcCMkAxw4SHIjG9E2AUtpUusWyFvyVUGCltBsFmJB2W/dHZCHWswdYLwJ/XiulnrNr323zcQeodthDuAHTgmm4aEqCH1zsrBHYLIISheyyqD9Nnp1FK+e0TSgtpX5ZxrBBtNe4PItP4w8Q07oBN+a2mD4a9erPzDN4bzY1iy5BiS742imV2ynT4l8h9hQvz+Pz+COU/pGCdyrkgm/Qt3ddw/5Cms7CLXsSy50k/dJDT8037QTcuq1kWZ6r1y/Ic6bkHdD5is9fDvCf7SZA/m44ZLfmg+QcM0vugvjmxx3fwLsTFmpRwlwdE95zq/LSYwxqn0q5ANgDPUT7GXsm5PLB3mwcl7ZNygPFaqA+NvL6SOo93NP4bFDF9sfh+LThtgxvkF80fyxxy/Ac7U9i/RcYNWrd)。 -在这两种情况下,路由将导航到路径 `/user/erina`。 +使用 `name` 有很多优点: -完整的例子在[这里](https://github.com/vuejs/vue-router/blob/dev/examples/named-routes/app.js). +- 没有硬编码的 URL。 +- `params` 的自动编码/解码。 +- 防止你在 URL 中出现打字错误。 +- 绕过路径排序,例如展示一个匹配相同路径但排序较低的路由。 - + -Each name **must be unique** across all routes. If you add the same name to multiple routes, the router will only keep the last one. You can read more about this [in the Dynamic Routing](../advanced/dynamic-routing.md#Removing-routes) section. +所有路由的命名**都必须是唯一的**。如果为多条路由添加相同的命名,路由器只会保留最后那一条。你可以在[动态路由](../advanced/dynamic-routing.md#Removing-routes)章节了解更多。 + +Vue Router 有很多其他部分可以传入网址,例如 `router.push()` 和 `router.replace()` 方法。我们将在[编程式导航](./navigation.md)指南中详细介绍这些方法。就像 `to` 属性一样,这些方法也支持通过 `name` 传入网址: + +```js +router.push({ name: 'user', params: { username: 'erina' } }) +``` diff --git a/packages/docs/zh/guide/essentials/named-views.md b/packages/docs/zh/guide/essentials/named-views.md index 11e8f5f18..36adc8e4b 100644 --- a/packages/docs/zh/guide/essentials/named-views.md +++ b/packages/docs/zh/guide/essentials/named-views.md @@ -7,10 +7,10 @@ 有时候想同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有 `sidebar` (侧导航) 和 `main` (主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 `router-view` 没有设置名字,那么默认为 `default`。 -```html - - - +```vue-html + + + ``` 一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件。确保正确使用 `components` 配置 (带上 **s**): @@ -90,3 +90,5 @@ const router = createRouter({ ``` 以上案例相关的可运行代码请[移步这里](https://codesandbox.io/s/nested-named-views-vue-router-4-examples-re9yl?&initialpath=%2Fsettings%2Femails). + + diff --git a/packages/docs/zh/guide/essentials/navigation.md b/packages/docs/zh/guide/essentials/navigation.md index 923519e3b..3760539a8 100644 --- a/packages/docs/zh/guide/essentials/navigation.md +++ b/packages/docs/zh/guide/essentials/navigation.md @@ -13,9 +13,7 @@ sidebarDepth: 0 ## 导航到不同的位置 - - -**Note: The examples below refer to the router instance as `router`. Inside a component, you can access the router using the `$router` property, e.g. `this.$router.push(...)`. If you're using the Composition API, the router is accessible by calling [`useRouter()`](../advanced/composition-api).** +**注意: 下面的示例中的 `router` 指代路由器实例。在组件内部,你可以使用 `$router` 属性访问路由,例如 `this.$router.push(...)`。如果使用组合式 API,你可以通过调用 [`useRouter()`](../advanced/composition-api) 来访问路由器。** 想要导航到不同的 URL,可以使用 `router.push` 方法。这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,会回到之前的 URL。 @@ -113,3 +111,5 @@ router.go(100) 因此,如果你已经熟悉 [Browser History APIs](https://developer.mozilla.org/en-US/docs/Web/API/History_API),在使用 Vue Router 时,操作历史记录就会觉得很熟悉。 值得一提的是,无论在创建路由器实例时传递什么 `history` 配置,Vue Router 的导航方法 (`push`、`replace`、`go`) 都能始终正常工作。 + + diff --git a/packages/docs/zh/guide/essentials/nested-routes.md b/packages/docs/zh/guide/essentials/nested-routes.md index 56e4fd2ae..40fd5481b 100644 --- a/packages/docs/zh/guide/essentials/nested-routes.md +++ b/packages/docs/zh/guide/essentials/nested-routes.md @@ -8,30 +8,38 @@ 一些应用程序的 UI 由多层嵌套的组件组成。在这种情况下,URL 的片段通常对应于特定的嵌套组件结构,例如: ``` -/user/johnny/profile /user/johnny/posts -+------------------+ +-----------------+ -| User | | User | -| +--------------+ | | +-------------+ | -| | Profile | | +------------> | | Posts | | -| | | | | | | | -| +--------------+ | | +-------------+ | -+------------------+ +-----------------+ +/user/johnny/profile /user/johnny/posts +┌──────────────────┐ ┌──────────────────┐ +│ User │ │ User │ +│ ┌──────────────┐ │ │ ┌──────────────┐ │ +│ │ Profile │ │ ────────────> │ │ Posts │ │ +│ │ │ │ │ │ │ │ +│ └──────────────┘ │ │ └──────────────┘ │ +└──────────────────┘ └──────────────────┘ ``` 通过 Vue Router,你可以使用嵌套路由配置来表达这种关系。 接着上节创建的 app : -```html -
- -
+```vue + + +``` + +```vue + + ``` ```js -const User = { - template: '
User {{ $route.params.id }}
', -} +import User from './User.vue' // 这些都会传递给 `createRouter` const routes = [{ path: '/user/:id', component: User }] @@ -39,15 +47,14 @@ const routes = [{ path: '/user/:id', component: User }] 这里的 `` 是一个顶层的 `router-view`。它渲染顶层路由匹配的组件。同样地,一个被渲染的组件也可以包含自己嵌套的 ``。例如,如果我们在 `User` 组件的模板内添加一个 ``: -```js -const User = { - template: ` -
-

User {{ $route.params.id }}

- -
- `, -} +```vue + + ``` 要将组件渲染到这个嵌套的 `router-view` 中,我们需要在路由中配置 `children`: @@ -99,6 +106,8 @@ const routes = [ 这个例子的 demo 可以在[这里](https://codesandbox.io/s/nested-views-vue-router-4-examples-hl326?initialpath=%2Fusers%2Feduardo)找到。 + + ## 嵌套的命名路由 在处理[命名路由](./named-routes.md)时,**你通常会给子路由命名**: @@ -128,3 +137,24 @@ const routes = [   }, ] ``` + +## 忽略父组件 + +我们还可以仅利用路由的父子关系,但不嵌套路由组件。这对于将具有公共路径前缀的路由分组在一起或使用更高级的功能时很有用,例如:[路由独享的守卫](../advanced/navigation-guards#Per-Route-Guard)或[路由元信息](../advanced/meta)。 + +为了实现这一点, 我们在父路由中省略了 `component` 和 `components` 选项 + +```js +const routes = [ + { + path: '/admin', + children: [ + { path: '', component: AdminOverview }, + { path: 'users', component: AdminUserList }, + { path: 'users/:id', component: AdminUserDetails }, + ], + }, +] +``` + +由于父级没有指定路由组件,顶级 `` 将跳过父级并仅使用子路由组件。 diff --git a/packages/docs/zh/guide/essentials/passing-props.md b/packages/docs/zh/guide/essentials/passing-props.md index c59b0b22b..8349dd6c3 100644 --- a/packages/docs/zh/guide/essentials/passing-props.md +++ b/packages/docs/zh/guide/essentials/passing-props.md @@ -5,26 +5,74 @@ title="Learn how to pass props to route components" /> -在你的组件中使用 `$route` 会与路由紧密耦合,这限制了组件的灵活性,因为它只能用于特定的 URL。虽然这不一定是件坏事,但我们可以通过 `props` 配置来解除这种行为: +在你的组件中使用 `$route` 或 `useRoute()` 会与路由紧密耦合,这限制了组件的灵活性,因为它只能用于特定的 URL。虽然这不一定是件坏事,但我们可以通过 `props` 配置来解除这种行为: -我们可以将下面的代码 +回到我们之前的示例: + +```vue + + +``` + +和: ```js -const User = { - template: '
User {{ $route.params.id }}
' +import User from './User.vue' + +// 传入 `createRouter` +const routes = [ + { path: '/users/:id', component: User }, +] +``` + +我们可以通过声明 prop 来在 `User.vue` 中删除对 `$route` 的直接依赖: + +::: code-group + +```vue [Composition API] + + + + +``` + +```vue [Options API] + + + + ``` -替换成 +::: + +然后我们可以通过设置 `props: true` 来配置路由将 `id` 参数作为 prop 传递给组件: ```js -const User = { - // 请确保添加一个与路由参数完全相同的 prop 名 - props: ['id'], - template: '
User {{ id }}
' -} -const routes = [{ path: '/user/:id', component: User, props: true }] +const routes = [ + { path: '/user/:id', component: User, props: true } +] ``` 这允许你在任何地方使用该组件,使得该组件更容易重用和测试。 @@ -79,11 +127,9 @@ URL `/search?q=vue` 将传递 `{query: 'vue'}` 作为 props 传给 `SearchUser` 请尽可能保持 `props` 函数为无状态的,因为它只会在路由发生变化时起作用。如果你需要状态来定义 props,请使用包装组件,这样 vue 才可以对状态变化做出反应。 - +## 通过 RouterView -## Via RouterView - -You can also pass any props via the [`` slot](../advanced/router-view-slot): +你还可以通过 [`` 插槽](../advanced/router-view-slot) 传递任意参数: ```vue-html @@ -95,5 +141,7 @@ You can also pass any props via the [`` slot](../advanced/router-vie ``` ::: warning -In this case, **all view components** will receive `view-prop`. This is usually not a good idea as it means that all of the view components have declared a `view-prop` prop, which is not necessarily true. If possible, use any of the options above. +在这种情况下,**所有视图组件**都会接收到 `view-prop`。通常这并不是一个好主意,因为这意味着所有的视图组件都声明了一个 `view-prop` prop,但这未必需要。所以请尽可能使用上述的其他选项。 ::: + + diff --git a/packages/docs/zh/guide/essentials/redirect-and-alias.md b/packages/docs/zh/guide/essentials/redirect-and-alias.md index aa28a0eeb..29391eff0 100644 --- a/packages/docs/zh/guide/essentials/redirect-and-alias.md +++ b/packages/docs/zh/guide/essentials/redirect-and-alias.md @@ -54,9 +54,7 @@ const routes = [ path: '/users/:id/posts', redirect: to => { // 该函数接收目标路由作为参数 - // 相对位置不以`/`开头 - // 或 { path: 'profile'} - return 'profile' + return to.path.replace(/posts$/, 'profile') }, }, ] @@ -111,3 +109,5 @@ const routes = [ ``` **关于 SEO 的注意事项**: 使用别名时,一定要[定义规范链接](https://support.google.com/webmasters/answer/139066?hl=en). + + diff --git a/packages/docs/zh/guide/essentials/route-matching-syntax.md b/packages/docs/zh/guide/essentials/route-matching-syntax.md index 372ed674a..fef89fb40 100644 --- a/packages/docs/zh/guide/essentials/route-matching-syntax.md +++ b/packages/docs/zh/guide/essentials/route-matching-syntax.md @@ -117,3 +117,5 @@ const routes = [ ## 调试 如果你需要探究你的路由是如何转化为正则的,以了解为什么一个路由没有被匹配,或者,报告一个 bug,你可以使用[路径排名工具](https://paths.esm.dev/?p=AAMeJSyAwR4UbFDAFxAcAGAIJXMAAA..#)。它支持通过 URL 分享你的路由。 + + diff --git a/packages/docs/zh/guide/index.md b/packages/docs/zh/guide/index.md index 833ff3028..ef68b15c8 100644 --- a/packages/docs/zh/guide/index.md +++ b/packages/docs/zh/guide/index.md @@ -1,100 +1,203 @@ # 入门 +href="https://vueschool.io/courses/vue-router-4-for-everyone" +title="在 Vue School 上学习如何使用 Vue Router 构建强大的单页应用">观看免费的 Vue Router 视频课程 -用 Vue + Vue Router 创建单页应用非常简单:通过 Vue.js,我们已经用组件组成了我们的应用。当加入 Vue Router 时,我们需要做的就是将我们的组件映射到路由上,让 Vue Router 知道在哪里渲染它们。下面是一个基本的例子: +Vue Router 是 Vue 官方的客户端路由解决方案。 -## HTML +客户端路由的作用是在单页应用 (SPA) 中将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面时,URL 会随之更新,但页面不需要从服务器重新加载。 -```html - - +Vue Router 基于 Vue 的组件系统构建,你可以通过配置**路由**来告诉 Vue Router 为每个 URL 路径显示哪些组件。 -
+::: tip 学习基础 +这份指南假设你已经对 Vue 有了一定的了解。你不必是 Vue 的专家,但你也许偶尔需要查看 [Vue 的文档](https://cn.vuejs.org/)来了解某些特性。 +::: + + + +## 示例 + +为了引入一些核心概念,我们将使用如下的示例: + +- [Vue 演练场中的示例](https://play.vuejs.org/#eNqFVVtv2zYU/itn6gArmC05btEHTXXTFcWyYZeiLfYy7UGWji02EsmRlOPA8H/fIambnaRD4Fg61++c7yN9DJqc8eirDpKANVIoA0coFOYG30kJJ9gq0cBs3+Is412AEq1B1Xmi2L+ObpvX+3IpI5+b8aFqSJ+rjANErcbQp/v3RrTchLMXlDa7CuZBl07YUoONrCl/bQPT6np9i3UtbLPv0phenVm6L3rQRgm+W79vlULeIQaZmypJ484HxyN87xzRtq3rj+SE08mViX2dlOf7vuAnh/I3xu/AiDdZEGfB+mdBz3ArGkzj0f9sRr4hy5D2zr49ykvjvmdqeTmv9RfDe4i7uM6dxsNiaF9+l0+y+Ts2Qj3cMm3oa94Zfd0py4uBzYFPO6Br3ZPaGzpme9rtQGdxg2WUgOC6Y0PDG/jbjnL0vMAsnhEsQcU4UZaMbU/z8zC3x/PYsbcN/ueilaJW03nDoy1Y+VUkT+0nvHI9PVB6PJE8M44HN2iJ27yt+9q09ek+rFR1oZg0RM5FgmvboKlEqRP/BrATX4SDH171JgBD4CIvThXJVldhP7Y7J9DtxP4nxZKk+470cnFQVuseHh2TlTduWmMEh5uiZsUdSXPAcKlOH/hIZmfEjhODRtPaozNKjyiiGcqn75Ej0Pl3lMyHp2fFeMHnEB/SRia+ict6ep/GXBWV1UGHyGtgh5O1K0KvuC8T/duieoi6tLdvYUYg+rXTmKH3jLmeKoW0owLDI7h8IrnvfAKrIargxfQ/lA0LHjmr8w3W3X3w2dVMIGWchoH9ohEl1pFRrCE2fccsgCY/1Mh3piLjaknc+pujr3TOqedk0eSSrg/BiVU3WtY5dBYMks2CkRtrzoLKGKmTOG65vNtFtON4jLh5Fb2MlnFJJ2tijVA3i40S99rdV1ngNmtr31BQXOLeCFHrRS7Zcy0eBd68jl5H13HNNjFVjxkv8eBq94unMY0mQWzZ7mJIKwtWo/pTGkaCORs2p9+Z+1+dzagWB6BFhcXdE/av+uAhf1RI0+1xMpzJFWnOuz98/gMP9Dw4icW2puhvOD+hFnVrMfqwn1peEuxJnEP7i+OM8d0X/eFgkOt+KAt0FLIj8v03Rh/hvoxeTbaozUONOiq0/aGhX6w5aY1xn7cRqkSVwEoegMCyEl4sl8sf3d1H5RhfbATdKk0C10t5cHaZlyWBHSzUJeNUFtaQww/08Tenz65xSzf+NLJaTTuP5UcARVFMACSwpL9VVyE4/QesCg/V) + +让我们首先来看根组件, `App.vue`。 + +### App.vue + +```vue + ``` -### `router-link` +在这个 `template` 中使用了两个由 Vue Router 提供的组件: `RouterLink` 和 `RouterView`。 + +不同于常规的 `` 标签,我们使用组件 `RouterLink` 来创建链接。这使得 Vue Router 能够在不重新加载页面的情况下改变 URL,处理 URL 的生成、编码和其他功能。我们将会在之后的部分深入了解 `RouterLink` 组件。 + +`RouterView` 组件可以使 Vue Router 知道你想要在哪里渲染当前 URL 路径对应的**路由组件**。它不一定要在 `App.vue` 中,你可以把它放在任何地方,但它需要在某处被导入,否则 Vue Router 就不会渲染任何东西。 -请注意,我们没有使用常规的 `a` 标签,而是使用一个自定义组件 `router-link` 来创建链接。这使得 Vue Router 可以在不重新加载页面的情况下更改 URL,处理 URL 的生成以及编码。我们将在后面看到如何从这些功能中获益。 +上述示例还使用了 {{ $route.fullPath }} 。你可以在组件模板中使用 `$route` 来访问当前的路由对象。 -### `router-view` + -`router-view` 将显示与 URL 对应的组件。你可以把它放在任何地方,以适应你的布局。 +### 创建路由器实例 -## JavaScript +路由器实例是通过调用 `createRouter()` 函数创建的: ```js -// 1. 定义路由组件. -// 也可以从其他文件导入 -const Home = { template: '
Home
' } -const About = { template: '
About
' } - -// 2. 定义一些路由 -// 每个路由都需要映射到一个组件。 -// 我们后面再讨论嵌套路由。 +import { createMemoryHistory, createRouter } from 'vue-router' + +import HomeView from './HomeView.vue' +import AboutView from './AboutView.vue' + const routes = [ - { path: '/', component: Home }, - { path: '/about', component: About }, + { path: '/', component: HomeView }, + { path: '/about', component: AboutView }, ] -// 3. 创建路由实例并传递 `routes` 配置 -// 你可以在这里输入更多的配置,但我们在这里 -// 暂时保持简单 -const router = VueRouter.createRouter({ - // 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。 - history: VueRouter.createWebHashHistory(), - routes, // `routes: routes` 的缩写 +const router = createRouter({ + history: createMemoryHistory(), + routes, }) +``` -// 5. 创建并挂载根实例 -const app = Vue.createApp({}) -//确保 _use_ 路由实例使 -//整个应用支持路由。 -app.use(router) +这里的 `routes` 选项定义了一组路由,把 URL 路径映射到组件。其中,由 `component` 参数指定的组件就是先前在 `App.vue` 中被 `` 渲染的组件。这些路由组件通常被称为*视图*,但本质上它们只是普通的 Vue 组件。 -app.mount('#app') +其他可以设置的路由选项我们会在之后介绍,目前我们只需要 `path` 和 `component`。 -// 现在,应用已经启动了! +这里的 `history` 选项控制了路由和 URL 路径是如何双向映射的。在演练场的示例里,我们使用了 `createMemoryHistory()`,它会完全忽略浏览器的 URL 而使用其自己内部的 URL。 这在演练场中可以正常工作,但是未必是你想要在实际应用中使用的。通常,你应该使用 `createWebHistory()` 或 `createWebHashHistory()`。我们将在[不同的历史记录模式](./essentials/history-mode)的部分详细介绍这个主题。 + +### 注册路由器插件 + +一旦创建了我们的路由器实例,我们就需要将其注册为插件,这一步骤可以通过调用 `use()` 来完成。 + +```js +createApp(App).use(router).mount('#app') ``` -通过调用 `app.use(router)`,我们会触发第一次导航且可以在任意组件中以 `this.$router` 的形式访问它,并且以 `this.$route` 的形式访问当前路由: +或等价地: + +```js +const app = createApp(App) +app.use(router) +app.mount('#app') +``` + +和大多数的 Vue 插件一样,`use()` 需要在 `mount()` 之前调用。 + +如果你好奇这个插件做了什么,它的职责包括: + +1. [全局注册](https://cn.vuejs.org/guide/components/registration.html#global-registration) `RouterView` 和 `RouterLink` 组件。 +2. 添加全局 `$router` 和 `$route` 属性。 +3. 启用 `useRouter()` 和 `useRoute()` 组合式函数。 +4. 触发路由器解析初始路由。 + +### 访问路由器和当前路由 + +你很可能想要在应用的其他地方访问路由器。 + +如果你是从 ES 模块导出路由器实例的,你可以将路由器实例直接导入到你需要它的地方。在一些情况下这是最好的方法,但如果我们在组件内部,那么我们还有其他选择。 + +在组件模板中,路由器实例将被暴露为 `$router`。这与同样被暴露的 `$route` 一样,但注意前者最后有一个额外的 `r`。 + +如果我们使用选项式 API,我们可以在 JavaScript 中如下访问这两个属性:`this.$router` 和 `this.$route`。在演练场示例中的 `HomeView.vue` 组件中,路由器就是这样获取的。 ```js -// Home.vue export default { - computed: { - username() { - // 我们很快就会看到 `params` 是什么 - return this.$route.params.username - }, - }, methods: { - goToDashboard() { - if (isAuthenticated) { - this.$router.push('/dashboard') - } else { - this.$router.push('/login') - } + goToAbout() { + this.$router.push('/about') }, }, } ``` -要在 `setup` 函数中访问路由,请调用 `useRouter` 或 `useRoute` 函数。我们将在 [Composition API](./advanced/composition-api.md#在-setup-中访问路由和当前路由) 中了解更多信息。 +这里调用了 `push()`,这是用于[编程式导航](./essentials/navigation)的方法。我们会在后面详细了解。 + +对于组合式 API,我们不能通过 `this` 访问组件实例,所以 Vue Router 给我们提供了一些组合式函数。演练场示例中的 `AboutView.vue` 组件使用了这种方法: + +```vue + +``` + +你现在不一定要完全理解这段代码,关键是要知道可以通过 `useRouter()` 和 `useRoute()` 来访问路由器实例和当前路由。 + +### 下一步 + +如果你想要在 Vite 中使用完整的示例,你可以使用 [create-vue](https://github.com/vuejs/create-vue) 工具,它提供了在项目加入 Vue Router 的选项: + +::: code-group + +```bash [npm] +npm create vue@latest +``` + +```bash [yarn] +yarn create vue +``` + +```bash [pnpm] +pnpm create vue +``` + +::: + +上述通过 create-vue 创建的示例项目使用了与我们在这里看到的类似的功能,对于探索后续介绍的其他功能而言,也许你会觉得这是一个不错的起点。 + +## 本教程的约定 + +### 单文件组件 + +Vue Router 经常在配合打包工具 (如 Vite) 和[单文件组件](https://cn.vuejs.org/guide/introduction.html#single-file-components) (即 `.vue` 文件) 的应用中使用。本教程大多数的示例都是如此,但是 Vue Router 本身并不要求你使用构建工具或单文件组件。 + +例如,若你要使用 [Vue](https://cn.vuejs.org/guide/quick-start.html#using-vue-from-cdn) 和 [Vue Router](../installation#Direct-Download-CDN) 的全局构建版本,这些库将被暴露为全局对象,而不是导入: + +```js +const { createApp } = Vue +const { createRouter, createWebHistory } = VueRouter +``` + +### 组件 API 风格 + +Vue Router 可以使用组合式 API 或选项式 API 。在必要时,示例将会同时使用两种风格,组合式 API 示例通常会使用 ` diff --git a/packages/playground/src/main.ts b/packages/playground/src/main.ts index ce131cb69..1df834422 100644 --- a/packages/playground/src/main.ts +++ b/packages/playground/src/main.ts @@ -4,6 +4,7 @@ import type { ComponentPublicInstance } from 'vue' import { router, routerHistory } from './router' import { globalState } from './store' import App from './App.vue' +import { useRoute, type ParamValue, type RouteRecordInfo } from 'vue-router' declare global { interface Window { @@ -29,3 +30,60 @@ app.provide('state', globalState) app.use(router) window.vm = app.mount('#app') + +export interface RouteNamedMap { + home: RouteRecordInfo< + 'home', + '/', + Record, + Record, + never + > + '/[name]': RouteRecordInfo< + '/[name]', + '/:name', + { name: ParamValue }, + { name: ParamValue }, + '/[name]/edit' + > + '/[name]/edit': RouteRecordInfo< + '/[name]/edit', + '/:name/edit', + { name: ParamValue }, + { name: ParamValue }, + never + > + '/[...path]': RouteRecordInfo< + '/[...path]', + '/:path(.*)', + { path: ParamValue }, + { path: ParamValue }, + never + > +} + +declare module 'vue-router' { + interface TypesConfig { + RouteNamedMap: RouteNamedMap + } +} + +function _ok() { + const r = useRoute() + + if (r.name === '/[name]') { + r.params.name.toUpperCase() + // @ts-expect-error: Not existing route + } else if (r.name === 'nope') { + console.log('nope') + } + + router.push({ + name: '/[name]', + params: { name: 'hey' }, + }) + + router + .resolve({ name: '/[name]', params: { name: 2 } }) + .params.name.toUpperCase() +} diff --git a/packages/playground/vite.config.ts b/packages/playground/vite.config.ts index aac0711a3..62303df9a 100644 --- a/packages/playground/vite.config.ts +++ b/packages/playground/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath, URL } from 'node:url' import { defineConfig } from 'vite' import Vue from '@vitejs/plugin-vue' -// https://vitejs.dev/config/ +// https://vite.dev/config/ export default defineConfig({ plugins: [Vue()], resolve: { diff --git a/packages/router/CHANGELOG.md b/packages/router/CHANGELOG.md index cf05d2740..1fea22299 100644 --- a/packages/router/CHANGELOG.md +++ b/packages/router/CHANGELOG.md @@ -1,3 +1,119 @@ +## [4.5.1](https://github.com/vuejs/router/compare/v4.5.0...v4.5.1) (2025-04-25) + +### Bug Fixes + +- missing viewTransition prop on RouterLink ([#2465](https://github.com/vuejs/router/issues/2465)) ([2ddd19f](https://github.com/vuejs/router/commit/2ddd19fcfb9877b6952d55c75989fea6ba6a1367)) + +### Features + +- memory history stores state ([#2491](https://github.com/vuejs/router/issues/2491)) ([24ff936](https://github.com/vuejs/router/commit/24ff936bed41166a03f365ab1437960f6426bed1)) +- **types:** add support for children routes as union ([#2475](https://github.com/vuejs/router/issues/2475)) ([0ce408d](https://github.com/vuejs/router/commit/0ce408dadbb45a4790e2ccee311a032cc7c6d957)) + +# [4.5.0](https://github.com/vuejs/router/compare/v4.4.5...v4.5.0) (2024-11-25) + +### Bug Fixes + +- combining 'end' and 'strict' ([#2154](https://github.com/vuejs/router/issues/2154)) ([ab62098](https://github.com/vuejs/router/commit/ab62098b4f47b910ad89b8f08b882bf0d38c973f)) +- custom directive doesn't work when custom=true ([#2377](https://github.com/vuejs/router/issues/2377)) ([0d8d997](https://github.com/vuejs/router/commit/0d8d9978cbf1cae77ee4d9ac6cec69cc341a8243)) +- **router:** allow duplicated navigation on back + redirect ([#2133](https://github.com/vuejs/router/issues/2133)) ([d992bb2](https://github.com/vuejs/router/commit/d992bb2085cadf01b270e4f04b3d91c4fd5a70e3)) + +### Features + +- **link:** add view-transition prop ([#2356](https://github.com/vuejs/router/issues/2356)) ([e978eb8](https://github.com/vuejs/router/commit/e978eb8efeef193dfaf5f358a56109633d17fc56)) +- throw if parent and child routes have the same name ([#2267](https://github.com/vuejs/router/issues/2267)) ([8c73877](https://github.com/vuejs/router/commit/8c73877dc159fb7d736f9d0a71ba22e8130012a3)) + +## [4.4.5](https://github.com/vuejs/router/compare/v4.4.4...v4.4.5) (2024-09-13) + +### Bug Fixes + +- make internal property non enumerable to avoid errors with `{{route}}` ([a8df616](https://github.com/vuejs/router/commit/a8df616bfda2feb7aa6b738054a02e241d4f276b)) + +## [4.4.4](https://github.com/vuejs/router/compare/v4.4.3...v4.4.4) (2024-09-10) + +### Bug Fixes + +- **ssr:** handle symboless Modules in dynamic imports ([#2355](https://github.com/vuejs/router/issues/2355)) ([4861467](https://github.com/vuejs/router/commit/4861467e60a9e20d00cb46e4b9bbce1a2e129e0e)) + +### Features + +- **loaders:** internal mods in route records ([5ff2cd0](https://github.com/vuejs/router/commit/5ff2cd09d656a6f5ff38517c87d48b89f41ff49b)) + +## [4.4.3](https://github.com/vuejs/router/compare/v4.4.2...v4.4.3) (2024-08-06) + +### Bug Fixes + +- reorder exports in `package.json` ([#2323](https://github.com/vuejs/router/issues/2323)) ([7422b15](https://github.com/vuejs/router/commit/7422b15e6fcf57819f82a1384c9a2a73e32e186f)) + +## [4.4.2](https://github.com/vuejs/router/compare/v4.4.1...v4.4.2) (2024-08-01) + +### Bug Fixes + +- **types:** revert stricter meta ([d4d0087](https://github.com/vuejs/router/commit/d4d0087eae5721f73bde445be33407875a92a1ca)), closes [#2319](https://github.com/vuejs/router/issues/2319) + +## [4.4.1](https://github.com/vuejs/router/compare/v4.4.0...v4.4.1) (2024-07-31) + +### Bug Fixes + +> [!IMPORTANT] +> This release replaces `declare module '@vue/runtime-core'` with `declare module 'vue'` [like it's supposed to be](https://vuejs.org/guide/typescript/options-api.html#augmenting-global-properties). If you are also augmenting `@vue/runtime-core`, you will likely have to change it to `vue`. It is also recommended to use an up-to-date TypeScript version (>=5.4) and `"moduleResolution": "Bundler"` in your `tsconfig.json`. + +- router typescript definitions related to vue package ([#2295](https://github.com/vuejs/router/issues/2295)) ([a495ce0](https://github.com/vuejs/router/commit/a495ce0e1d545d521673d21af43e63a761b53e27)) +- **types:** stricter meta with required fields ([423d9f7](https://github.com/vuejs/router/commit/423d9f763ed033dd6687ce7687c859c92554a60d)) + +### Features + +- **warn:** fix links to docs ([0cb5797](https://github.com/vuejs/router/commit/0cb57971efd767777011e872e9cc327e0a0da79f)) + +# [4.4.0](https://github.com/vuejs/router/compare/v4.4.0-alpha.3...v4.4.0) (2024-06-21) + +This version introduces native support for [typed routes via the `RouteNamedMap`](https://router.vuejs.org/guide/advanced/typed-routes.html). It is now possible to define a map without [unplugin-vue-router](https://uvr.esm.is) and have the types inferred automatically. It is still recommended to use [unplugin-vue-router](https://uvr.esm.is) to automatically generate these types. + +### Features + +- add a clearRoutes method ([abe223d](https://github.com/vuejs/router/commit/abe223dab44a092682eed5f77b0e231ff2392076)) +- typed routes ([f92282b](https://github.com/vuejs/router/commit/f92282b896ccf92360d781832435e1ae86314e0e)) + +### Bug Fixes + +- allow arbitrary strings in RouteLocationRaw ([a7a8452](https://github.com/vuejs/router/commit/a7a8452d137024d607d803a4009a5d55419259f2)) + +## [4.3.3](https://github.com/vuejs/router/compare/v4.3.2...v4.3.3) (2024-06-10) + +### Performance Improvements + +- use a binary search for insertMatcher ([#2137](https://github.com/vuejs/router/issues/2137)) ([e9f6ae3](https://github.com/vuejs/router/commit/e9f6ae3d61b91892f88fa26a6c224e0166b874ff)) This partially addresses #2132 + +## [4.3.2](https://github.com/vuejs/router/compare/v4.3.1...v4.3.2) (2024-04-18) + +### Bug Fixes + +- Revert "fix: avoid normalizing the fullPath ([#2189](https://github.com/vuejs/router/issues/2189))" ([b78aa98](https://github.com/vuejs/router/commit/b78aa98792e86e08b76eb879e496fe1c300c1e18)), closes [vuejs/router#2216](https://github.com/vuejs/router/issues/2216). This was creating other bugs when reusing a normalized location (common pattern). The original issue wasn't a problem in practice as the consistent values are the query, params, and hash. + +## [4.3.1](https://github.com/vuejs/router/compare/v4.3.0...v4.3.1) (2024-04-17) + +### Bug Fixes + +- avoid normalizing the fullPath ([#2189](https://github.com/vuejs/router/issues/2189)) ([c54fc84](https://github.com/vuejs/router/commit/c54fc8407bd1944a3b724fbcc7f6fbac5ff45f0f)), closes [vuejs/router#2187](https://github.com/vuejs/router/issues/2187) + +### Features + +- **dx:** warn when `addRoute` cannot find the parent ([#2157](https://github.com/vuejs/router/issues/2157)) ([6377083](https://github.com/vuejs/router/commit/63770832d01a86a7464fde744e94058aae07de2e)) +- **dx:** warn when passing undefined/null locations ([#2158](https://github.com/vuejs/router/issues/2158)) ([089378b](https://github.com/vuejs/router/commit/089378bb973a6d91ddfe8eea76a670cd805fb5cf)) + +# [4.3.0](https://github.com/vuejs/router/compare/v4.2.5...v4.3.0) (2024-02-21) + +### Bug Fixes + +- check document for browser instead of window ([#2042](https://github.com/vuejs/router/issues/2042)) ([5631732](https://github.com/vuejs/router/commit/5631732cbafd0c780db449fd820607a75b9b82aa)) +- decode hash when parsing urls ([#2061](https://github.com/vuejs/router/issues/2061)) ([6f160b9](https://github.com/vuejs/router/commit/6f160b931e8647e15217a3ecf9efcc2152366fc6)), closes [#2060](https://github.com/vuejs/router/issues/2060) +- **guards:** run beforeRouteEnter with app context ([#2117](https://github.com/vuejs/router/issues/2117)) ([6a69696](https://github.com/vuejs/router/commit/6a696961a42d1d39640d36a1e65e5097b50030b8)), closes [vuejs/router#2051](https://github.com/vuejs/router/issues/2051) +- handle undefined path in router resolve ([0ec4862](https://github.com/vuejs/router/commit/0ec4862ff54207c1c207027ed240e24efcfeb6cf)) +- keep optional params coming from a parent record ([#2031](https://github.com/vuejs/router/issues/2031)) ([04b50e5](https://github.com/vuejs/router/commit/04b50e5a2cf82f896f5200497386d8a2acdae738)) + +### Features + +- (internal) add types for unplugin-vue-router ([2d1dd2a](https://github.com/vuejs/router/commit/2d1dd2ad721d7e62d801d6788ba056444aa09bad)). + ## [4.2.5](https://github.com/vuejs/router/compare/v4.2.4...v4.2.5) (2023-09-22) ### Bug Fixes diff --git a/packages/router/__tests__/RouterLink.spec.ts b/packages/router/__tests__/RouterLink.spec.ts index e3d76b685..9a0a51457 100644 --- a/packages/router/__tests__/RouterLink.spec.ts +++ b/packages/router/__tests__/RouterLink.spec.ts @@ -1,20 +1,22 @@ /** - * @jest-environment jsdom + * @vitest-environment jsdom */ -import { RouterLink, RouterLinkProps } from '../src/RouterLink' +import { RouterLink } from '../src/RouterLink' +import { RouteQueryAndHash, MatcherLocationRaw } from '../src/types' +import { START_LOCATION_NORMALIZED } from '../src/location' import { - START_LOCATION_NORMALIZED, - RouteQueryAndHash, - MatcherLocationRaw, + createMemoryHistory, + RouterOptions, RouteLocationNormalized, -} from '../src/types' -import { createMemoryHistory, RouterOptions } from '../src' + RouteLocationResolved, +} from '../src' import { createMockedRoute } from './mount' import { defineComponent, PropType } from 'vue' import { RouteRecordNormalized } from '../src/matcher/types' import { routerKey } from '../src/injectionSymbols' import { tick } from './utils' import { mount } from '@vue/test-utils' +import { vi, describe, expect, it } from 'vitest' const records = { home: {} as RouteRecordNormalized, @@ -37,8 +39,6 @@ records.parentAlias = { records.childAlias = { aliasOf: records.child } as RouteRecordNormalized records.childEmptyAlias.aliasOf = records.childEmpty -type RouteLocationResolved = RouteLocationNormalized & { href: string } - function createLocations< T extends Record< string, @@ -47,7 +47,7 @@ function createLocations< normalized: RouteLocationResolved toResolve?: MatcherLocationRaw & Required } - > + >, >(locs: T) { return locs } @@ -358,7 +358,8 @@ async function factory( currentLocation: RouteLocationNormalized, propsData: any, resolvedLocation: RouteLocationResolved, - slotTemplate: string = '' + slotTemplate: string = '', + component: any = RouterLink ) { const route = createMockedRoute(currentLocation) const router = { @@ -367,13 +368,13 @@ async function factory( return this.history.base + to.fullPath }, options: {} as Partial, - resolve: jest.fn(), - push: jest.fn().mockResolvedValue(resolvedLocation), - replace: jest.fn().mockResolvedValue(resolvedLocation), + resolve: vi.fn(), + push: vi.fn().mockResolvedValue(resolvedLocation), + replace: vi.fn().mockResolvedValue(resolvedLocation), } router.resolve.mockReturnValueOnce(resolvedLocation) - const wrapper = mount(RouterLink as any, { + const wrapper = mount(component, { propsData, global: { provide: { @@ -801,7 +802,7 @@ describe('RouterLink', () => { }) it('allows adding more click listeners', async () => { - const onClick = jest.fn() + const onClick = vi.fn() const { router, wrapper } = await factory( START_LOCATION_NORMALIZED, { to: locations.basic.string, onClick }, @@ -899,6 +900,32 @@ describe('RouterLink', () => { expect(wrapper.html()).not.toContain('
') }) + // #2375 + it('works with custom directive when custom=true', async () => { + const Directive = (el: HTMLElement) => el.setAttribute('data-test', 'x') + const AppLink = defineComponent({ + template: ` + + + + `, + components: { RouterLink }, + directives: { Directive }, + name: 'AppLink', + }) + + const { wrapper } = await factory( + locations.basic.normalized, + { to: locations.basic.string }, + locations.basic.normalized, + undefined, + AppLink + ) + + expect(wrapper.element.tagName).toBe('A') + expect(wrapper.attributes('data-test')).toBe('x') + }) + describe('Extending RouterLink', () => { const AppLink = defineComponent({ template: ` @@ -919,9 +946,8 @@ describe('RouterLink', () => { components: { RouterLink }, name: 'AppLink', - // @ts-expect-error props: { - ...((RouterLink as any).props as RouterLinkProps), + ...(RouterLink as any).props, inactiveClass: String as PropType, }, @@ -933,59 +959,31 @@ describe('RouterLink', () => { }, }) - async function factoryCustom( - currentLocation: RouteLocationNormalized, - propsData: any, - resolvedLocation: RouteLocationResolved, - slotTemplate: string = '' - ) { - const route = createMockedRoute(currentLocation) - const router = { - history: createMemoryHistory(), - createHref(to: RouteLocationNormalized): string { - return this.history.base + to.fullPath - }, - options: {} as Partial, - resolve: jest.fn(), - push: jest.fn().mockResolvedValue(resolvedLocation), - } - router.resolve.mockReturnValueOnce(resolvedLocation) - - const wrapper = await mount(AppLink as any, { - propsData, - global: { - provide: { - [routerKey as any]: router, - ...route.provides, - }, - }, - slots: { default: slotTemplate }, - }) - - return { router, wrapper, route } - } - it('can extend RouterLink with inactive class', async () => { - const { wrapper } = await factoryCustom( + const { wrapper } = await factory( locations.basic.normalized, { to: locations.basic.string, inactiveClass: 'inactive', activeClass: 'active', }, - locations.foo.normalized + locations.foo.normalized, + undefined, + AppLink ) expect(wrapper.find('a')!.classes()).toEqual(['inactive']) }) it('can extend RouterLink with external link', async () => { - const { wrapper } = await factoryCustom( + const { wrapper } = await factory( locations.basic.normalized, { to: 'https://esm.dev', }, - locations.foo.normalized + locations.foo.normalized, + undefined, + AppLink ) expect(wrapper.find('a')!.classes()).toHaveLength(0) diff --git a/packages/router/__tests__/RouterView.spec.ts b/packages/router/__tests__/RouterView.spec.ts index 54fea992c..6f142b9f1 100644 --- a/packages/router/__tests__/RouterView.spec.ts +++ b/packages/router/__tests__/RouterView.spec.ts @@ -1,16 +1,15 @@ /** - * @jest-environment jsdom + * @vitest-environment jsdom */ import { RouterView } from '../src/RouterView' import { components, RouteLocationNormalizedLoose } from './utils' -import { - START_LOCATION_NORMALIZED, - RouteLocationNormalized, -} from '../src/types' +import { START_LOCATION_NORMALIZED } from '../src/location' import { markRaw } from 'vue' import { createMockedRoute } from './mount' -import { mockWarn } from 'jest-mock-warn' import { mount } from '@vue/test-utils' +import { RouteLocationNormalized } from '../src' +import { describe, expect, it } from 'vitest' +import { mockWarn } from './vitest-mock-warn' // to have autocompletion function createRoutes>( diff --git a/packages/router/__tests__/__snapshots__/RouterLink.spec.ts.snap b/packages/router/__tests__/__snapshots__/RouterLink.spec.ts.snap index ad84946d9..bdeda41b1 100644 --- a/packages/router/__tests__/__snapshots__/RouterLink.spec.ts.snap +++ b/packages/router/__tests__/__snapshots__/RouterLink.spec.ts.snap @@ -1,3 +1,3 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`RouterLink v-slot provides information on v-slot 1`] = `" route: {"href":"/home","fullPath":"/home","path":"/home","params":{},"meta":{},"query":{},"hash":"","matched":[{}],"name":"home"} href: "/home" isActive: "true" isExactActive: "true" "`; +exports[`RouterLink > v-slot > provides information on v-slot 1`] = `" route: {"href":"/home","fullPath":"/home","path":"/home","params":{},"meta":{},"query":{},"hash":"","matched":[{}],"name":"home"} href: "/home" isActive: "true" isExactActive: "true" "`; diff --git a/packages/router/__tests__/__snapshots__/RouterView.spec.ts.snap b/packages/router/__tests__/__snapshots__/RouterView.spec.ts.snap index 49f60569b..15c8bd203 100644 --- a/packages/router/__tests__/__snapshots__/RouterView.spec.ts.snap +++ b/packages/router/__tests__/__snapshots__/RouterView.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`RouterView displays deeply nested views 1`] = ` +exports[`RouterView > displays deeply nested views 1`] = ` "

Nested

@@ -10,19 +10,19 @@ exports[`RouterView displays deeply nested views 1`] = `
" `; -exports[`RouterView displays nested views 1`] = ` +exports[`RouterView > displays nested views 1`] = ` "

Nested

Foo
" `; -exports[`RouterView v-slot passes a Component and route 1`] = ` +exports[`RouterView > v-slot > passes a Component and route 1`] = ` "home
Home
" `; -exports[`RouterView warnings does not warn RouterView is wrapped 1`] = ` +exports[`RouterView > warnings > does not warn RouterView is wrapped 1`] = ` "
Home
" diff --git a/packages/router/__tests__/createRouter.test-d.ts b/packages/router/__tests__/createRouter.test-d.ts new file mode 100644 index 000000000..64e48ca3f --- /dev/null +++ b/packages/router/__tests__/createRouter.test-d.ts @@ -0,0 +1,47 @@ +import { describe, it } from 'vitest' +import { createRouter, createWebHistory } from '../src' +import { defineComponent, h } from 'vue' + +describe('createRouter', () => { + const component = defineComponent({}) + + const WithProps = defineComponent({ + props: { + id: { + type: String, + required: true, + }, + }, + }) + + const Foo = defineComponent({ + props: { + test: String, + }, + setup() { + return { + title: 'homepage', + } + }, + render() { + return h('div', `${this.title}: ${this.test}`) + }, + }) + + it('works', () => { + createRouter({ + history: createWebHistory(), + routes: [ + { path: '/', component }, + { path: '/foo', component: Foo }, + { path: '/', component: WithProps }, + ], + parseQuery: search => ({}), + stringifyQuery: query => '', + strict: true, + end: true, + sensitive: true, + scrollBehavior(to, from, savedPosition) {}, + }) + }) +}) diff --git a/packages/router/__tests__/encoding.spec.ts b/packages/router/__tests__/encoding.spec.ts index d299ac3a8..e4aebb88d 100644 --- a/packages/router/__tests__/encoding.spec.ts +++ b/packages/router/__tests__/encoding.spec.ts @@ -5,6 +5,7 @@ import { encodeQueryValue, // decode, } from '../src/encoding' +import { describe, expect, it } from 'vitest' describe('Encoding', () => { // all ascii chars with a non ascii char at the beginning diff --git a/packages/router/__tests__/errors.spec.ts b/packages/router/__tests__/errors.spec.ts index c7219dc44..5678bf43f 100644 --- a/packages/router/__tests__/errors.spec.ts +++ b/packages/router/__tests__/errors.spec.ts @@ -8,14 +8,14 @@ import { ErrorTypes, } from '../src/errors' import { components, tick } from './utils' -import { - RouteRecordRaw, - NavigationGuard, +import type { RouteRecordRaw, NavigationGuard } from '../src' +import type { RouteLocationRaw, - START_LOCATION_NORMALIZED, RouteLocationNormalized, -} from '../src/types' -import { mockWarn } from 'jest-mock-warn' +} from '../src/typed-routes' +import { START_LOCATION_NORMALIZED } from '../src/location' +import { vi, describe, expect, it, beforeEach } from 'vitest' +import { mockWarn } from './vitest-mock-warn' const routes: Readonly[] = [ { path: '/', component: components.Home }, @@ -26,8 +26,8 @@ const routes: Readonly[] = [ { path: '/async', component: () => Promise.reject('failed') }, ] -const onError = jest.fn() -const afterEach = jest.fn() +const onError = vi.fn() +const afterEach = vi.fn() function createRouter() { const history = createMemoryHistory() const router = newRouter({ diff --git a/packages/router/__tests__/guards/afterEach.spec.ts b/packages/router/__tests__/guards/afterEach.spec.ts index d42004860..8709b76fc 100644 --- a/packages/router/__tests__/guards/afterEach.spec.ts +++ b/packages/router/__tests__/guards/afterEach.spec.ts @@ -1,5 +1,6 @@ import { createDom, newRouter as createRouter } from '../utils' -import { RouteRecordRaw } from 'src/types' +import { RouteRecordRaw } from '../../src/types' +import { vi, describe, expect, it, beforeAll } from 'vitest' const Home = { template: `
Home
` } const Foo = { template: `
Foo
` } @@ -24,7 +25,7 @@ describe('router.afterEach', () => { }) it('calls afterEach guards on push', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) router.afterEach(spy) await router.push('/foo') @@ -37,7 +38,7 @@ describe('router.afterEach', () => { }) it('can be removed', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) const remove = router.afterEach(spy) remove() @@ -46,7 +47,7 @@ describe('router.afterEach', () => { }) it('calls afterEach guards on multiple push', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) await router.push('/nested') router.afterEach(spy) @@ -67,8 +68,8 @@ describe('router.afterEach', () => { }) it('removing an afterEach guard within one does not affect others', async () => { - const spy1 = jest.fn() - const spy2 = jest.fn() + const spy1 = vi.fn() + const spy2 = vi.fn() const router = createRouter({ routes }) router.afterEach(spy1) const remove = router.afterEach(spy2) diff --git a/packages/router/__tests__/guards/beforeEach.spec.ts b/packages/router/__tests__/guards/beforeEach.spec.ts index ddc15ef07..b4e373606 100644 --- a/packages/router/__tests__/guards/beforeEach.spec.ts +++ b/packages/router/__tests__/guards/beforeEach.spec.ts @@ -1,6 +1,8 @@ import fakePromise from 'faked-promise' import { createDom, tick, noGuard, newRouter as createRouter } from '../utils' -import { RouteRecordRaw, RouteLocationRaw } from '../../src/types' +import { RouteRecordRaw } from '../../src/types' +import { RouteLocationRaw } from '../../src' +import { vi, describe, expect, it, beforeAll } from 'vitest' const Home = { template: `
Home
` } const Foo = { template: `
Foo
` } @@ -31,7 +33,7 @@ describe('router.beforeEach', () => { }) it('calls beforeEach guards on navigation', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) router.beforeEach(spy) spy.mockImplementationOnce(noGuard) @@ -40,7 +42,7 @@ describe('router.beforeEach', () => { }) it('can be removed', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) const remove = router.beforeEach(spy) remove() @@ -50,7 +52,7 @@ describe('router.beforeEach', () => { }) it('does not call beforeEach guard if we were already on the page', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) await router.push('/foo') router.beforeEach(spy) @@ -60,7 +62,7 @@ describe('router.beforeEach', () => { }) it('calls beforeEach guards on navigation between children routes', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) await router.push('/nested') router.beforeEach(spy) @@ -82,7 +84,7 @@ describe('router.beforeEach', () => { }) it('can redirect to a different location', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) await router.push('/foo') spy.mockImplementation((to, from, next) => { @@ -124,7 +126,7 @@ describe('router.beforeEach', () => { return }) - const spy = jest.spyOn(history, 'pushState') + const spy = vi.spyOn(history, 'pushState') await router.push({ path: '/', state: { a: 'a' } }) expect(spy).toHaveBeenCalledTimes(1) // called before redirect @@ -141,7 +143,7 @@ describe('router.beforeEach', () => { const router = createRouter({ routes }) await router.push('/foo') - const spy = jest.spyOn(history, 'pushState') + const spy = vi.spyOn(history, 'pushState') await router.push({ path: '/redirect', state: { a: 'a' } }) expect(spy).toHaveBeenCalledTimes(1) // called before redirect @@ -155,7 +157,7 @@ describe('router.beforeEach', () => { }) async function assertRedirect(redirectFn: (i: string) => RouteLocationRaw) { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) await router.push('/') spy.mockImplementation((to, from, next) => { @@ -184,7 +186,7 @@ describe('router.beforeEach', () => { }) it('is called when changing params', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes: [...routes] }) await router.push('/n/2') spy.mockImplementation(noGuard) @@ -195,7 +197,7 @@ describe('router.beforeEach', () => { }) it('is not called with same params', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes: [...routes] }) await router.push('/n/2') spy.mockImplementation(noGuard) @@ -223,7 +225,7 @@ describe('router.beforeEach', () => { const [p1, r1] = fakePromise() const [p2, r2] = fakePromise() const router = createRouter({ routes }) - const guard1 = jest.fn() + const guard1 = vi.fn() let order = 0 guard1.mockImplementationOnce(async (to, from, next) => { expect(order++).toBe(0) @@ -231,7 +233,7 @@ describe('router.beforeEach', () => { next() }) router.beforeEach(guard1) - const guard2 = jest.fn() + const guard2 = vi.fn() guard2.mockImplementationOnce(async (to, from, next) => { expect(order++).toBe(1) await p2 @@ -255,7 +257,7 @@ describe('router.beforeEach', () => { }) it('adds meta information', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) router.beforeEach(spy) spy.mockImplementationOnce(noGuard) diff --git a/packages/router/__tests__/guards/beforeEnter.spec.ts b/packages/router/__tests__/guards/beforeEnter.spec.ts index 913b0d041..1df476eee 100644 --- a/packages/router/__tests__/guards/beforeEnter.spec.ts +++ b/packages/router/__tests__/guards/beforeEnter.spec.ts @@ -1,20 +1,21 @@ import fakePromise from 'faked-promise' import { createDom, noGuard, tick, newRouter as createRouter } from '../utils' import { RouteRecordRaw } from '../../src/types' +import { vi, describe, expect, it, beforeAll, beforeEach } from 'vitest' const Home = { template: `
Home
` } const Foo = { template: `
Foo
` } -const beforeEnter = jest.fn() -const beforeEnters = [jest.fn(), jest.fn()] +const beforeEnter = vi.fn() +const beforeEnters = [vi.fn(), vi.fn()] const nested = { - parent: jest.fn(), - nestedEmpty: jest.fn(), - nestedA: jest.fn(), - nestedAbs: jest.fn(), - nestedNested: jest.fn(), - nestedNestedFoo: jest.fn(), - nestedNestedParam: jest.fn(), + parent: vi.fn(), + nestedEmpty: vi.fn(), + nestedA: vi.fn(), + nestedAbs: vi.fn(), + nestedNested: vi.fn(), + nestedNestedFoo: vi.fn(), + nestedNestedParam: vi.fn(), } const routes: RouteRecordRaw[] = [ diff --git a/packages/router/__tests__/guards/beforeResolve.spec.ts b/packages/router/__tests__/guards/beforeResolve.spec.ts index a0dbeaed4..9736b520e 100644 --- a/packages/router/__tests__/guards/beforeResolve.spec.ts +++ b/packages/router/__tests__/guards/beforeResolve.spec.ts @@ -1,5 +1,6 @@ import { createDom, noGuard, newRouter as createRouter } from '../utils' import { RouteRecordRaw } from '../../src/types' +import { vi, describe, expect, it, beforeAll } from 'vitest' const Home = { template: `
Home
` } const Foo = { template: `
Foo
` } @@ -15,7 +16,7 @@ describe('router.beforeEach', () => { }) it('calls beforeEach guards on navigation', async () => { - const spy = jest.fn() + const spy = vi.fn() const router = createRouter({ routes }) router.beforeResolve(spy) spy.mockImplementationOnce(noGuard) diff --git a/packages/router/__tests__/guards/beforeRouteEnter.spec.ts b/packages/router/__tests__/guards/beforeRouteEnter.spec.ts index 82e05418c..43268f2b5 100644 --- a/packages/router/__tests__/guards/beforeRouteEnter.spec.ts +++ b/packages/router/__tests__/guards/beforeRouteEnter.spec.ts @@ -1,27 +1,25 @@ import fakePromise from 'faked-promise' import { createDom, noGuard, newRouter as createRouter } from '../utils' -import { RouteRecordRaw, NavigationGuard } from '../../src/types' +import type { RouteRecordRaw, NavigationGuard } from '../../src' +import { vi, describe, expect, it, beforeAll, beforeEach } from 'vitest' const Home = { template: `
Home
` } const Foo = { template: `
Foo
` } -const beforeRouteEnter = jest.fn< - ReturnType, - Parameters ->() +const beforeRouteEnter = vi.fn() const named = { - default: jest.fn(), - other: jest.fn(), + default: vi.fn(), + other: vi.fn(), } const nested = { - parent: jest.fn(), - nestedEmpty: jest.fn(), - nestedA: jest.fn(), - nestedAbs: jest.fn(), - nestedNested: jest.fn(), - nestedNestedFoo: jest.fn(), - nestedNestedParam: jest.fn(), + parent: vi.fn(), + nestedEmpty: vi.fn(), + nestedA: vi.fn(), + nestedAbs: vi.fn(), + nestedNested: vi.fn(), + nestedNestedFoo: vi.fn(), + nestedNestedParam: vi.fn(), } const routes: RouteRecordRaw[] = [ @@ -123,7 +121,7 @@ describe('beforeRouteEnter', () => { it('does not call beforeRouteEnter guards on navigation between aliases', async () => { const router = createRouter({ routes }) - const spy = jest.fn() + const spy = vi.fn() beforeRouteEnter.mockImplementation(spy) await router.push('/guard/valid') expect(beforeRouteEnter).toHaveBeenCalledTimes(1) diff --git a/packages/router/__tests__/guards/beforeRouteEnterCallback.spec.ts b/packages/router/__tests__/guards/beforeRouteEnterCallback.spec.ts index b9918c48a..d851c7c3f 100644 --- a/packages/router/__tests__/guards/beforeRouteEnterCallback.spec.ts +++ b/packages/router/__tests__/guards/beforeRouteEnterCallback.spec.ts @@ -1,13 +1,14 @@ /** - * @jest-environment jsdom + * @vitest-environment jsdom */ import { defineComponent, h } from 'vue' import { mount } from '@vue/test-utils' import { createRouter, createMemoryHistory, RouterOptions } from '../../src' +import { vi, describe, expect, it, beforeEach } from 'vitest' const nextCallbacks = { - Default: jest.fn(), - Other: jest.fn(), + Default: vi.fn(), + Other: vi.fn(), } const Default = defineComponent({ beforeRouteEnter(to, from, next) { diff --git a/packages/router/__tests__/guards/beforeRouteLeave.spec.ts b/packages/router/__tests__/guards/beforeRouteLeave.spec.ts index ff5618337..57dd78158 100644 --- a/packages/router/__tests__/guards/beforeRouteLeave.spec.ts +++ b/packages/router/__tests__/guards/beforeRouteLeave.spec.ts @@ -1,20 +1,21 @@ import { createDom, noGuard, newRouter as createRouter } from '../utils' import { RouteRecordRaw } from '../../src/types' +import { vi, describe, expect, it, beforeAll, beforeEach } from 'vitest' const Home = { template: `
Home
` } const Foo = { template: `
Foo
` } const nested = { - parent: jest.fn(), - nestedEmpty: jest.fn(), - nestedA: jest.fn(), - nestedB: jest.fn(), - nestedAbs: jest.fn(), - nestedNested: jest.fn(), - nestedNestedFoo: jest.fn(), - nestedNestedParam: jest.fn(), + parent: vi.fn(), + nestedEmpty: vi.fn(), + nestedA: vi.fn(), + nestedB: vi.fn(), + nestedAbs: vi.fn(), + nestedNested: vi.fn(), + nestedNestedFoo: vi.fn(), + nestedNestedParam: vi.fn(), } -const beforeRouteLeave = jest.fn() +const beforeRouteLeave = vi.fn() const routes: RouteRecordRaw[] = [ { path: '/', component: Home }, diff --git a/packages/router/__tests__/guards/beforeRouteUpdate.spec.ts b/packages/router/__tests__/guards/beforeRouteUpdate.spec.ts index 5d98f21e5..d4cbf98eb 100644 --- a/packages/router/__tests__/guards/beforeRouteUpdate.spec.ts +++ b/packages/router/__tests__/guards/beforeRouteUpdate.spec.ts @@ -1,11 +1,12 @@ import fakePromise from 'faked-promise' import { createDom, noGuard, newRouter as createRouter } from '../utils' import { RouteRecordRaw } from '../../src/types' +import { vi, describe, expect, it, beforeAll, beforeEach } from 'vitest' const Home = { template: `
Home
` } const Foo = { template: `
Foo
` } -const beforeRouteUpdate = jest.fn() +const beforeRouteUpdate = vi.fn() const routes: RouteRecordRaw[] = [ { path: '/', component: Home }, { path: '/foo', component: Foo }, diff --git a/packages/router/__tests__/guards/extractComponentsGuards.spec.ts b/packages/router/__tests__/guards/extractComponentsGuards.spec.ts index 560d9cc1e..b10a32247 100644 --- a/packages/router/__tests__/guards/extractComponentsGuards.spec.ts +++ b/packages/router/__tests__/guards/extractComponentsGuards.spec.ts @@ -1,11 +1,12 @@ import { extractComponentsGuards } from '../../src/navigationGuards' -import { START_LOCATION_NORMALIZED, RouteRecordRaw } from '../../src/types' +import type { RouteRecordRaw, RouteRecordNormalized } from '../../src' +import { START_LOCATION_NORMALIZED } from '../../src/location' import { components } from '../utils' import { normalizeRouteRecord } from '../../src/matcher' -import { RouteRecordNormalized } from 'src/matcher/types' -import { mockWarn } from 'jest-mock-warn' +import { mockWarn } from '../vitest-mock-warn' +import { vi, describe, expect, it, beforeEach } from 'vitest' -const beforeRouteEnter = jest.fn() +const beforeRouteEnter = vi.fn() // stub those two const to = START_LOCATION_NORMALIZED @@ -103,4 +104,30 @@ describe('extractComponentsGuards', () => { 'custom' ) }) + + it('preserves resolved modules in mods', async () => { + const mod = { + default: components.Home, + __esModule: true, + custom: true, + } + const mod2 = { + default: components.Bar, + __esModule: true, + custom: true, + } + const record = normalizeRouteRecord({ + path: '/', + components: { default: async () => mod, other: async () => mod2 }, + }) + expect(record.mods).toEqual({}) + const guards = extractComponentsGuards( + [record], + 'beforeRouteEnter', + to, + from + ) + await Promise.all(guards.map(guard => guard())) + expect(record.mods).toEqual({ default: mod, other: mod2 }) + }) }) diff --git a/packages/router/__tests__/guards/guardToPromiseFn.spec.ts b/packages/router/__tests__/guards/guardToPromiseFn.spec.ts index d2b596f98..d19267793 100644 --- a/packages/router/__tests__/guards/guardToPromiseFn.spec.ts +++ b/packages/router/__tests__/guards/guardToPromiseFn.spec.ts @@ -1,7 +1,8 @@ import { guardToPromiseFn } from '../../src/navigationGuards' -import { START_LOCATION_NORMALIZED } from '../../src/types' +import { START_LOCATION_NORMALIZED } from '../../src/location' import { ErrorTypes } from '../../src/errors' -import { mockWarn } from 'jest-mock-warn' +import { mockWarn } from '../vitest-mock-warn' +import { vi, describe, expect, it } from 'vitest' // stub those two const to = START_LOCATION_NORMALIZED @@ -15,7 +16,7 @@ describe('guardToPromiseFn', () => { mockWarn() it('calls the guard with to, from and, next', async () => { expect.assertions(2) - const spy = jest.fn((to, from, next) => next()) + const spy = vi.fn((to, from, next) => next()) await expect(guardToPromiseFn(spy, to, from)()).resolves.toEqual(undefined) expect(spy).toHaveBeenCalledWith(to, from, expect.any(Function)) }) diff --git a/packages/router/__tests__/guards/guardsContext.spec.ts b/packages/router/__tests__/guards/guardsContext.spec.ts index 7900f9f3b..dd8de4819 100644 --- a/packages/router/__tests__/guards/guardsContext.spec.ts +++ b/packages/router/__tests__/guards/guardsContext.spec.ts @@ -1,8 +1,9 @@ /** - * @jest-environment jsdom + * @vitest-environment jsdom */ import { createRouter, createMemoryHistory } from '../../src' import { createApp, defineComponent } from 'vue' +import { vi, describe, expect, it } from 'vitest' const component = { template: '
Generic
', @@ -11,12 +12,15 @@ const component = { describe('beforeRouteLeave', () => { it('invokes with the component context', async () => { expect.assertions(2) - const spy = jest - .fn() - .mockImplementationOnce(function (this: any, to, from, next) { - expect(typeof this.counter).toBe('number') - next() - }) + const spy = vi.fn().mockImplementationOnce(function ( + this: any, + to, + from, + next + ) { + expect(typeof this.counter).toBe('number') + next() + }) const WithLeave = defineComponent({ template: `text`, // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings @@ -53,23 +57,29 @@ describe('beforeRouteLeave', () => { template: `text`, // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings data: () => ({ counter: 0 }), - beforeRouteLeave: jest - .fn() - .mockImplementationOnce(function (this: any, to, from, next) { - expect(typeof this.counter).toBe('number') - next() - }), + beforeRouteLeave: vi.fn().mockImplementationOnce(function ( + this: any, + to, + from, + next + ) { + expect(typeof this.counter).toBe('number') + next() + }), }) const WithLeaveTwo = defineComponent({ template: `text`, // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings data: () => ({ counter: 0 }), - beforeRouteLeave: jest - .fn() - .mockImplementationOnce(function (this: any, to, from, next) { - expect(typeof this.counter).toBe('number') - next() - }), + beforeRouteLeave: vi.fn().mockImplementationOnce(function ( + this: any, + to, + from, + next + ) { + expect(typeof this.counter).toBe('number') + next() + }), }) const router = createRouter({ @@ -107,23 +117,29 @@ describe('beforeRouteLeave', () => { template: ``, // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings data: () => ({ counter: 0 }), - beforeRouteLeave: jest - .fn() - .mockImplementationOnce(function (this: any, to, from, next) { - expect(typeof this.counter).toBe('number') - next() - }), + beforeRouteLeave: vi.fn().mockImplementationOnce(function ( + this: any, + to, + from, + next + ) { + expect(typeof this.counter).toBe('number') + next() + }), }) const WithLeave = defineComponent({ template: `text`, // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings data: () => ({ counter: 0 }), - beforeRouteLeave: jest - .fn() - .mockImplementationOnce(function (this: any, to, from, next) { - expect(typeof this.counter).toBe('number') - next() - }), + beforeRouteLeave: vi.fn().mockImplementationOnce(function ( + this: any, + to, + from, + next + ) { + expect(typeof this.counter).toBe('number') + next() + }), }) const router = createRouter({ @@ -166,34 +182,43 @@ describe('beforeRouteLeave', () => { `, // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings data: () => ({ counter: 0 }), - beforeRouteLeave: jest - .fn() - .mockImplementationOnce(function (this: any, to, from, next) { - expect(typeof this.counter).toBe('number') - next() - }), + beforeRouteLeave: vi.fn().mockImplementationOnce(function ( + this: any, + to, + from, + next + ) { + expect(typeof this.counter).toBe('number') + next() + }), }) const WithLeaveOne = defineComponent({ template: `text`, // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings data: () => ({ counter: 0 }), - beforeRouteLeave: jest - .fn() - .mockImplementationOnce(function (this: any, to, from, next) { - expect(typeof this.counter).toBe('number') - next() - }), + beforeRouteLeave: vi.fn().mockImplementationOnce(function ( + this: any, + to, + from, + next + ) { + expect(typeof this.counter).toBe('number') + next() + }), }) const WithLeaveTwo = defineComponent({ template: `text`, // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings data: () => ({ counter: 0 }), - beforeRouteLeave: jest - .fn() - .mockImplementationOnce(function (this: any, to, from, next) { - expect(typeof this.counter).toBe('number') - next() - }), + beforeRouteLeave: vi.fn().mockImplementationOnce(function ( + this: any, + to, + from, + next + ) { + expect(typeof this.counter).toBe('number') + next() + }), }) const router = createRouter({ @@ -234,12 +259,15 @@ describe('beforeRouteLeave', () => { describe('beforeRouteUpdate', () => { it('invokes with the component context', async () => { expect.assertions(2) - const spy = jest - .fn() - .mockImplementationOnce(function (this: any, to, from, next) { - expect(typeof this.counter).toBe('number') - next() - }) + const spy = vi.fn().mockImplementationOnce(function ( + this: any, + to, + from, + next + ) { + expect(typeof this.counter).toBe('number') + next() + }) const WithParam = defineComponent({ template: `text`, // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings diff --git a/packages/router/__tests__/guards/loadRouteLocation.spec.ts b/packages/router/__tests__/guards/loadRouteLocation.spec.ts index e1c63d135..2921dc730 100644 --- a/packages/router/__tests__/guards/loadRouteLocation.spec.ts +++ b/packages/router/__tests__/guards/loadRouteLocation.spec.ts @@ -1,8 +1,10 @@ -import { isRouteComponent, loadRouteLocation } from '../../src/navigationGuards' -import { RouteRecordRaw, RouteLocationRaw } from '../../src/types' +import { loadRouteLocation } from '../../src/navigationGuards' +import { RouteRecordRaw } from '../../src/types' import { components } from '../utils' -import { createMemoryHistory, createRouter } from '../../src' +import { RouteLocationRaw, createMemoryHistory, createRouter } from '../../src' import { FunctionalComponent } from 'vue' +import { describe, expect, it } from 'vitest' +import { isRouteComponent } from '../../src/utils' const FunctionalHome: FunctionalComponent = () => null FunctionalHome.displayName = 'Home' @@ -84,6 +86,61 @@ describe('loadRouteLocation', () => { ]) }) + describe('mods', () => { + const mod = { + default: components.Home, + __esModule: true, + custom: true, + } + const mod2 = { + default: FunctionalHome, + __esModule: true, + custom: true, + } + + it('preserves resolved modules', async () => { + const router = createRouter({ + history: createMemoryHistory(), + routes: [ + { + path: '/', + component: async () => mod, + }, + ], + }) + + const loaded = await loadRouteLocation(router.resolve('/')) + // mods follow the same structure as components + expect(loaded.matched[0]?.mods).toEqual({ + default: expect.anything(), + }) + expect(loaded.matched[0]?.mods?.default).toBe(mod) + }) + + it('preserves resolved modules for named components', async () => { + const router = createRouter({ + history: createMemoryHistory(), + routes: [ + { + path: '/', + components: { + default: async () => mod2, + name: async () => mod, + }, + }, + ], + }) + + const loaded = await loadRouteLocation(router.resolve('/')) + expect(loaded.matched[0]?.mods).toEqual({ + default: expect.anything(), + name: expect.anything(), + }) + expect(loaded.matched[0]?.mods?.name).toBe(mod) + expect(loaded.matched[0]?.mods?.default).toBe(mod2) + }) + }) + it('throws with non loadable routes', async () => { expect.assertions(1) await expect( @@ -93,7 +150,7 @@ describe('loadRouteLocation', () => { it('works with nested routes with redirect', async () => { expect.assertions(2) - testLoadRoute( + await testLoadRoute( [ { path: '/', @@ -105,7 +162,7 @@ describe('loadRouteLocation', () => { ], '/foo' ) - testLoadRoute( + await testLoadRoute( [ { path: '/', diff --git a/packages/router/__tests__/guards/navigatioGuardsInjections.spec.ts b/packages/router/__tests__/guards/navigatioGuardsInjections.spec.ts index fe20236be..522e80b3c 100644 --- a/packages/router/__tests__/guards/navigatioGuardsInjections.spec.ts +++ b/packages/router/__tests__/guards/navigatioGuardsInjections.spec.ts @@ -1,17 +1,15 @@ /** - * @jest-environment jsdom + * @vitest-environment happy-dom */ -import { createDom, newRouter as createRouter } from '../utils' +import { newRouter as createRouter } from '../utils' import { mount } from '@vue/test-utils' import { inject } from 'vue' -import { mockWarn } from 'jest-mock-warn' -import type { Router } from '../../src' +import { mockWarn } from '../vitest-mock-warn' +import { createMemoryHistory, type Router } from '../../src' +import { describe, expect, it } from 'vitest' describe('inject() within navigation guards', () => { mockWarn() - beforeAll(() => { - createDom() - }) const PageComponent = { template: `
Page
`, @@ -96,6 +94,7 @@ describe('inject() within navigation guards', () => { it('beforeRouteUpdate', async () => { expect.assertions(1) const router = createRouter({ + history: createMemoryHistory(), routes: [ { path: '/', @@ -117,6 +116,7 @@ describe('inject() within navigation guards', () => { it('beforeRouteLeave', async () => { expect.assertions(1) const router = createRouter({ + history: createMemoryHistory(), routes: [ { path: '/', component: PageComponent }, { diff --git a/packages/router/__tests__/guards/onBeforeRouteLeave.spec.ts b/packages/router/__tests__/guards/onBeforeRouteLeave.spec.ts index 7fd60c632..a244874f9 100644 --- a/packages/router/__tests__/guards/onBeforeRouteLeave.spec.ts +++ b/packages/router/__tests__/guards/onBeforeRouteLeave.spec.ts @@ -1,5 +1,5 @@ /** - * @jest-environment jsdom + * @vitest-environment jsdom */ import { createRouter, @@ -7,6 +7,7 @@ import { onBeforeRouteLeave, } from '../../src' import { createApp, defineComponent } from 'vue' +import { vi, describe, expect, it } from 'vitest' const component = { template: '
Generic
', @@ -14,7 +15,7 @@ const component = { describe('onBeforeRouteLeave', () => { it('removes guards when leaving the route', async () => { - const spy = jest.fn() + const spy = vi.fn() const WithLeave = defineComponent({ template: `text`, setup() { diff --git a/packages/router/__tests__/guards/onBeforeRouteUpdate.spec.ts b/packages/router/__tests__/guards/onBeforeRouteUpdate.spec.ts index af11c91a2..f2d278e86 100644 --- a/packages/router/__tests__/guards/onBeforeRouteUpdate.spec.ts +++ b/packages/router/__tests__/guards/onBeforeRouteUpdate.spec.ts @@ -1,5 +1,5 @@ /** - * @jest-environment jsdom + * @vitest-environment jsdom */ import { createRouter, @@ -11,13 +11,14 @@ import { import { defineComponent, h, ComponentOptions, FunctionalComponent } from 'vue' import { mount } from '@vue/test-utils' import { delay } from '../utils' +import { vi, describe, expect, it } from 'vitest' const component = { template: '
Generic
', } function withSpy(name?: string, isAsync = false) { - const spy = jest.fn() + const spy = vi.fn() const Component = defineComponent({ name, template: `

${name || 'No Name'}

`, diff --git a/packages/router/__tests__/hash-manual-navigation.spec.ts b/packages/router/__tests__/hash-manual-navigation.spec.ts index a465bb309..9a0887c43 100644 --- a/packages/router/__tests__/hash-manual-navigation.spec.ts +++ b/packages/router/__tests__/hash-manual-navigation.spec.ts @@ -1,5 +1,6 @@ import { createMemoryHistory, createRouter, RouterHistory } from '../src' import { tick } from './utils' +import { describe, expect, it } from 'vitest' const component = {} @@ -34,7 +35,7 @@ describe('hash history edge cases', () => { return }) - // const spy = jest.spyOn(history, 'go') + // const spy = vi.spyOn(history, 'go') history.changeURL('/') await tick() @@ -71,7 +72,7 @@ describe('hash history edge cases', () => { return }) - // const spy = jest.spyOn(history, 'go') + // const spy = vi.spyOn(history, 'go') history.changeURL('/') await tick() diff --git a/packages/router/__tests__/history/hash.spec.ts b/packages/router/__tests__/history/hash.spec.ts index 43a299c15..65cc6dfdd 100644 --- a/packages/router/__tests__/history/hash.spec.ts +++ b/packages/router/__tests__/history/hash.spec.ts @@ -2,12 +2,23 @@ import { JSDOM } from 'jsdom' import { createWebHashHistory } from '../../src/history/hash' import { createWebHistory } from '../../src/history/html5' import { createDom } from '../utils' -import { mockWarn } from 'jest-mock-warn' - -jest.mock('../../src/history/html5') +import { mockWarn } from '../vitest-mock-warn' +import { + vi, + describe, + expect, + it, + beforeAll, + beforeEach, + Mock, + afterAll, + afterEach, +} from 'vitest' + +vi.mock('../../src/history/html5') // override the value of isBrowser because the variable is created before JSDOM // is created -jest.mock('../../src/utils/env', () => ({ +vi.mock('../../src/utils/env', () => ({ isBrowser: true, })) @@ -19,7 +30,7 @@ describe('History Hash', () => { mockWarn() beforeEach(() => { - ;(createWebHistory as jest.Mock).mockClear() + ;(createWebHistory as Mock).mockClear() }) afterAll(() => { diff --git a/packages/router/__tests__/history/html5.spec.ts b/packages/router/__tests__/history/html5.spec.ts index 4eb446a36..88bc12f65 100644 --- a/packages/router/__tests__/history/html5.spec.ts +++ b/packages/router/__tests__/history/html5.spec.ts @@ -1,10 +1,20 @@ import { JSDOM } from 'jsdom' import { createWebHistory } from '../../src/history/html5' import { createDom } from '../utils' +import { + vi, + describe, + expect, + it, + beforeAll, + beforeEach, + afterAll, + afterEach, +} from 'vitest' // override the value of isBrowser because the variable is created before JSDOM // is created -jest.mock('../../src/utils/env', () => ({ +vi.mock('../../src/utils/env', () => ({ isBrowser: true, })) @@ -89,7 +99,7 @@ describe('History HTMl5', () => { it('prepends the host to support // urls', () => { let history = createWebHistory() - let spy = jest.spyOn(window.history, 'pushState') + let spy = vi.spyOn(window.history, 'pushState') history.push('/foo') expect(spy).toHaveBeenCalledWith( expect.anything(), @@ -108,7 +118,7 @@ describe('History HTMl5', () => { describe('specific to base containing a hash', () => { it('calls push with hash part of the url with a base', () => { dom.reconfigure({ url: 'file:///usr/etc/index.html' }) - let initialSpy = jest.spyOn(window.history, 'replaceState') + let initialSpy = vi.spyOn(window.history, 'replaceState') let history = createWebHistory('#') // initial navigation expect(initialSpy).toHaveBeenCalledWith( @@ -116,7 +126,7 @@ describe('History HTMl5', () => { expect.any(String), '#/' ) - let spy = jest.spyOn(window.history, 'pushState') + let spy = vi.spyOn(window.history, 'pushState') history.push('/foo') expect(spy).toHaveBeenCalledWith( expect.anything(), @@ -129,7 +139,7 @@ describe('History HTMl5', () => { it('works with something after the hash in the base', () => { dom.reconfigure({ url: 'file:///usr/etc/index.html' }) - let initialSpy = jest.spyOn(window.history, 'replaceState') + let initialSpy = vi.spyOn(window.history, 'replaceState') let history = createWebHistory('#something') // initial navigation expect(initialSpy).toHaveBeenCalledWith( @@ -137,7 +147,7 @@ describe('History HTMl5', () => { expect.any(String), '#something/' ) - let spy = jest.spyOn(window.history, 'pushState') + let spy = vi.spyOn(window.history, 'pushState') history.push('/foo') expect(spy).toHaveBeenCalledWith( expect.anything(), @@ -150,7 +160,7 @@ describe('History HTMl5', () => { it('works with #! and on a file with initial location', () => { dom.reconfigure({ url: 'file:///usr/etc/index.html#!/foo' }) - let spy = jest.spyOn(window.history, 'replaceState') + let spy = vi.spyOn(window.history, 'replaceState') createWebHistory('#!') expect(spy).toHaveBeenCalledWith( expect.anything(), @@ -162,7 +172,7 @@ describe('History HTMl5', () => { it('works with #other', () => { dom.reconfigure({ url: 'file:///usr/etc/index.html' }) - let spy = jest.spyOn(window.history, 'replaceState') + let spy = vi.spyOn(window.history, 'replaceState') createWebHistory('#other') expect(spy).toHaveBeenCalledWith( expect.anything(), @@ -174,7 +184,7 @@ describe('History HTMl5', () => { it('works with custom#other in domain', () => { dom.reconfigure({ url: 'https://esm.dev/custom' }) - let spy = jest.spyOn(window.history, 'replaceState') + let spy = vi.spyOn(window.history, 'replaceState') createWebHistory('custom#other') expect(spy).toHaveBeenCalledWith( expect.anything(), @@ -186,7 +196,7 @@ describe('History HTMl5', () => { it('works with #! and a host with initial location', () => { dom.reconfigure({ url: 'https://esm.dev/#!/foo' }) - let spy = jest.spyOn(window.history, 'replaceState') + let spy = vi.spyOn(window.history, 'replaceState') createWebHistory('/#!') expect(spy).toHaveBeenCalledWith( expect.anything(), diff --git a/packages/router/__tests__/history/memory.spec.ts b/packages/router/__tests__/history/memory.spec.ts index a1fab2351..b2de91e6d 100644 --- a/packages/router/__tests__/history/memory.spec.ts +++ b/packages/router/__tests__/history/memory.spec.ts @@ -1,5 +1,6 @@ import { createMemoryHistory } from '../../src/history/memory' import { START, HistoryLocation } from '../../src/history/common' +import { vi, describe, expect, it } from 'vitest' const loc: HistoryLocation = '/foo' @@ -26,7 +27,7 @@ describe('Memory history', () => { it('does not trigger listeners with push', () => { const history = createMemoryHistory() - const spy = jest.fn() + const spy = vi.fn() history.listen(spy) history.push(loc) expect(spy).not.toHaveBeenCalled() @@ -34,7 +35,7 @@ describe('Memory history', () => { it('does not trigger listeners with replace', () => { const history = createMemoryHistory() - const spy = jest.fn() + const spy = vi.fn() history.listen(spy) history.replace(loc) expect(spy).not.toHaveBeenCalled() @@ -50,6 +51,16 @@ describe('Memory history', () => { expect(history.location).toEqual(START) }) + it('stores a state', () => { + const history = createMemoryHistory() + history.push(loc, { foo: 'bar' }) + expect(history.state).toEqual({ foo: 'bar' }) + history.push(loc, { foo: 'baz' }) + expect(history.state).toEqual({ foo: 'baz' }) + history.go(-1) + expect(history.state).toEqual({ foo: 'bar' }) + }) + it('does nothing with back if queue contains only one element', () => { const history = createMemoryHistory() history.go(-1) @@ -91,7 +102,7 @@ describe('Memory history', () => { it('can listen to navigations', () => { const history = createMemoryHistory() - const spy = jest.fn() + const spy = vi.fn() history.listen(spy) history.push(loc) history.go(-1) @@ -112,8 +123,8 @@ describe('Memory history', () => { it('can stop listening to navigation', () => { const history = createMemoryHistory() - const spy = jest.fn() - const spy2 = jest.fn() + const spy = vi.fn() + const spy2 = vi.fn() // remove right away history.listen(spy)() const remove = history.listen(spy2) @@ -129,8 +140,8 @@ describe('Memory history', () => { it('removing the same listener is a noop', () => { const history = createMemoryHistory() - const spy = jest.fn() - const spy2 = jest.fn() + const spy = vi.fn() + const spy2 = vi.fn() const rem = history.listen(spy) const rem2 = history.listen(spy2) rem() @@ -149,7 +160,7 @@ describe('Memory history', () => { it('removes all listeners with destroy', () => { const history = createMemoryHistory() history.push('/other') - const spy = jest.fn() + const spy = vi.fn() history.listen(spy) history.destroy() history.push('/2') @@ -177,7 +188,7 @@ describe('Memory history', () => { it('can avoid listeners with back and forward', () => { const history = createMemoryHistory() - const spy = jest.fn() + const spy = vi.fn() history.listen(spy) history.push(loc) history.go(-1, false) diff --git a/packages/router/__tests__/initialNavigation.spec.ts b/packages/router/__tests__/initialNavigation.spec.ts index 04ee5cbaa..c30d7fd34 100644 --- a/packages/router/__tests__/initialNavigation.spec.ts +++ b/packages/router/__tests__/initialNavigation.spec.ts @@ -2,10 +2,11 @@ import { JSDOM } from 'jsdom' import { createRouter, createWebHistory } from '../src' import { createDom, components, nextNavigation } from './utils' import { RouteRecordRaw } from '../src/types' +import { describe, expect, it, beforeAll, vi, afterAll } from 'vitest' // override the value of isBrowser because the variable is created before JSDOM // is created -jest.mock('../src/utils/env', () => ({ +vi.mock('../src/utils/env', () => ({ isBrowser: true, })) diff --git a/packages/router/__tests__/isReady.spec.ts b/packages/router/__tests__/isReady.spec.ts index cad258a00..fb559e7e5 100644 --- a/packages/router/__tests__/isReady.spec.ts +++ b/packages/router/__tests__/isReady.spec.ts @@ -1,6 +1,7 @@ import { createMemoryHistory, createRouter } from '../src' import { components } from './utils' import { RouteRecordRaw } from '../src/types' +import { vi, describe, expect, it } from 'vitest' // generic component because we are not displaying anything so it doesn't matter const component = components.Home @@ -49,7 +50,7 @@ describe('isReady', () => { it('rejects when an error is thrown in a navigation guard', async () => { const router = newRouter() - const errorSpy = jest.fn() + const errorSpy = vi.fn() const error = new Error('failed') router.onError(errorSpy) const remove = router.beforeEach(async () => { @@ -75,7 +76,7 @@ describe('isReady', () => { it('rejects a cancelled navigation', async () => { const router = newRouter() - const errorSpy = jest.fn() + const errorSpy = vi.fn() router.onError(errorSpy) const remove = router.beforeEach(() => false) router.push('/foo').catch(() => {}) @@ -102,7 +103,7 @@ describe('isReady', () => { it('rejects failed lazy loading', async () => { const router = newRouter() - const errorSpy = jest.fn() + const errorSpy = vi.fn() router.onError(errorSpy) router.push('/fail-lazy').catch(() => {}) await expect(router.isReady()).rejects.toEqual(expect.any(Error)) diff --git a/packages/router/__tests__/lazyLoading.spec.ts b/packages/router/__tests__/lazyLoading.spec.ts index 09e97b178..1a8210937 100644 --- a/packages/router/__tests__/lazyLoading.spec.ts +++ b/packages/router/__tests__/lazyLoading.spec.ts @@ -4,7 +4,16 @@ import { RouterOptions } from '../src/router' import { RouteComponent } from '../src/types' import { ticks } from './utils' import { FunctionalComponent, h } from 'vue' -import { mockWarn } from 'jest-mock-warn' +import { mockWarn } from './vitest-mock-warn' +import { + vi, + describe, + expect, + it, + beforeEach, + MockInstance, + afterEach, +} from 'vitest' function newRouter(options: Partial = {}) { let history = createMemoryHistory() @@ -17,7 +26,7 @@ function createLazyComponent() { const [promise, resolve, reject] = fakePromise() return { - component: jest.fn(() => promise.then(() => ({} as RouteComponent))), + component: vi.fn(() => promise.then(() => ({}) as RouteComponent)), promise, resolve, reject, @@ -26,9 +35,9 @@ function createLazyComponent() { describe('Lazy Loading', () => { mockWarn() - let consoleErrorSpy: jest.SpyInstance + let consoleErrorSpy: MockInstance beforeEach(() => { - consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}) + consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}) }) afterEach(() => { @@ -150,7 +159,7 @@ describe('Lazy Loading', () => { it('avoid fetching async component if navigation is cancelled through beforeEnter', async () => { const { component, resolve } = createLazyComponent() - const spy = jest.fn((to, from, next) => next(false)) + const spy = vi.fn((to, from, next) => next(false)) const { router } = newRouter({ routes: [ { @@ -178,7 +187,7 @@ describe('Lazy Loading', () => { ], }) - const spy = jest.fn((to, from, next) => next(false)) + const spy = vi.fn((to, from, next) => next(false)) router.beforeEach(spy) @@ -190,8 +199,8 @@ describe('Lazy Loading', () => { it('invokes beforeRouteEnter after lazy loading the component', async () => { const { promise, resolve } = createLazyComponent() - const spy = jest.fn((to, from, next) => next()) - const component = jest.fn(() => + const spy = vi.fn((to, from, next) => next()) + const component = vi.fn(() => promise.then(() => ({ beforeRouteEnter: spy })) ) const { router } = newRouter({ @@ -206,8 +215,8 @@ describe('Lazy Loading', () => { it('beforeRouteLeave works on a lazy loaded component', async () => { const { promise, resolve } = createLazyComponent() - const spy = jest.fn((to, from, next) => next()) - const component = jest.fn(() => + const spy = vi.fn((to, from, next) => next()) + const component = vi.fn(() => promise.then(() => ({ beforeRouteLeave: spy })) ) const { router } = newRouter({ @@ -231,8 +240,8 @@ describe('Lazy Loading', () => { it('beforeRouteUpdate works on a lazy loaded component', async () => { const { promise, resolve } = createLazyComponent() - const spy = jest.fn((to, from, next) => next()) - const component = jest.fn(() => + const spy = vi.fn((to, from, next) => next()) + const component = vi.fn(() => promise.then(() => ({ beforeRouteUpdate: spy })) ) const { router } = newRouter({ @@ -257,7 +266,7 @@ describe('Lazy Loading', () => { routes: [{ path: '/foo', component }], }) - const spy = jest.fn() + const spy = vi.fn() const error = new Error('fail') reject(error) @@ -279,7 +288,7 @@ describe('Lazy Loading', () => { routes: [{ path: '/foo', component }], }) - const spy = jest.fn() + const spy = vi.fn() reject() await router.push('/foo').catch(spy) @@ -306,7 +315,7 @@ describe('Lazy Loading', () => { ], }) - const spy = jest.fn() + const spy = vi.fn() parent.resolve() const error = new Error() diff --git a/packages/router/__tests__/location.spec.ts b/packages/router/__tests__/location.spec.ts index 08e111bff..8ccd8a425 100644 --- a/packages/router/__tests__/location.spec.ts +++ b/packages/router/__tests__/location.spec.ts @@ -8,7 +8,8 @@ import { resolveRelativePath, } from '../src/location' import { RouteLocationNormalizedLoaded } from 'src' -import { mockWarn } from 'jest-mock-warn' +import { vi, describe, expect, it } from 'vitest' +import { mockWarn } from './vitest-mock-warn' describe('parseURL', () => { let parseURL = originalParseURL.bind(null, parseQuery) @@ -149,7 +150,7 @@ describe('parseURL', () => { }) it('calls parseQuery', () => { - const parseQuery = jest.fn() + const parseQuery = vi.fn() originalParseURL(parseQuery, '/?é=é&é=a') expect(parseQuery).toHaveBeenCalledTimes(1) expect(parseQuery).toHaveBeenCalledWith('é=é&é=a') @@ -214,7 +215,7 @@ describe('stringifyURL', () => { }) it('calls stringifyQuery', () => { - const stringifyQuery = jest.fn() + const stringifyQuery = vi.fn() originalStringifyURL(stringifyQuery, { path: '/', query: { é: 'é', b: 'a' }, diff --git a/packages/router/__tests__/matcher/__snapshots__/resolve.spec.ts.snap b/packages/router/__tests__/matcher/__snapshots__/resolve.spec.ts.snap index d2ffdb9c2..090cc8bc3 100644 --- a/packages/router/__tests__/matcher/__snapshots__/resolve.spec.ts.snap +++ b/packages/router/__tests__/matcher/__snapshots__/resolve.spec.ts.snap @@ -1,11 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`RouterMatcher.resolve LocationAsName throws if the named route does not exists 1`] = ` +exports[`RouterMatcher.resolve > LocationAsName > throws if the named route does not exists 1`] = ` [Error: No match for {"name":"Home"}] `; -exports[`RouterMatcher.resolve LocationAsRelative throws if the current named route does not exists 1`] = ` +exports[`RouterMatcher.resolve > LocationAsRelative > throws if the current named route does not exists 1`] = ` [Error: No match for {"params":{"a":"foo"}} while being at diff --git a/packages/router/__tests__/matcher/addingRemoving.spec.ts b/packages/router/__tests__/matcher/addingRemoving.spec.ts index 336262105..9633ae6cc 100644 --- a/packages/router/__tests__/matcher/addingRemoving.spec.ts +++ b/packages/router/__tests__/matcher/addingRemoving.spec.ts @@ -1,6 +1,7 @@ import { createRouterMatcher } from '../../src/matcher' import { MatcherLocation } from '../../src/types' -import { mockWarn } from 'jest-mock-warn' +import { mockWarn } from '../vitest-mock-warn' +import { describe, expect, it } from 'vitest' const currentLocation = { path: '/' } as MatcherLocation // @ts-expect-error @@ -15,6 +16,21 @@ describe('Matcher: adding and removing records', () => { }) }) + it('can remove all records', () => { + const matcher = createRouterMatcher([], {}) + matcher.addRoute({ path: '/', component }) + matcher.addRoute({ path: '/about', component, name: 'about' }) + matcher.addRoute({ + path: '/with-children', + component, + children: [{ path: 'child', component }], + }) + expect(matcher.getRoutes()).not.toHaveLength(0) + matcher.clearRoutes() + expect(matcher.getRoutes()).toHaveLength(0) + expect(matcher.getRecordMatcher('about')).toBeFalsy() + }) + it('throws when adding *', () => { const matcher = createRouterMatcher([], {}) expect(() => { @@ -388,6 +404,52 @@ describe('Matcher: adding and removing records', () => { }) }) + it('throws if a parent and child have the same name', () => { + expect(() => { + createRouterMatcher( + [ + { + path: '/', + component, + name: 'home', + children: [{ path: '/home', component, name: 'home' }], + }, + ], + {} + ) + }).toThrowError( + 'A route named "home" has been added as a child of a route with the same name' + ) + }) + + it('throws if an ancestor and descendant have the same name', () => { + const name = Symbol('home') + const matcher = createRouterMatcher( + [ + { + path: '/', + name, + children: [ + { + path: 'home', + name: 'other', + component, + }, + ], + }, + ], + {} + ) + + const parent = matcher.getRecordMatcher('other') + + expect(() => { + matcher.addRoute({ path: '', component, name }, parent) + }).toThrowError( + 'A route named "Symbol(home)" has been added as a descendant of a route with the same name' + ) + }) + it('adds empty paths as children', () => { const matcher = createRouterMatcher([], {}) matcher.addRoute({ path: '/', component, name: 'parent' }) diff --git a/packages/router/__tests__/matcher/pathParser.spec.ts b/packages/router/__tests__/matcher/pathParser.spec.ts index 6cff8d4ec..b7b9969b1 100644 --- a/packages/router/__tests__/matcher/pathParser.spec.ts +++ b/packages/router/__tests__/matcher/pathParser.spec.ts @@ -1,5 +1,6 @@ import { tokenizePath, TokenType } from '../../src/matcher/pathTokenizer' import { tokensToParser } from '../../src/matcher/pathParserRanker' +import { describe, expect, it } from 'vitest' describe('Path parser', () => { describe('tokenizer', () => { @@ -618,9 +619,77 @@ describe('Path parser', () => { matchParams('/home', '/other/home', {}, { start: false }) }) + it('defaults to matching the end', () => { + // The default should behave like `end: true` + const optionSets = [{}, { end: true }] + + for (const options of optionSets) { + matchParams('/home', '/home', {}, options) + matchParams('/home', '/home/', {}, options) + matchParams('/home', '/home/other', null, options) + matchParams('/home', '/homepage', null, options) + + matchParams('/home/', '/home', {}, options) + matchParams('/home/', '/home/', {}, options) + matchParams('/home/', '/home/other', null, options) + matchParams('/home/', '/homepage', null, options) + } + }) + it('can not match the end', () => { - matchParams('/home', '/home/other', null, { end: true }) - matchParams('/home', '/home/other', {}, { end: false }) + const options = { end: false } + + matchParams('/home', '/home', {}, options) + matchParams('/home', '/home/', {}, options) + matchParams('/home', '/home/other', {}, options) + matchParams('/home', '/homepage', {}, options) + + matchParams('/home/:p', '/home', null, options) + matchParams('/home/:p', '/home/', null, options) + matchParams('/home/:p', '/home/a', { p: 'a' }, options) + matchParams('/home/:p', '/home/a/', { p: 'a' }, options) + matchParams('/home/:p', '/home/a/b', { p: 'a' }, options) + matchParams('/home/:p', '/homepage', null, options) + + matchParams('/home/', '/home', {}, options) + matchParams('/home/', '/home/', {}, options) + matchParams('/home/', '/home/other', {}, options) + matchParams('/home/', '/homepage', {}, options) + + matchParams('/home/:p/', '/home', null, options) + matchParams('/home/:p/', '/home/', null, options) + matchParams('/home/:p/', '/home/a', { p: 'a' }, options) + matchParams('/home/:p/', '/home/a/', { p: 'a' }, options) + matchParams('/home/:p/', '/home/a/b', { p: 'a' }, options) + matchParams('/home/:p/', '/homepage', null, options) + }) + + it('can not match the end when strict', () => { + const options = { end: false, strict: true } + + matchParams('/home', '/home', {}, options) + matchParams('/home', '/home/', {}, options) + matchParams('/home', '/home/other', {}, options) + matchParams('/home', '/homepage', null, options) + + matchParams('/home/:p', '/home', null, options) + matchParams('/home/:p', '/home/', null, options) + matchParams('/home/:p', '/home/a', { p: 'a' }, options) + matchParams('/home/:p', '/home/a/', { p: 'a' }, options) + matchParams('/home/:p', '/home/a/b', { p: 'a' }, options) + matchParams('/home/:p', '/homepage', null, options) + + matchParams('/home/', '/home', null, options) + matchParams('/home/', '/home/', {}, options) + matchParams('/home/', '/home/other', {}, options) + matchParams('/home/', '/homepage', null, options) + + matchParams('/home/:p/', '/home', null, options) + matchParams('/home/:p/', '/home/', null, options) + matchParams('/home/:p/', '/home/a', null, options) + matchParams('/home/:p/', '/home/a/', { p: 'a' }, options) + matchParams('/home/:p/', '/home/a/b', { p: 'a' }, options) + matchParams('/home/:p/', '/homepage', null, options) }) it('should not match optional params + static without leading slash', () => { diff --git a/packages/router/__tests__/matcher/pathRanking.spec.ts b/packages/router/__tests__/matcher/pathRanking.spec.ts index a5d4d46a1..230c3a182 100644 --- a/packages/router/__tests__/matcher/pathRanking.spec.ts +++ b/packages/router/__tests__/matcher/pathRanking.spec.ts @@ -3,6 +3,7 @@ import { tokensToParser, comparePathParserScore, } from '../../src/matcher/pathParserRanker' +import { describe, expect, it } from 'vitest' type PathParserOptions = Parameters[1] diff --git a/packages/router/__tests__/matcher/records.spec.ts b/packages/router/__tests__/matcher/records.spec.ts index 698edcdfb..92d459084 100644 --- a/packages/router/__tests__/matcher/records.spec.ts +++ b/packages/router/__tests__/matcher/records.spec.ts @@ -1,4 +1,5 @@ import { normalizeRouteRecord } from '../../src/matcher' +import { vi, describe, expect, it } from 'vitest' describe('normalizeRouteRecord', () => { it('transforms a single view into multiple views', () => { @@ -22,7 +23,7 @@ describe('normalizeRouteRecord', () => { }) it('keeps original values in single view', () => { - const beforeEnter = jest.fn() + const beforeEnter = vi.fn() const record = normalizeRouteRecord({ path: '/home', beforeEnter, @@ -64,7 +65,7 @@ describe('normalizeRouteRecord', () => { }) it('keeps original values in multiple views', () => { - const beforeEnter = jest.fn() + const beforeEnter = vi.fn() const record = normalizeRouteRecord({ path: '/home', beforeEnter, diff --git a/packages/router/__tests__/matcher/resolve.spec.ts b/packages/router/__tests__/matcher/resolve.spec.ts index 359a3daa9..2b9c4e7ae 100644 --- a/packages/router/__tests__/matcher/resolve.spec.ts +++ b/packages/router/__tests__/matcher/resolve.spec.ts @@ -1,14 +1,15 @@ import { createRouterMatcher, normalizeRouteRecord } from '../../src/matcher' import { - START_LOCATION_NORMALIZED, RouteComponent, RouteRecordRaw, MatcherLocationRaw, MatcherLocation, } from '../../src/types' import { MatcherLocationNormalizedLoose } from '../utils' -import { mockWarn } from 'jest-mock-warn' -import { defineComponent } from '@vue/runtime-core' +import { defineComponent } from 'vue' +import { START_LOCATION_NORMALIZED } from '../../src/location' +import { mockWarn } from '../vitest-mock-warn' +import { describe, expect, it } from 'vitest' const component: RouteComponent = defineComponent({}) @@ -75,7 +76,7 @@ describe('RouterMatcher.resolve', () => { /** * * @param record - Record or records we are testing the matcher against - * @param location - location we want to reolve against + * @param location - location we want to resolve against * @param [start] Optional currentLocation used when resolving * @returns error */ @@ -777,6 +778,40 @@ describe('RouterMatcher.resolve', () => { ) }) + it('keep optional params from parent record', () => { + const Child_A = { path: 'a', name: 'child_a', components } + const Child_B = { path: 'b', name: 'child_b', components } + const Parent = { + path: '/:optional?/parent', + name: 'parent', + components, + children: [Child_A, Child_B], + } + assertRecordMatch( + Parent, + { name: 'child_b' }, + { + name: 'child_b', + path: '/foo/parent/b', + params: { optional: 'foo' }, + matched: [ + Parent as any, + { + ...Child_B, + path: `${Parent.path}/${Child_B.path}`, + }, + ], + }, + { + params: { optional: 'foo' }, + path: '/foo/parent/a', + matched: [], + meta: {}, + name: undefined, + } + ) + }) + it('discards non existent params', () => { assertRecordMatch( { path: '/', name: 'home', components }, diff --git a/packages/router/__tests__/multipleApps.spec.ts b/packages/router/__tests__/multipleApps.spec.ts index 1158048e8..664cd08af 100644 --- a/packages/router/__tests__/multipleApps.spec.ts +++ b/packages/router/__tests__/multipleApps.spec.ts @@ -1,7 +1,7 @@ import { createRouter, createMemoryHistory } from '../src' import { h } from 'vue' import { createDom } from './utils' -// import { mockWarn } from 'jest-mock-warn' +import { vi, describe, expect, it, beforeAll } from 'vitest' const delay = (t: number) => new Promise(resolve => setTimeout(resolve, t)) @@ -34,7 +34,7 @@ describe('Multiple apps', () => { it('does not listen to url changes before being ready', async () => { const { router, history } = newRouter() - const spy = jest.fn((to, from, next) => { + const spy = vi.fn((to, from, next) => { next() }) router.beforeEach(spy) diff --git a/packages/router/__tests__/parseQuery.spec.ts b/packages/router/__tests__/parseQuery.spec.ts index b16c86245..031c3932c 100644 --- a/packages/router/__tests__/parseQuery.spec.ts +++ b/packages/router/__tests__/parseQuery.spec.ts @@ -1,5 +1,6 @@ import { parseQuery } from '../src/query' -import { mockWarn } from 'jest-mock-warn' +import { mockWarn } from './vitest-mock-warn' +import { describe, expect, it } from 'vitest' describe('parseQuery', () => { mockWarn() diff --git a/packages/router/__tests__/routeLocation.test-d.ts b/packages/router/__tests__/routeLocation.test-d.ts new file mode 100644 index 000000000..423f20a29 --- /dev/null +++ b/packages/router/__tests__/routeLocation.test-d.ts @@ -0,0 +1,118 @@ +import { describe, it, expectTypeOf } from 'vitest' +import type { + RouteRecordName, + ParamValue, + ParamValueZeroOrMore, + RouteRecordInfo, + RouteLocationNormalizedTypedList, +} from '../src' + +// NOTE: A type allows us to make it work only in this test file +// https://github.com/microsoft/TypeScript/issues/15300 +type RouteNamedMap = { + home: RouteRecordInfo<'/', '/', Record, Record> + '/[other]': RouteRecordInfo< + '/[other]', + '/:other', + { other: ParamValue }, + { other: ParamValue }, + never + > + '/groups/[gid]': RouteRecordInfo< + '/groups/[gid]', + '/:gid', + { gid: ParamValue }, + { gid: ParamValue }, + '/groups/[gid]/users' | '/groups/[gid]/users/[uid]' + > + '/groups/[gid]/users': RouteRecordInfo< + '/groups/[gid]/users', + '/:gid/users', + { gid: ParamValue }, + { gid: ParamValue }, + '/groups/[gid]/users/[uid]' + > + '/groups/[gid]/users/[uid]': RouteRecordInfo< + '/groups/[gid]/users/[uid]', + '/:gid/users/:uid', + { gid: ParamValue; uid: ParamValue }, + { gid: ParamValue; uid: ParamValue }, + never + > + '/[...path]': RouteRecordInfo< + '/[...path]', + '/:path(.*)', + { path: ParamValue }, + { path: ParamValue }, + never + > + '/deep/nesting/works/[[files]]+': RouteRecordInfo< + '/deep/nesting/works/[[files]]+', + '/deep/nesting/works/:files*', + { files?: ParamValueZeroOrMore }, + { files?: ParamValueZeroOrMore }, + never + > +} + +describe('Route Location types', () => { + it('RouteLocationNormalized', () => { + function withRoute( + fn: ( + to: RouteLocationNormalizedTypedList[keyof RouteNamedMap] + ) => void + ): void + function withRoute( + name: Name, + fn: (to: RouteLocationNormalizedTypedList[Name]) => void + ): void + function withRoute<_Name extends RouteRecordName>(..._args: unknown[]) {} + + withRoute('/[other]', to => { + expectTypeOf(to.params).toEqualTypeOf<{ other: string }>() + expectTypeOf(to.params).not.toEqualTypeOf<{ gid: string }>() + expectTypeOf(to.params).not.toEqualTypeOf<{ notExisting: string }>() + }) + + withRoute('/groups/[gid]', to => { + expectTypeOf(to.params).toEqualTypeOf<{ gid: string }>() + expectTypeOf(to.params).not.toEqualTypeOf<{ notExisting: string }>() + expectTypeOf(to.params).not.toEqualTypeOf<{ other: string }>() + }) + + withRoute('/groups/[gid]/users', to => { + expectTypeOf(to.params).toEqualTypeOf<{ gid: string }>() + expectTypeOf(to.params).not.toEqualTypeOf<{ gid: string; uid: string }>() + expectTypeOf(to.params).not.toEqualTypeOf<{ other: string }>() + }) + + withRoute('/groups/[gid]/users/[uid]', to => { + expectTypeOf(to.params).toEqualTypeOf<{ gid: string; uid: string }>() + expectTypeOf(to.params).not.toEqualTypeOf<{ notExisting: string }>() + expectTypeOf(to.params).not.toEqualTypeOf<{ other: string }>() + }) + + withRoute('/groups/[gid]' as keyof RouteNamedMap, to => { + // @ts-expect-error: no all params have this + to.params.gid + if (to.name === '/groups/[gid]') { + to.params.gid + // @ts-expect-error: no param other + to.params.other + } + }) + + withRoute(to => { + // @ts-expect-error: not all params object have a name + to.params.gid + // @ts-expect-error: no route named like that + if (to.name === '') { + } + if (to.name === '/groups/[gid]') { + expectTypeOf(to.params).toEqualTypeOf<{ gid: string }>() + // @ts-expect-error: no param other + to.params.other + } + }) + }) +}) diff --git a/packages/router/__tests__/router.spec.ts b/packages/router/__tests__/router.spec.ts index 951f2f0db..bf11f31ba 100644 --- a/packages/router/__tests__/router.spec.ts +++ b/packages/router/__tests__/router.spec.ts @@ -4,15 +4,15 @@ import { createMemoryHistory, createWebHistory, createWebHashHistory, + loadRouteLocation, + RouteLocationRaw, } from '../src' import { NavigationFailureType } from '../src/errors' import { createDom, components, tick, nextNavigation } from './utils' -import { - RouteRecordRaw, - RouteLocationRaw, - START_LOCATION_NORMALIZED, -} from '../src/types' -import { mockWarn } from 'jest-mock-warn' +import { RouteRecordRaw } from '../src/types' +import { START_LOCATION_NORMALIZED } from '../src/location' +import { vi, describe, expect, it, beforeAll } from 'vitest' +import { mockWarn } from './vitest-mock-warn' declare var __DEV__: boolean @@ -110,7 +110,7 @@ describe('Router', () => { it('calls history.push with router.push', async () => { const { router, history } = await newRouter() - jest.spyOn(history, 'push') + vi.spyOn(history, 'push') await router.push('/foo') expect(history.push).toHaveBeenCalledTimes(1) expect(history.push).toHaveBeenCalledWith('/foo', undefined) @@ -119,7 +119,7 @@ describe('Router', () => { it('calls history.replace with router.replace', async () => { const history = createMemoryHistory() const { router } = await newRouter({ history }) - jest.spyOn(history, 'replace') + vi.spyOn(history, 'replace') await router.replace('/foo') expect(history.replace).toHaveBeenCalledTimes(1) expect(history.replace).toHaveBeenCalledWith('/foo', expect.anything()) @@ -128,7 +128,7 @@ describe('Router', () => { it('parses query and hash with router.replace', async () => { const history = createMemoryHistory() const { router } = await newRouter({ history }) - jest.spyOn(history, 'replace') + vi.spyOn(history, 'replace') await router.replace('/foo?q=2#a') expect(history.replace).toHaveBeenCalledTimes(1) expect(history.replace).toHaveBeenCalledWith( @@ -142,8 +142,8 @@ describe('Router', () => { const { router } = await newRouter({ history }) // move somewhere else await router.push('/search') - jest.spyOn(history, 'replace') - jest.spyOn(history, 'push') + vi.spyOn(history, 'replace') + vi.spyOn(history, 'push') await router.replace('/home-before') expect(history.push).toHaveBeenCalledTimes(0) expect(history.replace).toHaveBeenCalledTimes(1) @@ -160,8 +160,8 @@ describe('Router', () => { } return // no warn }) - jest.spyOn(history, 'replace') - jest.spyOn(history, 'push') + vi.spyOn(history, 'replace') + vi.spyOn(history, 'push') await router.push('/search') expect(history.location).toBe('/foo') expect(history.push).toHaveBeenCalledTimes(0) @@ -170,7 +170,7 @@ describe('Router', () => { }) it('allows to customize parseQuery', async () => { - const parseQuery = jest.fn(_ => ({})) + const parseQuery = vi.fn(_ => ({})) const { router } = await newRouter({ parseQuery }) const to = router.resolve('/foo?bar=baz') expect(parseQuery).toHaveBeenCalledWith('bar=baz') @@ -178,7 +178,7 @@ describe('Router', () => { }) it('allows to customize stringifyQuery', async () => { - const stringifyQuery = jest.fn(_ => '') + const stringifyQuery = vi.fn(_ => '') const { router } = await newRouter({ stringifyQuery }) const to = router.resolve({ query: { foo: 'bar' } }) expect(stringifyQuery).toHaveBeenCalledWith({ foo: 'bar' }) @@ -187,7 +187,7 @@ describe('Router', () => { }) it('creates an empty query with no query', async () => { - const stringifyQuery = jest.fn(_ => '') + const stringifyQuery = vi.fn(_ => '') const { router } = await newRouter({ stringifyQuery }) const to = router.resolve({ hash: '#a' }) expect(stringifyQuery).not.toHaveBeenCalled() @@ -255,7 +255,7 @@ describe('Router', () => { it('can pass replace option to push', async () => { const { router, history } = await newRouter() - jest.spyOn(history, 'replace') + vi.spyOn(history, 'replace') await router.push({ path: '/foo', replace: true }) expect(history.replace).toHaveBeenCalledTimes(1) expect(history.replace).toHaveBeenCalledWith('/foo', expect.anything()) @@ -263,7 +263,7 @@ describe('Router', () => { it('can replaces current location with a string location', async () => { const { router, history } = await newRouter() - jest.spyOn(history, 'replace') + vi.spyOn(history, 'replace') await router.replace('/foo') expect(history.replace).toHaveBeenCalledTimes(1) expect(history.replace).toHaveBeenCalledWith('/foo', expect.anything()) @@ -271,7 +271,7 @@ describe('Router', () => { it('can replaces current location with an object location', async () => { const { router, history } = await newRouter() - jest.spyOn(history, 'replace') + vi.spyOn(history, 'replace') await router.replace({ path: '/foo' }) expect(history.replace).toHaveBeenCalledTimes(1) expect(history.replace).toHaveBeenCalledWith('/foo', expect.anything()) @@ -279,7 +279,7 @@ describe('Router', () => { it('navigates if the location does not exist', async () => { const { router } = await newRouter({ routes: [routes[0]] }) - const spy = jest.fn((to, from, next) => next()) + const spy = vi.fn((to, from, next) => next()) router.beforeEach(spy) await router.push('/idontexist') expect(spy).toHaveBeenCalledTimes(1) @@ -330,6 +330,22 @@ describe('Router', () => { expect(route1.params).toEqual({ p: 'a' }) }) + it('warns on undefined location during dev', async () => { + const { router } = await newRouter() + + const route1 = router.resolve(undefined as any) + expect('router.resolve() was passed an invalid location').toHaveBeenWarned() + expect(route1.path).toBe('/') + }) + + it('warns on null location during dev', async () => { + const { router } = await newRouter() + + const route1 = router.resolve(null as any) + expect('router.resolve() was passed an invalid location').toHaveBeenWarned() + expect(route1.path).toBe('/') + }) + it('removes null/undefined optional params when current location has it', async () => { const { router } = await newRouter() @@ -452,7 +468,9 @@ describe('Router', () => { expect( router.resolve( { params: { p: 1 } }, - router.resolve({ name: 'Param', params: { p: 2 } }) + await loadRouteLocation( + router.resolve({ name: 'Param', params: { p: 2 } }) + ) ) ).toMatchObject({ name: 'Param', @@ -486,7 +504,7 @@ describe('Router', () => { describe('alias', () => { it('does not navigate to alias if already on original record', async () => { const { router } = await newRouter() - const spy = jest.fn((to, from, next) => next()) + const spy = vi.fn((to, from, next) => next()) await router.push('/basic') router.beforeEach(spy) await router.push('/basic-alias') @@ -495,7 +513,7 @@ describe('Router', () => { it('does not navigate to alias with children if already on original record', async () => { const { router } = await newRouter() - const spy = jest.fn((to, from, next) => next()) + const spy = vi.fn((to, from, next) => next()) await router.push('/aliases') router.beforeEach(spy) await router.push('/aliases1') @@ -506,7 +524,7 @@ describe('Router', () => { it('does not navigate to child alias if already on original record', async () => { const { router } = await newRouter() - const spy = jest.fn((to, from, next) => next()) + const spy = vi.fn((to, from, next) => next()) await router.push('/aliases/one') router.beforeEach(spy) await router.push('/aliases1/one') @@ -518,6 +536,24 @@ describe('Router', () => { }) }) + it('should be able to resolve a partially updated location', async () => { + const { router } = await newRouter() + expect( + router.resolve({ + // spread the current location + ...router.currentRoute.value, + // then update some stuff, creating inconsistencies, + query: { a: '1' }, + hash: '#a', + }) + ).toMatchObject({ + query: { a: '1' }, + path: '/', + fullPath: '/?a=1#a', + hash: '#a', + }) + }) + describe('navigation cancelled', () => { async function checkNavigationCancelledOnPush( target?: RouteLocationRaw | false @@ -663,7 +699,7 @@ describe('Router', () => { it('only triggers guards once with a redirect option', async () => { const history = createMemoryHistory() const router = createRouter({ history, routes }) - const spy = jest.fn((to, from, next) => next()) + const spy = vi.fn((to, from, next) => next()) router.beforeEach(spy) await router.push('/to-foo') expect(spy).toHaveBeenCalledTimes(1) @@ -1076,5 +1112,22 @@ describe('Router', () => { name: 'Param', }) }) + + it('warns when the parent route is missing', async () => { + const { router } = await newRouter() + router.addRoute('parent-route', { + path: '/p', + component: components.Foo, + }) + expect( + 'Parent route "parent-route" not found when adding child route' + ).toHaveBeenWarned() + }) + + it('warns when removing a missing route', async () => { + const { router } = await newRouter() + router.removeRoute('route-name') + expect('Cannot remove non-existent route "route-name"').toHaveBeenWarned() + }) }) }) diff --git a/packages/router/__tests__/scrollBehavior.spec.ts b/packages/router/__tests__/scrollBehavior.spec.ts index 3e1dd70ac..bdd42a3e5 100644 --- a/packages/router/__tests__/scrollBehavior.spec.ts +++ b/packages/router/__tests__/scrollBehavior.spec.ts @@ -1,20 +1,30 @@ import { JSDOM } from 'jsdom' import { scrollToPosition } from '../src/scrollBehavior' import { createDom } from './utils' -import { mockWarn } from 'jest-mock-warn' +import { mockWarn } from './vitest-mock-warn' +import { + vi, + describe, + expect, + it, + beforeEach, + afterAll, + beforeAll, + MockInstance, +} from 'vitest' describe('scrollBehavior', () => { mockWarn() let dom: JSDOM - let scrollTo: jest.SpyInstance - let getElementById: jest.SpyInstance - let querySelector: jest.SpyInstance + let scrollTo: MockInstance + let getElementById: MockInstance + let querySelector: MockInstance beforeAll(() => { dom = createDom() - scrollTo = jest.spyOn(window, 'scrollTo').mockImplementation(() => {}) - getElementById = jest.spyOn(document, 'getElementById') - querySelector = jest.spyOn(document, 'querySelector') + scrollTo = vi.spyOn(window, 'scrollTo').mockImplementation(() => {}) + getElementById = vi.spyOn(document, 'getElementById') + querySelector = vi.spyOn(document, 'querySelector') // #text let el = document.createElement('div') diff --git a/packages/router/__tests__/ssr.spec.ts b/packages/router/__tests__/ssr.spec.ts index 660c1ae02..65091620f 100644 --- a/packages/router/__tests__/ssr.spec.ts +++ b/packages/router/__tests__/ssr.spec.ts @@ -1,5 +1,5 @@ /** - * @jest-environment node + * @vitest-environment node */ import { createRouter, createMemoryHistory } from '../src' import { createSSRApp, resolveComponent, Component } from 'vue' @@ -8,6 +8,7 @@ import { ssrInterpolate, ssrRenderComponent, } from '@vue/server-renderer' +import { describe, expect, it } from 'vitest' const delay = (t: number) => new Promise(resolve => setTimeout(resolve, t)) diff --git a/packages/router/__tests__/stringifyQuery.spec.ts b/packages/router/__tests__/stringifyQuery.spec.ts index 64e774ee6..16a9703d4 100644 --- a/packages/router/__tests__/stringifyQuery.spec.ts +++ b/packages/router/__tests__/stringifyQuery.spec.ts @@ -1,5 +1,6 @@ import { stringifyQuery } from '../src/query' -import { mockWarn } from 'jest-mock-warn' +import { mockWarn } from './vitest-mock-warn' +import { describe, expect, it } from 'vitest' describe('stringifyQuery', () => { mockWarn() diff --git a/packages/router/__tests__/urlEncoding.spec.ts b/packages/router/__tests__/urlEncoding.spec.ts index 4102b73bd..fd83e1a07 100644 --- a/packages/router/__tests__/urlEncoding.spec.ts +++ b/packages/router/__tests__/urlEncoding.spec.ts @@ -3,8 +3,9 @@ import { components } from './utils' import { RouteRecordRaw } from '../src/types' import { createMemoryHistory } from '../src' import * as encoding from '../src/encoding' +import { vi, describe, expect, it, beforeEach } from 'vitest' -jest.mock('../src/encoding') +vi.mock('../src/encoding') const routes: RouteRecordRaw[] = [ { path: '/', name: 'home', component: components.Home }, @@ -28,7 +29,7 @@ describe('URL Encoding', () => { // @ts-expect-error const value = encoding[key] // @ts-expect-error - if (typeof value === 'function') encoding[key] = jest.fn((v: string) => v) + if (typeof value === 'function') encoding[key] = vi.fn((v: string) => v) // @ts-expect-error else if (key === 'PLUS_RE') encoding[key] = /\+/g } diff --git a/packages/router/__tests__/useApi.spec.ts b/packages/router/__tests__/useApi.spec.ts index e8e7be28f..b9d69ae96 100644 --- a/packages/router/__tests__/useApi.spec.ts +++ b/packages/router/__tests__/useApi.spec.ts @@ -1,9 +1,10 @@ /** - * @jest-environment jsdom + * @vitest-environment jsdom */ import { mount } from '@vue/test-utils' import { computed } from 'vue' import { useRoute, createRouter, createMemoryHistory } from '../src' +import { describe, expect, it } from 'vitest' describe('use apis', () => { it('unwraps useRoute()', async () => { diff --git a/packages/router/__tests__/useLink.spec.ts b/packages/router/__tests__/useLink.spec.ts new file mode 100644 index 000000000..094e837af --- /dev/null +++ b/packages/router/__tests__/useLink.spec.ts @@ -0,0 +1,144 @@ +/** + * @vitest-environment jsdom + */ +import { nextTick, ref } from 'vue' +import { mount } from '@vue/test-utils' +import { mockWarn } from './vitest-mock-warn' +import { + createMemoryHistory, + createRouter, + RouteLocationRaw, + useLink, + UseLinkOptions, +} from '../src' +import { describe, expect, it } from 'vitest' + +async function callUseLink(args: UseLinkOptions) { + const router = createRouter({ + history: createMemoryHistory(), + routes: [ + { + path: '/', + component: {}, + name: 'root', + }, + { + path: '/a', + component: {}, + name: 'a', + }, + { + path: '/b', + component: {}, + name: 'b', + }, + ], + }) + + await router.push('/') + + let link: ReturnType + + mount( + { + setup() { + link = useLink(args) + + return () => '' + }, + }, + { + global: { + plugins: [router], + }, + } + ) + + return link! +} + +describe('useLink', () => { + describe('basic usage', () => { + it('supports a string for "to"', async () => { + const { href, route } = await callUseLink({ + to: '/a', + }) + + expect(href.value).toBe('/a') + expect(route.value).toMatchObject({ name: 'a' }) + }) + + it('supports an object for "to"', async () => { + const { href, route } = await callUseLink({ + to: { path: '/a' }, + }) + + expect(href.value).toBe('/a') + expect(route.value).toMatchObject({ name: 'a' }) + }) + + it('supports a ref for "to"', async () => { + const to = ref('/a') + + const { href, route } = await callUseLink({ + to, + }) + + expect(href.value).toBe('/a') + expect(route.value).toMatchObject({ name: 'a' }) + + to.value = { path: '/b' } + + await nextTick() + + expect(href.value).toBe('/b') + expect(route.value).toMatchObject({ name: 'b' }) + }) + }) + + describe('warnings', () => { + mockWarn() + + it('should warn when "to" is undefined', async () => { + await callUseLink({ + to: undefined as any, + }) + + expect('Invalid value for prop "to" in useLink()').toHaveBeenWarned() + expect( + 'router.resolve() was passed an invalid location' + ).toHaveBeenWarned() + }) + + it('should warn when "to" is an undefined ref', async () => { + await callUseLink({ + to: ref(undefined as any), + }) + + expect('Invalid value for prop "to" in useLink()').toHaveBeenWarned() + expect( + 'router.resolve() was passed an invalid location' + ).toHaveBeenWarned() + }) + + it('should warn when "to" changes to a null ref', async () => { + const to = ref('/a') + + const { href, route } = await callUseLink({ + to, + }) + + expect(href.value).toBe('/a') + expect(route.value).toMatchObject({ name: 'a' }) + + to.value = null as any + + await nextTick() + + expect('Invalid value for prop "to" in useLink()').toHaveBeenWarned() + expect( + 'router.resolve() was passed an invalid location' + ).toHaveBeenWarned() + }) + }) +}) diff --git a/packages/router/__tests__/utils.ts b/packages/router/__tests__/utils.ts index 620757ce7..a6020fc3a 100644 --- a/packages/router/__tests__/utils.ts +++ b/packages/router/__tests__/utils.ts @@ -1,13 +1,9 @@ import { JSDOM, ConstructorOptions } from 'jsdom' import { - NavigationGuard, RouteRecordMultipleViews, MatcherLocation, - RouteLocationNormalized, RouteComponent, RouteRecordRaw, - RouteRecordName, - _RouteRecordProps, } from '../src/types' import { h, ComponentOptions } from 'vue' import { @@ -17,7 +13,10 @@ import { Router, RouterView, RouteRecordNormalized, + NavigationGuard, + RouteLocationNormalized, } from '../src' +import { _RouteRecordProps } from '../src/typed-routes' export const tick = (time?: number) => new Promise(resolve => { @@ -65,7 +64,7 @@ export interface RouteRecordViewLoose // @ts-expect-error we are intentionally overriding the type export interface RouteLocationNormalizedLoose extends RouteLocationNormalized { - name: RouteRecordName | null | undefined + name: string | symbol | null | undefined path: string // record? params: any diff --git a/packages/router/__tests__/vitest-mock-warn.ts b/packages/router/__tests__/vitest-mock-warn.ts new file mode 100644 index 000000000..8b2268629 --- /dev/null +++ b/packages/router/__tests__/vitest-mock-warn.ts @@ -0,0 +1,125 @@ +// https://github.com/posva/jest-mock-warn/blob/master/src/index.js + +import { afterEach, beforeEach, expect, type MockInstance, vi } from 'vitest' + +export function mockWarn() { + expect.extend({ + toHaveBeenWarned(received: string | RegExp) { + asserted.set(received.toString(), received) + const passed = warn.mock.calls.some(args => + typeof received === 'string' + ? args[0].indexOf(received) > -1 + : received.test(args[0]) + ) + if (passed) { + return { + pass: true, + message: () => `expected "${received}" not to have been warned.`, + } + } else { + const msgs = warn.mock.calls.map(args => args[0]).join('\n - ') + return { + pass: false, + message: () => + `expected "${received}" to have been warned.\n\nActual messages:\n\n - ${msgs}`, + } + } + }, + + toHaveBeenWarnedLast(received: string | RegExp) { + asserted.set(received.toString(), received) + if (warn.mock.calls.length === 0) { + return { + pass: false, + message: () => 'expected console.warn to have been called.', + } + } + const lastCall = warn.mock.calls.at(-1)?.[0] + const passed = + typeof received === 'string' + ? lastCall.indexOf(received) > -1 + : received.test(lastCall) + if (passed) { + return { + pass: true, + message: () => `expected "${received}" not to have been warned last.`, + } + } else { + const msgs = warn.mock.calls.map(args => args[0]).join('\n - ') + return { + pass: false, + message: () => + `expected "${received}" to have been warned last.\n\nActual messages:\n\n - ${msgs}`, + } + } + }, + + toHaveBeenWarnedTimes(received: string | RegExp, n: number) { + asserted.set(received.toString(), received) + let found = 0 + warn.mock.calls.forEach(args => { + const isFound = + typeof received === 'string' + ? args[0].indexOf(received) > -1 + : received.test(args[0]) + if (isFound) { + found++ + } + }) + + if (found === n) { + return { + pass: true, + message: () => + `expected "${received}" to have been warned ${n} times.`, + } + } else { + return { + pass: false, + message: () => + `expected "${received}" to have been warned ${n} times but got ${found}.`, + } + } + }, + }) + + let warn: MockInstance + const asserted = new Map() + + beforeEach(() => { + asserted.clear() + warn = vi.spyOn(console, 'warn') + warn.mockImplementation(() => {}) + }) + + afterEach(() => { + const assertedArray = Array.from(asserted) + const nonAssertedWarnings = warn.mock.calls + .map(args => args[0]) + .filter(received => { + return !assertedArray.some(([_key, assertedMsg]) => { + return typeof assertedMsg === 'string' + ? received.indexOf(assertedMsg) > -1 + : assertedMsg.test(received) + }) + }) + warn.mockRestore() + if (nonAssertedWarnings.length) { + nonAssertedWarnings.forEach(warning => { + console.warn(warning) + }) + throw new Error(`test case threw unexpected warnings.`) + } + }) +} + +interface CustomMatchers { + toHaveBeenWarned(): R + toHaveBeenWarnedLast(): R + toHaveBeenWarnedTimes(n: number): R +} + +declare module 'vitest' { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} diff --git a/packages/router/__tests__/warnings.spec.ts b/packages/router/__tests__/warnings.spec.ts index 82f6450d5..7d9d9274e 100644 --- a/packages/router/__tests__/warnings.spec.ts +++ b/packages/router/__tests__/warnings.spec.ts @@ -1,4 +1,3 @@ -import { mockWarn } from 'jest-mock-warn' import { createMemoryHistory, createRouter, createRouterMatcher } from '../src' import { defineAsyncComponent, @@ -6,6 +5,8 @@ import { FunctionalComponent, h, } from 'vue' +import { describe, expect, it } from 'vitest' +import { mockWarn } from './vitest-mock-warn' let component = defineComponent({}) @@ -117,7 +118,7 @@ describe('warnings', () => { ).toHaveBeenWarned() }) - it('warns if next is called multiple times in one navigation guard', done => { + it('warns if next is called multiple times in one navigation guard', async () => { expect.assertions(3) let router = createRouter({ history: createMemoryHistory(), @@ -134,10 +135,9 @@ describe('warnings', () => { expect('called more than once').toHaveBeenWarnedTimes(1) next() expect('called more than once').toHaveBeenWarnedTimes(1) - done() }) - router.push('/b') + await router.push('/b') }) it('warns if a non valid function is passed as a component', async () => { diff --git a/packages/router/e2e/encoding/index.html b/packages/router/e2e/encoding/index.html index 35c8aba90..17424f16f 100644 --- a/packages/router/e2e/encoding/index.html +++ b/packages/router/e2e/encoding/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/guards-instances/index.html b/packages/router/e2e/guards-instances/index.html index da5b204e3..869ba4b91 100644 --- a/packages/router/e2e/guards-instances/index.html +++ b/packages/router/e2e/guards-instances/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/hash/index.html b/packages/router/e2e/hash/index.html index 581258865..c8a7db71e 100644 --- a/packages/router/e2e/hash/index.html +++ b/packages/router/e2e/hash/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/index.html b/packages/router/e2e/index.html index 4d5ad1e06..af9ce61c3 100644 --- a/packages/router/e2e/index.html +++ b/packages/router/e2e/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/keep-alive/index.html b/packages/router/e2e/keep-alive/index.html index 9db3f3af6..427493582 100644 --- a/packages/router/e2e/keep-alive/index.html +++ b/packages/router/e2e/keep-alive/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/modal/index.html b/packages/router/e2e/modal/index.html index 7e443a4dd..59eb6fd0d 100644 --- a/packages/router/e2e/modal/index.html +++ b/packages/router/e2e/modal/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/multi-app/index.html b/packages/router/e2e/multi-app/index.html index 683f593c4..29dd3c6a3 100644 --- a/packages/router/e2e/multi-app/index.html +++ b/packages/router/e2e/multi-app/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/scroll-behavior/index.html b/packages/router/e2e/scroll-behavior/index.html index 09306ce61..249d662e0 100644 --- a/packages/router/e2e/scroll-behavior/index.html +++ b/packages/router/e2e/scroll-behavior/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/suspense/index.html b/packages/router/e2e/suspense/index.html index 6a12fe5dc..dc123ca96 100644 --- a/packages/router/e2e/suspense/index.html +++ b/packages/router/e2e/suspense/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/transitions/index.html b/packages/router/e2e/transitions/index.html index b32a28743..e4eb21a36 100644 --- a/packages/router/e2e/transitions/index.html +++ b/packages/router/e2e/transitions/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/router/e2e/vite.config.mjs b/packages/router/e2e/vite.config.mjs index e3a6fbba4..d704653b4 100644 --- a/packages/router/e2e/vite.config.mjs +++ b/packages/router/e2e/vite.config.mjs @@ -20,7 +20,7 @@ fs.readdirSync(__dirname).forEach(dir => { } }) -// https://vitejs.dev/config/ +// https://vite.dev/config/ /** * * @param {Record} env diff --git a/packages/router/jest.config.js b/packages/router/jest.config.js deleted file mode 100644 index 8059c1247..000000000 --- a/packages/router/jest.config.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - testEnvironment: 'node', - testEnvironmentOptions: { - customExportConditions: ['node', 'node-addons'], - }, - globals: { - __DEV__: true, - __TEST__: true, - __BROWSER__: true, - }, - setupFilesAfterEnv: ['/__tests__/setup.ts'], - coverageDirectory: 'coverage', - coverageReporters: ['html', 'lcov', 'text'], - collectCoverageFrom: ['src/**/*.ts'], - coveragePathIgnorePatterns: [ - '/node_modules/', - 'src/index.ts', - 'src/entries', - 'src/devtools.ts', - ], - transform: { - '^.+\\.tsx?$': '@sucrase/jest-plugin', - }, - testMatch: ['/__tests__/**/*.spec.ts?(x)'], - watchPathIgnorePatterns: ['/node_modules'], -} diff --git a/packages/router/package.json b/packages/router/package.json index d0f7d3f02..ba06a10be 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "vue-router", - "version": "4.2.5", + "version": "4.5.1", "main": "index.js", "unpkg": "dist/vue-router.global.js", "jsdelivr": "dist/vue-router.global.js", @@ -26,7 +26,41 @@ }, "./dist/*": "./dist/*", "./vetur/*": "./vetur/*", - "./package.json": "./package.json" + "./package.json": "./package.json", + "./auto-routes": { + "types": "./vue-router-auto-routes.d.ts", + "node": { + "import": { + "production": "./dist/vue-router.node.mjs", + "development": "./dist/vue-router.node.mjs", + "default": "./dist/vue-router.node.mjs" + }, + "require": { + "production": "./dist/vue-router.prod.cjs", + "development": "./dist/vue-router.cjs", + "default": "./index.js" + } + }, + "import": "./dist/vue-router.mjs", + "require": "./index.js" + }, + "./auto": { + "types": "./vue-router-auto.d.ts", + "node": { + "import": { + "production": "./dist/vue-router.node.mjs", + "development": "./dist/vue-router.node.mjs", + "default": "./dist/vue-router.node.mjs" + }, + "require": { + "production": "./dist/vue-router.prod.cjs", + "development": "./dist/vue-router.cjs", + "default": "./index.js" + } + }, + "import": "./dist/vue-router.mjs", + "require": "./index.js" + } }, "sideEffects": false, "author": { @@ -42,17 +76,19 @@ "bugs": { "url": "https://github.com/vuejs/router/issues" }, - "homepage": "https://github.com/vuejs/router#readme", + "homepage": "https://router.vuejs.org", "files": [ "index.js", "dist/*.{js,cjs,mjs}", "dist/vue-router.d.ts", + "vue-router-auto.d.ts", + "vue-router-auto-routes.d.ts", "vetur/tags.json", "vetur/attributes.json", "README.md" ], "scripts": { - "dev": "jest --watch", + "dev": "vitest --ui", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 1", "build": "rimraf dist && rollup -c rollup.config.mjs", "build:dts": "api-extractor run --local --verbose && tail -n +10 src/globalExtensions.ts >> dist/vue-router.d.ts", @@ -61,9 +97,8 @@ "build:size": "pnpm run build && rollup -c size-checks/rollup.config.mjs", "dev:e2e": "vite --config e2e/vite.config.mjs", "test:types": "tsc --build tsconfig.json", - "test:dts": "tsc -p ./test-dts/tsconfig.json", - "test:unit": "jest --coverage", - "test": "pnpm run test:types && pnpm run test:unit && pnpm run build && pnpm run build:dts && pnpm run test:e2e", + "test:unit": "vitest --coverage run", + "test": "pnpm run build && pnpm run build:dts && pnpm run test:types && pnpm run test:unit && pnpm run test:e2e", "test:e2e": "pnpm run test:e2e:headless", "test:e2e:headless": "node e2e/runner.mjs --env chrome-headless", "test:e2e:native": "node e2e/runner.mjs --env chrome", @@ -79,42 +114,36 @@ "attributes": "vetur/attributes.json" }, "dependencies": { - "@vue/devtools-api": "^6.5.1" + "@vue/devtools-api": "^6.6.4" }, "devDependencies": { - "@microsoft/api-extractor": "^7.38.5", - "@rollup/plugin-alias": "^5.1.0", - "@rollup/plugin-commonjs": "^25.0.7", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.5", + "@microsoft/api-extractor": "^7.48.0", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^25.0.8", + "@rollup/plugin-node-resolve": "^15.3.1", + "@rollup/plugin-replace": "^5.0.7", "@rollup/plugin-terser": "^0.4.4", - "@sucrase/jest-plugin": "^3.0.0", - "@types/jest": "^29.5.11", - "@types/jsdom": "^21.1.6", - "@types/nightwatch": "^2.3.30", - "@vitejs/plugin-vue": "^4.5.2", - "@vue/compiler-sfc": "^3.3.11", - "@vue/server-renderer": "^3.3.11", - "@vue/test-utils": "^2.4.3", - "browserstack-local": "^1.5.5", - "chromedriver": "^119.0.1", + "@types/jsdom": "^21.1.7", + "@types/nightwatch": "^2.3.32", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/compiler-sfc": "~3.5.13", + "@vue/server-renderer": "~3.5.13", + "@vue/test-utils": "^2.4.6", + "browserstack-local": "^1.5.6", + "chromedriver": "^131.0.5", "connect-history-api-fallback": "^1.6.0", - "conventional-changelog-cli": "^2.1.1", - "dotenv": "^16.3.1", + "conventional-changelog-cli": "^2.2.2", + "dotenv": "^16.5.0", "faked-promise": "^2.2.2", - "geckodriver": "^3.2.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "jest-mock-warn": "^1.1.0", - "nightwatch": "^2.6.22", + "geckodriver": "^4.5.1", + "happy-dom": "^15.11.7", + "nightwatch": "^2.6.25", "nightwatch-helpers": "^1.2.0", - "rimraf": "^5.0.5", - "rollup": "^3.29.4", + "rimraf": "^6.0.1", + "rollup": "^3.29.5", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-typescript2": "^0.36.0", - "sucrase": "^3.34.0", - "typescript": "~5.3.3", - "vite": "^5.0.7", - "vue": "^3.3.11" + "vite": "^5.4.18", + "vue": "~3.5.13" } } diff --git a/packages/router/rollup.config.mjs b/packages/router/rollup.config.mjs index 52f591cfd..fc8aaa3b0 100644 --- a/packages/router/rollup.config.mjs +++ b/packages/router/rollup.config.mjs @@ -6,7 +6,7 @@ import replace from '@rollup/plugin-replace' import resolve from '@rollup/plugin-node-resolve' import commonjs from '@rollup/plugin-commonjs' import chalk from 'chalk' -import pkg from './package.json' assert { type: 'json' } +import pkg from './package.json' with { type: 'json' } import terser from '@rollup/plugin-terser' const name = pkg.name @@ -59,7 +59,7 @@ const packageConfigs = packageBuilds.map(buildName => packageBuilds.forEach(buildName => { if (buildName === 'cjs') { packageConfigs.push(createProductionConfig(buildName)) - } else if (buildName === 'global') { + } else if (buildName === 'global' || buildName === 'browser') { packageConfigs.push(createMinifiedConfig(buildName)) } }) @@ -125,6 +125,10 @@ function createConfig(buildName, output, plugins = []) { // Global and Browser ESM builds inlines everything so that they can be // used alone. external, + treeshake: { + // Ensure @vue/devtools-api can be treeshaken in production builds + moduleSideEffects: false, + }, plugins: [ tsPlugin, createReplacePlugin( @@ -224,7 +228,7 @@ function createMinifiedConfig(format) { return createConfig( format, { - file: `dist/${name}.${format}.prod.js`, + file: outputConfigs[format].file.replace(/.js$/, '.prod.js'), format: outputConfigs[format].format, }, [ diff --git a/packages/router/size-checks/rollup.config.mjs b/packages/router/size-checks/rollup.config.mjs index 9b3f07071..28e8d8155 100644 --- a/packages/router/size-checks/rollup.config.mjs +++ b/packages/router/size-checks/rollup.config.mjs @@ -1,4 +1,5 @@ import path from 'node:path' +import { fileURLToPath } from 'node:url' import ts from 'rollup-plugin-typescript2' import replace from '@rollup/plugin-replace' import resolve from '@rollup/plugin-node-resolve' @@ -6,7 +7,7 @@ import commonjs from '@rollup/plugin-commonjs' import terser from '@rollup/plugin-terser' import { defineConfig } from 'rollup' -const __dirname = path.dirname(new URL(import.meta.url).pathname) +const __dirname = path.dirname(fileURLToPath(import.meta.url)) const config = defineConfig({ external: ['vue'], diff --git a/packages/router/size-checks/webRouterAndVue.js b/packages/router/size-checks/webRouterAndVue.js index e22ed0a74..0c392949b 100644 --- a/packages/router/size-checks/webRouterAndVue.js +++ b/packages/router/size-checks/webRouterAndVue.js @@ -1,4 +1,4 @@ -import { h, createApp } from '@vue/runtime-dom' +import { h, createApp } from 'vue' import { createRouter, createWebHistory } from '../dist/vue-router.esm-bundler' createRouter({ diff --git a/packages/router/src/RouterLink.ts b/packages/router/src/RouterLink.ts index 1d18845d6..e5b5d9d62 100644 --- a/packages/router/src/RouterLink.ts +++ b/packages/router/src/RouterLink.ts @@ -25,18 +25,24 @@ import { RendererNode, // @ts-ignore ComponentOptionsMixin, + MaybeRef, } from 'vue' -import { - RouteLocationRaw, - VueUseOptions, - RouteLocation, - RouteLocationNormalized, -} from './types' import { isSameRouteLocationParams, isSameRouteRecord } from './location' import { routerKey, routeLocationKey } from './injectionSymbols' import { RouteRecord } from './matcher/types' import { NavigationFailure } from './errors' import { isArray, isBrowser, noop } from './utils' +import { warn } from './warning' +import { isRouteLocation } from './types' +import { + RouteLocation, + RouteLocationAsPath, + RouteLocationAsRelativeTyped, + RouteLocationAsString, + RouteLocationRaw, + RouteLocationResolved, + RouteMap, +} from './typed-routes' export interface RouterLinkOptions { /** @@ -77,23 +83,101 @@ export interface RouterLinkProps extends RouterLinkOptions { | 'time' | 'true' | 'false' + + /** + * Pass the returned promise of `router.push()` to `document.startViewTransition()` if supported. + */ + viewTransition?: boolean } +/** + * Context passed from router-link components to devtools. + * @internal + */ export interface UseLinkDevtoolsContext { - route: RouteLocationNormalized & { href: string } + route: RouteLocationResolved isActive: boolean isExactActive: boolean + error: string | null +} + +/** + * Options passed to {@link useLink}. + */ +export interface UseLinkOptions { + to: MaybeRef< + | RouteLocationAsString + | RouteLocationAsRelativeTyped + | RouteLocationAsPath + | RouteLocationRaw + > + + replace?: MaybeRef + + /** + * Pass the returned promise of `router.push()` to `document.startViewTransition()` if supported. + */ + viewTransition?: boolean } -export type UseLinkOptions = VueUseOptions +/** + * Return type of {@link useLink}. + * @internal + */ +export interface UseLinkReturn { + route: ComputedRef> + href: ComputedRef + isActive: ComputedRef + isExactActive: ComputedRef + navigate(e?: MouseEvent): Promise +} // TODO: we could allow currentRoute as a prop to expose `isActive` and // `isExactActive` behavior should go through an RFC -export function useLink(props: UseLinkOptions) { +/** + * Returns the internal behavior of a {@link RouterLink} without the rendering part. + * + * @param props - a `to` location and an optional `replace` flag + */ +export function useLink( + props: UseLinkOptions +): UseLinkReturn { const router = inject(routerKey)! const currentRoute = inject(routeLocationKey)! - const route = computed(() => router.resolve(unref(props.to))) + let hasPrevious = false + let previousTo: unknown = null + + const route = computed(() => { + const to = unref(props.to) + + if (__DEV__ && (!hasPrevious || to !== previousTo)) { + if (!isRouteLocation(to)) { + if (hasPrevious) { + warn( + `Invalid value for prop "to" in useLink()\n- to:`, + to, + `\n- previous to:`, + previousTo, + `\n- props:`, + props + ) + } else { + warn( + `Invalid value for prop "to" in useLink()\n- to:`, + to, + `\n- props:`, + props + ) + } + } + + previousTo = to + hasPrevious = true + } + + return router.resolve(to) + }) const activeRecordIndex = computed(() => { const { matched } = route.value @@ -141,10 +225,18 @@ export function useLink(props: UseLinkOptions) { e: MouseEvent = {} as MouseEvent ): Promise { if (guardEvent(e)) { - return router[unref(props.replace) ? 'replace' : 'push']( + const p = router[unref(props.replace) ? 'replace' : 'push']( unref(props.to) // avoid uncaught errors are they are logged anyway ).catch(noop) + if ( + props.viewTransition && + typeof document !== 'undefined' && + 'startViewTransition' in document + ) { + document.startViewTransition(() => p) + } + return p } return Promise.resolve() } @@ -157,6 +249,7 @@ export function useLink(props: UseLinkOptions) { route: route.value, isActive: isActive.value, isExactActive: isExactActive.value, + error: null, } // @ts-expect-error: this is internal @@ -168,6 +261,9 @@ export function useLink(props: UseLinkOptions) { linkContextDevtools.route = route.value linkContextDevtools.isActive = isActive.value linkContextDevtools.isExactActive = isExactActive.value + linkContextDevtools.error = isRouteLocation(unref(props.to)) + ? null + : 'Invalid "to" value' }, { flush: 'post' } ) @@ -186,6 +282,10 @@ export function useLink(props: UseLinkOptions) { } } +function preferSingleVNode(vnodes: VNode[]) { + return vnodes.length === 1 ? vnodes[0] : vnodes +} + export const RouterLinkImpl = /*#__PURE__*/ defineComponent({ name: 'RouterLink', compatConfig: { MODE: 3 }, @@ -203,6 +303,7 @@ export const RouterLinkImpl = /*#__PURE__*/ defineComponent({ type: String as PropType, default: 'page', }, + viewTransition: Boolean, }, useLink, @@ -230,7 +331,7 @@ export const RouterLinkImpl = /*#__PURE__*/ defineComponent({ })) return () => { - const children = slots.default && slots.default(link) + const children = slots.default && preferSingleVNode(slots.default(link)) return props.custom ? children : h( @@ -278,7 +379,8 @@ export interface _RouterLinkI { isActive, isExactActive, navigate, - }: UnwrapRef>) => VNode[] + }: // TODO: How do we add the name generic + UnwrapRef) => VNode[] } } @@ -354,5 +456,5 @@ const getLinkClass = ( propClass != null ? propClass : globalClass != null - ? globalClass - : defaultClass + ? globalClass + : defaultClass diff --git a/packages/router/src/RouterView.ts b/packages/router/src/RouterView.ts index ad4d8f720..a456c2b63 100644 --- a/packages/router/src/RouterView.ts +++ b/packages/router/src/RouterView.ts @@ -17,11 +17,11 @@ import { VNode, Component, } from 'vue' -import { +import type { RouteLocationNormalized, RouteLocationNormalizedLoaded, - RouteLocationMatched, -} from './types' +} from './typed-routes' +import type { RouteLocationMatched } from './types' import { matchedRouteKey, viewDepthKey, @@ -154,8 +154,8 @@ export const RouterViewImpl = /*#__PURE__*/ defineComponent({ ? routePropsOption === true ? route.params : typeof routePropsOption === 'function' - ? routePropsOption(route) - : routePropsOption + ? routePropsOption(route) + : routePropsOption : null const onVnodeUnmounted: VNodeProps['onVnodeUnmounted'] = vnode => { diff --git a/packages/router/src/config.ts b/packages/router/src/config.ts index 1da3f7f15..02204e9ba 100644 --- a/packages/router/src/config.ts +++ b/packages/router/src/config.ts @@ -1,5 +1,13 @@ /** - * Allows customizing existing types of the router that are used globally like `$router`, ``, and `beforeRouteLeave()`. **ONLY FOR INTERNAL USAGE**. + * Allows customizing existing types of the router that are used globally like `$router`, ``, etc. **ONLY FOR INTERNAL USAGE**. + * + * - `$router` - the router instance + * - `$route` - the current route location + * - `beforeRouteEnter` - Page component option + * - `beforeRouteUpdate` - Page component option + * - `beforeRouteLeave` - Page component option + * - `RouterLink` - RouterLink Component + * - `RouterView` - RouterView Component * * @internal */ diff --git a/packages/router/src/devtools.ts b/packages/router/src/devtools.ts index 81760225b..e4bef80d7 100644 --- a/packages/router/src/devtools.ts +++ b/packages/router/src/devtools.ts @@ -16,8 +16,8 @@ import { PathParser } from './matcher/pathParserRanker' import { Router } from './router' import { UseLinkDevtoolsContext } from './RouterLink' import { RouterViewDevtoolsContext } from './RouterView' -import { RouteLocationNormalized } from './types' import { assign, isArray } from './utils' +import { RouteLocationNormalized } from './typed-routes' /** * Copies a route location and removes any problematic properties that cannot be shown in devtools (e.g. Vue instances). @@ -119,10 +119,16 @@ export function addDevtools(app: App, router: Router, matcher: RouterMatcher) { ;( componentInstance.__vrl_devtools as UseLinkDevtoolsContext[] ).forEach(devtoolsData => { + let label = devtoolsData.route.path let backgroundColor = ORANGE_400 let tooltip: string = '' + let textColor = 0 - if (devtoolsData.isExactActive) { + if (devtoolsData.error) { + label = devtoolsData.error + backgroundColor = RED_100 + textColor = RED_700 + } else if (devtoolsData.isExactActive) { backgroundColor = LIME_500 tooltip = 'This is exactly active' } else if (devtoolsData.isActive) { @@ -131,8 +137,8 @@ export function addDevtools(app: App, router: Router, matcher: RouterMatcher) { } node.tags.push({ - label: devtoolsData.route.path, - textColor: 0, + label, + textColor, tooltip, backgroundColor, }) @@ -419,6 +425,8 @@ const CYAN_400 = 0x22d3ee const ORANGE_400 = 0xfb923c // const GRAY_100 = 0xf4f4f5 const DARK = 0x666666 +const RED_100 = 0xfee2e2 +const RED_700 = 0xb91c1c function formatRouteRecordForInspector( route: RouteRecordMatcher diff --git a/packages/router/src/encoding.ts b/packages/router/src/encoding.ts index e46707080..69b338a65 100644 --- a/packages/router/src/encoding.ts +++ b/packages/router/src/encoding.ts @@ -1,8 +1,10 @@ import { warn } from './warning' /** - * Encoding Rules ␣ = Space Path: ␣ " < > # ? { } Query: ␣ " < > # & = Hash: ␣ " - * < > ` + * Encoding Rules (␣ = Space) + * - Path: ␣ " < > # ? { } + * - Query: ␣ " < > # & = + * - Hash: ␣ " < > ` * * On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2) * defines some extra characters to be encoded. Most browsers do not encode them diff --git a/packages/router/src/errors.ts b/packages/router/src/errors.ts index 379bf6392..97b9f45fd 100644 --- a/packages/router/src/errors.ts +++ b/packages/router/src/errors.ts @@ -1,9 +1,5 @@ -import { - MatcherLocationRaw, - MatcherLocation, - RouteLocationRaw, - RouteLocationNormalized, -} from './types' +import type { MatcherLocationRaw, MatcherLocation } from './types' +import type { RouteLocationRaw, RouteLocationNormalized } from './typed-routes' import { assign } from './utils' /** @@ -115,6 +111,12 @@ const ErrorTypeMessages = { // Possible internal errors type RouterError = NavigationFailure | NavigationRedirectError | MatcherError +/** + * Creates a typed NavigationFailure object. + * @internal + * @param type - NavigationFailureType + * @param params - { from, to } + */ export function createRouterError( type: E['type'], params: Omit @@ -161,7 +163,7 @@ export function createRouterError( * // ... * } * // Aborted or canceled navigations - * if (isNavigationFailure(failure, NavigationFailureType.aborted | NavigationFailureType.canceled)) { + * if (isNavigationFailure(failure, NavigationFailureType.aborted | NavigationFailureType.cancelled )) { * // ... * } * }) diff --git a/packages/router/src/globalExtensions.ts b/packages/router/src/globalExtensions.ts index 368978578..22c49c3c8 100644 --- a/packages/router/src/globalExtensions.ts +++ b/packages/router/src/globalExtensions.ts @@ -2,14 +2,17 @@ import type { NavigationGuardWithThis, NavigationGuard, RouteLocationNormalizedLoaded, -} from './types' -import { RouterView } from './RouterView' -import { RouterLink } from './RouterLink' +} from './typed-routes' +import type { RouterView } from './RouterView' +import type { RouterLink } from './RouterLink' import type { Router } from './router' import type { TypesConfig } from './config' -// TODO: figure out why it cannot be 'vue' like said in docs -declare module '@vue/runtime-core' { +/** + * NOTE: this used to be `@vue/runtime-core` but it should have been `vue` for a long time. Using both declaration at + * the same time breaks so using only one everywhere is the preferred way. + */ +declare module 'vue' { export interface ComponentCustomOptions { /** * Guard called when the router is navigating to the route that is rendering diff --git a/packages/router/src/history/html5.ts b/packages/router/src/history/html5.ts index 9388e8f24..79c5cedf0 100644 --- a/packages/router/src/history/html5.ts +++ b/packages/router/src/history/html5.ts @@ -127,28 +127,31 @@ function useHistoryListeners( } function beforeUnloadListener() { - const { history } = window - if (!history.state) return - history.replaceState( - assign({}, history.state, { scroll: computeScrollPosition() }), - '' - ) + if (document.visibilityState === 'hidden') { + const { history } = window + if (!history.state) return + history.replaceState( + assign({}, history.state, { scroll: computeScrollPosition() }), + '' + ) + } } function destroy() { for (const teardown of teardowns) teardown() teardowns = [] window.removeEventListener('popstate', popStateHandler) - window.removeEventListener('beforeunload', beforeUnloadListener) + window.removeEventListener('pagehide', beforeUnloadListener) + document.removeEventListener('visibilitychange', beforeUnloadListener) } // set up the listeners and prepare teardown callbacks window.addEventListener('popstate', popStateHandler) - // TODO: could we use 'pagehide' or 'visibilitychange' instead? // https://developer.chrome.com/blog/page-lifecycle-api/ - window.addEventListener('beforeunload', beforeUnloadListener, { - passive: true, - }) + // note: iOS safari does not fire beforeunload, so we + // use pagehide and visibilitychange instead + window.addEventListener('pagehide', beforeUnloadListener) + document.addEventListener('visibilitychange', beforeUnloadListener) return { pauseListeners, @@ -280,7 +283,7 @@ function useHistoryStateNavigation(base: string) { warn( `history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\n\n` + `history.replaceState(history.state, '', url)\n\n` + - `You can find more information at https://next.router.vuejs.org/guide/migration/#usage-of-history-state.` + `You can find more information at https://router.vuejs.org/guide/migration/#Usage-of-history-state` ) } diff --git a/packages/router/src/history/memory.ts b/packages/router/src/history/memory.ts index f8f25a08c..fc5a3d1ed 100644 --- a/packages/router/src/history/memory.ts +++ b/packages/router/src/history/memory.ts @@ -20,17 +20,17 @@ import { */ export function createMemoryHistory(base: string = ''): RouterHistory { let listeners: NavigationCallback[] = [] - let queue: HistoryLocation[] = [START] + let queue: [url: HistoryLocation, state: HistoryState][] = [[START, {}]] let position: number = 0 base = normalizeBase(base) - function setLocation(location: HistoryLocation) { + function setLocation(location: HistoryLocation, state: HistoryState = {}) { position++ if (position !== queue.length) { // we are in the middle, we remove everything from here in the queue queue.splice(position) } - queue.push(location) + queue.push([location, state]) } function triggerListeners( @@ -51,19 +51,19 @@ export function createMemoryHistory(base: string = ''): RouterHistory { const routerHistory: RouterHistory = { // rewritten by Object.defineProperty location: START, - // TODO: should be kept in queue + // rewritten by Object.defineProperty state: {}, base, createHref: createHref.bind(null, base), - replace(to) { + replace(to, state?: HistoryState) { // remove current entry and decrement position queue.splice(position--, 1) - setLocation(to) + setLocation(to, state) }, - push(to, data?: HistoryState) { - setLocation(to) + push(to, state?: HistoryState) { + setLocation(to, state) }, listen(callback) { @@ -75,7 +75,7 @@ export function createMemoryHistory(base: string = ''): RouterHistory { }, destroy() { listeners = [] - queue = [START] + queue = [[START, {}]] position = 0 }, @@ -98,14 +98,19 @@ export function createMemoryHistory(base: string = ''): RouterHistory { Object.defineProperty(routerHistory, 'location', { enumerable: true, - get: () => queue[position], + get: () => queue[position][0], + }) + + Object.defineProperty(routerHistory, 'state', { + enumerable: true, + get: () => queue[position][1], }) if (__TEST__) { // @ts-expect-error: only for tests - routerHistory.changeURL = function (url: string) { + routerHistory.changeURL = function (url: string, state: HistoryState = {}) { const from = this.location - queue.splice(position++ + 1, queue.length, url) + queue.splice(position++ + 1, queue.length, [url, state]) triggerListeners(this.location, from, { direction: NavigationDirection.unknown, delta: 0, diff --git a/packages/router/src/index.ts b/packages/router/src/index.ts index 816dd2c51..2b27d8329 100644 --- a/packages/router/src/index.ts +++ b/packages/router/src/index.ts @@ -29,30 +29,30 @@ export { viewDepthKey, } from './injectionSymbols' -export { START_LOCATION_NORMALIZED as START_LOCATION } from './types' +export { START_LOCATION_NORMALIZED as START_LOCATION } from './location' export type { // route location _RouteLocationBase, MatcherLocationAsPath, LocationAsRelativeRaw, RouteQueryAndHash, - RouteLocationRaw, - RouteLocation, - RouteLocationNormalized, - RouteLocationNormalizedLoaded, - RouteParams, - RouteParamsRaw, + + // route params RouteParamValue, RouteParamValueRaw, + + // Partial route location RouteLocationNamedRaw, + // exported for backwards compat for old RouteLocationRaw RouteLocationPathRaw, RouteLocationMatched, + + // extra options when navigating RouteLocationOptions, + // route records _RouteRecordBase, - RouteRecordName, RouteRecordRaw, - RouteRecordRedirectOption, RouteRecordSingleView, RouteRecordSingleViewWithChildren, RouteRecordMultipleViews, @@ -61,11 +61,81 @@ export type { RouteMeta, RouteComponent, // RawRouteComponent, + RouteParamsGeneric, + RouteParamsRawGeneric, + MatcherLocation, +} from './types' +export type { _Awaitable } from './types/utils' + +// Experimental Type Safe API +export type { + RouteMap, + RouteMapGeneric, + + // route location + RouteLocationRaw, + RouteLocation, + RouteLocationGeneric, + RouteLocationTyped, + RouteLocationTypedList, + + // RouteLocationNormalized + RouteLocationNormalizedGeneric, + RouteLocationNormalized, + RouteLocationNormalizedTyped, + RouteLocationNormalizedTypedList, + + // RouteLocationNormalizedLoaded + RouteLocationNormalizedLoadedGeneric, + RouteLocationNormalizedLoaded, + RouteLocationNormalizedLoadedTyped, + RouteLocationNormalizedLoadedTypedList, + + // RouteLocationResolved + RouteLocationResolvedGeneric, + RouteLocationResolved, + RouteLocationResolvedTyped, + RouteLocationResolvedTypedList, + + // relative + RouteLocationAsRelativeGeneric, + RouteLocationAsRelative, + RouteLocationAsRelativeTyped, + RouteLocationAsRelativeTypedList, + // string + RouteLocationAsStringTyped, + RouteLocationAsString, + RouteLocationAsStringTypedList, + // as path + RouteLocationAsPathGeneric, + RouteLocationAsPath, + RouteLocationAsPathTyped, + RouteLocationAsPathTypedList, + + // route records + RouteRecordInfoGeneric, + RouteRecordInfo, + RouteRecordNameGeneric, + RouteRecordName, + _RouteRecordProps, + RouteRecordRedirectOption, + + // params + RouteParams, + RouteParamsRaw, + ParamValue, + ParamValueOneOrMore, + ParamValueZeroOrMore, + ParamValueZeroOrOne, + + // navigation guards NavigationGuard, - NavigationGuardNext, NavigationGuardWithThis, NavigationHookAfter, -} from './types' + NavigationGuardReturn, + NavigationGuardNext, + NavigationGuardNextCallback, +} from './typed-routes' export { createRouter } from './router' export type { Router, RouterOptions, RouterScrollBehavior } from './router' @@ -87,6 +157,7 @@ export type { _RouterLinkI, RouterLinkProps, UseLinkOptions, + UseLinkReturn, } from './RouterLink' export { RouterView } from './RouterView' export type { RouterViewProps } from './RouterView' diff --git a/packages/router/src/injectionSymbols.ts b/packages/router/src/injectionSymbols.ts index ad391624f..49ec55e92 100644 --- a/packages/router/src/injectionSymbols.ts +++ b/packages/router/src/injectionSymbols.ts @@ -1,5 +1,5 @@ import type { InjectionKey, ComputedRef, Ref } from 'vue' -import { RouteLocationNormalizedLoaded } from './types' +import type { RouteLocationNormalizedLoaded } from './typed-routes' import { RouteRecordNormalized } from './matcher/types' import type { Router } from './router' diff --git a/packages/router/src/location.ts b/packages/router/src/location.ts index 1f29cfb63..c786e0ae9 100644 --- a/packages/router/src/location.ts +++ b/packages/router/src/location.ts @@ -1,13 +1,10 @@ import { LocationQuery, LocationQueryRaw } from './query' -import { - RouteLocation, - RouteLocationNormalized, - RouteParamValue, -} from './types' +import { RouteParamValue, RouteParamsGeneric } from './types' import { RouteRecord } from './matcher/types' import { warn } from './warning' import { isArray } from './utils' import { decode } from './encoding' +import { RouteLocation, RouteLocationNormalizedLoaded } from './typed-routes' /** * Location object returned by {@link `parseURL`}. @@ -159,8 +156,8 @@ export function isSameRouteRecord(a: RouteRecord, b: RouteRecord): boolean { } export function isSameRouteLocationParams( - a: RouteLocationNormalized['params'], - b: RouteLocationNormalized['params'] + a: RouteParamsGeneric, + b: RouteParamsGeneric ): boolean { if (Object.keys(a).length !== Object.keys(b).length) return false @@ -178,8 +175,8 @@ function isSameRouteLocationParamsValue( return isArray(a) ? isEquivalentArray(a, b) : isArray(b) - ? isEquivalentArray(b, a) - : a === b + ? isEquivalentArray(b, a) + : a === b } /** @@ -247,3 +244,31 @@ export function resolveRelativePath(to: string, from: string): string { toSegments.slice(toPosition).join('/') ) } + +/** + * Initial route location where the router is. Can be used in navigation guards + * to differentiate the initial navigation. + * + * @example + * ```js + * import { START_LOCATION } from 'vue-router' + * + * router.beforeEach((to, from) => { + * if (from === START_LOCATION) { + * // initial navigation + * } + * }) + * ``` + */ +export const START_LOCATION_NORMALIZED: RouteLocationNormalizedLoaded = { + path: '/', + // TODO: could we use a symbol in the future? + name: undefined, + params: {}, + query: {}, + hash: '', + fullPath: '/', + matched: [], + meta: {}, + redirectedFrom: undefined, +} diff --git a/packages/router/src/matcher/index.ts b/packages/router/src/matcher/index.ts index 39a3c24b1..9d787ddbc 100644 --- a/packages/router/src/matcher/index.ts +++ b/packages/router/src/matcher/index.ts @@ -3,8 +3,6 @@ import { MatcherLocationRaw, MatcherLocation, isRouteName, - RouteRecordName, - _RouteRecordProps, } from '../types' import { createRouterError, ErrorTypes, MatcherError } from '../errors' import { createRouteRecordMatcher, RouteRecordMatcher } from './pathMatcher' @@ -20,6 +18,7 @@ import { comparePathParserScore } from './pathParserRanker' import { warn } from '../warning' import { assign, noop } from '../utils' +import type { RouteRecordNameGeneric, _RouteRecordProps } from '../typed-routes' /** * Internal RouterMatcher @@ -28,12 +27,13 @@ import { assign, noop } from '../utils' */ export interface RouterMatcher { addRoute: (record: RouteRecordRaw, parent?: RouteRecordMatcher) => () => void - removeRoute: { - (matcher: RouteRecordMatcher): void - (name: RouteRecordName): void - } + removeRoute(matcher: RouteRecordMatcher): void + removeRoute(name: NonNullable): void + clearRoutes: () => void getRoutes: () => RouteRecordMatcher[] - getRecordMatcher: (name: RouteRecordName) => RouteRecordMatcher | undefined + getRecordMatcher: ( + name: NonNullable + ) => RouteRecordMatcher | undefined /** * Resolves a location. Gives access to the route record that corresponds to the actual path as well as filling the corresponding params objects @@ -60,13 +60,16 @@ export function createRouterMatcher( ): RouterMatcher { // normalized ordered array of matchers const matchers: RouteRecordMatcher[] = [] - const matcherMap = new Map() + const matcherMap = new Map< + NonNullable, + RouteRecordMatcher + >() globalOptions = mergeOptions( { strict: false, end: true, sensitive: false } as PathParserOptions, globalOptions ) - function getRecordMatcher(name: RouteRecordName) { + function getRecordMatcher(name: NonNullable) { return matcherMap.get(name) } @@ -85,28 +88,30 @@ export function createRouterMatcher( mainNormalizedRecord.aliasOf = originalRecord && originalRecord.record const options: PathParserOptions = mergeOptions(globalOptions, record) // generate an array of records to correctly handle aliases - const normalizedRecords: (typeof mainNormalizedRecord)[] = [ - mainNormalizedRecord, - ] + const normalizedRecords: RouteRecordNormalized[] = [mainNormalizedRecord] if ('alias' in record) { const aliases = typeof record.alias === 'string' ? [record.alias] : record.alias! for (const alias of aliases) { normalizedRecords.push( - assign({}, mainNormalizedRecord, { - // this allows us to hold a copy of the `components` option - // so that async components cache is hold on the original record - components: originalRecord - ? originalRecord.record.components - : mainNormalizedRecord.components, - path: alias, - // we might be the child of an alias - aliasOf: originalRecord - ? originalRecord.record - : mainNormalizedRecord, - // the aliases are always of the same kind as the original since they - // are defined on the same record - }) as typeof mainNormalizedRecord + // we need to normalize again to ensure the `mods` property + // being non enumerable + normalizeRouteRecord( + assign({}, mainNormalizedRecord, { + // this allows us to hold a copy of the `components` option + // so that async components cache is hold on the original record + components: originalRecord + ? originalRecord.record.components + : mainNormalizedRecord.components, + path: alias, + // we might be the child of an alias + aliasOf: originalRecord + ? originalRecord.record + : mainNormalizedRecord, + // the aliases are always of the same kind as the original since they + // are defined on the same record + }) + ) ) } } @@ -130,7 +135,7 @@ export function createRouterMatcher( if (__DEV__ && normalizedRecord.path === '*') { throw new Error( 'Catch all routes ("*") must now be defined using a param with a custom regexp.\n' + - 'See more at https://next.router.vuejs.org/guide/migration/#removed-star-or-catch-all-routes.' + 'See more at https://router.vuejs.org/guide/migration/#Removed-star-or-catch-all-routes.' ) } @@ -154,8 +159,18 @@ export function createRouterMatcher( // remove the route if named and only for the top record (avoid in nested calls) // this works because the original record is the first one - if (isRootAdd && record.name && !isAliasRecord(matcher)) + if (isRootAdd && record.name && !isAliasRecord(matcher)) { + if (__DEV__) { + checkSameNameAsAncestor(record, parent) + } removeRoute(record.name) + } + } + + // Avoid adding a record that doesn't display anything. This allows passing through records without a component to + // not be reached and pass through the catch all route + if (isMatchable(matcher)) { + insertMatcher(matcher) } if (mainNormalizedRecord.children) { @@ -177,17 +192,6 @@ export function createRouterMatcher( // if (parent && isAliasRecord(originalRecord)) { // parent.children.push(originalRecord) // } - - // Avoid adding a record that doesn't display anything. This allows passing through records without a component to - // not be reached and pass through the catch all route - if ( - (matcher.record.components && - Object.keys(matcher.record.components).length) || - matcher.record.name || - matcher.record.redirect - ) { - insertMatcher(matcher) - } } return originalMatcher @@ -198,7 +202,9 @@ export function createRouterMatcher( : noop } - function removeRoute(matcherRef: RouteRecordName | RouteRecordMatcher) { + function removeRoute( + matcherRef: NonNullable | RouteRecordMatcher + ) { if (isRouteName(matcherRef)) { const matcher = matcherMap.get(matcherRef) if (matcher) { @@ -223,17 +229,8 @@ export function createRouterMatcher( } function insertMatcher(matcher: RouteRecordMatcher) { - let i = 0 - while ( - i < matchers.length && - comparePathParserScore(matcher, matchers[i]) >= 0 && - // Adding children with empty path should still appear before the parent - // https://github.com/vuejs/router/issues/1124 - (matcher.record.path !== matchers[i].record.path || - !isRecordChildOf(matcher, matchers[i])) - ) - i++ - matchers.splice(i, 0, matcher) + const index = findInsertionIndex(matcher, matchers) + matchers.splice(index, 0, matcher) // only add the original record to the name map if (matcher.record.name && !isAliasRecord(matcher)) matcherMap.set(matcher.record.name, matcher) @@ -277,8 +274,13 @@ export function createRouterMatcher( paramsFromLocation( currentLocation.params, // only keep params that exist in the resolved location - // TODO: only keep optional params coming from a parent record - matcher.keys.filter(k => !k.optional).map(k => k.name) + // only keep optional params coming from a parent record + matcher.keys + .filter(k => !k.optional) + .concat( + matcher.parent ? matcher.parent.keys.filter(k => k.optional) : [] + ) + .map(k => k.name) ), // discard any existing params in the current location that do not exist here // #1497 this ensures better active/exact matching @@ -348,7 +350,19 @@ export function createRouterMatcher( // add initial routes routes.forEach(route => addRoute(route)) - return { addRoute, resolve, removeRoute, getRoutes, getRecordMatcher } + function clearRoutes() { + matchers.length = 0 + matcherMap.clear() + } + + return { + addRoute, + resolve, + removeRoute, + clearRoutes, + getRoutes, + getRecordMatcher, + } } function paramsFromLocation( @@ -371,14 +385,14 @@ function paramsFromLocation( * @returns the normalized version */ export function normalizeRouteRecord( - record: RouteRecordRaw + record: RouteRecordRaw & { aliasOf?: RouteRecordNormalized } ): RouteRecordNormalized { - return { + const normalized: Omit = { path: record.path, redirect: record.redirect, name: record.name, meta: record.meta || {}, - aliasOf: undefined, + aliasOf: record.aliasOf, beforeEnter: record.beforeEnter, props: normalizeRecordProps(record), children: record.children || [], @@ -386,11 +400,22 @@ export function normalizeRouteRecord( leaveGuards: new Set(), updateGuards: new Set(), enterCallbacks: {}, + // must be declared afterwards + // mods: {}, components: 'components' in record ? record.components || null : record.component && { default: record.component }, } + + // mods contain modules and shouldn't be copied, + // logged or anything. It's just used for internal + // advanced use cases like data loaders + Object.defineProperty(normalized, 'mods', { + value: {}, + }) + + return normalized as RouteRecordNormalized } /** @@ -508,6 +533,21 @@ function checkChildMissingNameWithEmptyPath( } } +function checkSameNameAsAncestor( + record: RouteRecordRaw, + parent?: RouteRecordMatcher +) { + for (let ancestor = parent; ancestor; ancestor = ancestor.parent) { + if (ancestor.record.name === record.name) { + throw new Error( + `A route named "${String(record.name)}" has been added as a ${ + parent === ancestor ? 'child' : 'descendant' + } of a route with the same name. Route names must be unique and a nested route cannot use the same name as an ancestor.` + ) + } + } +} + function checkMissingParamsInAbsolutePath( record: RouteRecordMatcher, parent: RouteRecordMatcher @@ -520,12 +560,78 @@ function checkMissingParamsInAbsolutePath( } } -function isRecordChildOf( - record: RouteRecordMatcher, - parent: RouteRecordMatcher -): boolean { - return parent.children.some( - child => child === record || isRecordChildOf(record, child) +/** + * Performs a binary search to find the correct insertion index for a new matcher. + * + * Matchers are primarily sorted by their score. If scores are tied then we also consider parent/child relationships, + * with descendants coming before ancestors. If there's still a tie, new routes are inserted after existing routes. + * + * @param matcher - new matcher to be inserted + * @param matchers - existing matchers + */ +function findInsertionIndex( + matcher: RouteRecordMatcher, + matchers: RouteRecordMatcher[] +) { + // First phase: binary search based on score + let lower = 0 + let upper = matchers.length + + while (lower !== upper) { + const mid = (lower + upper) >> 1 + const sortOrder = comparePathParserScore(matcher, matchers[mid]) + + if (sortOrder < 0) { + upper = mid + } else { + lower = mid + 1 + } + } + + // Second phase: check for an ancestor with the same score + const insertionAncestor = getInsertionAncestor(matcher) + + if (insertionAncestor) { + upper = matchers.lastIndexOf(insertionAncestor, upper - 1) + + if (__DEV__ && upper < 0) { + // This should never happen + warn( + `Finding ancestor route "${insertionAncestor.record.path}" failed for "${matcher.record.path}"` + ) + } + } + + return upper +} + +function getInsertionAncestor(matcher: RouteRecordMatcher) { + let ancestor: RouteRecordMatcher | undefined = matcher + + while ((ancestor = ancestor.parent)) { + if ( + isMatchable(ancestor) && + comparePathParserScore(matcher, ancestor) === 0 + ) { + return ancestor + } + } + + return +} + +/** + * Checks if a matcher can be reachable. This means if it's possible to reach it as a route. For example, routes without + * a component, or name, or redirect, are just used to group other routes. + * @param matcher + * @param matcher.record record of the matcher + * @returns + */ +function isMatchable({ record }: RouteRecordMatcher): boolean { + return !!( + record.name || + (record.components && Object.keys(record.components).length) || + record.redirect ) } diff --git a/packages/router/src/matcher/pathParserRanker.ts b/packages/router/src/matcher/pathParserRanker.ts index 670013794..81b077642 100644 --- a/packages/router/src/matcher/pathParserRanker.ts +++ b/packages/router/src/matcher/pathParserRanker.ts @@ -217,7 +217,7 @@ export function tokensToParser( if (options.end) pattern += '$' // allow paths like /dynamic to only match dynamic or dynamic/... but not dynamic_something_else - else if (options.strict) pattern += '(?:/|$)' + else if (options.strict && !pattern.endsWith('/')) pattern += '(?:/|$)' const re = new RegExp(pattern, options.sensitive ? '' : 'i') diff --git a/packages/router/src/matcher/types.ts b/packages/router/src/matcher/types.ts index 6693a3d75..5f80f27bf 100644 --- a/packages/router/src/matcher/types.ts +++ b/packages/router/src/matcher/types.ts @@ -1,9 +1,11 @@ +import type { + NavigationGuard, + NavigationGuardNextCallback, + _RouteRecordProps, +} from '../typed-routes' import { RouteRecordMultipleViews, - NavigationGuard, _RouteRecordBase, - _RouteRecordProps, - NavigationGuardNextCallback, RouteRecordRaw, } from '../types' import { ComponentPublicInstance } from 'vue' @@ -29,6 +31,13 @@ export interface RouteRecordNormalized { * {@inheritDoc RouteRecordMultipleViews.components} */ components: RouteRecordMultipleViews['components'] | null | undefined + + /** + * Contains the original modules for lazy loaded components. + * @internal + */ + mods: Record + /** * Nested route records. */ diff --git a/packages/router/src/navigationGuards.ts b/packages/router/src/navigationGuards.ts index 27eac6cfc..db53c3dc1 100644 --- a/packages/router/src/navigationGuards.ts +++ b/packages/router/src/navigationGuards.ts @@ -1,15 +1,14 @@ -import { - NavigationGuard, +import { isRouteLocation, Lazy, RouteComponent } from './types' + +import type { RouteLocationNormalized, - NavigationGuardNext, - RouteLocationRaw, RouteLocationNormalizedLoaded, + NavigationGuard, + RouteLocation, + RouteLocationRaw, + NavigationGuardNext, NavigationGuardNextCallback, - isRouteLocation, - Lazy, - RouteComponent, - RawRouteComponent, -} from './types' +} from './typed-routes' import { createRouterError, @@ -21,7 +20,7 @@ import { ComponentOptions, onUnmounted, onActivated, onDeactivated } from 'vue' import { inject, getCurrentInstance } from 'vue' import { matchedRouteKey } from './injectionSymbols' import { RouteRecordNormalized } from './matcher/types' -import { isESModule } from './utils' +import { isESModule, isRouteComponent } from './utils' import { warn } from './warning' function registerGuard( @@ -317,14 +316,14 @@ export function extractComponentsGuards( guards.push(() => componentPromise.then(resolved => { if (!resolved) - return Promise.reject( - new Error( - `Couldn't resolve component "${name}" at "${record.path}"` - ) + throw new Error( + `Couldn't resolve component "${name}" at "${record.path}"` ) const resolvedComponent = isESModule(resolved) ? resolved.default : resolved + // keep the resolved module for plugins like data loaders + record.mods[name] = resolved // replace the function with the resolved component // cannot be null or undefined because we went into the for loop record.components![name] = resolvedComponent @@ -332,6 +331,7 @@ export function extractComponentsGuards( const options: ComponentOptions = (resolvedComponent as any).__vccOpts || resolvedComponent const guard = options[guardType] + return ( guard && guardToPromiseFn(guard, to, from, record, name, runWithContext)() @@ -345,30 +345,13 @@ export function extractComponentsGuards( return guards } -/** - * Allows differentiating lazy components from functional components and vue-class-component - * @internal - * - * @param component - */ -export function isRouteComponent( - component: RawRouteComponent -): component is RouteComponent { - return ( - typeof component === 'object' || - 'displayName' in component || - 'props' in component || - '__vccOpts' in component - ) -} - /** * Ensures a route is loaded, so it can be passed as o prop to ``. * * @param route - resolved route to load */ export function loadRouteLocation( - route: RouteLocationNormalized + route: RouteLocation | RouteLocationNormalized ): Promise { return route.matched.every(record => record.redirect) ? Promise.reject(new Error('Cannot load a route that redirects.')) @@ -377,32 +360,40 @@ export function loadRouteLocation( record => record.components && Promise.all( - Object.keys(record.components).reduce((promises, name) => { - const rawComponent = record.components![name] - if ( - typeof rawComponent === 'function' && - !('displayName' in rawComponent) - ) { - promises.push( - (rawComponent as Lazy)().then(resolved => { - if (!resolved) - return Promise.reject( - new Error( - `Couldn't resolve component "${name}" at "${record.path}". Ensure you passed a function that returns a promise.` - ) - ) - const resolvedComponent = isESModule(resolved) - ? resolved.default - : resolved - // replace the function with the resolved component - // cannot be null or undefined because we went into the for loop - record.components![name] = resolvedComponent - return - }) - ) - } - return promises - }, [] as Array>) + Object.keys(record.components).reduce( + (promises, name) => { + const rawComponent = record.components![name] + if ( + typeof rawComponent === 'function' && + !('displayName' in rawComponent) + ) { + promises.push( + (rawComponent as Lazy)().then( + resolved => { + if (!resolved) + return Promise.reject( + new Error( + `Couldn't resolve component "${name}" at "${record.path}". Ensure you passed a function that returns a promise.` + ) + ) + + const resolvedComponent = isESModule(resolved) + ? resolved.default + : resolved + // keep the resolved module for plugins like data loaders + record.mods[name] = resolved + // replace the function with the resolved component + // cannot be null or undefined because we went into the for loop + record.components![name] = resolvedComponent + return + } + ) + ) + } + return promises + }, + [] as Array> + ) ) ) ).then(() => route as RouteLocationNormalizedLoaded) diff --git a/packages/router/src/query.ts b/packages/router/src/query.ts index 94d914618..35e2e9f8a 100644 --- a/packages/router/src/query.ts +++ b/packages/router/src/query.ts @@ -140,8 +140,8 @@ export function normalizeQuery( normalizedQuery[key] = isArray(value) ? value.map(v => (v == null ? null : '' + v)) : value == null - ? value - : '' + value + ? value + : '' + value } } diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index b1ec39dfd..bc448bbd5 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -1,19 +1,25 @@ import { - RouteLocationNormalized, RouteRecordRaw, - RouteLocationRaw, - NavigationHookAfter, - START_LOCATION_NORMALIZED, Lazy, - RouteLocationNormalizedLoaded, - RouteLocation, - RouteRecordName, + isRouteLocation, isRouteName, - NavigationGuardWithThis, RouteLocationOptions, MatcherLocationRaw, - RouteParams, } from './types' +import type { + RouteLocation, + RouteLocationRaw, + RouteParams, + RouteLocationNormalized, + RouteLocationNormalizedLoaded, + NavigationGuardWithThis, + NavigationHookAfter, + RouteLocationResolved, + RouteLocationAsRelative, + RouteLocationAsPath, + RouteLocationAsString, + RouteRecordNameGeneric, +} from './typed-routes' import { RouterHistory, HistoryState, NavigationType } from './history/common' import { ScrollPosition, @@ -48,6 +54,7 @@ import { stringifyURL, isSameRouteLocation, isSameRouteRecord, + START_LOCATION_NORMALIZED, } from './location' import { extractComponentsGuards, guardToPromiseFn } from './navigationGuards' import { warn } from './warning' @@ -59,6 +66,9 @@ import { routerViewLocationKey, } from './injectionSymbols' import { addDevtools } from './devtools' +import { _LiteralUnion } from './types/utils' +import { RouteLocationAsRelativeTyped } from './typed-routes/route-location' +import { RouteMap } from './typed-routes/route-map' /** * Internal type to define an ErrorHandler @@ -191,7 +201,7 @@ export interface Router { readonly options: RouterOptions /** - * Allows turning off the listening of history events. This is a low level api for micro-frontends. + * Allows turning off the listening of history events. This is a low level api for micro-frontend. */ listening: boolean @@ -201,7 +211,11 @@ export interface Router { * @param parentName - Parent Route Record where `route` should be appended at * @param route - Route Record to add */ - addRoute(parentName: RouteRecordName, route: RouteRecordRaw): () => void + addRoute( + // NOTE: it could be `keyof RouteMap` but the point of dynamic routes is not knowing the routes at build + parentName: NonNullable, + route: RouteRecordRaw + ): () => void /** * Add a new {@link RouteRecordRaw | route record} to the router. * @@ -213,18 +227,23 @@ export interface Router { * * @param name - Name of the route to remove */ - removeRoute(name: RouteRecordName): void + removeRoute(name: NonNullable): void /** * Checks if a route with a given name exists * * @param name - Name of the route to check */ - hasRoute(name: RouteRecordName): boolean + hasRoute(name: NonNullable): boolean /** * Get a full list of all the {@link RouteRecord | route records}. */ getRoutes(): RouteRecord[] + /** + * Delete all routes from the router matcher. + */ + clearRoutes(): void + /** * Returns the {@link RouteLocation | normalized version} of a * {@link RouteLocationRaw | route location}. Also includes an `href` property @@ -234,10 +253,17 @@ export interface Router { * @param to - Raw route location to resolve * @param currentLocation - Optional current location to resolve against */ + resolve( + to: RouteLocationAsRelativeTyped, + // NOTE: This version doesn't work probably because it infers the type too early + // | RouteLocationAsRelative + currentLocation?: RouteLocationNormalizedLoaded + ): RouteLocationResolved resolve( - to: RouteLocationRaw, + // not having the overload produces errors in RouterLink calls to router.resolve() + to: RouteLocationAsString | RouteLocationAsRelative | RouteLocationAsPath, currentLocation?: RouteLocationNormalizedLoaded - ): RouteLocation & { href: string } + ): RouteLocationResolved /** * Programmatically navigate to a new URL by pushing an entry in the history @@ -364,7 +390,7 @@ export function createRouter(options: RouterOptions): Router { if (__DEV__ && !routerHistory) throw new Error( 'Provide the "history" option when calling "createRouter()":' + - ' https://next.router.vuejs.org/api/#history.' + ' https://router.vuejs.org/api/interfaces/RouterOptions.html#history' ) const beforeGuards = useCallbacks>() @@ -390,13 +416,21 @@ export function createRouter(options: RouterOptions): Router { applyToParams.bind(null, decode) function addRoute( - parentOrRoute: RouteRecordName | RouteRecordRaw, + parentOrRoute: NonNullable | RouteRecordRaw, route?: RouteRecordRaw ) { let parent: Parameters<(typeof matcher)['addRoute']>[1] | undefined let record: RouteRecordRaw if (isRouteName(parentOrRoute)) { parent = matcher.getRecordMatcher(parentOrRoute) + if (__DEV__ && !parent) { + warn( + `Parent route "${String( + parentOrRoute + )}" not found when adding child route`, + route + ) + } record = route! } else { record = parentOrRoute @@ -405,7 +439,7 @@ export function createRouter(options: RouterOptions): Router { return matcher.addRoute(record, parent) } - function removeRoute(name: RouteRecordName) { + function removeRoute(name: NonNullable) { const recordMatcher = matcher.getRecordMatcher(name) if (recordMatcher) { matcher.removeRoute(recordMatcher) @@ -418,14 +452,15 @@ export function createRouter(options: RouterOptions): Router { return matcher.getRoutes().map(routeMatcher => routeMatcher.record) } - function hasRoute(name: RouteRecordName): boolean { + function hasRoute(name: NonNullable): boolean { return !!matcher.getRecordMatcher(name) } function resolve( - rawLocation: Readonly, + rawLocation: RouteLocationRaw, currentLocation?: RouteLocationNormalizedLoaded - ): RouteLocation & { href: string } { + ): RouteLocationResolved { + // const resolve: Router['resolve'] = (rawLocation: RouteLocationRaw, currentLocation) => { // const objectLocation = routerLocationAsObject(rawLocation) // we create a copy to modify it later currentLocation = assign({}, currentLocation || currentRoute.value) @@ -460,6 +495,14 @@ export function createRouter(options: RouterOptions): Router { }) } + if (__DEV__ && !isRouteLocation(rawLocation)) { + warn( + `router.resolve() was passed an invalid location. This will fail in production.\n- Location:`, + rawLocation + ) + return resolve({}) + } + let matcherLocation: MatcherLocationRaw // path could be relative in object as well @@ -979,7 +1022,7 @@ export function createRouter(options: RouterOptions): Router { const shouldRedirect = handleRedirectRecord(toLocation) if (shouldRedirect) { pushWithRedirect( - assign(shouldRedirect, { replace: true }), + assign(shouldRedirect, { replace: true, force: true }), toLocation ).catch(noop) return @@ -1020,7 +1063,9 @@ export function createRouter(options: RouterOptions): Router { // the error is already handled by router.push we just want to avoid // logging the error pushWithRedirect( - (error as NavigationRedirectError).to, + assign(locationAsObject((error as NavigationRedirectError).to), { + force: true, + }), toLocation // avoid an uncaught rejection, let push call triggerError ) @@ -1190,6 +1235,7 @@ export function createRouter(options: RouterOptions): Router { addRoute, removeRoute, + clearRoutes: matcher.clearRoutes, hasRoute, getRoutes, resolve, @@ -1209,7 +1255,6 @@ export function createRouter(options: RouterOptions): Router { isReady, install(app: App) { - const router = this app.component('RouterLink', RouterLink) app.component('RouterView', RouterView) diff --git a/packages/router/src/scrollBehavior.ts b/packages/router/src/scrollBehavior.ts index 7072604ae..642556452 100644 --- a/packages/router/src/scrollBehavior.ts +++ b/packages/router/src/scrollBehavior.ts @@ -1,4 +1,7 @@ -import { RouteLocationNormalized, RouteLocationNormalizedLoaded } from './types' +import type { + RouteLocationNormalized, + RouteLocationNormalizedLoaded, +} from './typed-routes' import { warn } from './warning' // we use types instead of interfaces to make it work with HistoryStateValue type diff --git a/packages/router/src/typed-routes/index.ts b/packages/router/src/typed-routes/index.ts new file mode 100644 index 000000000..3a64a4633 --- /dev/null +++ b/packages/router/src/typed-routes/index.ts @@ -0,0 +1,5 @@ +export type * from './params' +export type * from './route-map' +export type * from './route-location' +export type * from './route-records' +export type * from './navigation-guards' diff --git a/packages/router/src/typed-routes/navigation-guards.ts b/packages/router/src/typed-routes/navigation-guards.ts new file mode 100644 index 000000000..ab624e1f7 --- /dev/null +++ b/packages/router/src/typed-routes/navigation-guards.ts @@ -0,0 +1,94 @@ +import type { _Awaitable } from '../types/utils' +import type { + RouteLocationNormalizedLoaded, + RouteLocationNormalized, + RouteLocationRaw, +} from './route-location' +import type { TypesConfig } from '../config' +import type { NavigationFailure } from '../errors' +import { ComponentPublicInstance } from 'vue' + +/** + * Return types for a Navigation Guard. Based on `TypesConfig` + * + * @see {@link TypesConfig} + */ +export type NavigationGuardReturn = void | Error | boolean | RouteLocationRaw + +/** + * Navigation Guard with a type parameter for `this`. + * @see {@link TypesConfig} + */ +export interface NavigationGuardWithThis { + ( + this: T, + to: RouteLocationNormalized, + from: RouteLocationNormalizedLoaded, + // intentionally not typed to make people use the return + next: NavigationGuardNext + ): _Awaitable +} + +/** + * In `router.beforeResolve((to) => {})`, the `to` is typed as `RouteLocationNormalizedLoaded`, not + * `RouteLocationNormalized` like in `router.beforeEach()`. In practice it doesn't change much as users do not rely on + * the difference between them but if we update the type in vue-router, we will have to update this type too. + * @internal + */ +export interface _NavigationGuardResolved { + ( + this: undefined, + to: RouteLocationNormalizedLoaded, + from: RouteLocationNormalizedLoaded, + // intentionally not typed to make people use the return + next: NavigationGuardNext + ): _Awaitable +} + +/** + * Navigation Guard. + */ +export interface NavigationGuard { + ( + to: RouteLocationNormalized, + from: RouteLocationNormalizedLoaded, + // intentionally not typed to make people use the return + next: NavigationGuardNext + ): _Awaitable +} + +/** + * Navigation hook triggered after a navigation is settled. + */ +export interface NavigationHookAfter { + ( + to: RouteLocationNormalized, + from: RouteLocationNormalizedLoaded, + failure?: NavigationFailure | void + ): unknown +} + +/** + * `next()` callback passed to navigation guards. + */ +export interface NavigationGuardNext { + (): void + (error: Error): void + (location: RouteLocationRaw): void + (valid: boolean | undefined): void + (cb: NavigationGuardNextCallback): void + /** + * Allows to detect if `next` isn't called in a resolved guard. Used + * internally in DEV mode to emit a warning. Commented out to simplify + * typings. + * @internal + */ + // _called: boolean +} + +/** + * Callback that can be passed to `next()` in `beforeRouteEnter()` guards. + */ +export type NavigationGuardNextCallback = ( + vm: ComponentPublicInstance +) => unknown diff --git a/packages/router/src/typed-routes/params.ts b/packages/router/src/typed-routes/params.ts new file mode 100644 index 000000000..6e1dae5a1 --- /dev/null +++ b/packages/router/src/typed-routes/params.ts @@ -0,0 +1,53 @@ +import type { RouteMap } from './route-map' + +/** + * Utility type for raw and non raw params like :id+ + * + */ +export type ParamValueOneOrMore = [ + ParamValue, + ...ParamValue[], +] + +/** + * Utility type for raw and non raw params like :id* + * + */ +export type ParamValueZeroOrMore = true extends isRaw + ? ParamValue[] | undefined | null + : ParamValue[] | undefined + +/** + * Utility type for raw and non raw params like :id? + * + */ +export type ParamValueZeroOrOne = true extends isRaw + ? string | number | null | undefined + : string + +/** + * Utility type for raw and non raw params like :id + * + */ +export type ParamValue = true extends isRaw + ? string | number + : string + +// TODO: finish this refactor +// export type ParamValueOneOrMoreRaw = [ParamValueRaw, ...ParamValueRaw[]] +// export type ParamValue = string +// export type ParamValueRaw = string | number + +/** + * Generate a type safe params for a route location. Requires the name of the route to be passed as a generic. + * @see {@link RouteParamsGeneric} + */ +export type RouteParams = + RouteMap[Name]['params'] + +/** + * Generate a type safe raw params for a route location. Requires the name of the route to be passed as a generic. + * @see {@link RouteParamsRaw} + */ +export type RouteParamsRaw = + RouteMap[Name]['paramsRaw'] diff --git a/packages/router/src/typed-routes/route-location.ts b/packages/router/src/typed-routes/route-location.ts new file mode 100644 index 000000000..d370c99ab --- /dev/null +++ b/packages/router/src/typed-routes/route-location.ts @@ -0,0 +1,312 @@ +import type { + RouteLocationOptions, + RouteQueryAndHash, + _RouteLocationBase, + RouteParamsGeneric, + RouteLocationMatched, + RouteParamsRawGeneric, +} from '../types' +import type { _LiteralUnion } from '../types/utils' +// inlining the type as it avoids code splitting issues +import type { RouteMap, RouteMapGeneric } from './route-map' +import type { Router } from '../router' +import type { RouteRecord, RouteRecordNormalized } from '../matcher/types' +import type { RouteRecordNameGeneric } from './route-records' + +/** + * Generic version of {@link RouteLocation}. It is used when no {@link RouteMap} is provided. + */ +export interface RouteLocationGeneric extends _RouteLocationBase { + /** + * Array of {@link RouteRecord} containing components as they were + * passed when adding records. It can also contain redirect records. This + * can't be used directly. **This property is non-enumerable**. + */ + matched: RouteRecord[] +} + +/** + * Helper to generate a type safe version of the {@link RouteLocation} type. + */ +export interface RouteLocationTyped< + RouteMap extends RouteMapGeneric, + Name extends keyof RouteMap, +> extends RouteLocationGeneric { + // Extract is needed because keyof can produce numbers + name: Extract + params: RouteMap[Name]['params'] +} + +/** + * List of all possible {@link RouteLocation} indexed by the route name. + * @internal + */ +export type RouteLocationTypedList< + RouteMap extends RouteMapGeneric = RouteMapGeneric, +> = { [N in keyof RouteMap]: RouteLocationTyped } + +/** + * Generic version of {@link RouteLocationNormalized} that is used when no {@link RouteMap} is provided. + */ +export interface RouteLocationNormalizedGeneric extends _RouteLocationBase { + name: RouteRecordNameGeneric + params: RouteParamsGeneric + /** + * Array of {@link RouteRecordNormalized} + */ + matched: RouteRecordNormalized[] +} + +/** + * Helper to generate a type safe version of the {@link RouteLocationNormalized} type. + */ +export interface RouteLocationNormalizedTyped< + RouteMap extends RouteMapGeneric = RouteMapGeneric, + Name extends keyof RouteMap = keyof RouteMap, +> extends RouteLocationNormalizedGeneric { + name: Extract + // we don't override path because it could contain params and in practice it's just not useful + params: RouteMap[Name]['params'] + + /** + * Array of {@link RouteRecordNormalized} + */ + matched: RouteRecordNormalized[] // non-enumerable +} + +/** + * List of all possible {@link RouteLocationNormalized} indexed by the route name. + * @internal + */ +export type RouteLocationNormalizedTypedList< + RouteMap extends RouteMapGeneric = RouteMapGeneric, +> = { [N in keyof RouteMap]: RouteLocationNormalizedTyped } + +/** + * Generic version of {@link RouteLocationNormalizedLoaded} that is used when no {@link RouteMap} is provided. + */ +export interface RouteLocationNormalizedLoadedGeneric + extends RouteLocationNormalizedGeneric { + /** + * Array of {@link RouteLocationMatched} containing only plain components (any + * lazy-loaded components have been loaded and were replaced inside the + * `components` object) so it can be directly used to display routes. It + * cannot contain redirect records either. **This property is non-enumerable**. + */ + matched: RouteLocationMatched[] +} + +/** + * Helper to generate a type safe version of the {@link RouteLocationNormalizedLoaded} type. + */ +export interface RouteLocationNormalizedLoadedTyped< + RouteMap extends RouteMapGeneric = RouteMapGeneric, + Name extends keyof RouteMap = keyof RouteMap, +> extends RouteLocationNormalizedLoadedGeneric { + name: Extract + // we don't override path because it could contain params and in practice it's just not useful + params: RouteMap[Name]['params'] +} + +/** + * List of all possible {@link RouteLocationNormalizedLoaded} indexed by the route name. + * @internal + */ +export type RouteLocationNormalizedLoadedTypedList< + RouteMap extends RouteMapGeneric = RouteMapGeneric, +> = { [N in keyof RouteMap]: RouteLocationNormalizedLoadedTyped } + +/** + * Generic version of {@link RouteLocationAsRelative}. It is used when no {@link RouteMap} is provided. + */ +export interface RouteLocationAsRelativeGeneric + extends RouteQueryAndHash, + RouteLocationOptions { + name?: RouteRecordNameGeneric + params?: RouteParamsRawGeneric + /** + * A relative path to the current location. This property should be removed + */ + path?: undefined +} + +/** + * Helper to generate a type safe version of the {@link RouteLocationAsRelative} type. + */ +export interface RouteLocationAsRelativeTyped< + RouteMap extends RouteMapGeneric = RouteMapGeneric, + Name extends keyof RouteMap = keyof RouteMap, +> extends RouteLocationAsRelativeGeneric { + name?: Extract + params?: RouteMap[Name]['paramsRaw'] +} + +/** + * List of all possible {@link RouteLocationAsRelative} indexed by the route name. + * @internal + */ +export type RouteLocationAsRelativeTypedList< + RouteMap extends RouteMapGeneric = RouteMapGeneric, +> = { [N in keyof RouteMap]: RouteLocationAsRelativeTyped } + +/** + * Generic version of {@link RouteLocationAsPath}. It is used when no {@link RouteMap} is provided. + */ +export interface RouteLocationAsPathGeneric + extends RouteQueryAndHash, + RouteLocationOptions { + /** + * Percentage encoded pathname section of the URL. + */ + path: string +} + +/** + * Helper to generate a type safe version of the {@link RouteLocationAsPath} type. + */ +export interface RouteLocationAsPathTyped< + RouteMap extends RouteMapGeneric = RouteMapGeneric, + Name extends keyof RouteMap = keyof RouteMap, +> extends RouteLocationAsPathGeneric { + path: _LiteralUnion + + // // allows to check for .path and other properties that exist in different route location types + // [key: string]: unknown +} + +/** + * List of all possible {@link RouteLocationAsPath} indexed by the route name. + * @internal + */ +export type RouteLocationAsPathTypedList< + RouteMap extends RouteMapGeneric = RouteMapGeneric, +> = { [N in keyof RouteMap]: RouteLocationAsPathTyped } + +/** + * Helper to generate a type safe version of the {@link RouteLocationAsString} type. + */ +export type RouteLocationAsStringTyped< + RouteMap extends RouteMapGeneric = RouteMapGeneric, + Name extends keyof RouteMap = keyof RouteMap, +> = RouteMap[Name]['path'] + +/** + * List of all possible {@link RouteLocationAsString} indexed by the route name. + * @internal + */ +export type RouteLocationAsStringTypedList< + RouteMap extends RouteMapGeneric = RouteMapGeneric, +> = { [N in keyof RouteMap]: RouteLocationAsStringTyped } + +/** + * Generic version of {@link RouteLocationResolved}. It is used when no {@link RouteMap} is provided. + */ +export interface RouteLocationResolvedGeneric extends RouteLocationGeneric { + /** + * Resolved `href` for the route location that will be set on the ``. + */ + href: string +} + +/** + * Helper to generate a type safe version of the {@link RouteLocationResolved} type. + */ +export interface RouteLocationResolvedTyped< + RouteMap extends RouteMapGeneric, + Name extends keyof RouteMap, +> extends RouteLocationTyped { + /** + * Resolved `href` for the route location that will be set on the ``. + */ + href: string +} + +/** + * List of all possible {@link RouteLocationResolved} indexed by the route name. + * @internal + */ +export type RouteLocationResolvedTypedList< + RouteMap extends RouteMapGeneric = RouteMapGeneric, +> = { [N in keyof RouteMap]: RouteLocationResolvedTyped } + +/** + * Type safe versions of types that are exposed by vue-router. We have to use a generic check to allow for names to be `undefined` when no `RouteMap` is provided. + */ + +/** + * {@link RouteLocationRaw} resolved using the matcher + */ +export type RouteLocation = + RouteMapGeneric extends RouteMap + ? RouteLocationGeneric + : RouteLocationTypedList[Name] + +/** + * Similar to {@link RouteLocation} but its + * {@link RouteLocationNormalizedTyped.matched | `matched` property} cannot contain redirect records + */ +export type RouteLocationNormalized< + Name extends keyof RouteMap = keyof RouteMap, +> = RouteMapGeneric extends RouteMap + ? RouteLocationNormalizedGeneric + : RouteLocationNormalizedTypedList[Name] + +/** + * Similar to {@link RouteLocationNormalized} but its `components` do not contain any function to lazy load components. + * In other words, it's ready to be rendered by ``. + */ +export type RouteLocationNormalizedLoaded< + Name extends keyof RouteMap = keyof RouteMap, +> = RouteMapGeneric extends RouteMap + ? RouteLocationNormalizedLoadedGeneric + : RouteLocationNormalizedLoadedTypedList[Name] + +/** + * Route location relative to the current location. It accepts other properties than `path` like `params`, `query` and + * `hash` to conveniently change them. + */ +export type RouteLocationAsRelative< + Name extends keyof RouteMap = keyof RouteMap, +> = RouteMapGeneric extends RouteMap + ? RouteLocationAsRelativeGeneric + : RouteLocationAsRelativeTypedList[Name] + +/** + * Route location resolved with {@link Router | `router.resolve()`}. + */ +export type RouteLocationResolved< + Name extends keyof RouteMap = keyof RouteMap, +> = RouteMapGeneric extends RouteMap + ? RouteLocationResolvedGeneric + : RouteLocationResolvedTypedList[Name] + +/** + * Same as {@link RouteLocationAsPath} but as a string literal. + */ +export type RouteLocationAsString< + Name extends keyof RouteMap = keyof RouteMap, +> = RouteMapGeneric extends RouteMap + ? string + : _LiteralUnion[Name], string> + +/** + * Route location as an object with a `path` property. + */ +export type RouteLocationAsPath = + RouteMapGeneric extends RouteMap + ? RouteLocationAsPathGeneric + : RouteLocationAsPathTypedList[Name] + +/** + * Route location that can be passed to `router.push()` and other user-facing APIs. + */ +export type RouteLocationRaw = + RouteMapGeneric extends RouteMap + ? + | RouteLocationAsString + | RouteLocationAsRelativeGeneric + | RouteLocationAsPathGeneric + : + | _LiteralUnion[Name], string> + | RouteLocationAsRelativeTypedList[Name] + | RouteLocationAsPathTypedList[Name] diff --git a/packages/router/src/typed-routes/route-map.ts b/packages/router/src/typed-routes/route-map.ts new file mode 100644 index 000000000..7a7f0a2ef --- /dev/null +++ b/packages/router/src/typed-routes/route-map.ts @@ -0,0 +1,51 @@ +import type { TypesConfig } from '../config' +import type { RouteParamsGeneric, RouteParamsRawGeneric } from '../types' +import type { RouteRecord } from '../matcher/types' + +/** + * Helper type to define a Typed `RouteRecord` + * @see {@link RouteRecord} + */ +export interface RouteRecordInfo< + // the name cannot be nullish here as that would not allow type narrowing + Name extends string | symbol = string, + Path extends string = string, + // TODO: could probably be inferred from the Params + ParamsRaw extends RouteParamsRawGeneric = RouteParamsRawGeneric, + Params extends RouteParamsGeneric = RouteParamsGeneric, + // NOTE: this is the only type param that feels wrong because its default + // value is the default value to avoid breaking changes but it should be the + // generic version by default instead (string | symbol) + ChildrenNames extends string | symbol = never, + // TODO: implement meta with a defineRoute macro + // Meta extends RouteMeta = RouteMeta, +> { + name: Name + path: Path + paramsRaw: ParamsRaw + params: Params + childrenNames: ChildrenNames + // TODO: implement meta with a defineRoute macro + // meta: Meta +} + +export type RouteRecordInfoGeneric = RouteRecordInfo< + string | symbol, + string, + RouteParamsRawGeneric, + RouteParamsGeneric, + string | symbol +> + +/** + * Convenience type to get the typed RouteMap or a generic one if not provided. It is extracted from the {@link TypesConfig} if it exists, it becomes {@link RouteMapGeneric} otherwise. + */ +export type RouteMap = + TypesConfig extends Record<'RouteNamedMap', infer RouteNamedMap> + ? RouteNamedMap + : RouteMapGeneric + +/** + * Generic version of the `RouteMap`. + */ +export type RouteMapGeneric = Record diff --git a/packages/router/src/typed-routes/route-records.ts b/packages/router/src/typed-routes/route-records.ts new file mode 100644 index 000000000..d7d9d2022 --- /dev/null +++ b/packages/router/src/typed-routes/route-records.ts @@ -0,0 +1,35 @@ +import type { + RouteLocation, + RouteLocationNormalized, + RouteLocationRaw, +} from './route-location' +import type { RouteMap, RouteMapGeneric } from './route-map' + +/** + * @internal + */ +export type RouteRecordRedirectOption = + | RouteLocationRaw + | ((to: RouteLocation) => RouteLocationRaw) + +/** + * Generic version of {@link RouteRecordName}. + */ +export type RouteRecordNameGeneric = string | symbol | undefined + +/** + * Possible values for a route record **after normalization** + * + * NOTE: since `RouteRecordName` is a type, it evaluates too early and it's often the generic version {@link RouteRecordNameGeneric}. If you need a typed version of all of the names of routes, use {@link RouteMap | `keyof RouteMap`} + */ +export type RouteRecordName = RouteMapGeneric extends RouteMap + ? RouteRecordNameGeneric + : keyof RouteMap + +/** + * @internal + */ +export type _RouteRecordProps = + | boolean + | Record + | ((to: RouteLocationNormalized) => Record) diff --git a/packages/router/src/types/index.ts b/packages/router/src/types/index.ts index 9c2396b21..bf8f7fb6c 100644 --- a/packages/router/src/types/index.ts +++ b/packages/router/src/types/index.ts @@ -1,9 +1,16 @@ -import { LocationQuery, LocationQueryRaw } from '../query' -import { PathParserOptions } from '../matcher' -import { Ref, ComponentPublicInstance, Component, DefineComponent } from 'vue' -import { RouteRecord, RouteRecordNormalized } from '../matcher/types' -import { HistoryState } from '../history/common' -import { NavigationFailure } from '../errors' +import type { LocationQuery, LocationQueryRaw } from '../query' +import type { PathParserOptions } from '../matcher' +import type { Ref, Component, DefineComponent } from 'vue' +import type { RouteRecord, RouteRecordNormalized } from '../matcher/types' +import type { HistoryState } from '../history/common' +import type { + NavigationGuardWithThis, + RouteLocation, + RouteRecordRedirectOption, + _RouteRecordProps, + RouteRecordNameGeneric, +} from '../typed-routes' +import type { _Awaitable } from './utils' export type Lazy = () => Promise export type Override = Pick> & U @@ -32,8 +39,11 @@ export type RouteParamValue = string * @internal */ export type RouteParamValueRaw = RouteParamValue | number | null | undefined -export type RouteParams = Record -export type RouteParamsRaw = Record< +export type RouteParamsGeneric = Record< + string, + RouteParamValue | RouteParamValue[] +> +export type RouteParamsRawGeneric = Record< string, RouteParamValueRaw | Exclude[] > @@ -57,13 +67,13 @@ export interface MatcherLocationAsPath { * @internal */ export interface MatcherLocationAsName { - name: RouteRecordName + name: RouteRecordNameGeneric // to allow checking location.path == null /** * Ignored path property since we are dealing with a relative location. Only `undefined` is allowed. */ path?: undefined - params?: RouteParams + params?: RouteParamsGeneric } /** @@ -75,20 +85,20 @@ export interface MatcherLocationAsRelative { * Ignored path property since we are dealing with a relative location. Only `undefined` is allowed. */ path?: undefined - params?: RouteParams + params?: RouteParamsGeneric } /** * @internal */ export interface LocationAsRelativeRaw { - name?: RouteRecordName + name?: RouteRecordNameGeneric // to allow checking location.path == null /** * Ignored path property since we are dealing with a relative location. Only `undefined` is allowed. */ path?: undefined - params?: RouteParamsRaw + params?: RouteParamsRawGeneric } /** @@ -113,14 +123,6 @@ export interface RouteLocationOptions { state?: HistoryState } -/** - * User-level route location - */ -export type RouteLocationRaw = - | string - | RouteLocationPathRaw - | RouteLocationNamedRaw - /** * Route Location that can infer the necessary params based on the name. * @@ -141,6 +143,7 @@ export interface RouteLocationPathRaw MatcherLocationAsPath, RouteLocationOptions {} +// TODO: rename in next major to RouteRecordMatched? export interface RouteLocationMatched extends RouteRecordNormalized { // components cannot be Lazy components: Record | null | undefined @@ -173,43 +176,6 @@ export interface _RouteLocationBase redirectedFrom: RouteLocation | undefined } -// matched contains resolved components -/** - * {@link RouteLocationRaw} with - */ -export interface RouteLocationNormalizedLoaded extends _RouteLocationBase { - /** - * Array of {@link RouteLocationMatched} containing only plain components (any - * lazy-loaded components have been loaded and were replaced inside the - * `components` object) so it can be directly used to display routes. It - * cannot contain redirect records either - */ - matched: RouteLocationMatched[] // non-enumerable -} - -/** - * {@link RouteLocationRaw} resolved using the matcher - */ -export interface RouteLocation extends _RouteLocationBase { - /** - * Array of {@link RouteRecord} containing components as they were - * passed when adding records. It can also contain redirect records. This - * can't be used directly - */ - matched: RouteRecord[] // non-enumerable -} - -/** - * Similar to {@link RouteLocation} but its - * {@link RouteLocationNormalized.matched} cannot contain redirect records - */ -export interface RouteLocationNormalized extends _RouteLocationBase { - /** - * Array of {@link RouteRecordNormalized} - */ - matched: RouteRecordNormalized[] // non-enumerable -} - /** * Allowed Component in {@link RouteLocationMatched} */ @@ -219,19 +185,6 @@ export type RouteComponent = Component | DefineComponent */ export type RawRouteComponent = RouteComponent | Lazy -/** - * Possible values for a user-defined route record's name - */ -export type RouteRecordName = string | symbol - -/** - * @internal - */ -export type _RouteRecordProps = - | boolean - | Record - | ((to: RouteLocationNormalized) => Record) - // TODO: could this be moved to matcher? /** * Internal type for common properties among all kind of {@link RouteRecordRaw}. @@ -262,7 +215,7 @@ export interface _RouteRecordBase extends PathParserOptions { /** * Name for the route record. Must be unique. */ - name?: RouteRecordName + name?: RouteRecordNameGeneric /** * Before Enter guard specific to this record. Note `beforeEnter` has no @@ -301,17 +254,10 @@ export interface _RouteRecordBase extends PathParserOptions { * interface RouteMeta { * requiresAuth?: boolean * } - * } + * } * ``` */ -export interface RouteMeta extends Record {} - -/** - * @internal - */ -export type RouteRecordRedirectOption = - | RouteLocationRaw - | ((to: RouteLocation) => RouteLocationRaw) +export interface RouteMeta extends Record {} /** * Route Record defining one single component with the `component` option. @@ -407,33 +353,6 @@ export type RouteRecordRaw = | RouteRecordMultipleViewsWithChildren | RouteRecordRedirect -/** - * Initial route location where the router is. Can be used in navigation guards - * to differentiate the initial navigation. - * - * @example - * ```js - * import { START_LOCATION } from 'vue-router' - * - * router.beforeEach((to, from) => { - * if (from === START_LOCATION) { - * // initial navigation - * } - * }) - * ``` - */ -export const START_LOCATION_NORMALIZED: RouteLocationNormalizedLoaded = { - path: '/', - name: undefined, - params: {}, - query: {}, - hash: '', - fullPath: '/', - matched: [], - meta: {}, - redirectedFrom: undefined, -} - // make matched non-enumerable for easy printing // NOTE: commented for tests at RouterView.spec // Object.defineProperty(START_LOCATION_NORMALIZED, 'matched', { @@ -457,7 +376,7 @@ export interface MatcherLocation { /** * Name of the matched record */ - name: RouteRecordName | null | undefined + name: RouteRecordNameGeneric | null | undefined /** * Percentage encoded pathname section of the URL. @@ -467,7 +386,7 @@ export interface MatcherLocation { /** * Object of decoded params extracted from the `path`. */ - params: RouteParams + params: RouteParamsGeneric /** * Merged `meta` properties from all the matched route records. @@ -482,67 +401,6 @@ export interface MatcherLocation { matched: RouteRecord[] // non-enumerable } -export interface NavigationGuardNext { - (): void - (error: Error): void - (location: RouteLocationRaw): void - (valid: boolean | undefined): void - (cb: NavigationGuardNextCallback): void - /** - * Allows to detect if `next` isn't called in a resolved guard. Used - * internally in DEV mode to emit a warning. Commented out to simplify - * typings. - * @internal - */ - // _called: boolean -} - -export type NavigationGuardNextCallback = ( - vm: ComponentPublicInstance -) => unknown - -export type NavigationGuardReturn = - | void - | Error - | RouteLocationRaw - | boolean - // FIXME: this one is only allowed in options api - | NavigationGuardNextCallback - -/** - * Navigation guard. See [Navigation - * Guards](/guide/advanced/navigation-guards.md). - */ -export interface NavigationGuard { - ( - // TODO: we could maybe add extra information like replace: true/false - to: RouteLocationNormalized, - from: RouteLocationNormalized, - next: NavigationGuardNext - // FIXME: this one shouldn't allow returning () => ... - ): NavigationGuardReturn | Promise -} - -/** - * {@inheritDoc NavigationGuard} - */ -export interface NavigationGuardWithThis { - ( - this: T, - to: RouteLocationNormalized, - from: RouteLocationNormalized, - next: NavigationGuardNext - ): NavigationGuardReturn | Promise -} - -export interface NavigationHookAfter { - ( - to: RouteLocationNormalized, - from: RouteLocationNormalized, - failure?: NavigationFailure | void - ): any -} - export * from './typeGuards' export type Mutable = { diff --git a/packages/router/src/types/typeGuards.ts b/packages/router/src/types/typeGuards.ts index 782ef08c0..ba30bd9b6 100644 --- a/packages/router/src/types/typeGuards.ts +++ b/packages/router/src/types/typeGuards.ts @@ -1,9 +1,9 @@ -import { RouteLocationRaw, RouteRecordName } from './index' +import type { RouteLocationRaw, RouteRecordNameGeneric } from '../typed-routes' export function isRouteLocation(route: any): route is RouteLocationRaw { return typeof route === 'string' || (route && typeof route === 'object') } -export function isRouteName(name: any): name is RouteRecordName { +export function isRouteName(name: any): name is RouteRecordNameGeneric { return typeof name === 'string' || typeof name === 'symbol' } diff --git a/packages/router/src/types/utils.ts b/packages/router/src/types/utils.ts index b5874a260..e7d163184 100644 --- a/packages/router/src/types/utils.ts +++ b/packages/router/src/types/utils.ts @@ -1,10 +1,17 @@ /** + * Creates a union type that still allows autocompletion for strings. * @internal */ export type _LiteralUnion = | LiteralType | (BaseType & Record) +/** + * Maybe a promise maybe not + * @internal + */ +export type _Awaitable = T | PromiseLike + /** * @internal */ diff --git a/packages/router/src/useApi.ts b/packages/router/src/useApi.ts index 9bf578539..36930a962 100644 --- a/packages/router/src/useApi.ts +++ b/packages/router/src/useApi.ts @@ -1,7 +1,8 @@ import { inject } from 'vue' import { routerKey, routeLocationKey } from './injectionSymbols' import { Router } from './router' -import { RouteLocationNormalizedLoaded } from './types' +import { RouteMap } from './typed-routes/route-map' +import { RouteLocationNormalizedLoaded } from './typed-routes' /** * Returns the router instance. Equivalent to using `$router` inside @@ -15,6 +16,10 @@ export function useRouter(): Router { * Returns the current route location. Equivalent to using `$route` inside * templates. */ -export function useRoute(): RouteLocationNormalizedLoaded { - return inject(routeLocationKey)! +export function useRoute( + _name?: Name +) { + return inject(routeLocationKey) as RouteLocationNormalizedLoaded< + Name | RouteMap[Name]['childrenNames'] + > } diff --git a/packages/router/src/utils/index.ts b/packages/router/src/utils/index.ts index af90cb5ce..b63f9dbb3 100644 --- a/packages/router/src/utils/index.ts +++ b/packages/router/src/utils/index.ts @@ -1,23 +1,47 @@ import { - RouteParams, + RouteParamsGeneric, RouteComponent, - RouteParamsRaw, + RouteParamsRawGeneric, RouteParamValueRaw, + RawRouteComponent, } from '../types' export * from './env' +/** + * Allows differentiating lazy components from functional components and vue-class-component + * @internal + * + * @param component + */ +export function isRouteComponent( + component: RawRouteComponent +): component is RouteComponent { + return ( + typeof component === 'object' || + 'displayName' in component || + 'props' in component || + '__vccOpts' in component + ) +} + export function isESModule(obj: any): obj is { default: RouteComponent } { - return obj.__esModule || obj[Symbol.toStringTag] === 'Module' + return ( + obj.__esModule || + obj[Symbol.toStringTag] === 'Module' || + // support CF with dynamic imports that do not + // add the Module string tag + (obj.default && isRouteComponent(obj.default)) + ) } export const assign = Object.assign export function applyToParams( fn: (v: string | number | null | undefined) => string, - params: RouteParamsRaw | undefined -): RouteParams { - const newParams: RouteParams = {} + params: RouteParamsRawGeneric | undefined +): RouteParamsGeneric { + const newParams: RouteParamsGeneric = {} for (const key in params) { const value = params[key] diff --git a/packages/router/test-dts/components.test-d.tsx b/packages/router/test-dts/components.test-d.tsx index e34707fdd..07c270520 100644 --- a/packages/router/test-dts/components.test-d.tsx +++ b/packages/router/test-dts/components.test-d.tsx @@ -4,29 +4,33 @@ import { RouterView, createRouter, createMemoryHistory, - expectError, - expectType, } from './index' +import { it, describe, expectTypeOf } from 'vitest' -let router = createRouter({ - history: createMemoryHistory(), - routes: [], -}) +describe('Components', () => { + let router = createRouter({ + history: createMemoryHistory(), + routes: [], + }) -// RouterLink -// @ts-expect-error missing to -expectError() -// @ts-expect-error: invalid prop -expectError() -// @ts-expect-error: invalid prop -expectError() -expectType() -expectType() -expectType() -expectType() -expectType() + // TODO: split into multiple tests + it('works', () => { + // RouterLink + // @ts-expect-error missing to + expectError() + // @ts-expect-error: invalid prop + expectError() + // @ts-expect-error: invalid prop + expectError() + expectTypeOf() + expectTypeOf() + expectTypeOf() + expectTypeOf() + expectTypeOf() -// RouterView -expectType() -expectType() -expectType() + // RouterView + expectTypeOf() + expectTypeOf() + expectTypeOf() + }) +}) diff --git a/packages/router/test-dts/createRouter.test-d.ts b/packages/router/test-dts/createRouter.test-d.ts deleted file mode 100644 index 75ff3b872..000000000 --- a/packages/router/test-dts/createRouter.test-d.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { - createRouter, - createWebHistory, - NavigationGuard, - NavigationGuardNext, - RouteLocationNormalized, -} from './index' -import { createApp, defineComponent, h } from 'vue' - -const component = defineComponent({}) - -const WithProps = defineComponent({ - props: { - id: { - type: String, - required: true, - }, - }, -}) - -const Foo = defineComponent({ - props: { - test: String, - }, - setup() { - return { - title: 'homepage', - } - }, - render() { - return h('div', `${this.title}: ${this.test}`) - }, -}) - -const router = createRouter({ - history: createWebHistory(), - routes: [ - { path: '/', component }, - { path: '/foo', component: Foo }, - { path: '/', component: WithProps }, - ], - parseQuery: search => ({}), - stringifyQuery: query => '', - strict: true, - end: true, - sensitive: true, - scrollBehavior(to, from, savedPosition) {}, -}) - -export const loggedInGuard: NavigationGuard = (to, from, next) => next('/') -function beforeGuardFn( - to: RouteLocationNormalized, - from: RouteLocationNormalized, - next: NavigationGuardNext -) {} - -router.beforeEach(loggedInGuard) -router.beforeEach(beforeGuardFn) - -const app = createApp({}) -app.use(router) diff --git a/packages/router/test-dts/index.d.ts b/packages/router/test-dts/index.d.ts index 1008e4d73..e7c8be7b6 100644 --- a/packages/router/test-dts/index.d.ts +++ b/packages/router/test-dts/index.d.ts @@ -1,7 +1,2 @@ export * from '../dist/vue-router' // export * from '../src' - -export function describe(_name: string, _fn: () => void): void -export function expectType(value: T): void -export function expectError(value: T): void -export function expectAssignable(value: T2): void diff --git a/packages/router/test-dts/legacy.test-d.ts b/packages/router/test-dts/legacy.test-d.ts index cd28179b4..3b5f70b57 100644 --- a/packages/router/test-dts/legacy.test-d.ts +++ b/packages/router/test-dts/legacy.test-d.ts @@ -1,11 +1,32 @@ -import { Router, RouteLocationNormalizedLoaded, expectType } from './index' +import { describe, expectTypeOf, it } from 'vitest' +import { + useRouter, + useRoute, + // rename types for better error messages, otherwise they have the same name + // RouteLocationNormalizedLoadedTyped as I_RLNLT +} from './index' import { defineComponent } from 'vue' -defineComponent({ - methods: { - doStuff() { - expectType(this.$router) - expectType(this.$route) - }, - }, +describe('Instance types', () => { + it('creates a $route instance property', () => { + defineComponent({ + methods: { + doStuff() { + // TODO: can't do a proper check because of typed routes + expectTypeOf(this.$route.params).toMatchTypeOf(useRoute().params) + }, + }, + }) + }) + + it('creates $router instance properties', () => { + defineComponent({ + methods: { + doStuff() { + // TODO: can't do a proper check because of typed routes + expectTypeOf(this.$router.back).toEqualTypeOf(useRouter().back) + }, + }, + }) + }) }) diff --git a/packages/router/test-dts/meta.test-d.ts b/packages/router/test-dts/meta.test-d.ts index 5e3d6e9b2..33bd677e1 100644 --- a/packages/router/test-dts/meta.test-d.ts +++ b/packages/router/test-dts/meta.test-d.ts @@ -1,43 +1,64 @@ -import { createRouter, createWebHistory, expectType } from './index' -import { createApp, defineComponent } from 'vue' +import { createRouter, createWebHistory } from './index' +import { defineComponent } from 'vue' +import { describe, it, expectTypeOf } from 'vitest' const component = defineComponent({}) -declare module './index' { +declare module '.' { interface RouteMeta { requiresAuth?: boolean nested: { foo: string } } } -const router = createRouter({ - history: createWebHistory(), - routes: [ - { - path: '/', +describe('RouteMeta', () => { + it('route creation', () => { + const router = createRouter({ + history: createWebHistory(), + routes: [ + { + path: '/', + component, + meta: { + requiresAuth: true, + lol: true, + nested: { + foo: 'bar', + }, + }, + }, + { + path: '/hey', + component, + // @ts-expect-error: meta is missing `nested` + meta: {}, + }, + ], + }) + + router.addRoute({ + path: '/foo', component, meta: { - requiresAuth: true, - lol: true, nested: { - foo: 'bar', + foo: 'foo', }, }, - }, - { - path: '/foo', - component, - // @ts-expect-error - meta: {}, - }, - ], -}) + }) + }) -router.beforeEach(to => { - expectType<{ requiresAuth?: Boolean; nested: { foo: string } }>(to.meta) - expectType(to.meta.lol) - if (to.meta.nested.foo == 'foo' || to.meta.lol) return false + it('route location in guards', () => { + const router = createRouter({ + history: createWebHistory(), + routes: [], + }) + router.beforeEach(to => { + expectTypeOf<{ requiresAuth?: Boolean; nested?: { foo: string } }>( + to.meta + ) + expectTypeOf(to.meta.lol) + if (to.meta.nested?.foo == 'foo' || to.meta.lol) return false + return + }) + }) }) - -const app = createApp({}) -app.use(router) diff --git a/packages/router/test-dts/navigationGuards.test-d.ts b/packages/router/test-dts/navigationGuards.test-d.ts index 71a244eb8..86f4a0c4a 100644 --- a/packages/router/test-dts/navigationGuards.test-d.ts +++ b/packages/router/test-dts/navigationGuards.test-d.ts @@ -1,7 +1,7 @@ +import { expectTypeOf, describe, it } from 'vitest' import { createRouter, createWebHistory, - expectType, isNavigationFailure, NavigationFailure, NavigationFailureType, @@ -14,44 +14,49 @@ const router = createRouter({ routes: [], }) -router.beforeEach((to, from) => { - return { path: '/' } -}) - -router.beforeEach((to, from) => { - return '/' -}) - -router.beforeEach((to, from) => { - return false -}) - -router.beforeEach((to, from, next) => { - next(undefined) -}) - -// @ts-expect-error -router.beforeEach((to, from, next) => { - return Symbol('not supported') -}) -// @ts-expect-error -router.beforeEach(() => { - return Symbol('not supported') -}) - -router.beforeEach((to, from, next) => { - // @ts-expect-error - next(Symbol('not supported')) -}) - -router.afterEach((to, from, failure) => { - expectType(failure) - if (isNavigationFailure(failure)) { - expectType(failure.from) - expectType(failure.to) - } - if (isNavigationFailure(failure, NavigationFailureType.cancelled)) { - expectType(failure.from) - expectType(failure.to) - } +describe('Navigation guards', () => { + // TODO: split into multiple tests + it('works', () => { + router.beforeEach((to, from) => { + return { path: '/' } + }) + + router.beforeEach((to, from) => { + return '/' + }) + + router.beforeEach((to, from) => { + return false + }) + + router.beforeEach((to, from, next) => { + next(undefined) + }) + + // @ts-expect-error + router.beforeEach((to, from, next) => { + return Symbol('not supported') + }) + // @ts-expect-error + router.beforeEach(() => { + return Symbol('not supported') + }) + + router.beforeEach((to, from, next) => { + // @ts-expect-error + next(Symbol('not supported')) + }) + + router.afterEach((to, from, failure) => { + expectTypeOf(failure) + if (isNavigationFailure(failure)) { + expectTypeOf(failure.from) + expectTypeOf(failure.to) + } + if (isNavigationFailure(failure, NavigationFailureType.cancelled)) { + expectTypeOf(failure.from) + expectTypeOf(failure.to) + } + }) + }) }) diff --git a/packages/router/test-dts/routeRecords.test-d.ts b/packages/router/test-dts/routeRecords.test-d.ts index e806dad1c..86cac2e68 100644 --- a/packages/router/test-dts/routeRecords.test-d.ts +++ b/packages/router/test-dts/routeRecords.test-d.ts @@ -1,4 +1,5 @@ -import { RouteRecordRaw } from './index' +import { describe, it } from 'vitest' +import type { RouteLocationNormalized, RouteRecordRaw } from './index' import { defineComponent } from 'vue' const component = defineComponent({}) @@ -6,56 +7,72 @@ const components = { default: component } const routes: RouteRecordRaw[] = [] -routes.push({ path: '/', redirect: '/foo' }) +describe('RouteRecords', () => { + // TODO: split into multiple tests + it('works', () => { + routes.push({ path: '/', redirect: '/foo' }) -// @ts-expect-error cannot have components and component at the same time -routes.push({ path: '/', components, component }) + // @ts-expect-error cannot have components and component at the same time + routes.push({ path: '/', components, component }) -// a redirect record with children to point to a child -routes.push({ - path: '/', - redirect: '/foo', - children: [ - { - path: 'foo', + // a redirect record with children to point to a child + routes.push({ + path: '/', + redirect: '/foo', + children: [ + { + path: 'foo', + component, + }, + ], + }) + + // same but with a nested route + routes.push({ + path: '/', component, - }, - ], -}) + redirect: '/foo', + children: [ + { + path: 'foo', + component, + }, + ], + }) -// same but with a nested route -routes.push({ - path: '/', - component, - redirect: '/foo', - children: [ - { - path: 'foo', + routes.push({ path: '/a/b', component, props: true }) + routes.push({ + path: '/a/b', component, - }, - ], -}) + props: (to: RouteLocationNormalized<'/[id]+'>) => to.params.id, + }) + // @ts-expect-error: props should be an object + routes.push({ path: '/a/b', components, props: to => to.params.id }) + routes.push({ + path: '/a/b', + components, + props: { + default: (to: RouteLocationNormalized<'/[id]+'>) => to.params.id, + }, + }) + routes.push({ path: '/', components, props: true }) -routes.push({ path: '/', component, props: true }) -routes.push({ path: '/', component, props: to => to.params.id }) -// @ts-expect-error: props should be an object -routes.push({ path: '/', components, props: to => to.params.id }) -routes.push({ path: '/', components, props: { default: to => to.params.id } }) -routes.push({ path: '/', components, props: true }) - -// let r: RouteRecordRaw = { -// path: '/', -// component, -// components, -// } - -export function filterNestedChildren(children: RouteRecordRaw[]) { - return children.filter(r => { - if (r.redirect) { - r.children?.map(() => {}) - } - if (r.children) { - r.children = filterNestedChildren(r.children) + // let r: RouteRecordRaw = { + // path: '/', + // component, + // components, + // } + + function filterNestedChildren(children: RouteRecordRaw[]) { + return children.filter(r => { + if (r.redirect) { + r.children?.map(() => {}) + } + if (r.children) { + r.children = filterNestedChildren(r.children) + } + }) } + filterNestedChildren(routes) }) -} +}) diff --git a/packages/router/test-dts/tsconfig.json b/packages/router/test-dts/tsconfig.json index 1a6da3927..1d95ccdf2 100644 --- a/packages/router/test-dts/tsconfig.json +++ b/packages/router/test-dts/tsconfig.json @@ -4,10 +4,19 @@ "noEmit": true, "declaration": true, "paths": { - "vue-router": ["../dist"] + "vue-router": [ + "../dist" + ] }, "noImplicitReturns": false }, - "include": ["./"], - "exclude": ["../__tests__", "../src"] + "include": [ + "./", + "components.test-d.tsx", + "../__tests__/createRouter.test-d.ts" + ], + "exclude": [ + "../__tests__", + "../src" + ] } diff --git a/packages/router/test-dts/typed-routes.test-d.ts b/packages/router/test-dts/typed-routes.test-d.ts new file mode 100644 index 000000000..c520bdb11 --- /dev/null +++ b/packages/router/test-dts/typed-routes.test-d.ts @@ -0,0 +1,188 @@ +import { describe, it, expectTypeOf } from 'vitest' +import { + type RouteRecordInfo, + type ParamValue, + type ParamValueOneOrMore, + type RouteLocationTyped, + createRouter, + createWebHistory, + useRoute, + RouteLocationNormalizedLoadedTypedList, +} from './index' + +// type is needed instead of an interface +// https://github.com/microsoft/TypeScript/issues/15300 +export type RouteMap = { + '/[...path]': RouteRecordInfo< + '/[...path]', + '/:path(.*)', + { path: ParamValue }, + { path: ParamValue }, + never + > + '/[a]': RouteRecordInfo< + '/[a]', + '/:a', + { a: ParamValue }, + { a: ParamValue }, + never + > + '/a': RouteRecordInfo< + '/a', + '/a', + Record, + Record, + '/a/b' | '/a/b/c' + > + '/a/b': RouteRecordInfo< + '/a/b', + '/a/b', + Record, + Record, + '/a/b/c' + > + '/a/b/c': RouteRecordInfo< + '/a/b/c', + '/a/b/c', + Record, + Record, + never + > + '/[id]+': RouteRecordInfo< + '/[id]+', + '/:id+', + { id: ParamValueOneOrMore }, + { id: ParamValueOneOrMore }, + never + > +} + +// the type allows for type params to distribute types: +// RouteLocationNormalizedLoadedLoaded<'/[a]' | '/'> will become RouteLocationNormalizedLoadedTyped['/[a]'] | RouteLocationTypedList['/'] +// it's closer to what the end users uses but with the RouteMap type fixed so it doesn't +// pollute globals +type RouteLocationNormalizedLoaded< + Name extends keyof RouteMap = keyof RouteMap, +> = RouteLocationNormalizedLoadedTypedList[Name] +// type Test = RouteLocationNormalizedLoaded<'/a' | '/a/b' | '/a/b/c'> + +declare module './index' { + interface TypesConfig { + RouteNamedMap: RouteMap + } +} + +describe('RouterTyped', () => { + const router = createRouter({ + history: createWebHistory(), + routes: [], + }) + + it('resolve', () => { + expectTypeOf>(router.resolve({ name: '/a' }).params) + expectTypeOf<{ a: ParamValue }>( + router.resolve({ name: '/[a]' }).params + ) + + expectTypeOf>( + router.resolve({ name: '/a' }) + ) + expectTypeOf<'/a'>( + // @ts-expect-error: cannot infer based on path + router.resolve({ path: '/a' }).name + ) + expectTypeOf(router.resolve({ path: '/a' }).name) + }) + + it('resolve', () => { + router.push({ name: '/a', params: { a: 2 } }) + // @ts-expect-error + router.push({ name: '/[a]', params: {} }) + // still allow relative params + router.push({ name: '/[a]' }) + // @ts-expect-error + router.push({ name: '/[a]', params: { a: [2] } }) + router.push({ name: '/[id]+', params: { id: [2] } }) + router.push({ name: '/[id]+', params: { id: [2, '3'] } }) + // @ts-expect-error + router.push({ name: '/[id]+', params: { id: 2 } }) + }) + + it('beforeEach', () => { + router.beforeEach((to, from) => { + // @ts-expect-error: no route named this way + if (to.name === '/[id]') { + } else if (to.name === '/[a]') { + expectTypeOf<{ a: ParamValue }>(to.params) + } + // @ts-expect-error: no route named this way + if (from.name === '/[id]') { + } else if (to.name === '/[a]') { + expectTypeOf<{ a: ParamValue }>(to.params) + } + if (Math.random()) { + return { name: '/[a]', params: { a: 2 } } + } else if (Math.random()) { + return '/any route does' + } + return true + }) + }) + + it('beforeResolve', () => { + router.beforeResolve((to, from) => { + // @ts-expect-error: no route named this way + if (to.name === '/[id]') { + } else if (to.name === '/[a]') { + expectTypeOf<{ a: ParamValue }>(to.params) + } + // @ts-expect-error: no route named this way + if (from.name === '/[id]') { + } else if (to.name === '/[a]') { + expectTypeOf<{ a: ParamValue }>(to.params) + } + if (Math.random()) { + return { name: '/[a]', params: { a: 2 } } + } else if (Math.random()) { + return '/any route does' + } + return true + }) + }) + + it('afterEach', () => { + router.afterEach((to, from) => { + // @ts-expect-error: no route named this way + if (to.name === '/[id]') { + } else if (to.name === '/[a]') { + expectTypeOf<{ a: ParamValue }>(to.params) + } + // @ts-expect-error: no route named this way + if (from.name === '/[id]') { + } else if (to.name === '/[a]') { + expectTypeOf<{ a: ParamValue }>(to.params) + } + if (Math.random()) { + return { name: '/[a]', params: { a: 2 } } + } else if (Math.random()) { + return '/any route does' + } + return true + }) + }) + + it('useRoute', () => { + expectTypeOf(useRoute('/[a]')).toEqualTypeOf< + RouteLocationNormalizedLoaded<'/[a]'> + >() + expectTypeOf(useRoute('/a')).toEqualTypeOf< + RouteLocationNormalizedLoaded<'/a' | '/a/b' | '/a/b/c'> + >() + expectTypeOf(useRoute('/a/b')).toEqualTypeOf< + RouteLocationNormalizedLoaded<'/a/b' | '/a/b/c'> + >() + expectTypeOf(useRoute('/a/b/c')).toEqualTypeOf< + RouteLocationNormalizedLoaded<'/a/b/c'> + >() + }) +}) diff --git a/packages/router/tsconfig.json b/packages/router/tsconfig.json index 0a32fcb75..41fc6c378 100644 --- a/packages/router/tsconfig.json +++ b/packages/router/tsconfig.json @@ -2,7 +2,8 @@ "include": [ "src/global.d.ts", "src/**/*.ts", - "__tests__/**/*.ts" + "__tests__/**/*.ts", + "test-dts/**/*.ts" ], "compilerOptions": { "baseUrl": ".", @@ -12,7 +13,7 @@ "noEmit": true, "target": "esnext", "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "Bundler", "allowJs": false, "noUnusedLocals": true, "strictNullChecks": true, @@ -32,7 +33,6 @@ "dom" ], "types": [ - "jest", "node", "vite/client" ] diff --git a/packages/router/vitest.config.ts b/packages/router/vitest.config.ts new file mode 100644 index 000000000..1e60c7351 --- /dev/null +++ b/packages/router/vitest.config.ts @@ -0,0 +1,40 @@ +import { defineConfig } from 'vitest/config' +import Vue from '@vitejs/plugin-vue' +import { fileURLToPath } from 'node:url' + +const __dirname = new URL('.', import.meta.url).pathname +export default defineConfig({ + resolve: { + alias: [], + }, + define: { + __DEV__: true, + __TEST__: true, + __BROWSER__: true, + }, + plugins: [Vue()], + + test: { + // open: false, + coverage: { + include: ['src/**/*.ts'], + exclude: [ + 'src/**/*.d.ts', + 'src/**/*.test-d.ts', + 'src/**/*.spec.ts', + // '/node_modules/', + 'src/index.ts', + 'src/devtools.ts', + ], + }, + typecheck: { + enabled: true, + checker: 'vue-tsc', + // only: true, + // by default it includes all specs too + // include: ['**/*.test-d.ts'], + + // tsconfig: './tsconfig.typecheck.json', + }, + }, +}) diff --git a/packages/router/vue-router-auto-routes.d.ts b/packages/router/vue-router-auto-routes.d.ts new file mode 100644 index 000000000..12fcf1cf7 --- /dev/null +++ b/packages/router/vue-router-auto-routes.d.ts @@ -0,0 +1,4 @@ +/** + * Array of routes generated by unplugin-vue-router + */ +export declare const routes: any[] diff --git a/packages/router/vue-router-auto.d.ts b/packages/router/vue-router-auto.d.ts new file mode 100644 index 000000000..56e8a0979 --- /dev/null +++ b/packages/router/vue-router-auto.d.ts @@ -0,0 +1,4 @@ +/** + * Extended by unplugin-vue-router to create typed routes. + */ +export interface RouteNamedMap {} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7a8a2259a..9e238c902 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -8,24 +8,30 @@ importers: .: devDependencies: + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@22.15.2)(@vitest/ui@2.1.9)(happy-dom@15.11.7)(jsdom@19.0.0)(terser@5.32.0)) + '@vitest/ui': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9) brotli: specifier: ^1.3.3 version: 1.3.3 chalk: - specifier: ^5.3.0 - version: 5.3.0 + specifier: ^5.4.1 + version: 5.4.1 enquirer: specifier: ^2.4.1 version: 2.4.1 execa: - specifier: ^8.0.1 - version: 8.0.1 + specifier: ^9.5.2 + version: 9.5.2 globby: - specifier: ^14.0.0 - version: 14.0.0 + specifier: ^14.1.0 + version: 14.1.0 lint-staged: - specifier: ^15.2.0 - version: 15.2.0 + specifier: ^15.5.1 + version: 15.5.1 minimist: specifier: ^1.2.8 version: 1.2.8 @@ -33,35 +39,38 @@ importers: specifier: ^3.0.0 version: 3.0.0 prettier: - specifier: ^2.8.8 - version: 2.8.8 + specifier: ^3.5.3 + version: 3.5.3 semver: - specifier: ^7.5.4 - version: 7.5.4 + specifier: ^7.7.1 + version: 7.7.1 + simple-git-hooks: + specifier: ^2.13.0 + version: 2.13.0 typedoc: - specifier: ^0.25.3 - version: 0.25.4(typescript@5.3.3) + specifier: ^0.26.11 + version: 0.26.11(typescript@5.6.3) typedoc-plugin-markdown: - specifier: ^3.17.1 - version: 3.17.1(typedoc@0.25.4) + specifier: ^4.2.10 + version: 4.2.10(typedoc@0.26.11(typescript@5.6.3)) typescript: - specifier: ~5.3.3 - version: 5.3.3 - yorkie: - specifier: ^2.0.0 - version: 2.0.0 + specifier: ~5.6.3 + version: 5.6.3 + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@22.15.2)(@vitest/ui@2.1.9)(happy-dom@15.11.7)(jsdom@19.0.0)(terser@5.32.0) packages/docs: dependencies: simple-git: - specifier: ^3.18.0 - version: 3.18.0 + specifier: ^3.27.0 + version: 3.27.0 vitepress: - specifier: 1.0.0-rc.35 - version: 1.0.0-rc.35(@algolia/client-search@4.19.1)(search-insights@2.7.0)(typescript@5.3.3) + specifier: 1.5.0 + version: 1.5.0(@algolia/client-search@5.15.0)(@types/node@22.15.2)(axios@1.7.7)(postcss@8.4.49)(search-insights@2.17.1)(terser@5.32.0)(typescript@5.6.3) vitepress-translation-helper: - specifier: ^0.1.3 - version: 0.1.3(vitepress@1.0.0-rc.35)(vue@3.4.8) + specifier: ^0.2.1 + version: 0.2.1(vitepress@1.5.0(@algolia/client-search@5.15.0)(@types/node@22.15.2)(axios@1.7.7)(postcss@8.4.49)(search-insights@2.17.1)(terser@5.32.0)(typescript@5.6.3))(vue@3.5.13(typescript@5.6.3)) vue-router: specifier: workspace:* version: link:../router @@ -69,646 +78,240 @@ importers: packages/playground: dependencies: vue: - specifier: ^3.3.11 - version: 3.3.11(typescript@5.3.3) + specifier: ~3.5.13 + version: 3.5.13(typescript@5.6.3) devDependencies: '@types/node': - specifier: ^20.10.4 - version: 20.10.4 + specifier: ^20.17.31 + version: 20.17.31 '@vitejs/plugin-vue': - specifier: ^4.5.2 - version: 4.5.2(vite@5.0.9)(vue@3.3.11) + specifier: ^5.2.3 + version: 5.2.3(vite@5.4.18(@types/node@20.17.31)(terser@5.32.0))(vue@3.5.13(typescript@5.6.3)) '@vue/compiler-sfc': - specifier: ^3.3.11 - version: 3.3.11 + specifier: ~3.5.13 + version: 3.5.13 '@vue/tsconfig': - specifier: ^0.4.0 - version: 0.4.0 - typescript: - specifier: ~5.3.3 - version: 5.3.3 + specifier: ^0.6.0 + version: 0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) vite: - specifier: ^5.0.7 - version: 5.0.9(@types/node@20.10.4) + specifier: ^5.4.18 + version: 5.4.18(@types/node@20.17.31)(terser@5.32.0) vue-router: specifier: workspace:* version: link:../router vue-tsc: - specifier: ^1.8.25 - version: 1.8.25(typescript@5.3.3) + specifier: ^2.2.10 + version: 2.2.10(typescript@5.6.3) packages/router: dependencies: '@vue/devtools-api': - specifier: ^6.5.1 - version: 6.5.1 + specifier: ^6.6.4 + version: 6.6.4 devDependencies: '@microsoft/api-extractor': - specifier: ^7.38.5 - version: 7.38.5 + specifier: ^7.48.0 + version: 7.48.0(@types/node@22.15.2) '@rollup/plugin-alias': - specifier: ^5.1.0 - version: 5.1.0(rollup@3.29.4) + specifier: ^5.1.1 + version: 5.1.1(rollup@3.29.5) '@rollup/plugin-commonjs': - specifier: ^25.0.7 - version: 25.0.7(rollup@3.29.4) + specifier: ^25.0.8 + version: 25.0.8(rollup@3.29.5) '@rollup/plugin-node-resolve': - specifier: ^15.2.3 - version: 15.2.3(rollup@3.29.4) + specifier: ^15.3.1 + version: 15.3.1(rollup@3.29.5) '@rollup/plugin-replace': - specifier: ^5.0.5 - version: 5.0.5(rollup@3.29.4) + specifier: ^5.0.7 + version: 5.0.7(rollup@3.29.5) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@3.29.4) - '@sucrase/jest-plugin': - specifier: ^3.0.0 - version: 3.0.0(jest@29.7.0)(sucrase@3.34.0) - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 + version: 0.4.4(rollup@3.29.5) '@types/jsdom': - specifier: ^21.1.6 - version: 21.1.6 + specifier: ^21.1.7 + version: 21.1.7 '@types/nightwatch': - specifier: ^2.3.30 - version: 2.3.30 + specifier: ^2.3.32 + version: 2.3.32 '@vitejs/plugin-vue': - specifier: ^4.5.2 - version: 4.5.2(vite@5.0.9)(vue@3.3.11) + specifier: ^5.2.3 + version: 5.2.3(vite@5.4.18(@types/node@22.15.2)(terser@5.32.0))(vue@3.5.13(typescript@5.6.3)) '@vue/compiler-sfc': - specifier: ^3.3.11 - version: 3.3.11 + specifier: ~3.5.13 + version: 3.5.13 '@vue/server-renderer': - specifier: ^3.3.11 - version: 3.3.11(vue@3.3.11) + specifier: ~3.5.13 + version: 3.5.13(vue@3.5.13(typescript@5.6.3)) '@vue/test-utils': - specifier: ^2.4.3 - version: 2.4.3(@vue/server-renderer@3.3.11)(vue@3.3.11) + specifier: ^2.4.6 + version: 2.4.6 browserstack-local: - specifier: ^1.5.5 - version: 1.5.5 + specifier: ^1.5.6 + version: 1.5.6 chromedriver: - specifier: ^119.0.1 - version: 119.0.1 + specifier: ^131.0.5 + version: 131.0.5 connect-history-api-fallback: specifier: ^1.6.0 version: 1.6.0 conventional-changelog-cli: - specifier: ^2.1.1 - version: 2.1.1 + specifier: ^2.2.2 + version: 2.2.2 dotenv: - specifier: ^16.3.1 - version: 16.3.1 + specifier: ^16.5.0 + version: 16.5.0 faked-promise: specifier: ^2.2.2 version: 2.2.2 geckodriver: - specifier: ^3.2.0 - version: 3.2.0 - jest: - specifier: ^29.7.0 - version: 29.7.0 - jest-environment-jsdom: - specifier: ^29.7.0 - version: 29.7.0 - jest-mock-warn: - specifier: ^1.1.0 - version: 1.1.0 + specifier: ^4.5.1 + version: 4.5.1 + happy-dom: + specifier: ^15.11.7 + version: 15.11.7 nightwatch: - specifier: ^2.6.22 - version: 2.6.24(chromedriver@119.0.1)(geckodriver@3.2.0) + specifier: ^2.6.25 + version: 2.6.25(chromedriver@131.0.5)(geckodriver@4.5.1) nightwatch-helpers: specifier: ^1.2.0 version: 1.2.0 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^6.0.1 + version: 6.0.1 rollup: - specifier: ^3.29.4 - version: 3.29.4 + specifier: ^3.29.5 + version: 3.29.5 rollup-plugin-analyzer: specifier: ^4.0.0 version: 4.0.0 rollup-plugin-typescript2: specifier: ^0.36.0 - version: 0.36.0(rollup@3.29.4)(typescript@5.3.3) - sucrase: - specifier: ^3.34.0 - version: 3.34.0 - typescript: - specifier: ~5.3.3 - version: 5.3.3 + version: 0.36.0(rollup@3.29.5)(typescript@5.6.3) vite: - specifier: ^5.0.7 - version: 5.0.9(@types/node@20.10.4) + specifier: ^5.4.18 + version: 5.4.18(@types/node@22.15.2)(terser@5.32.0) vue: - specifier: ^3.3.11 - version: 3.3.11(typescript@5.3.3) + specifier: ~3.5.13 + version: 3.5.13(typescript@5.6.3) packages: - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1)(search-insights@2.7.0): - resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1)(search-insights@2.7.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - dev: false + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1)(search-insights@2.7.0): - resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} peerDependencies: search-insights: '>= 1 < 3' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1) - search-insights: 2.7.0 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - dev: false - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1): - resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1) - '@algolia/client-search': 4.19.1 - algoliasearch: 4.19.1 - dev: false - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1): - resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/client-search': 4.19.1 - algoliasearch: 4.19.1 - dev: false - - /@algolia/cache-browser-local-storage@4.19.1: - resolution: {integrity: sha512-FYAZWcGsFTTaSAwj9Std8UML3Bu8dyWDncM7Ls8g+58UOe4XYdlgzXWbrIgjaguP63pCCbMoExKr61B+ztK3tw==} - dependencies: - '@algolia/cache-common': 4.19.1 - dev: false - /@algolia/cache-common@4.19.1: - resolution: {integrity: sha512-XGghi3l0qA38HiqdoUY+wvGyBsGvKZ6U3vTiMBT4hArhP3fOGLXpIINgMiiGjTe4FVlTa5a/7Zf2bwlIHfRqqg==} - dev: false + '@algolia/client-abtesting@5.15.0': + resolution: {integrity: sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==} + engines: {node: '>= 14.0.0'} - /@algolia/cache-in-memory@4.19.1: - resolution: {integrity: sha512-+PDWL+XALGvIginigzu8oU6eWw+o76Z8zHbBovWYcrtWOEtinbl7a7UTt3x3lthv+wNuFr/YD1Gf+B+A9V8n5w==} - dependencies: - '@algolia/cache-common': 4.19.1 - dev: false + '@algolia/client-analytics@5.15.0': + resolution: {integrity: sha512-lho0gTFsQDIdCwyUKTtMuf9nCLwq9jOGlLGIeQGKDxXF7HbiAysFIu5QW/iQr1LzMgDyM9NH7K98KY+BiIFriQ==} + engines: {node: '>= 14.0.0'} - /@algolia/client-account@4.19.1: - resolution: {integrity: sha512-Oy0ritA2k7AMxQ2JwNpfaEcgXEDgeyKu0V7E7xt/ZJRdXfEpZcwp9TOg4TJHC7Ia62gIeT2Y/ynzsxccPw92GA==} - dependencies: - '@algolia/client-common': 4.19.1 - '@algolia/client-search': 4.19.1 - '@algolia/transporter': 4.19.1 - dev: false + '@algolia/client-common@5.15.0': + resolution: {integrity: sha512-IofrVh213VLsDkPoSKMeM9Dshrv28jhDlBDLRcVJQvlL8pzue7PEB1EZ4UoJFYS3NSn7JOcJ/V+olRQzXlJj1w==} + engines: {node: '>= 14.0.0'} - /@algolia/client-analytics@4.19.1: - resolution: {integrity: sha512-5QCq2zmgdZLIQhHqwl55ZvKVpLM3DNWjFI4T+bHr3rGu23ew2bLO4YtyxaZeChmDb85jUdPDouDlCumGfk6wOg==} - dependencies: - '@algolia/client-common': 4.19.1 - '@algolia/client-search': 4.19.1 - '@algolia/requester-common': 4.19.1 - '@algolia/transporter': 4.19.1 - dev: false + '@algolia/client-insights@5.15.0': + resolution: {integrity: sha512-bDDEQGfFidDi0UQUCbxXOCdphbVAgbVmxvaV75cypBTQkJ+ABx/Npw7LkFGw1FsoVrttlrrQbwjvUB6mLVKs/w==} + engines: {node: '>= 14.0.0'} - /@algolia/client-common@4.19.1: - resolution: {integrity: sha512-3kAIVqTcPrjfS389KQvKzliC559x+BDRxtWamVJt8IVp7LGnjq+aVAXg4Xogkur1MUrScTZ59/AaUd5EdpyXgA==} - dependencies: - '@algolia/requester-common': 4.19.1 - '@algolia/transporter': 4.19.1 - dev: false + '@algolia/client-personalization@5.15.0': + resolution: {integrity: sha512-LfaZqLUWxdYFq44QrasCDED5bSYOswpQjSiIL7Q5fYlefAAUO95PzBPKCfUhSwhb4rKxigHfDkd81AvEicIEoA==} + engines: {node: '>= 14.0.0'} - /@algolia/client-personalization@4.19.1: - resolution: {integrity: sha512-8CWz4/H5FA+krm9HMw2HUQenizC/DxUtsI5oYC0Jxxyce1vsr8cb1aEiSJArQT6IzMynrERif1RVWLac1m36xw==} - dependencies: - '@algolia/client-common': 4.19.1 - '@algolia/requester-common': 4.19.1 - '@algolia/transporter': 4.19.1 - dev: false + '@algolia/client-query-suggestions@5.15.0': + resolution: {integrity: sha512-wu8GVluiZ5+il8WIRsGKu8VxMK9dAlr225h878GGtpTL6VBvwyJvAyLdZsfFIpY0iN++jiNb31q2C1PlPL+n/A==} + engines: {node: '>= 14.0.0'} - /@algolia/client-search@4.19.1: - resolution: {integrity: sha512-mBecfMFS4N+yK/p0ZbK53vrZbL6OtWMk8YmnOv1i0LXx4pelY8TFhqKoTit3NPVPwoSNN0vdSN9dTu1xr1XOVw==} - dependencies: - '@algolia/client-common': 4.19.1 - '@algolia/requester-common': 4.19.1 - '@algolia/transporter': 4.19.1 - dev: false + '@algolia/client-search@5.15.0': + resolution: {integrity: sha512-Z32gEMrRRpEta5UqVQA612sLdoqY3AovvUPClDfMxYrbdDAebmGDVPtSogUba1FZ4pP5dx20D3OV3reogLKsRA==} + engines: {node: '>= 14.0.0'} - /@algolia/logger-common@4.19.1: - resolution: {integrity: sha512-i6pLPZW/+/YXKis8gpmSiNk1lOmYCmRI6+x6d2Qk1OdfvX051nRVdalRbEcVTpSQX6FQAoyeaui0cUfLYW5Elw==} - dev: false + '@algolia/ingestion@1.15.0': + resolution: {integrity: sha512-MkqkAxBQxtQ5if/EX2IPqFA7LothghVyvPoRNA/meS2AW2qkHwcxjuiBxv4H6mnAVEPfJlhu9rkdVz9LgCBgJg==} + engines: {node: '>= 14.0.0'} - /@algolia/logger-console@4.19.1: - resolution: {integrity: sha512-jj72k9GKb9W0c7TyC3cuZtTr0CngLBLmc8trzZlXdfvQiigpUdvTi1KoWIb2ZMcRBG7Tl8hSb81zEY3zI2RlXg==} - dependencies: - '@algolia/logger-common': 4.19.1 - dev: false + '@algolia/monitoring@1.15.0': + resolution: {integrity: sha512-QPrFnnGLMMdRa8t/4bs7XilPYnoUXDY8PMQJ1sf9ZFwhUysYYhQNX34/enoO0LBjpoOY6rLpha39YQEFbzgKyQ==} + engines: {node: '>= 14.0.0'} - /@algolia/requester-browser-xhr@4.19.1: - resolution: {integrity: sha512-09K/+t7lptsweRTueHnSnmPqIxbHMowejAkn9XIcJMLdseS3zl8ObnS5GWea86mu3vy4+8H+ZBKkUN82Zsq/zg==} - dependencies: - '@algolia/requester-common': 4.19.1 - dev: false + '@algolia/recommend@5.15.0': + resolution: {integrity: sha512-5eupMwSqMLDObgSMF0XG958zR6GJP3f7jHDQ3/WlzCM9/YIJiWIUoJFGsko9GYsA5xbLDHE/PhWtq4chcCdaGQ==} + engines: {node: '>= 14.0.0'} - /@algolia/requester-common@4.19.1: - resolution: {integrity: sha512-BisRkcWVxrDzF1YPhAckmi2CFYK+jdMT60q10d7z3PX+w6fPPukxHRnZwooiTUrzFe50UBmLItGizWHP5bDzVQ==} - dev: false + '@algolia/requester-browser-xhr@5.15.0': + resolution: {integrity: sha512-Po/GNib6QKruC3XE+WKP1HwVSfCDaZcXu48kD+gwmtDlqHWKc7Bq9lrS0sNZ456rfCKhXksOmMfUs4wRM/Y96w==} + engines: {node: '>= 14.0.0'} - /@algolia/requester-node-http@4.19.1: - resolution: {integrity: sha512-6DK52DHviBHTG2BK/Vv2GIlEw7i+vxm7ypZW0Z7vybGCNDeWzADx+/TmxjkES2h15+FZOqVf/Ja677gePsVItA==} - dependencies: - '@algolia/requester-common': 4.19.1 - dev: false + '@algolia/requester-fetch@5.15.0': + resolution: {integrity: sha512-rOZ+c0P7ajmccAvpeeNrUmEKoliYFL8aOR5qGW5pFq3oj3Iept7Y5mEtEsOBYsRt6qLnaXn4zUKf+N8nvJpcIw==} + engines: {node: '>= 14.0.0'} - /@algolia/transporter@4.19.1: - resolution: {integrity: sha512-nkpvPWbpuzxo1flEYqNIbGz7xhfhGOKGAZS7tzC+TELgEmi7z99qRyTfNSUlW7LZmB3ACdnqAo+9A9KFBENviQ==} - dependencies: - '@algolia/cache-common': 4.19.1 - '@algolia/logger-common': 4.19.1 - '@algolia/requester-common': 4.19.1 - dev: false + '@algolia/requester-node-http@5.15.0': + resolution: {integrity: sha512-b1jTpbFf9LnQHEJP5ddDJKE2sAlhYd7EVSOWgzo/27n/SfCoHfqD0VWntnWYD83PnOKvfe8auZ2+xCb0TXotrQ==} + engines: {node: '>= 14.0.0'} - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - dev: true - /@babel/code-frame@7.22.10: + '@babel/code-frame@7.22.10': resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.10 - chalk: 2.4.2 - dev: true - - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.22.11: - resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) - '@babel/helpers': 7.22.11 - '@babel/parser': 7.22.11 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.11 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.22.10: - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.11 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - dev: true - - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - dev: true - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - dev: true - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.22.11: - resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.11 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.22.10: + '@babel/highlight@7.22.10': resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.22.11: - resolution: {integrity: sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.11 - dev: true - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.22.11 - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 - dev: true - - /@babel/traverse@7.22.11: - resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/types@7.22.11: - resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - - /@bcoe/v8-coverage@0.2.3: + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - /@colors/colors@1.5.0: + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true - optional: true - /@docsearch/css@3.5.2: - resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} - dev: false + '@docsearch/css@3.8.0': + resolution: {integrity: sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==} - /@docsearch/js@3.5.2(@algolia/client-search@4.19.1)(search-insights@2.7.0): - resolution: {integrity: sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==} - dependencies: - '@docsearch/react': 3.5.2(@algolia/client-search@4.19.1)(search-insights@2.7.0) - preact: 10.17.1 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - dev: false + '@docsearch/js@3.8.0': + resolution: {integrity: sha512-PVuV629f5UcYRtBWqK7ID6vNL5647+2ADJypwTjfeBIrJfwPuHtzLy39hMGMfFK+0xgRyhTR0FZ83EkdEraBlg==} - /@docsearch/react@3.5.2(@algolia/client-search@4.19.1)(search-insights@2.7.0): - resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} + '@docsearch/react@3.8.0': + resolution: {integrity: sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' @@ -723,649 +326,269 @@ packages: optional: true search-insights: optional: true - dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1)(search-insights@2.7.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1) - '@docsearch/css': 3.5.2 - algoliasearch: 4.19.1 - search-insights: 2.7.0 - transitivePeerDependencies: - - '@algolia/client-search' - dev: false - /@esbuild/android-arm64@0.19.9: - resolution: {integrity: sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - optional: true - /@esbuild/android-arm@0.19.9: - resolution: {integrity: sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - optional: true - /@esbuild/android-x64@0.19.9: - resolution: {integrity: sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - optional: true - /@esbuild/darwin-arm64@0.19.9: - resolution: {integrity: sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - optional: true - /@esbuild/darwin-x64@0.19.9: - resolution: {integrity: sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - optional: true - /@esbuild/freebsd-arm64@0.19.9: - resolution: {integrity: sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/freebsd-x64@0.19.9: - resolution: {integrity: sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/linux-arm64@0.19.9: - resolution: {integrity: sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-arm@0.19.9: - resolution: {integrity: sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ia32@0.19.9: - resolution: {integrity: sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-loong64@0.19.9: - resolution: {integrity: sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-mips64el@0.19.9: - resolution: {integrity: sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ppc64@0.19.9: - resolution: {integrity: sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-riscv64@0.19.9: - resolution: {integrity: sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-s390x@0.19.9: - resolution: {integrity: sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-x64@0.19.9: - resolution: {integrity: sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/netbsd-x64@0.19.9: - resolution: {integrity: sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - optional: true - /@esbuild/openbsd-x64@0.19.9: - resolution: {integrity: sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - optional: true - /@esbuild/sunos-x64@0.19.9: - resolution: {integrity: sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - optional: true - /@esbuild/win32-arm64@0.19.9: - resolution: {integrity: sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-ia32@0.19.9: - resolution: {integrity: sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-x64@0.19.9: - resolution: {integrity: sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - optional: true - /@hutson/parse-repository-url@3.0.2: + '@hutson/parse-repository-url@3.0.2': resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} - dev: true - /@isaacs/cliui@8.0.2: + '@iconify-json/simple-icons@1.2.13': + resolution: {integrity: sha512-rRQjMoIt/kPfaD+fnBC9YZQpso3hkn8xPeadl+YWhscJ5SVUCdB9oTeR9VIpt+/5Yi8vEkh2UOWFPq4lz3ee2A==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - dev: true - - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - dev: true - - /@jest/core@29.7.0: - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.10.4) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - jest-mock: 29.7.0 - dev: true - - /@jest/expect-utils@29.6.4: - resolution: {integrity: sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - dev: true - - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - dev: true - - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.10.4 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 - '@types/node': 20.10.4 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.0 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.19 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.2 - dev: true - - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - dev: true - - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.22.11 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.10.4 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 - dev: true - /@jridgewell/resolve-uri@3.1.1: + '@jridgewell/resolve-uri@3.1.1': resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - dev: true + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - /@kwsites/file-exists@1.1.1: + '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - /@kwsites/promise-deferred@1.1.1: + '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - dev: false - /@microsoft/api-extractor-model@7.28.3: - resolution: {integrity: sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0 - transitivePeerDependencies: - - '@types/node' - dev: true + '@microsoft/api-extractor-model@7.30.0': + resolution: {integrity: sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug==} - /@microsoft/api-extractor@7.38.5: - resolution: {integrity: sha512-c/w2zfqBcBJxaCzpJNvFoouWewcYrUOfeu5ZkWCCIXTF9a/gXM85RGevEzlMAIEGM/kssAAZSXRJIZ3Q5vLFow==} + '@microsoft/api-extractor@7.48.0': + resolution: {integrity: sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ==} hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.28.3 - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0 - '@rushstack/rig-package': 0.5.1 - '@rushstack/ts-command-line': 4.17.1 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.0.4 - transitivePeerDependencies: - - '@types/node' - dev: true - /@microsoft/tsdoc-config@0.16.2: - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - dev: true + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: true + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - /@nightwatch/chai@5.0.2: + '@nightwatch/chai@5.0.2': resolution: {integrity: sha512-yzILJFCcE75OPoRfBlJ80Y3Ky06ljsdrK4Ld92yhmM477vxO2GEguwnd+ldl7pdSYTcg1gSJ1bPPQrA+/Hrn+A==} engines: {node: '>=12'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.0.1 - loupe: 2.3.4 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - /@nightwatch/html-reporter-template@0.2.1: + '@nightwatch/html-reporter-template@0.2.1': resolution: {integrity: sha512-GEBeGoXVmTYPtNC4Yq34vfgxf6mlFyEagxpsfH18Qe5BvctF2rprX+wI5dKBm9p5IqHo6ZOcXHCufOeP3cjuOw==} - dev: true - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - /@one-ini/wasm@0.1.1: + '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - dev: true - /@pkgjs/parseargs@0.11.0: + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - /@rollup/plugin-alias@5.1.0(rollup@3.29.4): - resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@rollup/plugin-alias@5.1.1': + resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - dependencies: - rollup: 3.29.4 - slash: 4.0.0 - dev: true - /@rollup/plugin-commonjs@25.0.7(rollup@3.29.4): - resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} + '@rollup/plugin-commonjs@25.0.8': + resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - dependencies: - '@rollup/pluginutils': 5.0.4(rollup@3.29.4) - commondir: 1.0.1 - estree-walker: 2.0.2 - glob: 8.1.0 - is-reference: 1.2.1 - magic-string: 0.30.3 - rollup: 3.29.4 - dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@3.29.4): - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + '@rollup/plugin-node-resolve@15.3.1': + resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - dependencies: - '@rollup/pluginutils': 5.0.4(rollup@3.29.4) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-builtin-module: 3.2.1 - is-module: 1.0.0 - resolve: 1.22.4 - rollup: 3.29.4 - dev: true - /@rollup/plugin-replace@5.0.5(rollup@3.29.4): - resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==} + '@rollup/plugin-replace@5.0.7': + resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - dependencies: - '@rollup/pluginutils': 5.0.4(rollup@3.29.4) - magic-string: 0.30.3 - rollup: 3.29.4 - dev: true - /@rollup/plugin-terser@0.4.4(rollup@3.29.4): + '@rollup/plugin-terser@0.4.4': resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1373,760 +596,396 @@ packages: peerDependenciesMeta: rollup: optional: true - dependencies: - rollup: 3.29.4 - serialize-javascript: 6.0.1 - smob: 1.4.0 - terser: 5.19.2 - dev: true - /@rollup/pluginutils@4.2.1: + '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} - dependencies: - estree-walker: 2.0.2 - picomatch: 2.3.1 - dev: true - /@rollup/pluginutils@5.0.4(rollup@3.29.4): - resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==} + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - dependencies: - '@types/estree': 1.0.1 - estree-walker: 2.0.2 - picomatch: 2.3.1 - rollup: 3.29.4 - dev: true - /@rollup/rollup-android-arm-eabi@4.9.0: - resolution: {integrity: sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==} + '@rollup/rollup-android-arm-eabi@4.27.4': + resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} cpu: [arm] os: [android] - requiresBuild: true - optional: true - /@rollup/rollup-android-arm64@4.9.0: - resolution: {integrity: sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A==} + '@rollup/rollup-android-arm64@4.27.4': + resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} cpu: [arm64] os: [android] - requiresBuild: true - optional: true - /@rollup/rollup-darwin-arm64@4.9.0: - resolution: {integrity: sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ==} + '@rollup/rollup-darwin-arm64@4.27.4': + resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} cpu: [arm64] os: [darwin] - requiresBuild: true - optional: true - /@rollup/rollup-darwin-x64@4.9.0: - resolution: {integrity: sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw==} + '@rollup/rollup-darwin-x64@4.27.4': + resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} cpu: [x64] os: [darwin] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.9.0: - resolution: {integrity: sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg==} + '@rollup/rollup-freebsd-arm64@4.27.4': + resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.27.4': + resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.27.4': + resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} cpu: [arm] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.9.0: - resolution: {integrity: sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw==} + '@rollup/rollup-linux-arm64-gnu@4.27.4': + resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.9.0: - resolution: {integrity: sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w==} + '@rollup/rollup-linux-arm64-musl@4.27.4': + resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.9.0: - resolution: {integrity: sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w==} + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.27.4': + resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} cpu: [riscv64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.9.0: - resolution: {integrity: sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==} + '@rollup/rollup-linux-s390x-gnu@4.27.4': + resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.27.4': + resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-x64-musl@4.9.0: - resolution: {integrity: sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==} + '@rollup/rollup-linux-x64-musl@4.27.4': + resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.9.0: - resolution: {integrity: sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q==} + '@rollup/rollup-win32-arm64-msvc@4.27.4': + resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} cpu: [arm64] os: [win32] - requiresBuild: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.9.0: - resolution: {integrity: sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q==} + '@rollup/rollup-win32-ia32-msvc@4.27.4': + resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} cpu: [ia32] os: [win32] - requiresBuild: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.9.0: - resolution: {integrity: sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw==} + '@rollup/rollup-win32-x64-msvc@4.27.4': + resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} cpu: [x64] os: [win32] - requiresBuild: true - optional: true - /@rushstack/node-core-library@3.62.0: - resolution: {integrity: sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==} + '@rushstack/node-core-library@5.10.0': + resolution: {integrity: sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - dependencies: - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - dev: true - - /@rushstack/rig-package@0.5.1: - resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} - dependencies: - resolve: 1.22.8 - strip-json-comments: 3.1.1 - dev: true - /@rushstack/ts-command-line@4.17.1: - resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.2 - dev: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: true - - /@sindresorhus/merge-streams@1.0.0: - resolution: {integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==} - engines: {node: '>=18'} - dev: true - - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - dependencies: - type-detect: 4.0.8 - dev: true + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true - - /@sucrase/jest-plugin@3.0.0(jest@29.7.0)(sucrase@3.34.0): - resolution: {integrity: sha512-VRY6YKYImVWiRg1H3Yu24hwB1UPJDSDR62R/n+lOHR3+yDrfHEIAoddJivblMYN6U3vD+ndfTSrecZ9Jl+iGNw==} + '@rushstack/terminal@0.14.3': + resolution: {integrity: sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw==} peerDependencies: - jest: '>=27' - sucrase: '>=3.25.0' - dependencies: - jest: 29.7.0 - sucrase: 3.34.0 - dev: true + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - dev: true + '@rushstack/ts-command-line@4.23.1': + resolution: {integrity: sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA==} - /@testim/chrome-version@1.1.4: - resolution: {integrity: sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==} - dev: true + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true + '@shikijs/core@1.23.1': + resolution: {integrity: sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==} - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true + '@shikijs/engine-javascript@1.23.1': + resolution: {integrity: sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg==} - /@types/babel__core@7.20.1: - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} - dependencies: - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 - dev: true + '@shikijs/engine-oniguruma@1.23.1': + resolution: {integrity: sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==} - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.22.11 - dev: true + '@shikijs/transformers@1.23.1': + resolution: {integrity: sha512-yQ2Cn0M9i46p30KwbyIzLvKDk+dQNU+lj88RGO0XEj54Hn4Cof1bZoDb9xBRWxFE4R8nmK63w7oHnJwvOtt0NQ==} - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 - dev: true + '@shikijs/types@1.23.1': + resolution: {integrity: sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==} - /@types/babel__traverse@7.20.1: - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} - dependencies: - '@babel/types': 7.22.11 - dev: true + '@shikijs/vscode-textmate@9.3.0': + resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.1 - '@types/keyv': 3.1.4 - '@types/node': 20.10.4 - '@types/responselike': 1.0.0 - dev: true + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} - /@types/chai@4.3.5: - resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} - dev: true + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - dev: true + '@testim/chrome-version@1.1.4': + resolution: {integrity: sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==} - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} - dependencies: - '@types/node': 20.10.4 - dev: true + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} - /@types/http-cache-semantics@4.0.1: - resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} - dev: true + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true + '@types/chai@4.3.16': + resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - /@types/jest@29.5.11: - resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} - dependencies: - expect: 29.6.4 - pretty-format: 29.6.3 - dev: true + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - /@types/jsdom@20.0.1: - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} - dependencies: - '@types/node': 20.10.4 - '@types/tough-cookie': 4.0.2 - parse5: 7.1.2 - dev: true + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - /@types/jsdom@21.1.6: - resolution: {integrity: sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==} - dependencies: - '@types/node': 20.10.4 - '@types/tough-cookie': 4.0.2 - parse5: 7.1.2 - dev: true + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 20.10.4 - dev: true + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - /@types/linkify-it@3.0.5: - resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} - dev: false + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - /@types/markdown-it@13.0.7: - resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==} - dependencies: - '@types/linkify-it': 3.0.5 - '@types/mdurl': 1.0.5 - dev: false + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - /@types/mdurl@1.0.5: - resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} - dev: false + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - /@types/minimist@1.2.2: + '@types/minimist@1.2.2': resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true - /@types/nightwatch@2.3.30: - resolution: {integrity: sha512-TiVGKR9mORwx0nN3ylonXp2IobpQoZxwV63IjABYkxsEpNauHL8GU9kmceEThjqDUigKaeh6aPOqepwC4bwCfA==} - dependencies: - '@types/chai': 4.3.5 - '@types/selenium-webdriver': 4.1.16 - devtools-protocol: 0.0.1025565 - dev: true + '@types/nightwatch@2.3.32': + resolution: {integrity: sha512-RXAWpe83AERF0MbRHXaEJlMQGDtA6BW5sgbn2jO0z04yzbxc4gUvzaJwHpGULBSa2QKUHfBZoLwe/tuQx0PWLg==} - /@types/node@20.10.4: - resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} - dependencies: - undici-types: 5.26.5 - dev: true + '@types/node@20.17.31': + resolution: {integrity: sha512-quODOCNXQAbNf1Q7V+fI8WyErOCh0D5Yd31vHnKu4GkSztGQ7rlltAaqXhHhLl33tlVyUXs2386MkANSwgDn6A==} + + '@types/node@20.17.7': + resolution: {integrity: sha512-sZXXnpBFMKbao30dUAvzKbdwA2JM1fwUtVEq/kxKuPI5mMwZiRElCpTXb0Biq/LMEVpXDZL5G5V0RPnxKeyaYg==} - /@types/normalize-package-data@2.4.1: + '@types/node@22.15.2': + resolution: {integrity: sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==} + + '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true - /@types/resolve@1.20.2: + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: true - - /@types/responselike@1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} - dependencies: - '@types/node': 20.10.4 - dev: true - /@types/selenium-webdriver@4.1.16: - resolution: {integrity: sha512-ETje9rr7nTrD0r/mNnIuCAF7fAZ2xKE/1WyxXZZH9N9Cy2NKJTrpEd7SCdzuIlm/1iu1gjHCVbaDwT+MuDrVZg==} - dependencies: - '@types/ws': 8.5.5 - dev: true + '@types/selenium-webdriver@4.1.23': + resolution: {integrity: sha512-PgreEfCfafYLyTwvJTZvOspCq3JABnS51e+NSFFL5yoiMO7h04lWgLfr10NA7nl/yZbz4m76rBfOOdDfleb7pQ==} - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - /@types/tough-cookie@4.0.2: - resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} - dev: true + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - /@types/web-bluetooth@0.0.20: + '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - dev: false - /@types/ws@8.5.5: - resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - /@types/yauzl@2.10.3: + '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - requiresBuild: true - dependencies: - '@types/node': 20.10.4 - dev: true - optional: true - /@ungap/promise-all-settled@1.1.2: + '@ungap/promise-all-settled@1.1.2': resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - dev: true - /@vitejs/plugin-vue@4.5.2(vite@5.0.9)(vue@3.3.11): - resolution: {integrity: sha512-UGR3DlzLi/SaVBPX0cnSyE37vqxU3O6chn8l0HJNzQzDia6/Au2A4xKv+iIJW8w2daf80G7TYHhi1pAUjdZ0bQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.0.0 || ^5.0.0 - vue: ^3.2.25 - dependencies: - vite: 5.0.9(@types/node@20.10.4) - vue: 3.3.11(typescript@5.3.3) - dev: true + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@vitejs/plugin-vue@5.0.2(vite@5.0.11)(vue@3.4.5): - resolution: {integrity: sha512-kEjJHrLb5ePBvjD0SPZwJlw1QTRcjjCA9sB5VyfonoXVBxTS7TMnqL6EkLt1Eu61RDeiuZ/WN9Hf6PxXhPI2uA==} + '@vitejs/plugin-vue@5.2.0': + resolution: {integrity: sha512-7n7KdUEtx/7Yl7I/WVAMZ1bEb0eVvXF3ummWTeLcs/9gvo9pJhuLdouSXGjdZ/MKD1acf1I272+X0RMua4/R3g==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 vue: ^3.2.25 - dependencies: - vite: 5.0.11 - vue: 3.4.5(typescript@5.3.3) - dev: false - - /@volar/language-core@1.11.1: - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - dependencies: - '@volar/source-map': 1.11.1 - dev: true - /@volar/source-map@1.11.1: - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - dependencies: - muggle-string: 0.3.1 - dev: true - - /@volar/typescript@1.11.1: - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - dependencies: - '@volar/language-core': 1.11.1 - path-browserify: 1.0.1 - dev: true - - /@vue/compiler-core@3.3.11: - resolution: {integrity: sha512-h97/TGWBilnLuRaj58sxNrsUU66fwdRKLOLQ9N/5iNDfp+DZhYH9Obhe0bXxhedl8fjAgpRANpiZfbgWyruQ0w==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/shared': 3.3.11 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} - dependencies: - '@babel/parser': 7.22.11 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: true - - /@vue/compiler-core@3.4.5: - resolution: {integrity: sha512-Daka7P1z2AgKjzuueWXhwzIsKu0NkLB6vGbNVEV2iJ8GJTrzraZo/Sk4GWCMRtd/qVi3zwnk+Owbd/xSZbwHtQ==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/shared': 3.4.5 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: false + '@vitejs/plugin-vue@5.2.3': + resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 - /@vue/compiler-core@3.4.8: - resolution: {integrity: sha512-GjAwOydZV6UyVBi1lYW5v4jjfU6wOeyi3vBATKJOwV7muYF0/nZi4kfdJc0pwdT5lXwbbx57lyA2Y356rFpw1A==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/shared': 3.4.8 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: false + '@vitest/coverage-v8@2.1.9': + resolution: {integrity: sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==} + peerDependencies: + '@vitest/browser': 2.1.9 + vitest: 2.1.9 + peerDependenciesMeta: + '@vitest/browser': + optional: true - /@vue/compiler-dom@3.3.11: - resolution: {integrity: sha512-zoAiUIqSKqAJ81WhfPXYmFGwDRuO+loqLxvXmfUdR5fOitPoUiIeFI9cTTyv9MU5O1+ZZglJVTusWzy+wfk5hw==} - dependencies: - '@vue/compiler-core': 3.3.11 - '@vue/shared': 3.3.11 + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} - /@vue/compiler-dom@3.3.4: - resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} - dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 - dev: true + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - /@vue/compiler-dom@3.4.5: - resolution: {integrity: sha512-J8YlxknJVd90SXFJ4HwGANSAXsx5I0lK30sO/zvYV7s5gXf7gZR7r/1BmZ2ju7RGH1lnc6bpBc6nL61yW+PsAQ==} - dependencies: - '@vue/compiler-core': 3.4.5 - '@vue/shared': 3.4.5 - dev: false + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - /@vue/compiler-dom@3.4.8: - resolution: {integrity: sha512-GsPyji42zmkSJlaDFKXvwB97ukTlHzlFH/iVzPFYz/APnSzuhu/CMFQbsYmrtsnc2yscF39eC4rKzvKR27aBug==} - dependencies: - '@vue/compiler-core': 3.4.8 - '@vue/shared': 3.4.8 - dev: false + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} - /@vue/compiler-sfc@3.3.11: - resolution: {integrity: sha512-U4iqPlHO0KQeK1mrsxCN0vZzw43/lL8POxgpzcJweopmqtoYy9nljJzWDIQS3EfjiYhfdtdk9Gtgz7MRXnz3GA==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.3.11 - '@vue/compiler-dom': 3.3.11 - '@vue/compiler-ssr': 3.3.11 - '@vue/reactivity-transform': 3.3.11 - '@vue/shared': 3.3.11 - estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.32 - source-map-js: 1.0.2 - - /@vue/compiler-sfc@3.4.5: - resolution: {integrity: sha512-jauvkDuSSUbP0ebhfNqljhShA90YEfX/0wZ+w40oZF43IjGyWYjqYaJbvMJwGOd+9+vODW6eSvnk28f0SGV7OQ==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.4.5 - '@vue/compiler-dom': 3.4.5 - '@vue/compiler-ssr': 3.4.5 - '@vue/shared': 3.4.5 - estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.32 - source-map-js: 1.0.2 - dev: false - - /@vue/compiler-sfc@3.4.8: - resolution: {integrity: sha512-3ZcurOa6bQdZ6VZLtMqYSUZqpsMqfX0MC3oCxQG0VIJFCqouZAgRYJN1c8QvGs7HW5wW8aXVvUOQU0ILVlYHKA==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.4.8 - '@vue/compiler-dom': 3.4.8 - '@vue/compiler-ssr': 3.4.8 - '@vue/shared': 3.4.8 - estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.32 - source-map-js: 1.0.2 - dev: false + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} - /@vue/compiler-ssr@3.3.11: - resolution: {integrity: sha512-Zd66ZwMvndxRTgVPdo+muV4Rv9n9DwQ4SSgWWKWkPFebHQfVYRrVjeygmmDmPewsHyznCNvJ2P2d6iOOhdv8Qg==} - dependencies: - '@vue/compiler-dom': 3.3.11 - '@vue/shared': 3.3.11 + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} - /@vue/compiler-ssr@3.4.5: - resolution: {integrity: sha512-DDdEcDzj2lWTMfUMMtEpLDhURai9LhM0zSZ219jCt7b2Vyl0/jy3keFgCPMitG0V1S1YG4Cmws3lWHWdxHQOpg==} - dependencies: - '@vue/compiler-dom': 3.4.5 - '@vue/shared': 3.4.5 - dev: false + '@vitest/ui@2.1.9': + resolution: {integrity: sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==} + peerDependencies: + vitest: 2.1.9 - /@vue/compiler-ssr@3.4.8: - resolution: {integrity: sha512-nxN79LHeAemhBpIa2PQ6rz57cW7W4C/XIJCOMSn2g49u6q2ekirmJI0osAOTErQPApOR0KwP2QyeTexX4zQCrw==} - dependencies: - '@vue/compiler-dom': 3.4.8 - '@vue/shared': 3.4.8 - dev: false + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - /@vue/devtools-api@6.5.1: - resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==} - dev: false + '@volar/language-core@2.4.12': + resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} - /@vue/language-core@1.8.25(typescript@5.3.3): - resolution: {integrity: sha512-NJk/5DnAZlpvXX8BdWmHI45bWGLViUaS3R/RMrmFSvFMSbJKuEODpM4kR0F0Ofv5SFzCWuNiMhxameWpVdQsnA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 - computeds: 0.0.1 - minimatch: 9.0.3 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - typescript: 5.3.3 - vue-template-compiler: 2.7.14 - dev: true + '@volar/source-map@2.4.12': + resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} - /@vue/reactivity-transform@3.3.11: - resolution: {integrity: sha512-fPGjH0wqJo68A0wQ1k158utDq/cRyZNlFoxGwNScE28aUFOKFEnCBsvyD8jHn+0kd0UKVpuGuaZEQ6r9FJRqCg==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.3.11 - '@vue/shared': 3.3.11 - estree-walker: 2.0.2 - magic-string: 0.30.5 + '@volar/typescript@2.4.12': + resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} - /@vue/reactivity@3.3.11: - resolution: {integrity: sha512-D5tcw091f0nuu+hXq5XANofD0OXnBmaRqMYl5B3fCR+mX+cXJIGNw/VNawBqkjLNWETrFW0i+xH9NvDbTPVh7g==} - dependencies: - '@vue/shared': 3.3.11 + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - /@vue/reactivity@3.4.5: - resolution: {integrity: sha512-BcWkKvjdvqJwb7BhhFkXPLDCecX4d4a6GATvCduJQDLv21PkPowAE5GKuIE5p6RC07/Lp9FMkkq4AYCTVF5KlQ==} - dependencies: - '@vue/shared': 3.4.5 - dev: false + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - /@vue/reactivity@3.4.8: - resolution: {integrity: sha512-UJYMQ3S2rqIGw9IvKomD4Xw2uS5VlcKEEmwcfboGOdrI79oqebxnCgTvXWLMClvg3M5SF0Cyn+9eDQoyGMLu9Q==} - dependencies: - '@vue/shared': 3.4.8 - dev: false + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} - /@vue/runtime-core@3.3.11: - resolution: {integrity: sha512-g9ztHGwEbS5RyWaOpXuyIVFTschclnwhqEbdy5AwGhYOgc7m/q3NFwr50MirZwTTzX55JY8pSkeib9BX04NIpw==} - dependencies: - '@vue/reactivity': 3.3.11 - '@vue/shared': 3.3.11 + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} - /@vue/runtime-core@3.4.5: - resolution: {integrity: sha512-wh9ELIOQKeWT9SaUPdLrsxRkZv14jp+SJm9aiQGWio+/MWNM3Lib0wE6CoKEqQ9+SCYyGjDBhTOTtO47kCgbkg==} - dependencies: - '@vue/reactivity': 3.4.5 - '@vue/shared': 3.4.5 - dev: false + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - /@vue/runtime-core@3.4.8: - resolution: {integrity: sha512-sMRXOy89KnwY6fWG5epgPOsCWzpo/64FrA0QkjIeNeGnoA2YyZ6bBUxpFUyqhJ8VbrDhXEFH+6LHMOYrpzX/ZQ==} - dependencies: - '@vue/reactivity': 3.4.8 - '@vue/shared': 3.4.8 - dev: false + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - /@vue/runtime-dom@3.3.11: - resolution: {integrity: sha512-OlhtV1PVpbgk+I2zl+Y5rQtDNcCDs12rsRg71XwaA2/Rbllw6mBLMi57VOn8G0AjOJ4Mdb4k56V37+g8ukShpQ==} - dependencies: - '@vue/runtime-core': 3.3.11 - '@vue/shared': 3.3.11 - csstype: 3.1.2 + '@vue/devtools-api@7.6.4': + resolution: {integrity: sha512-5AaJ5ELBIuevmFMZYYLuOO9HUuY/6OlkOELHE7oeDhy4XD/hSODIzktlsvBOsn+bto3aD0psj36LGzwVu5Ip8w==} - /@vue/runtime-dom@3.4.5: - resolution: {integrity: sha512-n5ewvOjyG3IEpqGBahdPXODFSpVlSz3H4LF76Sx0XAqpIOqyJ5bIb2PrdYuH2ogBMAQPh+o5tnoH4nJpBr8U0Q==} - dependencies: - '@vue/runtime-core': 3.4.5 - '@vue/shared': 3.4.5 - csstype: 3.1.3 - dev: false + '@vue/devtools-kit@7.6.4': + resolution: {integrity: sha512-Zs86qIXXM9icU0PiGY09PQCle4TI750IPLmAJzW5Kf9n9t5HzSYf6Rz6fyzSwmfMPiR51SUKJh9sXVZu78h2QA==} - /@vue/runtime-dom@3.4.8: - resolution: {integrity: sha512-L4gZcYo8f3d7rQqQIHkPvyczkjjQ55cJqz2G0v6Ptmqa1mO2zkqN9F8lBT6aGPYy3hd0RDiINbs4jxhSvvy10Q==} - dependencies: - '@vue/runtime-core': 3.4.8 - '@vue/shared': 3.4.8 - csstype: 3.1.3 - dev: false + '@vue/devtools-shared@7.6.4': + resolution: {integrity: sha512-nD6CUvBEel+y7zpyorjiUocy0nh77DThZJ0k1GRnJeOmY3ATq2fWijEp7wk37gb023Cb0R396uYh5qMSBQ5WFg==} - /@vue/server-renderer@3.3.11(vue@3.3.11): - resolution: {integrity: sha512-AIWk0VwwxCAm4wqtJyxBylRTXSy1wCLOKbWxHaHiu14wjsNYtiRCSgVuqEPVuDpErOlRdNnuRgipQfXRLjLN5A==} + '@vue/language-core@2.2.10': + resolution: {integrity: sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==} peerDependencies: - vue: 3.3.11 - dependencies: - '@vue/compiler-ssr': 3.3.11 - '@vue/shared': 3.3.11 - vue: 3.3.11(typescript@5.3.3) + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - /@vue/server-renderer@3.4.5(vue@3.4.5): - resolution: {integrity: sha512-jOFc/VE87yvifQpNju12VcqimH8pBLxdcT+t3xMeiED1K6DfH9SORyhFEoZlW5TG2Vwfn3Ul5KE+1aC99xnSBg==} - peerDependencies: - vue: 3.4.5 - dependencies: - '@vue/compiler-ssr': 3.4.5 - '@vue/shared': 3.4.5 - vue: 3.4.5(typescript@5.3.3) - dev: false + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} - /@vue/server-renderer@3.4.8(vue@3.4.8): - resolution: {integrity: sha512-pBeHM59Owevr3P0Fl1XOjBmq4DTy5JDcjMG4NuzJEVDlZYzY8fHybx0wdjkY5lK5mCtUyBtw6Mz4d87aosc1Sw==} - peerDependencies: - vue: 3.4.8 - dependencies: - '@vue/compiler-ssr': 3.4.8 - '@vue/shared': 3.4.8 - vue: 3.4.8(typescript@5.3.3) - dev: false + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} - /@vue/shared@3.3.11: - resolution: {integrity: sha512-u2G8ZQ9IhMWTMXaWqZycnK4UthG1fA238CD+DP4Dm4WJi5hdUKKLg0RMRaRpDPNMdkTwIDkp7WtD0Rd9BH9fLw==} + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} - dev: true + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 - /@vue/shared@3.4.5: - resolution: {integrity: sha512-6XptuzlMvN4l4cDnDw36pdGEV+9njYkQ1ZE0Q6iZLwrKefKaOJyiFmcP3/KBDHbt72cJZGtllAc1GaHe6XGAyg==} - dev: false + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - /@vue/shared@3.4.8: - resolution: {integrity: sha512-ChLCWzXiJboQ009oVkemhEoUdrxHme7v3ip+Kh+/kDDeF1WtHWGt0knRLGm1Y4YqCRTSs9QxsZIY8paJj5Szrw==} - dev: false + '@vue/test-utils@2.4.6': + resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} - /@vue/test-utils@2.4.3(@vue/server-renderer@3.3.11)(vue@3.3.11): - resolution: {integrity: sha512-F4K7mF+ad++VlTrxMJVRnenKSJmO6fkQt2wpRDiKDesQMkfpniGWsqEi/JevxGBo2qEkwwjvTUAoiGJLNx++CA==} + '@vue/tsconfig@0.6.0': + resolution: {integrity: sha512-MHXNd6lzugsEHvuA6l1GqrF5jROqUon8sP/HInLPnthJiYvB0VvpHMywg7em1dBZfFZNBSkR68qH37zOdRHmCw==} peerDependencies: - '@vue/server-renderer': ^3.0.1 - vue: ^3.0.1 + typescript: 5.x + vue: ^3.3.0 peerDependenciesMeta: - '@vue/server-renderer': + typescript: + optional: true + vue: optional: true - dependencies: - '@vue/server-renderer': 3.3.11(vue@3.3.11) - js-beautify: 1.14.9 - vue: 3.3.11(typescript@5.3.3) - vue-component-type-helpers: 1.8.25 - dev: true - - /@vue/tsconfig@0.4.0: - resolution: {integrity: sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==} - dev: true - /@vueuse/core@10.7.1(vue@3.4.5): - resolution: {integrity: sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==} - dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.7.1 - '@vueuse/shared': 10.7.1(vue@3.4.5) - vue-demi: 0.14.6(vue@3.4.5) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false + '@vueuse/core@11.3.0': + resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} - /@vueuse/integrations@10.7.1(focus-trap@7.5.4)(vue@3.4.5): - resolution: {integrity: sha512-cKo5LEeKVHdBRBtMTOrDPdR0YNtrmN9IBfdcnY2P3m5LHVrsD0xiHUtAH1WKjHQRIErZG6rJUa6GA4tWZt89Og==} + '@vueuse/integrations@11.3.0': + resolution: {integrity: sha512-5fzRl0apQWrDezmobchoiGTkGw238VWESxZHazfhP3RM7pDSiyXy18QbfYkILoYNTd23HPAfQTJpkUc5QbkwTw==} peerDependencies: - async-validator: '*' - axios: '*' - change-case: '*' - drauu: '*' - focus-trap: '*' - fuse.js: '*' - idb-keyval: '*' - jwt-decode: '*' - nprogress: '*' - qrcode: '*' - sortablejs: '*' - universal-cookie: '*' + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 peerDependenciesMeta: async-validator: optional: true @@ -2152,1022 +1011,506 @@ packages: optional: true universal-cookie: optional: true - dependencies: - '@vueuse/core': 10.7.1(vue@3.4.5) - '@vueuse/shared': 10.7.1(vue@3.4.5) - focus-trap: 7.5.4 - vue-demi: 0.14.6(vue@3.4.5) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - /@vueuse/metadata@10.7.1: - resolution: {integrity: sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==} - dev: false + '@vueuse/metadata@11.3.0': + resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} - /@vueuse/shared@10.7.1(vue@3.4.5): - resolution: {integrity: sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==} - dependencies: - vue-demi: 0.14.6(vue@3.4.5) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false + '@vueuse/shared@11.3.0': + resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} + + '@wdio/logger@9.0.8': + resolution: {integrity: sha512-uIyYIDBwLczmsp9JE5hN3ME8Xg+9WNBfSNXD69ICHrY9WPTzFf94UeTuavK7kwSKF3ro2eJbmNZItYOfnoovnw==} + engines: {node: '>=18.20.0'} + + '@zip.js/zip.js@2.7.52': + resolution: {integrity: sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} - /JSONStream@1.3.5: + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: true - /abab@2.0.6: + abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead - dev: true - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /acorn-globals@6.0.0: + acorn-globals@6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - dev: true - - /acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - dependencies: - acorn: 8.10.0 - acorn-walk: 8.2.0 - dev: true - /acorn-walk@7.2.0: + acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} - dev: true - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@7.4.1: + acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true - dev: true - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true - dev: true - /add-stream@1.0.0: + add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: true - - /adm-zip@0.5.9: - resolution: {integrity: sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==} - engines: {node: '>=6.0'} - dev: true - /agent-base@6.0.2: + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /algoliasearch@4.19.1: - resolution: {integrity: sha512-IJF5b93b2MgAzcE/tuzW0yOPnuUyRgGAtaPv5UUywXM8kzqfdwZTO4sPJBzoGz1eOy6H9uEchsJsBFTELZSu+g==} - dependencies: - '@algolia/cache-browser-local-storage': 4.19.1 - '@algolia/cache-common': 4.19.1 - '@algolia/cache-in-memory': 4.19.1 - '@algolia/client-account': 4.19.1 - '@algolia/client-analytics': 4.19.1 - '@algolia/client-common': 4.19.1 - '@algolia/client-personalization': 4.19.1 - '@algolia/client-search': 4.19.1 - '@algolia/logger-common': 4.19.1 - '@algolia/logger-console': 4.19.1 - '@algolia/requester-browser-xhr': 4.19.1 - '@algolia/requester-common': 4.19.1 - '@algolia/requester-node-http': 4.19.1 - '@algolia/transporter': 4.19.1 - dev: false - - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - dependencies: - string-width: 4.2.3 - dev: true + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + algoliasearch@5.15.0: + resolution: {integrity: sha512-Yf3Swz1s63hjvBVZ/9f2P1Uu48GjmjCN+Esxb6MAONMGtZB1fRX8/S1AhUTtsuTlcGovbYLxpHgc7wEzstDZBw==} + engines: {node: '>= 14.0.0'} + + alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - /ansi-colors@4.1.1: + ansi-colors@4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} - dev: true - /ansi-colors@4.1.3: + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - - /ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} - engines: {node: '>=14.16'} - dependencies: - type-fest: 3.13.1 - dev: true + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} - /ansi-regex@5.0.1: + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} - dev: true - /ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - dev: true - - /ansi-styles@3.2.1: + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - /ansi-styles@6.2.1: + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - dev: true - /ansi-to-html@0.7.2: + ansi-to-html@0.7.2: resolution: {integrity: sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==} engines: {node: '>=8.0.0'} hasBin: true - dependencies: - entities: 2.2.0 - dev: true - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - /anymatch@3.1.3: + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - /argparse@1.0.10: + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - /array-ify@1.0.0: + array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true - /arrify@1.0.1: + arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - dev: true - /assertion-error@1.1.0: + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - /async@3.2.4: + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: true - /asynckit@0.4.0: + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - /axe-core@4.7.2: + axe-core@4.7.2: resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} engines: {node: '>=4'} - dev: true - /axios@1.6.2: - resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - /babel-jest@29.7.0(@babel/core@7.22.11): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.22.11 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.22.11) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.11 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.1 - dev: true + bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.11): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.11) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.11) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.22.11): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) - dev: true + bare-fs@2.3.3: + resolution: {integrity: sha512-7RYKL+vZVCyAsMLi5SPu7QGauGGT8avnP/HO571ndEuV4MYdGXvLhtW67FuLPeEI8EiIY7zbbRR9x7x7HU0kgw==} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + bare-os@2.4.2: + resolution: {integrity: sha512-HZoJwzC+rZ9lqEemTMiO0luOePoGYNBgsLLgegKR/cljiJvcDNhDZQkzC+NC5Oh0aHbdBNSOHpghwMuB5tqhjg==} + + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + + bare-stream@2.2.1: + resolution: {integrity: sha512-YTB47kHwBW9zSG8LD77MIBAAQXjU2WjAkMHeeb7hUplVs6+IoM5I7uEVQNPMB7lj9r8I76UMdoMkGnCodHOLqg==} - /base64-js@1.5.1: + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - /binary-extensions@2.2.0: + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + + binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - dev: true - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true + birpc@0.2.19: + resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - /boxen@5.1.2: + boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - dev: true - /brace-expansion@1.1.11: + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - /brotli@1.3.3: + brotli@1.3.3: resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} - dependencies: - base64-js: 1.5.1 - dev: true - /browser-process-hrtime@1.0.0: + browser-process-hrtime@1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: true - /browser-stdout@1.3.1: + browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - dev: true - - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001524 - electron-to-chromium: 1.4.503 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) - dev: true - - /browserstack-local@1.5.5: - resolution: {integrity: sha512-jKne7yosrMcptj3hqxp36TP9k0ZW2sCqhyurX24rUL4G3eT7OLgv+CSQN8iq5dtkv5IK+g+v8fWvsiC/S9KxMg==} - dependencies: - agent-base: 6.0.2 - https-proxy-agent: 5.0.1 - is-running: 2.1.0 - ps-tree: 1.2.0 - temp-fs: 0.9.9 - transitivePeerDependencies: - - supports-color - dev: true - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true + browserstack-local@1.5.6: + resolution: {integrity: sha512-s0GadAkyE1XHxnmymb9atogTZbA654bcFpqGkcYEtYPaPvuvVfSXR0gw8ojn0I0Td2HEMJcGtdrkBjb1Fi/HmQ==} - /buffer-crc32@0.2.13: + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true - /buffer-from@1.1.2: + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - /buffer@5.7.1: + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true - - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: true - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.3 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - /camelcase-keys@6.2.2: + camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - /camelcase@5.3.1: + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - dev: true - /camelcase@6.3.0: + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - dev: true - /caniuse-lite@1.0.30001524: - resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} - dev: true + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - /chai-nightwatch@0.5.3: + chai-nightwatch@0.5.3: resolution: {integrity: sha512-38ixH/mqpY6IwnZkz6xPqx8aB5/KVR+j6VPugcir3EGOsphnWXrPH/mUt8Jp+ninL6ghY0AaJDQ10hSfCPGy/g==} engines: {node: '>= 12.0.0'} - dependencies: - assertion-error: 1.1.0 - dev: true - /chalk@2.4.2: + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - /chalk@4.1.2: + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - /check-error@1.0.2: + check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - /chokidar@3.5.3: + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true - /chromedriver@119.0.1: - resolution: {integrity: sha512-lpCFFLaXPpvElTaUOWKdP74pFb/sJhWtWqMjn7Ju1YriWn8dT5JBk84BGXMPvZQs70WfCYWecxdMmwfIu1Mupg==} + chromedriver@131.0.5: + resolution: {integrity: sha512-OQY4BHUe9JedxH4aAsPZJcf8Y0lMlE7y+3tiCvQSCQ6qDz2b99R0qsqyqzUUSW2DFx0bg4YxmK8CDVMKb9u5kg==} engines: {node: '>=18'} hasBin: true - requiresBuild: true - dependencies: - '@testim/chrome-version': 1.1.4 - axios: 1.6.2 - compare-versions: 6.1.0 - extract-zip: 2.0.1 - https-proxy-agent: 5.0.1 - proxy-from-env: 1.1.0 - tcp-port-used: 1.0.2 - transitivePeerDependencies: - - debug - - supports-color - dev: true - /ci-info@1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} - dev: true - - /ci-info@3.3.0: + ci-info@3.3.0: resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} - dev: true - - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} - dev: true - - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - dev: true - /cli-boxes@2.2.1: + cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} - dev: true - /cli-cursor@3.1.0: + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - restore-cursor: 4.0.0 - dev: true + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} - /cli-spinners@2.9.0: + cli-spinners@2.9.0: resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} engines: {node: '>=6'} - dev: true - /cli-table3@0.6.3: + cli-table3@0.6.3: resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} engines: {node: 10.* || >= 12.*} - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - dev: true - /cli-truncate@4.0.0: + cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} - dependencies: - slice-ansi: 5.0.0 - string-width: 7.0.0 - dev: true - /cliui@7.0.4: + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: true - /clone@1.0.4: + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - dev: true - - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true - - /color-convert@1.9.3: + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - /color-convert@2.0.1: + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - /color-name@1.1.3: + color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - /color-name@1.1.4: + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - /colorette@2.0.20: + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true - - /colors@1.2.5: - resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} - engines: {node: '>=0.1.90'} - dev: true - /combined-stream@1.0.8: + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - /commander@10.0.1: + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - dev: true - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} - /commander@2.20.3: + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - requiresBuild: true - dev: true - optional: true - - /commondir@1.0.1: + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - /compare-func@2.0.0: + compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true - - /compare-versions@6.1.0: - resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} - dev: true - /computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - dev: true + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - /concat-map@0.0.1: + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - /config-chain@1.1.13: + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - dev: true - /connect-history-api-fallback@1.6.0: + connect-history-api-fallback@1.6.0: resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} engines: {node: '>=0.8'} - dev: true - /conventional-changelog-angular@5.0.13: + conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true - /conventional-changelog-atom@2.0.8: + conventional-changelog-atom@2.0.8: resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: true - /conventional-changelog-cli@2.1.1: - resolution: {integrity: sha512-xMGQdKJ+4XFDDgfX5aK7UNFduvJMbvF5BB+g0OdVhA3rYdYyhctrIE2Al+WYdZeKTdg9YzMWF2iFPT8MupIwng==} + conventional-changelog-cli@2.2.2: + resolution: {integrity: sha512-8grMV5Jo8S0kP3yoMeJxV2P5R6VJOqK72IiSV9t/4H5r/HiRqEBQ83bYGuz4Yzfdj4bjaAEhZN/FFbsFXr5bOA==} engines: {node: '>=10'} hasBin: true - dependencies: - add-stream: 1.0.0 - conventional-changelog: 3.1.25 - lodash: 4.17.21 - meow: 8.1.2 - tempfile: 3.0.0 - dev: true - /conventional-changelog-codemirror@2.0.8: + conventional-changelog-codemirror@2.0.8: resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: true - /conventional-changelog-conventionalcommits@4.6.3: + conventional-changelog-conventionalcommits@4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: true - /conventional-changelog-core@4.2.4: + conventional-changelog-core@4.2.4: resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} engines: {node: '>=10'} - dependencies: - add-stream: 1.0.0 - conventional-changelog-writer: 5.0.1 - conventional-commits-parser: 3.2.4 - dateformat: 3.0.3 - get-pkg-repo: 4.2.1 - git-raw-commits: 2.0.11 - git-remote-origin-url: 2.0.0 - git-semver-tags: 4.1.1 - lodash: 4.17.21 - normalize-package-data: 3.0.3 - q: 1.5.1 - read-pkg: 3.0.0 - read-pkg-up: 3.0.0 - through2: 4.0.2 - dev: true - /conventional-changelog-ember@2.0.9: + conventional-changelog-ember@2.0.9: resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: true - /conventional-changelog-eslint@3.0.9: + conventional-changelog-eslint@3.0.9: resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: true - /conventional-changelog-express@2.0.6: + conventional-changelog-express@2.0.6: resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: true - /conventional-changelog-jquery@3.0.11: + conventional-changelog-jquery@3.0.11: resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: true - /conventional-changelog-jshint@2.0.9: + conventional-changelog-jshint@2.0.9: resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true - /conventional-changelog-preset-loader@2.3.4: + conventional-changelog-preset-loader@2.3.4: resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} engines: {node: '>=10'} - dev: true - /conventional-changelog-writer@5.0.1: + conventional-changelog-writer@5.0.1: resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} engines: {node: '>=10'} hasBin: true - dependencies: - conventional-commits-filter: 2.0.7 - dateformat: 3.0.3 - handlebars: 4.7.8 - json-stringify-safe: 5.0.1 - lodash: 4.17.21 - meow: 8.1.2 - semver: 6.3.1 - split: 1.0.1 - through2: 4.0.2 - dev: true - /conventional-changelog@3.1.25: + conventional-changelog@3.1.25: resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} engines: {node: '>=10'} - dependencies: - conventional-changelog-angular: 5.0.13 - conventional-changelog-atom: 2.0.8 - conventional-changelog-codemirror: 2.0.8 - conventional-changelog-conventionalcommits: 4.6.3 - conventional-changelog-core: 4.2.4 - conventional-changelog-ember: 2.0.9 - conventional-changelog-eslint: 3.0.9 - conventional-changelog-express: 2.0.6 - conventional-changelog-jquery: 3.0.11 - conventional-changelog-jshint: 2.0.9 - conventional-changelog-preset-loader: 2.3.4 - dev: true - /conventional-commits-filter@2.0.7: + conventional-commits-filter@2.0.7: resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} engines: {node: '>=10'} - dependencies: - lodash.ismatch: 4.4.0 - modify-values: 1.0.1 - dev: true - /conventional-commits-parser@3.2.4: + conventional-commits-parser@3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} engines: {node: '>=10'} hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /core-util-is@1.0.3: + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true - - /create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.10.4) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - /cross-spawn@7.0.3: + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /cssom@0.3.8: + cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: true - /cssom@0.5.0: + cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - dev: true - /cssstyle@2.3.0: + cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} - dependencies: - cssom: 0.3.8 - dev: true - - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - /csstype@3.1.3: + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: false - /dargs@7.0.0: + dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - dev: true - /data-urls@3.0.2: + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - dev: true - /dateformat@3.0.3: + dateformat@3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: true - /de-indent@1.0.2: + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - dev: true - /debug@4.3.1: + debug@4.3.1: resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} engines: {node: '>=6.0'} peerDependencies: @@ -3175,11 +1518,8 @@ packages: peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - dev: true - /debug@4.3.3(supports-color@8.1.1): + debug@4.3.3: resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} engines: {node: '>=6.0'} peerDependencies: @@ -3187,1751 +1527,4383 @@ packages: peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - /decamelize-keys@1.1.1: + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - dev: true - /decamelize@4.0.0: + decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} - dev: true - - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true + decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - /deep-eql@4.0.1: + deep-eql@4.0.1: resolution: {integrity: sha512-D/Oxqobjr+kxaHsgiQBZq9b6iAWdEj5W/JdJm8deNduAPc9CwXQ3BJJCuEqlrPXcy45iOMkGPZ0T81Dnz7UDCA==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - /deep-is@0.1.4: + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - /deepmerge@4.3.1: + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - dev: true - /defaults@1.0.4: + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: true - - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true - /define-lazy-prop@2.0.0: + define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - dev: true - /delayed-stream@1.0.0: + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} - /devtools-protocol@0.0.1025565: + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + devtools-protocol@0.0.1025565: resolution: {integrity: sha512-0s5sbGQR/EfYQhd8EpZgphpndsv+CufTlaeUyA6vYXCA0H5kMAsHCS/cHtUFWoKJCO125hpoKicQCfpxRj4oqw==} - dev: true - /didyoumean@1.2.2: + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: true - - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /diff@5.0.0: + diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} - dev: true - /domexception@4.0.0: + domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} deprecated: Use your platform's native DOMException instead - dependencies: - webidl-conversions: 7.0.0 - dev: true - /dot-prop@5.3.0: + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: true - /dotenv@10.0.0: + dotenv@10.0.0: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} - dev: true - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} - dev: true - /duplexer@0.1.2: + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - /eastasianwidth@0.2.0: + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - /editorconfig@1.0.4: + editorconfig@1.0.4: resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} engines: {node: '>=14'} hasBin: true - dependencies: - '@one-ini/wasm': 0.1.1 - commander: 10.0.1 - minimatch: 9.0.1 - semver: 7.5.4 - dev: true - /ejs@3.1.8: + ejs@3.1.8: resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} engines: {node: '>=0.10.0'} hasBin: true - dependencies: - jake: 10.8.7 - dev: true - - /electron-to-chromium@1.4.503: - resolution: {integrity: sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==} - dev: true - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} - /emoji-regex@8.0.0: + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - /emoji-regex@9.2.2: + emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - /end-of-stream@1.4.4: + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - /enquirer@2.4.1: + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - dev: true - /entities@2.2.0: + entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: true - /entities@4.5.0: + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - /envinfo@7.8.1: + envinfo@7.8.1: resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} engines: {node: '>=4'} hasBin: true - dev: true - /error-ex@1.3.2: + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - /esbuild@0.19.9: - resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.9 - '@esbuild/android-arm64': 0.19.9 - '@esbuild/android-x64': 0.19.9 - '@esbuild/darwin-arm64': 0.19.9 - '@esbuild/darwin-x64': 0.19.9 - '@esbuild/freebsd-arm64': 0.19.9 - '@esbuild/freebsd-x64': 0.19.9 - '@esbuild/linux-arm': 0.19.9 - '@esbuild/linux-arm64': 0.19.9 - '@esbuild/linux-ia32': 0.19.9 - '@esbuild/linux-loong64': 0.19.9 - '@esbuild/linux-mips64el': 0.19.9 - '@esbuild/linux-ppc64': 0.19.9 - '@esbuild/linux-riscv64': 0.19.9 - '@esbuild/linux-s390x': 0.19.9 - '@esbuild/linux-x64': 0.19.9 - '@esbuild/netbsd-x64': 0.19.9 - '@esbuild/openbsd-x64': 0.19.9 - '@esbuild/sunos-x64': 0.19.9 - '@esbuild/win32-arm64': 0.19.9 - '@esbuild/win32-ia32': 0.19.9 - '@esbuild/win32-x64': 0.19.9 - - /escalade@3.1.1: + + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: true - /escape-string-regexp@1.0.5: + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - dev: true - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - /escape-string-regexp@4.0.0: + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - dev: true - /escodegen@2.1.0: + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - dev: true - /esprima@4.0.1: + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: true - /estraverse@5.3.0: + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true - /estree-walker@2.0.2: + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - /esutils@2.0.3: + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dev: true - /event-stream@3.3.4: + event-stream@3.3.4: resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - dev: true - /eventemitter3@5.0.1: + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true - /execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@8.0.1: + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expect@29.6.4: - resolution: {integrity: sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.6.4 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.6.4 - jest-message-util: 29.6.3 - jest-util: 29.6.3 - dev: true - - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - dev: true - - /extract-zip@2.0.1: + + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + engines: {node: ^18.19.0 || >=20.5.0} + + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + + extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} hasBin: true - dependencies: - debug: 4.3.4 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - dev: true - /faked-promise@2.2.2: + faked-promise@2.2.2: resolution: {integrity: sha512-1kaSWavyNHJw83/aJ0dZAhKWID/FAED9vlgBa43kW8Vb61BSXORXf8f9W6NJ7qepTtlPSaJc557qkpxT1HCUBw==} - dev: true - /fast-deep-equal@3.1.3: + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - dependencies: - pend: 1.2.0 - dev: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} - /filelist@1.0.4: + filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - dependencies: - minimatch: 5.1.6 - dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - /find-cache-dir@3.3.2: + find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: true - /find-up@2.1.0: + find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} - dependencies: - locate-path: 2.0.0 - dev: true - /find-up@4.1.0: + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - /find-up@5.0.0: + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - /flat@5.0.2: + flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - dev: true - /focus-trap@7.5.4: - resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - dependencies: - tabbable: 6.2.0 - dev: false + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + focus-trap@7.6.2: + resolution: {integrity: sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==} - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' peerDependenciesMeta: debug: optional: true - dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - /from@0.1.7: + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + from@0.1.7: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - dev: true - /fs-extra@10.1.0: + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - /fs-extra@7.0.1: + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /fs.realpath@1.0.0: + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - /fsevents@2.3.3: + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - requiresBuild: true - optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /function-bind@1.1.2: + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - /geckodriver@3.2.0: - resolution: {integrity: sha512-p+qR2RKlI/TQoCEYrSuTaYCLqsJNni96WmEukTyXmOmLn+3FLdgPAEwMZ0sG2Cwi9hozUzGAWyT6zLuhF6cpiQ==} - engines: {node: '>=12.0.0'} + geckodriver@4.5.1: + resolution: {integrity: sha512-lGCRqPMuzbRNDWJOQcUqhNqPvNsIFu6yzXF8J/6K3WCYFd2r5ckbeF7h1cxsnjA7YLSEiWzERCt6/gjZ3tW0ug==} + engines: {node: ^16.13 || >=18 || >=20} hasBin: true - requiresBuild: true - dependencies: - adm-zip: 0.5.9 - bluebird: 3.7.2 - got: 11.8.5 - https-proxy-agent: 5.0.1 - tar: 6.1.11 - transitivePeerDependencies: - - supports-color - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - /get-caller-file@2.0.5: + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} - dev: true - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-pkg-repo@4.2.1: + get-pkg-repo@4.2.1: resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} engines: {node: '>=6.9.0'} hasBin: true - dependencies: - '@hutson/parse-repository-url': 3.0.2 - hosted-git-info: 4.1.0 - through2: 2.0.5 - yargs: 16.2.0 - dev: true - - /get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: true - /get-stream@5.2.0: + get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - /get-stream@8.0.1: + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - dev: true - /git-raw-commits@2.0.11: + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-uri@6.0.3: + resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} + engines: {node: '>= 14'} + + git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} hasBin: true - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - /git-remote-origin-url@2.0.0: + git-remote-origin-url@2.0.0: resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} engines: {node: '>=4'} - dependencies: - gitconfiglocal: 1.0.0 - pify: 2.3.0 - dev: true - /git-semver-tags@4.1.1: + git-semver-tags@4.1.1: resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} engines: {node: '>=10'} hasBin: true - dependencies: - meow: 8.1.2 - semver: 6.3.1 - dev: true - /gitconfiglocal@1.0.0: + gitconfiglocal@1.0.0: resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} - dependencies: - ini: 1.3.8 - dev: true - /glob-parent@5.1.2: + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} + glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.3 - path-scurry: 1.10.1 - dev: true - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true - /glob@7.2.0: + glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true + deprecated: Glob versions prior to v9 are no longer supported - /glob@7.2.3: + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true + deprecated: Glob versions prior to v9 are no longer supported - /glob@8.1.0: + glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + deprecated: Glob versions prior to v9 are no longer supported - /globby@14.0.0: - resolution: {integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==} + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} - dependencies: - '@sindresorhus/merge-streams': 1.0.0 - fast-glob: 3.3.2 - ignore: 5.2.4 - path-type: 5.0.0 - slash: 5.1.0 - unicorn-magic: 0.1.0 - dev: true - - /got@11.8.5: - resolution: {integrity: sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.0 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - dev: true - - /graceful-fs@4.2.11: + + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - /growl@1.10.5: + growl@1.10.5: resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} engines: {node: '>=4.x'} - dev: true - /handlebars@4.7.8: + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - dev: true - /hard-rejection@2.1.0: + happy-dom@15.11.7: + resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} + engines: {node: '>=18.0.0'} + + hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} - dev: true - /has-flag@3.0.0: + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true - /has-flag@4.0.0: + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: true - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /hasown@2.0.0: + hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - /he@1.2.0: + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - dev: true - /hosted-git-info@2.8.9: + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - /hosted-git-info@4.1.0: + hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - /html-encoding-sniffer@3.0.0: + html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} - dependencies: - whatwg-encoding: 2.0.0 - dev: true - /html-escaper@2.0.2: + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - /http-proxy-agent@5.0.0: + http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: true + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} - /https-proxy-agent@5.0.1: + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} - /human-signals@5.0.0: + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - dev: true - /iconv-lite@0.6.3: + human-signals@8.0.0: + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + engines: {node: '>=18.18.0'} + + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - /ieee754@1.2.1: + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + ignore@7.0.4: + resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} engines: {node: '>= 4'} - dev: true - /immediate@3.0.6: + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: true - /import-lazy@4.0.0: + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - dev: true - - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string@4.0.0: + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - dev: true - /inflight@1.0.6: + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true + 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: + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - /ini@1.3.8: + ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - /ip-regex@4.3.0: + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} - dev: true - /is-arrayish@0.2.1: + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - /is-binary-path@2.1.0: + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - dependencies: - builtin-modules: 3.3.0 - dev: true - - /is-ci@1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} - hasBin: true - dependencies: - ci-info: 1.6.0 - dev: true - - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - dependencies: - has: 1.0.3 - dev: true - /is-core-module@2.13.1: + is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - dev: true - /is-docker@2.2.1: + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true - dev: true - /is-extglob@2.1.1: + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - dev: true - /is-fullwidth-code-point@3.0.0: + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true - /is-fullwidth-code-point@4.0.0: + is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} - dev: true - /is-fullwidth-code-point@5.0.0: + is-fullwidth-code-point@5.0.0: resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} engines: {node: '>=18'} - dependencies: - get-east-asian-width: 1.2.0 - dev: true - - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - /is-glob@4.0.3: + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - /is-interactive@1.0.0: + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - dev: true - /is-module@1.0.0: + is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - dev: true - /is-number@7.0.0: + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - dev: true - /is-obj@2.0.0: + is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - dev: true - /is-plain-obj@1.1.0: + is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - dev: true - /is-plain-obj@2.1.0: + is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - dev: true - /is-potential-custom-element-name@1.0.1: + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - /is-reference@1.2.1: + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - dependencies: - '@types/estree': 1.0.1 - dev: true - /is-running@2.1.0: + is-running@2.1.0: resolution: {integrity: sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==} - dev: true - - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: true - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-stream@3.0.0: + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /is-text-path@1.0.1: + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-text-path@1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} - dependencies: - text-extensions: 1.9.0 - dev: true - /is-unicode-supported@0.1.0: + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - dev: true - /is-url@1.2.4: + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - dev: true - /is-wsl@2.2.0: + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - /is2@2.0.9: + is2@2.0.9: resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} engines: {node: '>=v0.10.0'} - dependencies: - deep-is: 0.1.4 - ip-regex: 4.3.0 - is-url: 1.2.4 - dev: true - /isarray@1.0.0: + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - /isexe@2.0.0: + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - dependencies: - '@babel/core': 7.22.11 - '@babel/parser': 7.22.11 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-instrument@6.0.0: - resolution: {integrity: sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.22.11 - '@babel/parser': 7.22.11 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - /istanbul-lib-report@3.0.1: + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: true - /jake@10.8.7: + jackspeak@4.0.1: + resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + engines: {node: 20 || >=22} + + jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} hasBin: true - dependencies: - async: 3.2.4 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - dev: true - - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - dev: true - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.1 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.0.2 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - /jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0 - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.10.4) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - /jest-config@29.7.0(@types/node@20.10.4): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.22.11 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - babel-jest: 29.7.0(@babel/core@7.22.11) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} - /jest-diff@29.6.4: - resolution: {integrity: sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.6.3 - dev: true + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - dev: true - - /jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jsdom@19.0.0: + resolution: {integrity: sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==} + engines: {node: '>=12'} peerDependencies: canvas: ^2.5.0 peerDependenciesMeta: canvas: optional: true - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/jsdom': 20.0.1 - '@types/node': 20.10.4 - jest-mock: 29.7.0 - jest-util: 29.7.0 - jsdom: 20.0.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.6 - '@types/node': 20.10.4 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - /jest-matcher-utils@29.6.4: - resolution: {integrity: sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.6.4 - jest-get-type: 29.6.3 - pretty-format: 29.6.3 - dev: true + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - /jest-message-util@29.6.3: - resolution: {integrity: sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.10 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.6.3 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.10 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock-warn@1.1.0: - resolution: {integrity: sha512-Q0EjGIUowgcuH7K1v6KgZ/WtqQaA9kc/TxayKaZKKeTGBn9nC4uKI65nt0O3l8opaPi2VSvG18WcLPEqzowxrQ==} - dev: true - - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - jest-util: 29.7.0 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.7.0 - dev: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 - slash: 3.0.0 - dev: true - - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.22.11 - '@babel/generator': 7.22.10 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.11) - '@babel/types': 7.22.11 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - /jest-util@29.6.3: - resolution: {integrity: sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lint-staged@15.5.1: + resolution: {integrity: sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.3.2: + resolution: {integrity: sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==} + engines: {node: '>=18.0.0'} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash._arraycopy@3.0.0: + resolution: {integrity: sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==} + + lodash._arrayeach@3.0.0: + resolution: {integrity: sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==} + + lodash._baseassign@3.2.0: + resolution: {integrity: sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==} + + lodash._baseclone@3.3.0: + resolution: {integrity: sha512-1K0dntf2dFQ5my0WoGKkduewR6+pTNaqX03kvs45y7G5bzl4B3kTR4hDfJIc2aCQDeLyQHhS280tc814m1QC1Q==} + + lodash._basecopy@3.0.1: + resolution: {integrity: sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==} + + lodash._basefor@3.0.3: + resolution: {integrity: sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==} + + lodash._bindcallback@3.0.1: + resolution: {integrity: sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==} + + lodash._getnative@3.9.1: + resolution: {integrity: sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==} + + lodash._isiterateecall@3.0.9: + resolution: {integrity: sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==} + + lodash.clone@3.0.3: + resolution: {integrity: sha512-yVYPpFTdZDCLG2p07gVRTvcwN5X04oj2hu4gG6r0fer58JA08wAVxXzWM+CmmxO2bzOH8u8BkZTZqgX6juVF7A==} + + lodash.defaultsdeep@4.6.1: + resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==} + + lodash.escape@4.0.1: + resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + lodash.isarray@3.0.4: + resolution: {integrity: sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==} + + lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + lodash.keys@3.1.2: + resolution: {integrity: sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.pick@4.4.0: + resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + + loupe@2.3.4: + resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==} + deprecated: Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5 + + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.0.1: + resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} + engines: {node: 20 || >=22} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + magic-string@0.30.13: + resolution: {integrity: sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@4.2.1: + resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} + engines: {node: '>=10'} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minisearch@7.1.1: + resolution: {integrity: sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mocha@9.2.2: + resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} + engines: {node: '>= 12.0.0'} + hasBin: true + + modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.1: + resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + nightwatch-axe-verbose@2.2.2: + resolution: {integrity: sha512-MvCrQb9D/ixtGtyN5fh7YCkelXuPup3X9D2Zhhk1PWyALtkdYCFadnIGif1irpQ1BLNSlqC+FDNnsNald7KHYA==} + + nightwatch-helpers@1.2.0: + resolution: {integrity: sha512-TeYlrNctoy0rJdVAYKoouG+mwv1FmfZkArdBM76sM6090BOt5mKzJNr24lr9PFdDpBrjKhS6b/b6qJzGY/wCig==} + + nightwatch@2.6.25: + resolution: {integrity: sha512-aYc5eA6M/iADdbKbD6dMHlhUsaJm/Y4/VOtSHSC23nimGTXMUKbe1Bb14Iz3/SNyz2joHOkpxaDIPIAZCSlOiQ==} + engines: {node: '>= 12.0.0'} + hasBin: true + peerDependencies: + '@cucumber/cucumber': '*' + chromedriver: '*' + geckodriver: '*' + peerDependenciesMeta: + '@cucumber/cucumber': + optional: true + chromedriver: + optional: true + geckodriver: + optional: true + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nwsapi@2.2.13: + resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + oniguruma-to-es@0.4.1: + resolution: {integrity: sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==} + + open@8.4.0: + resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} + engines: {node: '>=12'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-series@3.0.0: + resolution: {integrity: sha512-geaabIwiqy+jN4vuJROl1rpMJT/myHAMAfdubPQGJT3Grr8td+ogWvTk2qLsNlhYXcoZZAfl01pfq7lK3/gYKQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pac-proxy-agent@7.0.2: + resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + 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'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.25.0: + resolution: {integrity: sha512-6bYnzlLxXV3OSpUxLdaxBmE7PMOu0aR3pG6lryK/0jmvcDFPlcXGQAt5DpK3RITWiDrfYZRI0druyaK/S9kYLg==} + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@9.1.0: + resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} + engines: {node: '>=18'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + + psl@1.13.0: + resolution: {integrity: sha512-BFwmFXiJoFqlUpZ5Qssolv15DMyc84gTBds1BjsV1BfXEo1UyyD7GsmN67n7J77uRhoSNW1AXtXKPLcBFQn9Aw==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + regex-recursion@4.2.1: + resolution: {integrity: sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.0.2: + resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + 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==} + + rimraf@2.5.4: + resolution: {integrity: sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + rollup-plugin-analyzer@4.0.0: + resolution: {integrity: sha512-LL9GEt3bkXp6Wa19SNR5MWcvHNMvuTFYg+eYBZN2OIFhSWN+pEJUQXEKu5BsOeABob3x9PDaLKW7w5iOJnsESQ==} + engines: {node: '>=8.0.0'} + + rollup-plugin-typescript2@0.36.0: + resolution: {integrity: sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==} + peerDependencies: + rollup: '>=1.26.3' + typescript: '>=2.4.0' + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.27.4: + resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + + search-insights@2.17.1: + resolution: {integrity: sha512-HHFjYH/0AqXacETlIbe9EYc3UNlQYGNNTY0fZ/sWl6SweX+GDxq9NB5+RVoPLgEFuOtCz7M9dhYxqDnhbbF0eQ==} + + selenium-webdriver@4.6.1: + resolution: {integrity: sha512-FT8Dw0tbzaTp8YYLuwhaCnve/nw03HKrOJrA3aUmTKmxaIFSP4kT2R5fN3K0RpV5kbR0ZnM4FGVI2vANBvekaA==} + engines: {node: '>= 14.20.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + + serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@1.23.1: + resolution: {integrity: sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git-hooks@2.13.0: + resolution: {integrity: sha512-N+goiLxlkHJlyaYEglFypzVNMaNplPAk5syu0+OPp/Bk6dwVoXF6FfOw2vO0Dp+JHsBaI+w6cm8TnFl2Hw6tDA==} + hasBin: true + + simple-git@3.27.0: + resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + smob@1.4.0: + resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} + + socks-proxy-agent@8.0.4: + resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + engines: {node: '>= 14'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + + streamx@2.20.0: + resolution: {integrity: sha512-ZGd1LhDeGFucr1CUCTBOS58ZhEendd0ttpGT3usTvosS4ntIwKN9LJFp+OeCSprsCPL14BXVRZlHGRY1V9PVzQ==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tcp-port-used@1.0.2: + resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + temp-fs@0.9.9: + resolution: {integrity: sha512-WfecDCR1xC9b0nsrzSaxPf3ZuWeWLUWblW4vlDQAa1biQaKHiImHnJfeQocQe/hXKMcolRzgkcVX/7kK4zoWbw==} + engines: {node: '>=0.8.0'} + + tempfile@3.0.0: + resolution: {integrity: sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==} + engines: {node: '>=8'} + + terser@5.32.0: + resolution: {integrity: sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + text-decoder@1.1.1: + resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typedoc-plugin-markdown@4.2.10: + resolution: {integrity: sha512-PLX3pc1/7z13UJm4TDE9vo9jWGcClFUErXXtd5LdnoLjV6mynPpqZLU992DwMGFSRqJFZeKbVyqlNNeNHnk2tQ==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.26.x + + typedoc@0.26.11: + resolution: {integrity: sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==} + engines: {node: '>= 18'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x + + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + 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@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@5.4.18: + resolution: {integrity: sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitepress-translation-helper@0.2.1: + resolution: {integrity: sha512-zYjakGIdVDonT1P85OkeQcdE6e8vdmKiVclHB7DGcTzFUwb2D0w+hcC31AGneB5wa5IiqEoipycSTYNKM0YKJg==} + hasBin: true + peerDependencies: + vitepress: ^1.0.0 + vue: ^3.4.8 + + vitepress@1.5.0: + resolution: {integrity: sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-component-type-helpers@2.0.21: + resolution: {integrity: sha512-3NaicyZ7N4B6cft4bfb7dOnPbE9CjLcx+6wZWAg5zwszfO4qXRh+U52dN5r5ZZfc6iMaxKCEcoH9CmxxoFZHLg==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-tsc@2.2.10: + resolution: {integrity: sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + w3c-xmlserializer@3.0.0: + resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} + engines: {node: '>=12'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@10.0.0: + resolution: {integrity: sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==} + engines: {node: '>=12'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + workerpool@6.2.0: + resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.1)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.1) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.1)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + search-insights: 2.17.1 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + '@algolia/client-search': 5.15.0 + algoliasearch: 5.15.0 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': + dependencies: + '@algolia/client-search': 5.15.0 + algoliasearch: 5.15.0 + + '@algolia/client-abtesting@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + '@algolia/client-analytics@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + '@algolia/client-common@5.15.0': {} + + '@algolia/client-insights@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + '@algolia/client-personalization@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + '@algolia/client-query-suggestions@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + '@algolia/client-search@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + '@algolia/ingestion@1.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + '@algolia/monitoring@1.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + '@algolia/recommend@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + '@algolia/requester-browser-xhr@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + + '@algolia/requester-fetch@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + + '@algolia/requester-node-http@5.15.0': + dependencies: + '@algolia/client-common': 5.15.0 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.22.10': + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/highlight@7.22.10': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@0.2.3': {} + + '@colors/colors@1.5.0': + optional: true + + '@docsearch/css@3.8.0': {} + + '@docsearch/js@3.8.0(@algolia/client-search@5.15.0)(search-insights@2.17.1)': + dependencies: + '@docsearch/react': 3.8.0(@algolia/client-search@5.15.0)(search-insights@2.17.1) + preact: 10.25.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.0(@algolia/client-search@5.15.0)(search-insights@2.17.1)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.1) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + '@docsearch/css': 3.8.0 + algoliasearch: 5.15.0 + optionalDependencies: + search-insights: 2.17.1 + transitivePeerDependencies: + - '@algolia/client-search' + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@hutson/parse-repository-url@3.0.2': {} + + '@iconify-json/simple-icons@1.2.13': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.1': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@microsoft/api-extractor-model@7.30.0(@types/node@22.15.2)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.10.0(@types/node@22.15.2) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.48.0(@types/node@22.15.2)': + dependencies: + '@microsoft/api-extractor-model': 7.30.0(@types/node@22.15.2) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.10.0(@types/node@22.15.2) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.14.3(@types/node@22.15.2) + '@rushstack/ts-command-line': 4.23.1(@types/node@22.15.2) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.17.1': + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.8 + + '@microsoft/tsdoc@0.15.1': {} + + '@nightwatch/chai@5.0.2': + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.0.1 + loupe: 2.3.4 + pathval: 1.1.1 + type-detect: 4.0.8 + + '@nightwatch/html-reporter-template@0.2.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@polka/url@1.0.0-next.28': {} + + '@rollup/plugin-alias@5.1.1(rollup@3.29.5)': + optionalDependencies: + rollup: 3.29.5 + + '@rollup/plugin-commonjs@25.0.8(rollup@3.29.5)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@3.29.5) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.30.13 + optionalDependencies: + rollup: 3.29.5 + + '@rollup/plugin-node-resolve@15.3.1(rollup@3.29.5)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@3.29.5) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.8 + optionalDependencies: + rollup: 3.29.5 + + '@rollup/plugin-replace@5.0.7(rollup@3.29.5)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@3.29.5) + magic-string: 0.30.13 + optionalDependencies: + rollup: 3.29.5 + + '@rollup/plugin-terser@0.4.4(rollup@3.29.5)': + dependencies: + serialize-javascript: 6.0.1 + smob: 1.4.0 + terser: 5.32.0 + optionalDependencies: + rollup: 3.29.5 + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@rollup/pluginutils@5.1.0(rollup@3.29.5)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 3.29.5 + + '@rollup/rollup-android-arm-eabi@4.27.4': + optional: true + + '@rollup/rollup-android-arm64@4.27.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.27.4': + optional: true + + '@rollup/rollup-darwin-x64@4.27.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.27.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.27.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.27.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.27.4': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.27.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.27.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.27.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.27.4': + optional: true + + '@rushstack/node-core-library@5.10.0(@types/node@22.15.2)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + optionalDependencies: + '@types/node': 22.15.2 + + '@rushstack/rig-package@0.5.3': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.14.3(@types/node@22.15.2)': + dependencies: + '@rushstack/node-core-library': 5.10.0(@types/node@22.15.2) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.15.2 + + '@rushstack/ts-command-line@4.23.1(@types/node@22.15.2)': + dependencies: + '@rushstack/terminal': 0.14.3(@types/node@22.15.2) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@sec-ant/readable-stream@0.4.1': {} + + '@shikijs/core@1.23.1': + dependencies: + '@shikijs/engine-javascript': 1.23.1 + '@shikijs/engine-oniguruma': 1.23.1 + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + + '@shikijs/engine-javascript@1.23.1': + dependencies: + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-es: 0.4.1 + + '@shikijs/engine-oniguruma@1.23.1': + dependencies: + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + + '@shikijs/transformers@1.23.1': + dependencies: + shiki: 1.23.1 + + '@shikijs/types@1.23.1': + dependencies: + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.0': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@testim/chrome-version@1.1.4': {} + + '@tootallnate/once@2.0.0': {} + + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@types/argparse@1.0.38': {} + + '@types/chai@4.3.16': {} + + '@types/estree@1.0.6': {} + + '@types/estree@1.0.7': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/jsdom@21.1.7': + dependencies: + '@types/node': 20.17.7 + '@types/tough-cookie': 4.0.5 + parse5: 7.2.1 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/minimist@1.2.2': {} + + '@types/nightwatch@2.3.32': + dependencies: + '@types/chai': 4.3.16 + '@types/node': 20.17.7 + '@types/selenium-webdriver': 4.1.23 + devtools-protocol: 0.0.1025565 + + '@types/node@20.17.31': + dependencies: + undici-types: 6.19.8 + + '@types/node@20.17.7': + dependencies: + undici-types: 6.19.8 + + '@types/node@22.15.2': + dependencies: + undici-types: 6.21.0 + optional: true + + '@types/normalize-package-data@2.4.1': {} + + '@types/resolve@1.20.2': {} + + '@types/selenium-webdriver@4.1.23': + dependencies: + '@types/node': 20.17.7 + '@types/ws': 8.5.10 + + '@types/tough-cookie@4.0.5': {} + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.20': {} + + '@types/ws@8.5.10': + dependencies: + '@types/node': 20.17.7 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.15.2 + optional: true + + '@ungap/promise-all-settled@1.1.2': {} + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.15.2)(terser@5.32.0))(vue@3.5.13(typescript@5.6.3))': + dependencies: + vite: 5.4.11(@types/node@22.15.2)(terser@5.32.0) + vue: 3.5.13(typescript@5.6.3) + + '@vitejs/plugin-vue@5.2.3(vite@5.4.18(@types/node@20.17.31)(terser@5.32.0))(vue@3.5.13(typescript@5.6.3))': + dependencies: + vite: 5.4.18(@types/node@20.17.31)(terser@5.32.0) + vue: 3.5.13(typescript@5.6.3) + + '@vitejs/plugin-vue@5.2.3(vite@5.4.18(@types/node@22.15.2)(terser@5.32.0))(vue@3.5.13(typescript@5.6.3))': + dependencies: + vite: 5.4.18(@types/node@22.15.2)(terser@5.32.0) + vue: 3.5.13(typescript@5.6.3) + + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@22.15.2)(@vitest/ui@2.1.9)(happy-dom@15.11.7)(jsdom@19.0.0)(terser@5.32.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.13 + magicast: 0.3.5 + std-env: 3.8.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.9(@types/node@22.15.2)(@vitest/ui@2.1.9)(happy-dom@15.11.7)(jsdom@19.0.0)(terser@5.32.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.9(vite@5.4.18(@types/node@22.15.2)(terser@5.32.0))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.13 + optionalDependencies: + vite: 5.4.18(@types/node@22.15.2)(terser@5.32.0) + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.13 + pathe: 1.1.2 + + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + + '@vitest/ui@2.1.9(vitest@2.1.9)': + dependencies: + '@vitest/utils': 2.1.9 + fflate: 0.8.2 + flatted: 3.3.2 + pathe: 1.1.2 + sirv: 3.0.0 + tinyglobby: 0.2.10 + tinyrainbow: 1.2.0 + vitest: 2.1.9(@types/node@22.15.2)(@vitest/ui@2.1.9)(happy-dom@15.11.7)(jsdom@19.0.0)(terser@5.32.0) + + '@vitest/utils@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.1.3 + tinyrainbow: 1.2.0 + + '@volar/language-core@2.4.12': + dependencies: + '@volar/source-map': 2.4.12 + + '@volar/source-map@2.4.12': {} + + '@volar/typescript@2.4.12': + dependencies: + '@volar/language-core': 2.4.12 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.2 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.2 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.13 + postcss: 8.4.49 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.6.4': + dependencies: + '@vue/devtools-kit': 7.6.4 + + '@vue/devtools-kit@7.6.4': + dependencies: + '@vue/devtools-shared': 7.6.4 + birpc: 0.2.19 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.1 + + '@vue/devtools-shared@7.6.4': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@2.2.10(typescript@5.6.3)': + dependencies: + '@volar/language-core': 2.4.12 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 1.0.13 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.6.3 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.6.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.6.3) + + '@vue/shared@3.5.13': {} + + '@vue/test-utils@2.4.6': + dependencies: + js-beautify: 1.15.1 + vue-component-type-helpers: 2.0.21 + + '@vue/tsconfig@0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3))': + optionalDependencies: + typescript: 5.6.3 + vue: 3.5.13(typescript@5.6.3) + + '@vueuse/core@11.3.0(vue@3.5.13(typescript@5.6.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 11.3.0 + '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.6.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/integrations@11.3.0(axios@1.7.7)(focus-trap@7.6.2)(vue@3.5.13(typescript@5.6.3))': + dependencies: + '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.6.3)) + '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.6.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) + optionalDependencies: + axios: 1.7.7 + focus-trap: 7.6.2 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@11.3.0': {} + + '@vueuse/shared@11.3.0(vue@3.5.13(typescript@5.6.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@wdio/logger@9.0.8': + dependencies: + chalk: 5.4.1 + loglevel: 1.9.2 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + + '@zip.js/zip.js@2.7.52': {} + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + acorn-globals@6.0.0: + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + + acorn-walk@7.2.0: {} + + acorn@7.4.1: {} + + acorn@8.14.0: {} + + add-stream@1.0.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.1: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ajv@8.13.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + algoliasearch@5.15.0: + dependencies: + '@algolia/client-abtesting': 5.15.0 + '@algolia/client-analytics': 5.15.0 + '@algolia/client-common': 5.15.0 + '@algolia/client-insights': 5.15.0 + '@algolia/client-personalization': 5.15.0 + '@algolia/client-query-suggestions': 5.15.0 + '@algolia/client-search': 5.15.0 + '@algolia/ingestion': 1.15.0 + '@algolia/monitoring': 1.15.0 + '@algolia/recommend': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 + + alien-signals@1.0.13: {} + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.1: {} + + ansi-colors@4.1.3: {} + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + ansi-to-html@0.7.2: + dependencies: + entities: 2.2.0 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-ify@1.0.0: {} + + arrify@1.0.1: {} + + assertion-error@1.1.0: {} + + assertion-error@2.0.1: {} + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + + async@3.2.4: {} + + asynckit@0.4.0: {} + + axe-core@4.7.2: {} + + axios@1.7.7: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + b4a@1.6.6: {} + + balanced-match@1.0.2: {} + + bare-events@2.4.2: + optional: true + + bare-fs@2.3.3: + dependencies: + bare-events: 2.4.2 + bare-path: 2.1.3 + bare-stream: 2.2.1 + optional: true + + bare-os@2.4.2: + optional: true + + bare-path@2.1.3: + dependencies: + bare-os: 2.4.2 + optional: true + + bare-stream@2.2.1: + dependencies: + b4a: 1.6.6 + streamx: 2.20.0 + optional: true + + base64-js@1.5.1: {} + + basic-ftp@5.0.5: {} + + binary-extensions@2.2.0: {} + + birpc@0.2.19: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + browser-process-hrtime@1.0.0: {} + + browser-stdout@1.3.1: {} + + browserstack-local@1.5.6: + dependencies: + agent-base: 6.0.2 + https-proxy-agent: 5.0.1 + is-running: 2.1.0 + ps-tree: 1.2.0 + temp-fs: 0.9.9 + transitivePeerDependencies: + - supports-color + + buffer-crc32@0.2.13: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + cac@6.7.14: {} + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + ccount@2.0.1: {} + + chai-nightwatch@0.5.3: + dependencies: + assertion-error: 1.1.0 + + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + check-error@1.0.2: {} + + check-error@2.1.1: {} + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chromedriver@131.0.5: + dependencies: + '@testim/chrome-version': 1.1.4 + axios: 1.7.7 + compare-versions: 6.1.1 + extract-zip: 2.0.1 + proxy-agent: 6.4.0 + proxy-from-env: 1.1.0 + tcp-port-used: 1.0.2 + transitivePeerDependencies: + - debug + - supports-color + + ci-info@3.3.0: {} + + cli-boxes@2.2.1: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.0: {} + + cli-table3@0.6.3: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@10.0.1: {} + + commander@13.1.0: {} + + commander@2.20.3: {} + + commondir@1.0.1: {} + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + compare-versions@6.1.1: {} + + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + connect-history-api-fallback@1.6.0: {} + + conventional-changelog-angular@5.0.13: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-atom@2.0.8: + dependencies: + q: 1.5.1 + + conventional-changelog-cli@2.2.2: + dependencies: + add-stream: 1.0.0 + conventional-changelog: 3.1.25 + lodash: 4.17.21 + meow: 8.1.2 + tempfile: 3.0.0 + + conventional-changelog-codemirror@2.0.8: + dependencies: + q: 1.5.1 + + conventional-changelog-conventionalcommits@4.6.3: + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + + conventional-changelog-core@4.2.4: + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + + conventional-changelog-ember@2.0.9: + dependencies: + q: 1.5.1 + + conventional-changelog-eslint@3.0.9: + dependencies: + q: 1.5.1 + + conventional-changelog-express@2.0.6: + dependencies: + q: 1.5.1 + + conventional-changelog-jquery@3.0.11: + dependencies: + q: 1.5.1 + + conventional-changelog-jshint@2.0.9: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-preset-loader@2.3.4: {} + + conventional-changelog-writer@5.0.1: + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.1 + split: 1.0.1 + through2: 4.0.2 + + conventional-changelog@3.1.25: + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + + conventional-commits-filter@2.0.7: + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + + conventional-commits-parser@3.2.4: + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + core-util-is@1.0.3: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssom@0.3.8: {} + + cssom@0.5.0: {} + + cssstyle@2.3.0: + dependencies: + cssom: 0.3.8 + + csstype@3.1.3: {} + + dargs@7.0.0: {} + + data-uri-to-buffer@4.0.1: {} + + data-uri-to-buffer@6.0.2: {} + + data-urls@3.0.2: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + + dateformat@3.0.3: {} + + de-indent@1.0.2: {} + + debug@4.3.1: + dependencies: + ms: 2.1.2 + + debug@4.3.3(supports-color@8.1.1): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decamelize@4.0.0: {} + + decamelize@6.0.0: {} + + decimal.js@10.4.3: {} + + deep-eql@4.0.1: + dependencies: + type-detect: 4.0.8 + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-lazy-prop@2.0.0: {} + + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + devtools-protocol@0.0.1025565: {} + + didyoumean@1.2.2: {} + + diff@5.0.0: {} + + domexception@4.0.0: + dependencies: + webidl-conversions: 7.0.0 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dotenv@10.0.0: {} + + dotenv@16.5.0: {} + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + ejs@3.1.8: + dependencies: + jake: 10.8.7 + + emoji-regex-xs@1.0.0: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@2.2.0: {} + + entities@4.5.0: {} + + envinfo@7.8.1: {} + + environment@1.1.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-module-lexer@1.7.0: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.1.1: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.7 + + esutils@2.0.3: {} + + event-stream@3.3.4: + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + + eventemitter3@5.0.1: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + execa@9.5.2: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.3 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.1.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + + expect-type@1.1.0: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.3.7 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + faked-promise@2.2.2: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + 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 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fflate@0.8.2: {} + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + flatted@3.3.2: {} + + focus-trap@7.6.2: + dependencies: + tabbable: 6.2.0 + + follow-redirects@1.15.9: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + from@0.1.7: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + geckodriver@4.5.1: + dependencies: + '@wdio/logger': 9.0.8 + '@zip.js/zip.js': 2.7.52 + decamelize: 6.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + node-fetch: 3.3.2 + tar-fs: 3.0.6 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + get-func-name@2.0.2: {} + + get-pkg-repo@4.2.1: + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-stream@8.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-uri@6.0.3: + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.3.7 + fs-extra: 11.2.0 + transitivePeerDependencies: + - supports-color + + git-raw-commits@2.0.11: + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + git-remote-origin-url@2.0.0: + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + + git-semver-tags@4.1.1: + dependencies: + meow: 8.1.2 + semver: 6.3.1 + + gitconfiglocal@1.0.0: + dependencies: + ini: 1.3.8 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.2: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.0 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.1 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 2.0.0 + + glob@7.2.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 + + glob@7.2.3: + 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 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.4 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + + graceful-fs@4.2.11: {} + + growl@1.10.5: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + + happy-dom@15.11.7: + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + + hard-rejection@2.1.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.0: dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true + function-bind: 1.1.2 - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hast-util-to-html@9.0.3: dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hast-util-whitespace@3.0.0: dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 - dev: true - - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.4 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 - dev: true + '@types/hast': 3.0.4 - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + he@1.2.0: {} + + hookable@5.5.3: {} + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: dependencies: - '@types/node': 20.10.4 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true + lru-cache: 6.0.0 - /jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + html-encoding-sniffer@3.0.0: + dependencies: + whatwg-encoding: 2.0.0 + + html-escaper@2.0.2: {} + + html-void-elements@3.0.0: {} + + http-proxy-agent@5.0.0: dependencies: - '@jest/core': 29.7.0 - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0 + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.0 transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - supports-color - - ts-node - dev: true - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color - /js-beautify@1.14.9: - resolution: {integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==} - engines: {node: '>=12'} - hasBin: true + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + human-signals@8.0.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@7.0.4: {} + + immediate@3.0.6: {} + + import-lazy@4.0.0: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + ip-regex@4.3.0: {} + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.2.0 + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.0 + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@1.0.0: {} + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@2.1.0: {} + + is-plain-obj@4.1.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.6 + + is-running@2.1.0: {} + + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + + is-text-path@1.0.1: + dependencies: + text-extensions: 1.9.0 + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@2.1.0: {} + + is-url@1.2.4: {} + + is-what@4.1.16: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is2@2.0.9: + dependencies: + deep-is: 0.1.4 + ip-regex: 4.3.0 + is-url: 1.2.4 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.0: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.0.1: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.8.7: + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jju@1.4.0: {} + + js-beautify@1.15.1: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 - glob: 8.1.0 - nopt: 6.0.0 - dev: true + glob: 10.4.2 + js-cookie: 3.0.5 + nopt: 7.2.1 - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + js-cookie@3.0.5: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true + js-tokens@4.0.0: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsdom@19.0.0: - resolution: {integrity: sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==} - engines: {node: '>=12'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true + jsbn@1.1.0: {} + + jsdom@19.0.0: dependencies: abab: 2.0.6 - acorn: 8.10.0 + acorn: 8.14.0 acorn-globals: 6.0.0 cssom: 0.5.0 cssstyle: 2.3.0 @@ -4939,251 +5911,124 @@ packages: decimal.js: 10.4.3 domexception: 4.0.0 escodegen: 2.1.0 - form-data: 4.0.0 + form-data: 4.0.1 html-encoding-sniffer: 3.0.0 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 + nwsapi: 2.2.13 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 4.1.4 w3c-hr-time: 1.0.2 w3c-xmlserializer: 3.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 10.0.0 - ws: 8.13.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - acorn: 8.10.0 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.4.3 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.13.0 + ws: 8.18.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-parse-better-errors@1.0.2: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json-schema-traverse@1.0.0: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + json-stringify-safe@5.0.1: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + jszip@3.10.1: dependencies: lie: 3.3.0 pako: 1.0.11 readable-stream: 2.3.8 setimmediate: 1.0.5 - dev: true - - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true + kind-of@6.0.3: {} - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lie@3.3.0: dependencies: immediate: 3.0.6 - dev: true - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: true + lilconfig@3.1.3: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /lint-staged@15.2.0: - resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} - engines: {node: '>=18.12.0'} - hasBin: true + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lint-staged@15.5.1: dependencies: - chalk: 5.3.0 - commander: 11.1.0 - debug: 4.3.4 + chalk: 5.4.1 + commander: 13.1.0 + debug: 4.4.0 execa: 8.0.1 - lilconfig: 3.0.0 - listr2: 8.0.0 - micromatch: 4.0.5 + lilconfig: 3.1.3 + listr2: 8.3.2 + micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.3.4 + yaml: 2.7.1 transitivePeerDependencies: - supports-color - dev: true - /listr2@8.0.0: - resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} - engines: {node: '>=18.0.0'} + listr2@8.3.2: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 eventemitter3: 5.0.1 - log-update: 6.0.0 - rfdc: 1.3.0 + log-update: 6.1.0 + rfdc: 1.4.1 wrap-ansi: 9.0.0 - dev: true - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + locate-path@2.0.0: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash._arraycopy@3.0.0: - resolution: {integrity: sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==} - dev: true + lodash._arraycopy@3.0.0: {} - /lodash._arrayeach@3.0.0: - resolution: {integrity: sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==} - dev: true + lodash._arrayeach@3.0.0: {} - /lodash._baseassign@3.2.0: - resolution: {integrity: sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==} + lodash._baseassign@3.2.0: dependencies: lodash._basecopy: 3.0.1 lodash.keys: 3.1.2 - dev: true - /lodash._baseclone@3.3.0: - resolution: {integrity: sha512-1K0dntf2dFQ5my0WoGKkduewR6+pTNaqX03kvs45y7G5bzl4B3kTR4hDfJIc2aCQDeLyQHhS280tc814m1QC1Q==} + lodash._baseclone@3.3.0: dependencies: lodash._arraycopy: 3.0.0 lodash._arrayeach: 3.0.0 @@ -5191,204 +6036,130 @@ packages: lodash._basefor: 3.0.3 lodash.isarray: 3.0.4 lodash.keys: 3.1.2 - dev: true - /lodash._basecopy@3.0.1: - resolution: {integrity: sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==} - dev: true + lodash._basecopy@3.0.1: {} - /lodash._basefor@3.0.3: - resolution: {integrity: sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==} - dev: true + lodash._basefor@3.0.3: {} - /lodash._bindcallback@3.0.1: - resolution: {integrity: sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==} - dev: true + lodash._bindcallback@3.0.1: {} - /lodash._getnative@3.9.1: - resolution: {integrity: sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==} - dev: true + lodash._getnative@3.9.1: {} - /lodash._isiterateecall@3.0.9: - resolution: {integrity: sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==} - dev: true + lodash._isiterateecall@3.0.9: {} - /lodash.clone@3.0.3: - resolution: {integrity: sha512-yVYPpFTdZDCLG2p07gVRTvcwN5X04oj2hu4gG6r0fer58JA08wAVxXzWM+CmmxO2bzOH8u8BkZTZqgX6juVF7A==} + lodash.clone@3.0.3: dependencies: lodash._baseclone: 3.3.0 lodash._bindcallback: 3.0.1 lodash._isiterateecall: 3.0.9 - dev: true - - /lodash.defaultsdeep@4.6.1: - resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==} - dev: true - - /lodash.escape@4.0.1: - resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} - dev: true - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true + lodash.defaultsdeep@4.6.1: {} - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: true + lodash.escape@4.0.1: {} - /lodash.isarray@3.0.4: - resolution: {integrity: sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==} - dev: true + lodash.isarguments@3.1.0: {} - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true + lodash.isarray@3.0.4: {} - /lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: true + lodash.ismatch@4.4.0: {} - /lodash.keys@3.1.2: - resolution: {integrity: sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==} + lodash.keys@3.1.2: dependencies: lodash._getnative: 3.9.1 lodash.isarguments: 3.1.0 lodash.isarray: 3.0.4 - dev: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.pick@4.4.0: - resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} - dev: true + lodash.pick@4.4.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} + log-update@6.1.0: dependencies: - ansi-escapes: 6.2.0 - cli-cursor: 4.0.0 + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 - dev: true - - /loupe@2.3.4: - resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==} - deprecated: Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5 - dependencies: - get-func-name: 2.0.0 - dev: true + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true + loglevel-plugin-prefix@0.8.4: {} - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - dev: true + loglevel@1.9.2: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + loupe@2.3.4: dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true + get-func-name: 2.0.2 - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true + loupe@3.1.3: {} - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@10.4.3: {} + + lru-cache@11.0.1: {} + + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: true + lru-cache@7.18.3: {} - /magic-string@0.30.3: - resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} - engines: {node: '>=12'} + lunr@2.3.9: {} + + magic-string@0.30.13: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + '@jridgewell/sourcemap-codec': 1.5.0 - /magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} + magicast@0.3.5: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + source-map-js: 1.2.1 - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - dev: true - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: - semver: 7.5.4 - dev: true + semver: 7.7.1 - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true + map-obj@1.0.1: {} - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@4.3.0: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-stream@0.1.0: {} - /map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - dev: true + mark.js@8.11.1: {} - /mark.js@8.11.1: - resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - dev: false + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 - /marked@4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} - hasBin: true - dev: true + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + mdurl@2.0.0: {} + + meow@8.1.2: dependencies: '@types/minimist': 1.2.2 camelcase-keys: 6.2.2 @@ -5401,146 +6172,92 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: dependencies: - braces: 3.0.2 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 picomatch: 2.3.1 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: true + mimic-function@5.0.1: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true + min-indent@1.0.1: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.0.8: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@4.2.1: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.1: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - - /minimist@1.2.6: - resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: true + minimist@1.2.6: {} - /minipass@7.0.3: - resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minimist@1.2.8: {} - /minisearch@6.3.0: - resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} - dev: false + minipass@7.1.2: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - dev: true + minisearch@7.1.1: {} - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true + mitt@3.0.1: {} - /mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true + mocha@9.2.2: dependencies: '@ungap/promise-all-settled': 1.1.2 ansi-colors: 4.1.1 @@ -5566,76 +6283,32 @@ packages: yargs: 16.2.0 yargs-parser: 20.2.4 yargs-unparser: 2.0.0 - dev: true - /modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - dev: true + modify-values@1.0.1: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + mrmime@2.0.0: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.2: {} - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - dev: true + ms@2.1.3: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true + muggle-string@0.4.1: {} - /nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.1: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + neo-async@2.6.2: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + netmask@2.0.2: {} - /nightwatch-axe-verbose@2.2.2: - resolution: {integrity: sha512-MvCrQb9D/ixtGtyN5fh7YCkelXuPup3X9D2Zhhk1PWyALtkdYCFadnIGif1irpQ1BLNSlqC+FDNnsNald7KHYA==} + nightwatch-axe-verbose@2.2.2: dependencies: axe-core: 4.7.2 - dev: true - /nightwatch-helpers@1.2.0: - resolution: {integrity: sha512-TeYlrNctoy0rJdVAYKoouG+mwv1FmfZkArdBM76sM6090BOt5mKzJNr24lr9PFdDpBrjKhS6b/b6qJzGY/wCig==} - dev: true + nightwatch-helpers@1.2.0: {} - /nightwatch@2.6.24(chromedriver@119.0.1)(geckodriver@3.2.0): - resolution: {integrity: sha512-XRLlmZLWv/a35ZZ0Ev1FVizqx+d5K4aDv/vV1++I1JJzyBu/vftx4ALKCrR0nmNqqQfBBO+p/h10r+ayyU9TRw==} - engines: {node: '>= 12.0.0'} - hasBin: true - peerDependencies: - '@cucumber/cucumber': '*' - chromedriver: '*' - geckodriver: '*' - peerDependenciesMeta: - '@cucumber/cucumber': - optional: true - chromedriver: - optional: true - geckodriver: - optional: true + nightwatch@2.6.25(chromedriver@131.0.5)(geckodriver@4.5.1): dependencies: '@nightwatch/chai': 5.0.2 '@nightwatch/html-reporter-template': 0.2.1 @@ -5643,7 +6316,6 @@ packages: assertion-error: 1.1.0 boxen: 5.1.2 chai-nightwatch: 0.5.3 - chromedriver: 119.0.1 ci-info: 3.3.0 cli-table3: 0.6.3 didyoumean: 1.2.2 @@ -5651,7 +6323,6 @@ packages: ejs: 3.1.8 envinfo: 7.8.1 fs-extra: 10.1.0 - geckodriver: 3.2.0 glob: 7.2.3 jsdom: 19.0.0 lodash.clone: 3.0.3 @@ -5671,125 +6342,83 @@ packages: strip-ansi: 6.0.1 untildify: 4.0.0 uuid: 8.3.2 + optionalDependencies: + chromedriver: 131.0.5 + geckodriver: 4.5.1 transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate - dev: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true + node-domexception@1.0.0: {} - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true + nopt@7.2.1: dependencies: - abbrev: 1.1.1 - dev: true + abbrev: 2.0.0 - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.5.4 + semver: 7.7.1 validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@1.0.0: - resolution: {integrity: sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: true - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: true + normalize-path@3.0.0: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@5.3.0: dependencies: - path-key: 3.1.1 - dev: true + path-key: 4.0.0 - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: dependencies: path-key: 4.0.0 - dev: true + unicorn-magic: 0.3.0 - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true + nwsapi@2.2.13: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /open@8.4.0: - resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} - engines: {node: '>=12'} + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + oniguruma-to-es@0.4.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.0.2 + regex-recursion: 4.2.1 + + open@8.4.0: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -5800,379 +6429,230 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true - - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + p-limit@1.3.0: dependencies: p-try: 1.0.0 - dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + p-locate@2.0.0: dependencies: p-limit: 1.3.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-series@3.0.0: - resolution: {integrity: sha512-geaabIwiqy+jN4vuJROl1rpMJT/myHAMAfdubPQGJT3Grr8td+ogWvTk2qLsNlhYXcoZZAfl01pfq7lK3/gYKQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + p-series@3.0.0: {} - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true + p-try@1.0.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true + pac-proxy-agent@7.0.2: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.1 + debug: 4.3.7 + get-uri: 6.0.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + + package-json-from-dist@1.0.0: {} + + pako@1.0.11: {} + + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.22.10 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true + parse-ms@4.0.0: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@6.0.1: {} + + parse5@7.2.1: dependencies: entities: 4.5.0 - dev: true - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + path-browserify@1.0.1: {} - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true + path-key@3.1.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@4.0.0: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-parse@1.0.7: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@2.0.0: dependencies: - lru-cache: 10.0.1 - minipass: 7.0.3 - dev: true + lru-cache: 11.0.1 + minipass: 7.1.2 - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + path-type@3.0.0: dependencies: pify: 3.0.0 - dev: true - /path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} - dev: true + path-type@6.0.0: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathe@1.1.2: {} - /pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + pathval@1.1.1: {} + + pathval@2.0.0: {} + + pause-stream@0.0.11: dependencies: through: 2.3.8 - dev: true - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true + pend@1.2.0: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + perfect-debounce@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picocolors@1.1.1: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + picomatch@2.3.1: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true + picomatch@4.0.2: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true + pidtree@0.6.0: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true + pify@2.3.0: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pify@3.0.0: {} + + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 + picocolors: 1.1.1 + source-map-js: 1.2.1 - /preact@10.17.1: - resolution: {integrity: sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==} - dev: false + preact@10.25.0: {} - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@3.5.3: {} - /pretty-format@29.6.3: - resolution: {integrity: sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-ms@9.1.0: dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true + parse-ms: 4.0.0 - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true + process-nextick-args@2.0.1: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true + property-information@6.5.0: {} - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true + proto-list@1.2.4: {} - /proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - dev: true + proxy-agent@6.4.0: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.2 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true + proxy-from-env@1.1.0: {} - /ps-tree@1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - hasBin: true + ps-tree@1.2.0: dependencies: event-stream: 3.3.4 - dev: true - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true + psl@1.13.0: + dependencies: + punycode: 2.3.1 - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode.js@2.3.1: {} - /pure-rand@6.0.2: - resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} - dev: true + punycode@2.3.1: {} - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true + q@1.5.1: {} - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true + querystringify@2.2.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + queue-tick@1.0.1: {} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true + quick-lru@4.0.1: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - /read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + read-pkg-up@3.0.0: dependencies: find-up: 2.1.0 read-pkg: 3.0.0 - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.1 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -6181,1071 +6661,651 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + regex-recursion@4.2.1: + dependencies: + regex-utilities: 2.3.0 - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true + regex-utilities@2.3.0: {} - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + regex@5.0.2: dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + regex-utilities: 2.3.0 - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true + require-directory@2.1.1: {} - /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - dev: true + require-from-string@2.0.2: {} - /resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} - hasBin: true - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true + requires-port@1.0.0: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@5.1.0: dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true + onetime: 7.0.0 + signal-exit: 4.1.0 - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.1.0: {} - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true + rfdc@1.4.1: {} - /rimraf@2.5.4: - resolution: {integrity: sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==} - hasBin: true + rimraf@2.5.4: dependencies: glob: 7.2.3 - dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} - hasBin: true + rimraf@6.0.1: dependencies: - glob: 10.3.10 - dev: true + glob: 11.0.0 + package-json-from-dist: 1.0.0 - /rollup-plugin-analyzer@4.0.0: - resolution: {integrity: sha512-LL9GEt3bkXp6Wa19SNR5MWcvHNMvuTFYg+eYBZN2OIFhSWN+pEJUQXEKu5BsOeABob3x9PDaLKW7w5iOJnsESQ==} - engines: {node: '>=8.0.0'} - dev: true + rollup-plugin-analyzer@4.0.0: {} - /rollup-plugin-typescript2@0.36.0(rollup@3.29.4)(typescript@5.3.3): - resolution: {integrity: sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==} - peerDependencies: - rollup: '>=1.26.3' - typescript: '>=2.4.0' + rollup-plugin-typescript2@0.36.0(rollup@3.29.5)(typescript@5.6.3): dependencies: '@rollup/pluginutils': 4.2.1 find-cache-dir: 3.3.2 fs-extra: 10.1.0 - rollup: 3.29.4 - semver: 7.5.4 - tslib: 2.6.2 - typescript: 5.3.3 - dev: true + rollup: 3.29.5 + semver: 7.6.3 + tslib: 2.8.1 + typescript: 5.6.3 - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + rollup@3.29.5: optionalDependencies: fsevents: 2.3.3 - dev: true - /rollup@4.9.0: - resolution: {integrity: sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.27.4: + dependencies: + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.0 - '@rollup/rollup-android-arm64': 4.9.0 - '@rollup/rollup-darwin-arm64': 4.9.0 - '@rollup/rollup-darwin-x64': 4.9.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.0 - '@rollup/rollup-linux-arm64-gnu': 4.9.0 - '@rollup/rollup-linux-arm64-musl': 4.9.0 - '@rollup/rollup-linux-riscv64-gnu': 4.9.0 - '@rollup/rollup-linux-x64-gnu': 4.9.0 - '@rollup/rollup-linux-x64-musl': 4.9.0 - '@rollup/rollup-win32-arm64-msvc': 4.9.0 - '@rollup/rollup-win32-ia32-msvc': 4.9.0 - '@rollup/rollup-win32-x64-msvc': 4.9.0 + '@rollup/rollup-android-arm-eabi': 4.27.4 + '@rollup/rollup-android-arm64': 4.27.4 + '@rollup/rollup-darwin-arm64': 4.27.4 + '@rollup/rollup-darwin-x64': 4.27.4 + '@rollup/rollup-freebsd-arm64': 4.27.4 + '@rollup/rollup-freebsd-x64': 4.27.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 + '@rollup/rollup-linux-arm-musleabihf': 4.27.4 + '@rollup/rollup-linux-arm64-gnu': 4.27.4 + '@rollup/rollup-linux-arm64-musl': 4.27.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 + '@rollup/rollup-linux-riscv64-gnu': 4.27.4 + '@rollup/rollup-linux-s390x-gnu': 4.27.4 + '@rollup/rollup-linux-x64-gnu': 4.27.4 + '@rollup/rollup-linux-x64-musl': 4.27.4 + '@rollup/rollup-win32-arm64-msvc': 4.27.4 + '@rollup/rollup-win32-ia32-msvc': 4.27.4 + '@rollup/rollup-win32-x64-msvc': 4.27.4 fsevents: 2.3.3 - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.1.2: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safe-buffer@5.2.1: {} - /saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} - dependencies: - xmlchars: 2.2.0 - dev: true + safer-buffer@2.1.2: {} - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + saxes@5.0.1: dependencies: xmlchars: 2.2.0 - dev: true - /search-insights@2.7.0: - resolution: {integrity: sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==} - engines: {node: '>=8.16.0'} - dev: false + search-insights@2.17.1: {} - /selenium-webdriver@4.6.1: - resolution: {integrity: sha512-FT8Dw0tbzaTp8YYLuwhaCnve/nw03HKrOJrA3aUmTKmxaIFSP4kT2R5fN3K0RpV5kbR0ZnM4FGVI2vANBvekaA==} - engines: {node: '>= 14.20.0'} + selenium-webdriver@4.6.1: dependencies: jszip: 3.10.1 tmp: 0.2.1 - ws: 8.13.0 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} - engines: {node: '>=10'} - hasBin: true + semver@7.3.5: dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + semver@7.6.3: {} + + semver@7.7.1: {} + + serialize-javascript@6.0.0: dependencies: randombytes: 2.1.0 - dev: true - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + serialize-javascript@6.0.1: dependencies: randombytes: 2.1.0 - dev: true - - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: true - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true + setimmediate@1.0.5: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /shiki@0.14.3: - resolution: {integrity: sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==} + shiki@1.23.1: dependencies: - ansi-sequence-parser: 1.1.1 - jsonc-parser: 3.2.0 - vscode-oniguruma: 1.7.0 - vscode-textmate: 8.0.0 - dev: true - - /shikiji-core@0.9.17: - resolution: {integrity: sha512-r1FWTXk6SO2aYqfWgcsJ11MuVQ1ymPSdXzJjK7q8EXuyqu8yc2N5qrQy5+BL6gTVOaF4yLjbxFjF+KTRM1Sp8Q==} - dev: false + '@shikijs/core': 1.23.1 + '@shikijs/engine-javascript': 1.23.1 + '@shikijs/engine-oniguruma': 1.23.1 + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 - /shikiji-transformers@0.9.17: - resolution: {integrity: sha512-2CCG9qSLS6Bn/jbeUTEuvC6YSuP8gm8VyX5VjmCvDKyCPGhlLJbH1k/kg9wfRt7cJqpYjhdMDgT5rkdYrOZnsA==} - dependencies: - shikiji: 0.9.17 - dev: false + siginfo@2.0.0: {} - /shikiji@0.9.17: - resolution: {integrity: sha512-0z/1NfkhBkm3ijrfFeHg3G9yDNuHhXdAGbQm7tRxj4WQ5z2y0XDbnagFyKyuV2ebCTS1Mwy1I3n0Fzcc/4xdmw==} - dependencies: - shikiji-core: 0.9.17 - dev: false + signal-exit@3.0.7: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@4.1.0: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + simple-git-hooks@2.13.0: {} - /simple-git@3.18.0: - resolution: {integrity: sha512-Yt0GJ5aYrpPci3JyrYcsPz8Xc05Hi4JPSOb+Sgn/BmPX35fn/6Fp9Mef8eMBCrL2siY5w4j49TA5Q+bxPpri1Q==} + simple-git@3.27.0: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4 + debug: 4.3.7 transitivePeerDependencies: - supports-color - dev: false - /simple-git@3.22.0: - resolution: {integrity: sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==} + sirv@3.0.0: dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - - /slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - dev: true + slash@5.1.0: {} - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true - /slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} + slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - dev: true - /smob@1.4.0: - resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} - dev: true + smart-buffer@4.2.0: {} - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} + smob@1.4.0: {} - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + socks-proxy-agent@8.0.4: dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true + agent-base: 7.1.1 + debug: 4.3.7 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.6.1: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + space-separated-tokens@2.0.2: {} + + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 - dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 - dev: true - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - dev: true + spdx-license-ids@3.0.13: {} - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + speakingurl@14.0.1: {} + + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: true - /split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + split@0.3.3: dependencies: through: 2.3.8 - dev: true - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + split@1.0.1: dependencies: through: 2.3.8 - dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true + sprintf-js@1.1.3: {} - /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} + stackback@0.0.2: {} + + stacktrace-parser@0.1.10: dependencies: type-fest: 0.7.1 - dev: true - /stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + std-env@3.8.0: {} + + stream-combiner@0.0.4: dependencies: duplexer: 0.1.2 - dev: true - - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + streamx@2.20.0: dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.1.1 + optionalDependencies: + bare-events: 2.4.2 - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-argv@0.3.2: {} + + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} - engines: {node: '>=18'} + string-width@7.2.0: dependencies: - emoji-regex: 10.3.0 - get-east-asian-width: 1.2.0 + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 strip-ansi: 7.1.0 - dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + stringify-entities@4.0.4: dependencies: - ansi-regex: 5.0.1 - dev: true + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@6.0.1: dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true + ansi-regex: 5.0.1 - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: true + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-bom@3.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-indent@2.0.0: - resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} - engines: {node: '>=4'} - dev: true + strip-final-newline@4.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true + superjson@2.2.1: dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true + copy-anything: 3.0.5 - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + symbol-tree@3.2.4: {} - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: false + tabbable@6.2.0: {} - /tar@6.1.11: - resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} - engines: {node: '>= 10'} + tar-fs@3.0.6: dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 3.3.6 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.3 + bare-path: 2.1.3 - /tcp-port-used@1.0.2: - resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + tar-stream@3.1.7: + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.20.0 + + tcp-port-used@1.0.2: dependencies: debug: 4.3.1 is2: 2.0.9 transitivePeerDependencies: - supports-color - dev: true - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - dev: true + temp-dir@2.0.0: {} - /temp-fs@0.9.9: - resolution: {integrity: sha512-WfecDCR1xC9b0nsrzSaxPf3ZuWeWLUWblW4vlDQAa1biQaKHiImHnJfeQocQe/hXKMcolRzgkcVX/7kK4zoWbw==} - engines: {node: '>=0.8.0'} + temp-fs@0.9.9: dependencies: rimraf: 2.5.4 - dev: true - /tempfile@3.0.0: - resolution: {integrity: sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==} - engines: {node: '>=8'} + tempfile@3.0.0: dependencies: temp-dir: 2.0.0 uuid: 3.4.0 - dev: true - /terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} - engines: {node: '>=10'} - hasBin: true + terser@5.32.0: dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true + glob: 10.4.2 + minimatch: 9.0.5 - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + text-decoder@1.1.1: dependencies: - thenify: 3.3.1 - dev: true + b4a: 1.6.6 - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true + text-extensions@1.9.0: {} - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: true - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through2@4.0.2: dependencies: readable-stream: 3.6.2 - dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + through@2.3.8: {} - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} + tinybench@2.9.0: {} + + tinyexec@0.3.1: {} + + tinyglobby@0.2.10: dependencies: - rimraf: 3.0.2 - dev: true + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true + tinypool@1.0.2: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + tinyrainbow@1.2.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + tinyspy@3.0.2: {} + + tmp@0.2.1: + dependencies: + rimraf: 3.0.2 + + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} + totalist@3.0.1: {} + + tough-cookie@4.1.4: dependencies: - psl: 1.9.0 - punycode: 2.3.0 + psl: 1.13.0 + punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: true - /tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} + tr46@3.0.0: dependencies: punycode: 2.3.1 - dev: true - - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true + trim-lines@3.0.1: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + trim-newlines@3.0.1: {} - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true + tslib@2.8.1: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.18.1: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.7.1: {} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true + type-fest@0.8.1: {} - /typedoc-plugin-markdown@3.17.1(typedoc@0.25.4): - resolution: {integrity: sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==} - peerDependencies: - typedoc: '>=0.24.0' + typedoc-plugin-markdown@4.2.10(typedoc@0.26.11(typescript@5.6.3)): dependencies: - handlebars: 4.7.8 - typedoc: 0.25.4(typescript@5.3.3) - dev: true + typedoc: 0.26.11(typescript@5.6.3) - /typedoc@0.25.4(typescript@5.3.3): - resolution: {integrity: sha512-Du9ImmpBCw54bX275yJrxPVnjdIyJO/84co0/L9mwe0R3G4FSR6rQ09AlXVRvZEGMUg09+z/usc8mgygQ1aidA==} - engines: {node: '>= 16'} - hasBin: true - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x + typedoc@0.26.11(typescript@5.6.3): dependencies: lunr: 2.3.9 - marked: 4.3.0 - minimatch: 9.0.3 - shiki: 0.14.3 - typescript: 5.3.3 - dev: true - - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true + markdown-it: 14.1.0 + minimatch: 9.0.5 + shiki: 1.23.1 + typescript: 5.6.3 + yaml: 2.6.1 + + typescript@5.4.2: {} - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.6.3: {} - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true + uc.micro@2.1.0: {} + + uglify-js@3.17.4: optional: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true + undici-types@6.19.8: {} - /unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - dev: true + undici-types@6.21.0: + optional: true - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true + unicorn-magic@0.3.0: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + unist-util-visit-parents@6.0.1: dependencies: - browserslist: 4.21.10 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + 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 + + universalify@0.1.2: {} + + universalify@0.2.0: {} + + universalify@2.0.1: {} + + untildify@4.0.0: {} + + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - /uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: true + util-deprecate@1.0.2: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true + uuid@3.4.0: {} - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.19 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true + uuid@8.3.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} - engines: {node: '>= 0.10'} - dev: true + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 - /vite@5.0.11: - resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite-node@2.1.9(@types/node@22.15.2)(terser@5.32.0): + dependencies: + cac: 6.7.14 + debug: 4.3.7 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.18(@types/node@22.15.2)(terser@5.32.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.11(@types/node@22.15.2)(terser@5.32.0): dependencies: - esbuild: 0.19.9 - postcss: 8.4.32 - rollup: 4.9.0 + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.27.4 optionalDependencies: + '@types/node': 22.15.2 fsevents: 2.3.3 - dev: false + terser: 5.32.0 - /vite@5.0.9(@types/node@20.10.4): - resolution: {integrity: sha512-wVqMd5kp28QWGgfYPDfrj771VyHTJ4UDlCteLH7bJDGDEamaz5hV8IX6h1brSGgnnyf9lI2RnzXq/JmD0c2wwg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.4.18(@types/node@20.17.31)(terser@5.32.0): dependencies: - '@types/node': 20.10.4 - esbuild: 0.19.9 - postcss: 8.4.32 - rollup: 4.9.0 + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.27.4 optionalDependencies: + '@types/node': 20.17.31 fsevents: 2.3.3 - dev: true + terser: 5.32.0 - /vitepress-translation-helper@0.1.3(vitepress@1.0.0-rc.35)(vue@3.4.8): - resolution: {integrity: sha512-KandbALKgfKmRwYBX1Wt/A/38fhACmK+962S3hYgdvzSgwM2EOO5XgEUxPKXEil5kR1eNZKJJIPbQp52h8kCpA==} - hasBin: true - peerDependencies: - vitepress: 1.0.0-rc.36 - vue: ^3.4.8 + vite@5.4.18(@types/node@22.15.2)(terser@5.32.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.27.4 + optionalDependencies: + '@types/node': 22.15.2 + fsevents: 2.3.3 + terser: 5.32.0 + + vitepress-translation-helper@0.2.1(vitepress@1.5.0(@algolia/client-search@5.15.0)(@types/node@22.15.2)(axios@1.7.7)(postcss@8.4.49)(search-insights@2.17.1)(terser@5.32.0)(typescript@5.6.3))(vue@3.5.13(typescript@5.6.3)): dependencies: minimist: 1.2.8 - simple-git: 3.22.0 - vitepress: 1.0.0-rc.35(@algolia/client-search@4.19.1)(search-insights@2.7.0)(typescript@5.3.3) - vue: 3.4.8(typescript@5.3.3) + simple-git: 3.27.0 + vitepress: 1.5.0(@algolia/client-search@5.15.0)(@types/node@22.15.2)(axios@1.7.7)(postcss@8.4.49)(search-insights@2.17.1)(terser@5.32.0)(typescript@5.6.3) + vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - supports-color - dev: false - /vitepress@1.0.0-rc.35(@algolia/client-search@4.19.1)(search-insights@2.7.0)(typescript@5.3.3): - resolution: {integrity: sha512-+2VnFwtYIiKWWAnMjWg7ik0PfsUdrNoZIZKeu5dbJtrkzKO/mTvlA3owiT5VBKJsZAgI17B5UV37aYfUvGrN6g==} - hasBin: true - peerDependencies: - markdown-it-mathjax3: ^4.3.2 - postcss: ^8.4.32 - peerDependenciesMeta: - markdown-it-mathjax3: - optional: true - postcss: - optional: true - dependencies: - '@docsearch/css': 3.5.2 - '@docsearch/js': 3.5.2(@algolia/client-search@4.19.1)(search-insights@2.7.0) - '@types/markdown-it': 13.0.7 - '@vitejs/plugin-vue': 5.0.2(vite@5.0.11)(vue@3.4.5) - '@vue/devtools-api': 6.5.1 - '@vueuse/core': 10.7.1(vue@3.4.5) - '@vueuse/integrations': 10.7.1(focus-trap@7.5.4)(vue@3.4.5) - focus-trap: 7.5.4 + vitepress@1.5.0(@algolia/client-search@5.15.0)(@types/node@22.15.2)(axios@1.7.7)(postcss@8.4.49)(search-insights@2.17.1)(terser@5.32.0)(typescript@5.6.3): + dependencies: + '@docsearch/css': 3.8.0 + '@docsearch/js': 3.8.0(@algolia/client-search@5.15.0)(search-insights@2.17.1) + '@iconify-json/simple-icons': 1.2.13 + '@shikijs/core': 1.23.1 + '@shikijs/transformers': 1.23.1 + '@shikijs/types': 1.23.1 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 5.2.0(vite@5.4.11(@types/node@22.15.2)(terser@5.32.0))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-api': 7.6.4 + '@vue/shared': 3.5.13 + '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.6.3)) + '@vueuse/integrations': 11.3.0(axios@1.7.7)(focus-trap@7.6.2)(vue@3.5.13(typescript@5.6.3)) + focus-trap: 7.6.2 mark.js: 8.11.1 - minisearch: 6.3.0 - shikiji: 0.9.17 - shikiji-core: 0.9.17 - shikiji-transformers: 0.9.17 - vite: 5.0.11 - vue: 3.4.5(typescript@5.3.3) + minisearch: 7.1.1 + shiki: 1.23.1 + vite: 5.4.11(@types/node@22.15.2)(terser@5.32.0) + vue: 3.5.13(typescript@5.6.3) + optionalDependencies: + postcss: 8.4.49 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -7265,6 +7325,7 @@ packages: - react - react-dom - sass + - sass-embedded - search-insights - sortablejs - stylus @@ -7272,313 +7333,170 @@ packages: - terser - typescript - universal-cookie - dev: false - - /vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: true - /vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: true - - /vue-component-type-helpers@1.8.25: - resolution: {integrity: sha512-NCA6sekiJIMnMs4DdORxATXD+/NRkQpS32UC+I1KQJUasx+Z7MZUb3Y+MsKsFmX+PgyTYSteb73JW77AibaCCw==} - dev: true - - /vue-demi@0.14.6(vue@3.4.5): - resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - dependencies: - vue: 3.4.5(typescript@5.3.3) - dev: false + vitest@2.1.9(@types/node@22.15.2)(@vitest/ui@2.1.9)(happy-dom@15.11.7)(jsdom@19.0.0)(terser@5.32.0): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.18(@types/node@22.15.2)(terser@5.32.0)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.1.2 + debug: 4.3.7 + expect-type: 1.1.0 + magic-string: 0.30.13 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.18(@types/node@22.15.2)(terser@5.32.0) + vite-node: 2.1.9(@types/node@22.15.2)(terser@5.32.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.15.2 + '@vitest/ui': 2.1.9(vitest@2.1.9) + happy-dom: 15.11.7 + jsdom: 19.0.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser - /vue-template-compiler@2.7.14: - resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - dev: true + vscode-uri@3.1.0: {} - /vue-tsc@1.8.25(typescript@5.3.3): - resolution: {integrity: sha512-lHsRhDc/Y7LINvYhZ3pv4elflFADoEOo67vfClAfF2heVHpHmVquLSjojgCSIwzA4F0Pc4vowT/psXCYcfk+iQ==} - hasBin: true - peerDependencies: - typescript: '*' - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.25(typescript@5.3.3) - semver: 7.5.4 - typescript: 5.3.3 - dev: true + vue-component-type-helpers@2.0.21: {} - /vue@3.3.11(typescript@5.3.3): - resolution: {integrity: sha512-d4oBctG92CRO1cQfVBZp6WJAs0n8AK4Xf5fNjQCBeKCvMI1efGQ5E3Alt1slFJS9fZuPcFoiAiqFvQlv1X7t/w==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + vue-demi@0.14.10(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/compiler-dom': 3.3.11 - '@vue/compiler-sfc': 3.3.11 - '@vue/runtime-dom': 3.3.11 - '@vue/server-renderer': 3.3.11(vue@3.3.11) - '@vue/shared': 3.3.11 - typescript: 5.3.3 + vue: 3.5.13(typescript@5.6.3) - /vue@3.4.5(typescript@5.3.3): - resolution: {integrity: sha512-VH6nHFhLPjgu2oh5vEBXoNZxsGHuZNr3qf4PHClwJWw6IDqw6B3x+4J+ABdoZ0aJuT8Zi0zf3GpGlLQCrGWHrw==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + vue-tsc@2.2.10(typescript@5.6.3): dependencies: - '@vue/compiler-dom': 3.4.5 - '@vue/compiler-sfc': 3.4.5 - '@vue/runtime-dom': 3.4.5 - '@vue/server-renderer': 3.4.5(vue@3.4.5) - '@vue/shared': 3.4.5 - typescript: 5.3.3 - dev: false + '@volar/typescript': 2.4.12 + '@vue/language-core': 2.2.10(typescript@5.6.3) + typescript: 5.6.3 - /vue@3.4.8(typescript@5.3.3): - resolution: {integrity: sha512-vJffFOe6DqWsAI10v3tDhb1nJrj7CF3CbdQwOznywAsFNoyvrQ1AWQdcIWJpmRpRnw7NFzstzh6fh4w7n1PNdg==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + vue@3.5.13(typescript@5.6.3): dependencies: - '@vue/compiler-dom': 3.4.8 - '@vue/compiler-sfc': 3.4.8 - '@vue/runtime-dom': 3.4.8 - '@vue/server-renderer': 3.4.8(vue@3.4.8) - '@vue/shared': 3.4.8 - typescript: 5.3.3 - dev: false + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.6.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.6.3 - /w3c-hr-time@1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. + w3c-hr-time@1.0.2: dependencies: browser-process-hrtime: 1.0.0 - dev: true - - /w3c-xmlserializer@3.0.0: - resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} - engines: {node: '>=12'} - dependencies: - xml-name-validator: 4.0.0 - dev: true - /w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} + w3c-xmlserializer@3.0.0: dependencies: xml-name-validator: 4.0.0 - dev: true - - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + web-streams-polyfill@3.3.3: {} - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} + webidl-conversions@7.0.0: {} + + whatwg-encoding@2.0.0: dependencies: iconv-lite: 0.6.3 - dev: true - /whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - dev: true + whatwg-mimetype@3.0.0: {} - /whatwg-url@10.0.0: - resolution: {integrity: sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==} - engines: {node: '>=12'} + whatwg-url@10.0.0: dependencies: tr46: 3.0.0 webidl-conversions: 7.0.0 - dev: true - /whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} + whatwg-url@11.0.0: dependencies: tr46: 3.0.0 webidl-conversions: 7.0.0 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@4.0.0: dependencies: - isexe: 2.0.0 - dev: true + isexe: 3.1.1 - /widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + widest-line@3.1.0: dependencies: string-width: 4.2.3 - dev: true - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + wordwrap@1.0.0: {} - /workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - dev: true + workerpool@6.2.0: {} - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 - string-width: 7.0.0 + string-width: 7.2.0 strip-ansi: 7.1.0 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true + wrappy@1.0.2: {} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true + ws@8.18.0: {} - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true + xml-name-validator@4.0.0: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + xmlchars@2.2.0: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true + xtend@4.0.2: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + y18n@5.0.8: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true + yaml@2.6.1: {} - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - dev: true + yaml@2.7.1: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.4: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@20.2.9: {} - /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + yargs-unparser@2.0.0: dependencies: camelcase: 6.3.0 decamelize: 4.0.0 flat: 5.0.2 is-plain-obj: 2.1.0 - dev: true - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -7586,53 +7504,15 @@ packages: require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.4 - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true + yargs-parser: 20.2.9 - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /yorkie@2.0.0: - resolution: {integrity: sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==} - engines: {node: '>=4'} - requiresBuild: true - dependencies: - execa: 0.8.0 - is-ci: 1.2.1 - normalize-path: 1.0.0 - strip-indent: 2.0.0 - dev: true + yoctocolors@2.1.1: {} - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.11.0 - optionalDependencies: - commander: 9.5.0 - dev: true + zwitch@2.0.4: {} diff --git a/scripts/check-size.mjs b/scripts/check-size.mjs index 59a5bbc8d..e681b5558 100644 --- a/scripts/check-size.mjs +++ b/scripts/check-size.mjs @@ -1,10 +1,11 @@ import fs from 'node:fs/promises' import path from 'node:path' +import { fileURLToPath } from 'node:url' import chalk from 'chalk' import { gzipSync } from 'zlib' import { compress } from 'brotli' -const __dirname = path.dirname(new URL(import.meta.url).pathname) +const __dirname = path.dirname(fileURLToPath(import.meta.url)) async function checkFileSize(filePath) { const stat = await fs.stat(filePath).catch(() => null) diff --git a/scripts/release.mjs b/scripts/release.mjs index 5499a75b6..4346f105e 100644 --- a/scripts/release.mjs +++ b/scripts/release.mjs @@ -1,7 +1,7 @@ +import minimist from 'minimist' import fs from 'node:fs/promises' import { join, resolve, dirname } from 'node:path' import { fileURLToPath } from 'node:url' -import minimist from 'minimist' import chalk from 'chalk' import semver from 'semver' import enquirer from 'enquirer' @@ -20,15 +20,33 @@ let { tag: optionTag, dry: isDryRun, skipCleanCheck: skipCleanGitCheck, + noDepsUpdate, + noPublish, } = args +if (args.h || args.help) { + console.log( + ` +Usage: node release.mjs [flags] + node release.mjs [ -h | --help ] + +Flags: + --skipBuild Skip building packages + --tag Publish under a given npm dist tag + --dry Dry run + --skipCleanCheck Skip checking if the git repo is clean + --noDepsUpdate Skip updating dependencies in package.json files + --noPublish Skip publishing packages +`.trim() + ) + process.exit(0) +} + // const preId = // args.preid || // (semver.prerelease(currentVersion) && semver.prerelease(currentVersion)[0]) const EXPECTED_BRANCH = 'main' -const incrementVersion = increment => - semver.inc(currentVersion, increment, preId) const bin = name => resolve(__dirname, '../node_modules/.bin/' + name) /** * @param bin {string} @@ -136,6 +154,17 @@ async function main() { message: `Select release type for ${chalk.bold.white(name)}`, choices: versionIncrements .map(i => `${i}: ${name} (${semver.inc(version, i, preId)})`) + .concat( + optionTag === 'edge' + ? [ + `edge: ${name} (${semver.inc( + version, + 'prerelease', + 'alpha' + )})`, + ] + : [] + ) .concat(['custom']), }) @@ -188,6 +217,9 @@ async function main() { console.log(`(skipped)`) } + step('\nUpdating lock...') + await runIfNotDry(`pnpm`, ['install']) + step('\nGenerating changelogs...') for (const pkg of pkgWithVersions) { step(` -> ${pkg.name} (${pkg.path})`) @@ -226,6 +258,7 @@ async function main() { 'add', 'packages/*/CHANGELOG.md', 'packages/*/package.json', + 'pnpm-lock.yaml', ]) await runIfNotDry('git', [ 'commit', @@ -249,14 +282,18 @@ async function main() { await runIfNotDry('git', ['tag', `${tagName}`]) } - step('\nPublishing packages...') - for (const pkg of pkgWithVersions) { - await publishPackage(pkg) - } + if (!noPublish) { + step('\nPublishing packages...') + for (const pkg of pkgWithVersions) { + await publishPackage(pkg) + } - step('\nPushing to Github...') - await runIfNotDry('git', ['push', 'origin', ...versionsToPush]) - await runIfNotDry('git', ['push']) + step('\nPushing to Github...') + await runIfNotDry('git', ['push', 'origin', ...versionsToPush]) + await runIfNotDry('git', ['push']) + } else { + console.log(chalk.bold.white(`Skipping publishing...`)) + } } /** @@ -267,11 +304,14 @@ async function updateVersions(packageList) { return Promise.all( packageList.map(({ pkg, version, path, name }) => { pkg.version = version - updateDeps(pkg, 'dependencies', packageList) - updateDeps(pkg, 'peerDependencies', packageList) + if (!noDepsUpdate) { + updateDeps(pkg, 'dependencies', packageList) + updateDeps(pkg, 'peerDependencies', packageList) + } const content = JSON.stringify(pkg, null, 2) + '\n' return isDryRun ? dryRun('write', [name], { + version: pkg.version, dependencies: pkg.dependencies, peerDependencies: pkg.peerDependencies, }) @@ -307,11 +347,11 @@ async function publishPackage(pkg) { [ 'publish', ...(optionTag ? ['--tag', optionTag] : []), + ...(skipCleanGitCheck ? ['--no-git-checks'] : []), '--access', 'public', '--publish-branch', EXPECTED_BRANCH, - ...(skipCleanGitCheck ? ['--no-git-checks'] : []), ], { cwd: pkg.path, diff --git a/scripts/verifyCommit.mjs b/scripts/verifyCommit.mjs index 46fb1376f..3ff4af8ba 100644 --- a/scripts/verifyCommit.mjs +++ b/scripts/verifyCommit.mjs @@ -1,8 +1,10 @@ -// Invoked on the commit-msg git hook by yorkie. +// Invoked on the commit-msg git hook by simple-git-hooks. import chalk from 'chalk' import { readFileSync } from 'node:fs' -const msgPath = process.env.GIT_PARAMS +import path from 'node:path' + +const msgPath = path.resolve('.git/COMMIT_EDITMSG') const msg = readFileSync(msgPath, 'utf-8').trim() const commitRE = diff --git a/vitest.workspace.js b/vitest.workspace.js new file mode 100644 index 000000000..fb6baec46 --- /dev/null +++ b/vitest.workspace.js @@ -0,0 +1,11 @@ +import { defineWorkspace } from 'vitest/config' + +export default defineWorkspace([ + { + extends: './packages/router/vitest.config.ts', + test: { + name: 'router', + root: './packages/router', + }, + }, +])