├── .github └── workflows │ └── publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── docs ├── .vitepress │ ├── config.mts │ ├── generateLocales.mts │ ├── i18n │ │ ├── en_us.ts │ │ └── test.ts │ ├── navbars │ │ └── versioned │ │ │ └── 0.11.0.json │ └── theme │ │ ├── index.ts │ │ └── style.css ├── config.md ├── guide │ ├── adding-version.md │ ├── basic-setup.md │ ├── index.md │ └── troubleshooting.md ├── index.md ├── public │ ├── branch.svg │ ├── config.svg │ ├── flask.svg │ └── i18n.svg ├── translated │ └── test │ │ ├── config.md │ │ ├── guide │ │ ├── adding-version.md │ │ ├── basic-setup.md │ │ ├── index.md │ │ └── troubleshooting.md │ │ └── index.md └── versions │ ├── .gitkeep │ └── 0.11.0 │ ├── index.md │ └── translated │ └── test │ └── index.md ├── package.json ├── pnpm-lock.yaml ├── src ├── components │ └── VersionSwitcher.vue ├── defaults.ts ├── index.ts ├── navbars.ts ├── rewrites.ts ├── sidebars.ts ├── switcher.ts └── types.ts ├── tsconfig.json └── tsup.config.ts /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | # Sample workflow for building and deploying a VitePress site to GitHub Pages 2 | # 3 | name: Deploy VitePress site to Pages 4 | 5 | on: 6 | # Runs on pushes targeting the `main` branch. Change this to `master` if you're 7 | # using the `master` branch as the default branch. 8 | push: 9 | branches: [master] 10 | 11 | # Allows you to run this workflow manually from the Actions tab 12 | workflow_dispatch: 13 | 14 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 15 | permissions: 16 | contents: read 17 | pages: write 18 | id-token: write 19 | 20 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 21 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 22 | concurrency: 23 | group: pages 24 | cancel-in-progress: false 25 | 26 | jobs: 27 | # Build job 28 | build: 29 | runs-on: ubuntu-latest 30 | steps: 31 | - name: Checkout 32 | uses: actions/checkout@v3 33 | with: 34 | fetch-depth: 0 # Not needed if lastUpdated is not enabled 35 | - uses: pnpm/action-setup@v2 36 | with: 37 | version: 8 38 | - name: Setup Node 39 | uses: actions/setup-node@v3 40 | with: 41 | node-version: 18 42 | cache: pnpm # or pnpm / yarn 43 | - name: Setup Pages 44 | uses: actions/configure-pages@v3 45 | - name: Install dependencies 46 | run: pnpm install # or pnpm install / yarn install / bun install 47 | - name: Build with VitePress 48 | run: | 49 | pnpm run docs:build 50 | touch docs/.vitepress/dist/.nojekyll 51 | - name: Upload artifact 52 | uses: actions/upload-pages-artifact@v2 53 | with: 54 | path: docs/.vitepress/dist 55 | 56 | # Deployment job 57 | deploy: 58 | environment: 59 | name: github-pages 60 | url: ${{ steps.deployment.outputs.page_url }} 61 | needs: build 62 | runs-on: ubuntu-latest 63 | name: Deploy 64 | steps: 65 | - name: Deploy to GitHub Pages 66 | id: deployment 67 | uses: actions/deploy-pages@v2 68 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | cache 4 | package-lock.json 5 | yarn.lock 6 | .vscode 7 | 8 | .nyc_output/ 9 | coverage/ 10 | dist/ 11 | node_modules/ 12 | output/ 13 | 14 | .DS_Store 15 | .eslintcache 16 | coverage.lcov 17 | .pnpm-debug.log 18 | .idea 19 | .rollup.cache 20 | 21 | !packages/*/test/**/node_modules 22 | !packages/node-resolve/test/fixtures/**/node_modules 23 | !packages/commonjs/test/**/node_modules 24 | !packages/typescript/test/fixtures/**/node_modules 25 | !packages/typescript/test/fixtures/**/dist 26 | 27 | fabric-docs-test -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Calum H. (imb11) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `vitepress-versioning-plugin` 2 | 3 | This plugin adds versioning support to VitePress. 4 | 5 | For more information, see the [documentation](https://vvp.imb11.dev/). 6 | 7 | ## Installation 8 | 9 | ```sh 10 | pnpm install vitepress-versioning-plugin 11 | ``` 12 | 13 | ## Usage 14 | 15 | Refer to the [documentation](https://vvp.imb11.dev/) on how to use this plugin. 16 | 17 | ## Configuration 18 | 19 | For a full list of configuration options, see the [Configuration Reference](https://vvp.imb11.dev/config/) page. 20 | -------------------------------------------------------------------------------- /docs/.vitepress/config.mts: -------------------------------------------------------------------------------- 1 | import { DefaultTheme } from "vitepress"; 2 | import defineVersionedConfig from "../../src"; 3 | import { generateLocales } from "./generateLocales.mts"; 4 | 5 | // https://vitepress.dev/reference/site-config 6 | export default defineVersionedConfig( 7 | { 8 | ignoreDeadLinks: true, 9 | title: "Vitepress Versioning Plugin", 10 | description: "A Vitepress plugin for versioning documentation.", 11 | cleanUrls: true, 12 | 13 | versioning: { 14 | latestVersion: "1.3.0", 15 | rewrites: { 16 | localePrefix: "translated", 17 | }, 18 | sidebars: { 19 | sidebarContentProcessor(sidebar: DefaultTheme.SidebarMulti) { 20 | // console.log(sidebar["/guide/"]); 21 | return sidebar; 22 | }, 23 | } 24 | }, 25 | 26 | rewrites: { 27 | "translated/:lang/(.*)": ":lang/(.*)", 28 | }, 29 | 30 | locales: generateLocales(), 31 | }, 32 | __dirname 33 | ); 34 | -------------------------------------------------------------------------------- /docs/.vitepress/generateLocales.mts: -------------------------------------------------------------------------------- 1 | import { LocaleConfig } from "vitepress"; 2 | import type {Versioned} from "../../src/types"; 3 | 4 | import English from "./i18n/en_us"; 5 | import Test from "./i18n/test"; 6 | // TODO: French translations 7 | // import French from "./i18n/fr_fr"; 8 | 9 | export function generateLocales(): LocaleConfig { 10 | // Load localisation from ./i18n, load en_us.json into localisation["root"] whilst everything else is loaded into localisation[locale] 11 | const localisations = { 12 | root: English, 13 | test: Test 14 | // fr: French 15 | } 16 | 17 | const sidebarConfig: Versioned.Sidebar = {}; 18 | for (const locale of Object.keys(localisations)) { 19 | const translations = localisations[locale]; 20 | 21 | const linkPrefix = locale === "root" ? "" : `/${locale}`; 22 | sidebarConfig[linkPrefix + "/guide/"] = [ 23 | { 24 | text: translations["installation"], 25 | link: linkPrefix + "/guide/", 26 | }, 27 | { 28 | text: translations["basicSetup"], 29 | link: linkPrefix + "/guide/basic-setup", 30 | }, 31 | { 32 | text: translations["addingVersion"], 33 | link: linkPrefix + "/guide/adding-version", 34 | }, 35 | { 36 | text: translations["addingTranslations"], 37 | link: linkPrefix + "/guide/adding-translations", 38 | }, 39 | { 40 | text: translations["troubleshooting"], 41 | link: linkPrefix + "/guide/troubleshooting", 42 | } 43 | ]; 44 | } 45 | 46 | const localeConfig: LocaleConfig = {}; 47 | for (const locale of Object.keys(localisations)) { 48 | const translations = localisations[locale]; 49 | 50 | localeConfig[locale] = { 51 | label: translations[locale], 52 | lang: locale === "root" ? "en" : locale, 53 | link: (locale === "root" ? "" : `/${locale}`) + "/", 54 | themeConfig: { 55 | versionSwitcher: false, 56 | nav: [ 57 | { 58 | text: translations["home"], 59 | link: (locale === "root" ? "" : `/${locale}`) + "/", 60 | }, 61 | { 62 | text: translations["gettingStarted"], 63 | link: 64 | (locale === "root" ? "" : `/${locale}`) + "/guide/", 65 | }, 66 | { 67 | text: translations["configReference"], 68 | link: 69 | (locale === "root" ? "" : `/${locale}`) + "/config/", 70 | }, 71 | { 72 | component: 'VersionSwitcher', 73 | }, 74 | ], 75 | sidebar: sidebarConfig, 76 | outline: "deep", 77 | socialLinks: [ 78 | { 79 | icon: "github", 80 | link: "https://github.com/IMB11/vitepress-versioning-plugin", 81 | }, 82 | ], 83 | }, 84 | }; 85 | } 86 | 87 | return localeConfig; 88 | } 89 | -------------------------------------------------------------------------------- /docs/.vitepress/i18n/en_us.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | "home": "Home", 3 | "gettingStarted": "Getting Started", 4 | "configReference": "Configuration Reference", 5 | "installation": "Installation", 6 | "basicSetup": "Basic Setup", 7 | "addingVersion": "Adding a Version", 8 | "troubleshooting": "Troubleshooting", 9 | "root": "English (US)", 10 | "test": "Test Language" 11 | } -------------------------------------------------------------------------------- /docs/.vitepress/i18n/test.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | "home": "TEST Home", 3 | "gettingStarted": "TEST Getting Started", 4 | "configReference": "TEST Configuration Reference", 5 | "installation": "TEST Installation", 6 | "basicSetup": "TEST Basic Setup", 7 | "addingVersion": "TEST Addingy a Version", 8 | "troubleshooting": "TEST Troubleshooting", 9 | "root": "TEST English (US)", 10 | "test": "TEST Test Language" 11 | } -------------------------------------------------------------------------------- /docs/.vitepress/navbars/versioned/0.11.0.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "text": "Home", 4 | "link": "/" 5 | } 6 | ] -------------------------------------------------------------------------------- /docs/.vitepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | import DefaultTheme from 'vitepress/theme' 2 | import VersionSwitcher from '../../../src/components/VersionSwitcher.vue' 3 | 4 | // Import style fixes and customizations. 5 | import './style.css' 6 | import { Theme } from 'vitepress'; 7 | 8 | export default { 9 | extends: DefaultTheme, 10 | enhanceApp({ app }) { 11 | app.component('VersionSwitcher', VersionSwitcher) 12 | } 13 | } satisfies Theme; -------------------------------------------------------------------------------- /docs/.vitepress/theme/style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --vp-c-blue-1: #0f9e63; 3 | --vp-c-blue-2: #18b875; 4 | --vp-c-blue-3: #3ad79d; 5 | --vp-c-blue-soft: rgba(52, 130, 219, 0.14); 6 | 7 | --vp-c-brand-1: var(--vp-c-blue-3); 8 | --vp-c-brand-2: var(--vp-c-blue-2); 9 | --vp-c-brand-3: var(--vp-c-blue-1); 10 | --vp-c-brand-soft: var(--vp-c-blue-soft); 11 | } 12 | 13 | :root { 14 | --vp-home-hero-name-color: transparent; 15 | --vp-home-hero-name-background: -webkit-linear-gradient( 16 | 120deg, 17 | var(--vp-c-blue-1) 30%, 18 | var(--vp-c-blue-2) 19 | ); 20 | } 21 | 22 | .homepage-container { 23 | margin: auto; 24 | width: 100%; 25 | max-width: 1280px; 26 | padding: 0 24px; 27 | } 28 | 29 | .VPHome { 30 | padding-bottom: 0px !important; 31 | } 32 | 33 | @media (min-width: 640px) { 34 | .homepage-container { 35 | padding: 0 48px; 36 | } 37 | } 38 | 39 | @media (min-width: 960px) { 40 | .homepage-container { 41 | width: 100%; 42 | padding: 0 64px; 43 | } 44 | } 45 | 46 | .VPLocalSearchBox > .backdrop { 47 | opacity: 0; 48 | animation: show 200ms 100ms cubic-bezier(0.38, 0.97, 0.56, 0.76) forwards; 49 | } 50 | 51 | .VPLocalSearchBox > .shell { 52 | animation: show 400ms 100ms cubic-bezier(0.38, 0.97, 0.56, 0.76) forwards; 53 | opacity: 0; 54 | transform: rotateX(-90deg); 55 | transform-origin: top center; 56 | } 57 | 58 | @keyframes show { 59 | 100% { 60 | opacity: 1; 61 | transform: none; 62 | } 63 | } 64 | 65 | /* Center any images in markdown. */ 66 | .vp-doc > p > img, 67 | .vp-doc > div > p > img { 68 | margin-left: auto; 69 | margin-right: auto; 70 | } -------------------------------------------------------------------------------- /docs/config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Configuration Reference 3 | description: A reference for the Vitepress Versioning Plugin configuration options. 4 | outline: none 5 | layout: home 6 | --- 7 | 8 |
9 | 10 | # Configuration Reference 11 | 12 | These configuration values are for the latest version. If you are using an older version of the plugin, switch version in the navbar. 13 | 14 | - `themeConfig.` refers to values which are part of the VitePress theme configuration, within the `themeConfig` block, these configuration values can also exist per-locale given that you use a custom theme configuration for each locale. 15 | - `versioning.` refers to values which are part of the VitePress Versioning Plugin configuration, these apply across all locales and versions. 16 | 17 | | Property | Description | Default Value | 18 | | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | 19 | | `themeConfig.sidebar.process` | Should the plugin should process sidebar links according to the `versioning.sidebars` processor functions? | `true` | 20 | | `themeConfig.versionSwitcher.text` | The text to display on the version switcher button. | "Switch Version" | 21 | | `themeConfig.versionSwitcher.includeLatestVersion` | Should the latest (root) version be included in the version switcher? | `true` | 22 | | `versioning.latestVersion` | A string representation of the latest version of the project (root). | `null` | 23 | | `versioning.sidebars.processSidebarURLs` | Whether or not to process sidebar URLs. Uses the `sidebarUrlProcessor` function. | `true` | 24 | | `versioning.sidebars.sidebarPathResolver` | The function that resolves the path to the sidebar file for a given version. | ``(version: Version) => `.vitepress/sidebars/versioned/${version}.json` `` | 25 | | `versioning.sidebars.sidebarUrlProcessor` | The function that processes sidebar URLs. | ``(url: string, version: Version) => `/${version}${url}` `` | 26 | | `versioning.rewrites.localePrefix` | The prefix to add to the locale folders. | `""` | 27 | | `versioning.rewrites.localeRewriteProcessor` | The function that processes rewrite URLs for locale folders. | ``(inputFilePath: string, _version: Version, locale: string) => `${locale}/` + inputFilePath.replace("versions/", "").replace(`${locale}/`, "")`` | 28 | | `versioning.rewrites.rewriteProcessor` | The function that processes rewrite URLs. | ``(inputFilePath: string, _version: Version) => inputFilePath.replace("versions/", "")`` | -------------------------------------------------------------------------------- /docs/guide/adding-version.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Adding a Version 3 | description: A guide to adding a new version to your VitePress project. 4 | --- 5 | 6 | # Adding a Version 7 | 8 | Adding a new version to your VitePress project is simple. 9 | 10 | ## Step 1: Create a New Version Folder 11 | 12 | Create a new folder in the `versions` directory in the root of your VitePress project. This folder should be named after the version you are adding. 13 | 14 | ## Step 2: Move All Content 15 | 16 | Move all content from the root of your VitePress project into the new version folder. This includes all markdown files. 17 | 18 | Images and assets should stay within the `public` folder in the root of your project, as they are shared across all versions - if you need to version these files, simply change the path of these files to include the version or move them next to the markdown files they are used by and reference them relatively (e.g. `![image](./image.png)`). 19 | 20 | ## Step 3: Move any Localized Content 21 | 22 | If you have translations for your pages, you should move them into the `versions/{version}/translated/{locale}` folder - if you have specified a prefix for this folder via the `versioning.rewrites.localePrefix` configuration, you should take this into account. 23 | 24 | ## Step 4: Create a Sidebar 25 | 26 | Create a sidebar for your version. By default, this should be placed in the `.vitepress/sidebars/versioned/{version}.json` file, or where specified by the `sidebarPathResolver` function. 27 | 28 | If you have locales in the version, localized sidebars can be found at `.vitepress/sidebars/versioned/{version}-{locale}.json`. The version will be replaced with the version number and the locale will be replaced with the locale code. -------------------------------------------------------------------------------- /docs/guide/basic-setup.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Basic Setup 3 | description: A guide to setting up the VitePress Versioning Plugin. 4 | --- 5 | 6 | # Basic Setup 7 | 8 | This guide will walk you through setting up the VitePress Versioning Plugin in your VitePress project. 9 | 10 | ## Ensure All Links Are Relative 11 | 12 | ::: warning 13 | This is extremely important! If you do not enforce relative links within your documentation project, versioned pages will not be able to link to each other! 14 | 15 | If you have a project with many absolute links, consider writing a script to automate this. 16 | ::: 17 | 18 | Before setting up the plugin, you will need to ensure that all links in your markdown files are relative. This is because the plugin uses the relative path of the file to determine which version of the file to link to. 19 | 20 | This means that you should not use absolute links, such as `/guide/getting-started` but instead reference files based on their relative position to the file you are linking from. 21 | 22 | - For example, if a file is located at `docs/guide/getting-started.md` and you want to link to `docs/guide/advanced-setup.md`, you should use the following link: `./advanced-setup.md`. 23 | 24 | - For example, if a file is located at `docs/guide/getting-started.md` and you want to link to `docs/help/faq.md`, you should use the following link: `../help/faq.md`. 25 | 26 | ## Configuration Setup 27 | 28 | Replace `defineConfig` in your `.vitepress/config.mts` with `defineVersionedConfig`, and you can add a `versioning` object to your config. 29 | 30 | ```ts 31 | export default defineVersionedConfig({ 32 | // ... your vitepress config. 33 | versioning: { 34 | latestVersion: "1.0.0", 35 | }, 36 | }, __dirname); 37 | ``` 38 | 39 | You can further configure this plugin by adding additional properties to the `versioning` object and within the `themeConfig` object. For a full list of configuration options, see the [Configuration Reference](../config.md) 40 | 41 | ## Using the Version Switcher Component 42 | 43 | If you want to use a more advanced version switcher component, such as the one used on this website, you can import the `VersionSwitcher` component from the plugin, register it in your theme config, and then use it within your navbar. 44 | 45 | ::: warning 46 | You will need to set `themeConfig.versionSwitcher` to `false` to hide the basic version switcher. 47 | ::: 48 | 49 | ```ts 50 | import { Theme } from 'vitepress'; 51 | import DefaultTheme from 'vitepress/theme' 52 | import VersionSwitcher from 'vitepress-versioning-plugin/src/components/VersionSwitcher.vue' // [!code focus] 53 | 54 | export default { 55 | extends: DefaultTheme, 56 | enhanceApp({ app }) { // [!code focus] 57 | app.component('VersionSwitcher', VersionSwitcher) // [!code focus] 58 | } // [!code focus] 59 | } satisfies Theme; 60 | ``` 61 | 62 | Add it to your navbar: 63 | 64 | ```ts 65 | themeConfig: { 66 | versionSwitcher: false, 67 | nav: [ 68 | ..., 69 | { // [!code focus] 70 | component: 'VersionSwitcher', // [!code focus] 71 | }, // [!code focus] 72 | ] 73 | } 74 | ``` 75 | 76 | ## Localization Setup 77 | 78 | Whilst the plugin provides support for versioning, it automatically supports localization **only for pages.** 79 | 80 | ::: warning 81 | 82 | **Sidebars and navbars are not automatically localized across versions.** 83 | 84 | There are plans for a future release to provide a more streamlined solution for localized sidebars and navbars, however, this is an extremely complex problem that requires a lot of thought and consideration to provide a solution that works for everyone. 85 | ::: 86 | 87 | Providing translations and versions for sidebars and navbars is complex, there isn't a one-size-fits-all solution. However, the plugin provides a number of configuration options to help you manage this complexity. 88 | 89 | Consider taking a look at the following implementations to help you develop a system which can help you have versioned and localized sidebars: 90 | 91 | - [Fabric Documentation](https://github.com/FabricMC/fabric-docs/blob/main/.vitepress/i18n.ts) 92 | - [This Documentation Site!](https://github.com/IMB11/vitepress-versioning-plugin/blob/master/.vitepress/generateLocales.mts) -------------------------------------------------------------------------------- /docs/guide/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Installation 3 | description: Installation instructions for the VitePress Versioning Plugin 4 | --- 5 | 6 | # Installation 7 | 8 | ::: info 9 | If you wish to use the legacy version of the plugin, `0.11.0`, please switch version in the sidebar. 10 | ::: 11 | 12 | Installing the plugin is simple, just run the following command in your terminal: 13 | 14 | ```sh 15 | pnpm install vitepress-versioning-plugin 16 | ``` 17 | 18 | This will install the plugin and its dependencies into your project. 19 | -------------------------------------------------------------------------------- /docs/guide/troubleshooting.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Troubleshooting 3 | description: Troubleshooting guide for common issues with the versioning plugin. 4 | --- 5 | 6 | # Troubleshooting 7 | 8 | ## "The sidebar cannot be an array. Please use a DefaultTheme.MultiSidebar object where the root ('/') is your array." 9 | 10 | This occurs when you have a sidebar that is an array, such as the following: 11 | 12 | ```ts 13 | sidebar: [ 14 | { 15 | text: '1.0.0', 16 | link: '/', 17 | }, 18 | ], 19 | ``` 20 | 21 | Instead, you should have a sidebar object that looks like the following: 22 | 23 | ```ts 24 | sidebar: { 25 | '/': [ 26 | { 27 | text: '1.0.0', 28 | link: '/', 29 | }, 30 | ], 31 | }, 32 | ``` 33 | 34 | This is because the sidebar object is expected to be a `DefaultTheme.MultiSidebar` object, where the root (`'/'`) is the array of sidebar items. 35 | 36 | I will not be developing an automatic migration from the array sidebar to the object sidebar, as this is a breaking change and should be done manually by developers. 37 | 38 | ## "Versioned sidebar preperation failed, disabling versioning." 39 | 40 | Please open an issue and provide a link to your documentation repository. This error occurs when the plugin is unable to find the sidebar for a version. This could be due to the sidebar not existing, or the sidebar being an array instead of an object. 41 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | title: VitePress Versioning Plugin 4 | description: A plugin for VitePress v1 that adds versioning support. 5 | 6 | hero: 7 | name: VitePress Versioning Plugin 8 | tagline: A plugin for VitePress v1 that adds versioning support. 9 | actions: 10 | - text: Get Started 11 | link: /guide/ 12 | - text: Configuration Reference 13 | link: /config/ 14 | 15 | features: 16 | - title: Versioning 17 | icon: 18 | src: /branch.svg 19 | details: Manage multiple versions of your documentation with ease. 20 | - title: Localisation 21 | icon: 22 | src: /i18n.svg 23 | details: Support for versioning alongside translations. 24 | - title: Customizable 25 | icon: 26 | src: /config.svg 27 | details: Configure the plugin to suit your needs through an easy to modify configuration. 28 | - title: Easy to Use 29 | icon: 30 | src: /flask.svg 31 | details: Get started quickly with minimal setup. 32 | --- 33 | -------------------------------------------------------------------------------- /docs/public/branch.svg: -------------------------------------------------------------------------------- 1 | 2 | ionicons-v5-d -------------------------------------------------------------------------------- /docs/public/config.svg: -------------------------------------------------------------------------------- 1 | 2 | ionicons-v5-n -------------------------------------------------------------------------------- /docs/public/flask.svg: -------------------------------------------------------------------------------- 1 | 2 | ionicons-v5-n -------------------------------------------------------------------------------- /docs/public/i18n.svg: -------------------------------------------------------------------------------- 1 | 2 | ionicons-v5-e -------------------------------------------------------------------------------- /docs/translated/test/config.md: -------------------------------------------------------------------------------- 1 | --- 2 | outline: none 3 | layout: home 4 | --- 5 | 6 |
7 | 8 | # TEST Configuration Reference 9 | 10 | This is a test configuration reference page. Please ignore it. Just testing i18n with versioning. -------------------------------------------------------------------------------- /docs/translated/test/guide/adding-version.md: -------------------------------------------------------------------------------- 1 | # TEST Adding a Version 2 | 3 | This is a test page. Please ignore it. Just testing i18n with versioning. -------------------------------------------------------------------------------- /docs/translated/test/guide/basic-setup.md: -------------------------------------------------------------------------------- 1 | # TEST Basic Setup 2 | 3 | This is a test page. Please ignore it. Just testing i18n with versioning. -------------------------------------------------------------------------------- /docs/translated/test/guide/index.md: -------------------------------------------------------------------------------- 1 | # TEST Installation 2 | 3 | This is a test page. Please ignore it. Just testing i18n with versioning. -------------------------------------------------------------------------------- /docs/translated/test/guide/troubleshooting.md: -------------------------------------------------------------------------------- 1 | # TEST Troubleshooting 2 | 3 | This is a test page. Please ignore it. Just testing i18n with versioning. -------------------------------------------------------------------------------- /docs/translated/test/index.md: -------------------------------------------------------------------------------- 1 | # Test Index Page 2 | 3 | This is a test index page. Please ignore it. -------------------------------------------------------------------------------- /docs/versions/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IMB11/vitepress-versioning-plugin/6d093afdb70ebee3be74ddb5bf0886a24236f7be/docs/versions/.gitkeep -------------------------------------------------------------------------------- /docs/versions/0.11.0/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Legacy vitepress-versioning-plugin 3 | description: Legacy page for vitepress-versioning-plugin 4 | outline: none 5 | layout: home 6 | --- 7 | 8 | ::: warning 9 | This is a legacy page for vitepress-versioning-plugin. Please refer to the [latest version](/) for the most up-to-date information. This page is for version `0.11.0`. 10 | ::: 11 | 12 | # vitepress-versioning-plugin 13 | 14 | This plugin adds versioning support to VitePress. 15 | 16 | ## Installation 17 | 18 | ```bash 19 | pnpm install vitepress-versioning-plugin 20 | ``` 21 | 22 | ## Usage 23 | 24 | Replace `defineConfig` in your `.vitepress/config.mts` with `defineVersionedConfig` and add a `versioning` object to your config. 25 | 26 | This `versioning` object should contain a `latestVersion` property, which is the name of the latest version (When no version is specified in the URL, eg: `/`). 27 | 28 | ```ts 29 | export default defineVersionedConfig(__dirname, { 30 | // ... your vitepress config. 31 | versioning: { 32 | latestVersion: "1.0.0", 33 | }, 34 | }); 35 | ``` 36 | 37 | ## Adding Versions 38 | 39 | To add a version, simply add a directory to the `versions` folder in the root of your vitepress site. 40 | 41 | To add a sidebar, put your sidebar into `.vitepress/sidebars/versioned/{version}.json` (or where specified by the `sidebarPathResolver` function). 42 | 43 | If you have locales in the version, localized sidebars can be found at `.vitepress/sidebars/versioned/{version}-{locale}.json`, or where specified by the `sidebarPathResolver` function. 44 | 45 | ## Configuration 46 | 47 | | Property | Description | Default Value | 48 | | -------------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | 49 | | `versioning.latestVersion` | The latest (current/root) version of the project. | None | 50 | | `versioning.switcher.text` | The text to display on the version switcher button. | 'Switch Version' | 51 | | `versioning.switcher.includeLatestVersion` | Should the latest (root) version be included in the version switcher? | `true` | 52 | | `versioning.sidebars.processSidebarURLs` | Whether or not to process sidebar URLs. Uses the `sidebarUrlProcessor` function. | `true` | 53 | | `versioning.sidebars.sidebarPathResolver` | The function that resolves the path to the sidebar file for a given version. | `(version) => '.vitepress/sidebars/versioned/${version}.json'` | 54 | | `versioning.sidebars.sidebarUrlProcessor` | The function that processes sidebar URLs. | `(url, version) => '/${version}${url}'` | 55 | | `versioning.rewrites.rewriteProcessor` | The function that processes rewrite URLs. | `(inputFilePath, version) => inputFilePath.replace('versions/', '')` | 56 | | `versioning.rewrites.localeRewriteProcessor` | The function that processes rewrite URLs for localized versions. | `(inputFilePath, version, locale) => '${locale}/' + inputFilePath.replace('versions/', '').replace('${locale}/', '')` | 57 | 58 | ## Troubleshooting 59 | 60 | #### "The sidebar cannot be an array. Please use a DefaultTheme.MultiSidebar object where the root ('/') is your array." 61 | 62 | This occurs when you have a sidebar that is an array, such as the following: 63 | 64 | ```ts 65 | sidebar: [ 66 | { 67 | text: '1.0.0', 68 | link: '/' 69 | } 70 | ], 71 | ``` 72 | 73 | Instead, you should have a sidebar object that looks like the following: 74 | 75 | ```ts 76 | sidebar: { 77 | '/': [ 78 | { 79 | text: '1.0.0', 80 | link: '/' 81 | } 82 | ] 83 | }, 84 | ``` 85 | 86 | This is because the sidebar object is expected to be a `DefaultTheme.MultiSidebar` object, where the root (`'/'`) is the array of sidebar items. 87 | 88 | I will not be developing an automatic migration from the array sidebar to the object sidebar, as this is a breaking change and should be done manually by developers. 89 | 90 | #### "Versioned sidebar preperation failed, disabling sidebar versioning." 91 | 92 | Please open an issue and provide a link to your documentation repository. This error occurs when the plugin is unable to find the sidebar for a version. This could be due to the sidebar not existing, or the sidebar being an array instead of an object. 93 | 94 | -------------------------------------------------------------------------------- /docs/versions/0.11.0/translated/test/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | outline: none 3 | layout: home 4 | --- 5 | 6 | # TEST vitepress-versioning-plugin 7 | 8 | This is a test page. Please ignore it. Just testing i18n with versioning. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vitepress-versioning-plugin", 3 | "version": "1.3.0", 4 | "description": "A highly customizable versioning plugin for VitePress v1", 5 | "main": "./dist/index.js", 6 | "module": "./dist/index.mjs", 7 | "types": "./dist/index.d.ts", 8 | "files": [ 9 | "dist", 10 | "src/components" 11 | ], 12 | "type": "module", 13 | "scripts": { 14 | "prepublish": "tsup", 15 | "build": "tsup", 16 | "docs": "vitepress dev docs", 17 | "docs:build": "vitepress build docs" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/imb11/vitepress-versioning-plugin.git" 22 | }, 23 | "keywords": [ 24 | "vitepress", 25 | "versioning", 26 | "i18n", 27 | "plugin", 28 | "vite" 29 | ], 30 | "author": "Calum H. (imb11)", 31 | "license": "MIT", 32 | "devDependencies": { 33 | "@types/cli-color": "^2.0.6", 34 | "@types/node": "^20.17.9", 35 | "@vueuse/core": "^10.11.1", 36 | "tsup": "^8.3.5", 37 | "typescript": "^5.7.2", 38 | "vue": "^3.5.13" 39 | }, 40 | "dependencies": { 41 | "@types/lodash": "^4.17.13", 42 | "cli-color": "^2.0.4", 43 | "json5": "^2.2.3", 44 | "lodash": "^4.17.21", 45 | "vite": "^5.4.11", 46 | "vitepress": "1.5.0", 47 | "vitepress-versioning-plugin": "file:" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@types/lodash': 12 | specifier: ^4.17.13 13 | version: 4.17.13 14 | cli-color: 15 | specifier: ^2.0.4 16 | version: 2.0.4 17 | json5: 18 | specifier: ^2.2.3 19 | version: 2.2.3 20 | lodash: 21 | specifier: ^4.17.21 22 | version: 4.17.21 23 | vite: 24 | specifier: ^5.4.11 25 | version: 5.4.11(@types/node@20.17.9) 26 | vitepress: 27 | specifier: 1.5.0 28 | version: 1.5.0(@algolia/client-search@5.15.0)(@types/node@20.17.9)(postcss@8.4.49)(search-insights@2.15.0)(typescript@5.7.2) 29 | vitepress-versioning-plugin: 30 | specifier: 'file:' 31 | version: file:(@algolia/client-search@5.15.0)(@types/node@20.17.9)(postcss@8.4.49)(search-insights@2.15.0)(typescript@5.7.2) 32 | devDependencies: 33 | '@types/cli-color': 34 | specifier: ^2.0.6 35 | version: 2.0.6 36 | '@types/node': 37 | specifier: ^20.17.9 38 | version: 20.17.9 39 | '@vueuse/core': 40 | specifier: ^10.11.1 41 | version: 10.11.1(vue@3.5.13(typescript@5.7.2)) 42 | tsup: 43 | specifier: ^8.3.5 44 | version: 8.3.5(postcss@8.4.49)(typescript@5.7.2) 45 | typescript: 46 | specifier: ^5.7.2 47 | version: 5.7.2 48 | vue: 49 | specifier: ^3.5.13 50 | version: 3.5.13(typescript@5.7.2) 51 | 52 | packages: 53 | 54 | '@algolia/autocomplete-core@1.17.7': 55 | resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} 56 | 57 | '@algolia/autocomplete-plugin-algolia-insights@1.17.7': 58 | resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} 59 | peerDependencies: 60 | search-insights: '>= 1 < 3' 61 | 62 | '@algolia/autocomplete-preset-algolia@1.17.7': 63 | resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} 64 | peerDependencies: 65 | '@algolia/client-search': '>= 4.9.1 < 6' 66 | algoliasearch: '>= 4.9.1 < 6' 67 | 68 | '@algolia/autocomplete-shared@1.17.7': 69 | resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} 70 | peerDependencies: 71 | '@algolia/client-search': '>= 4.9.1 < 6' 72 | algoliasearch: '>= 4.9.1 < 6' 73 | 74 | '@algolia/client-abtesting@5.15.0': 75 | resolution: {integrity: sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==} 76 | engines: {node: '>= 14.0.0'} 77 | 78 | '@algolia/client-analytics@5.15.0': 79 | resolution: {integrity: sha512-lho0gTFsQDIdCwyUKTtMuf9nCLwq9jOGlLGIeQGKDxXF7HbiAysFIu5QW/iQr1LzMgDyM9NH7K98KY+BiIFriQ==} 80 | engines: {node: '>= 14.0.0'} 81 | 82 | '@algolia/client-common@5.15.0': 83 | resolution: {integrity: sha512-IofrVh213VLsDkPoSKMeM9Dshrv28jhDlBDLRcVJQvlL8pzue7PEB1EZ4UoJFYS3NSn7JOcJ/V+olRQzXlJj1w==} 84 | engines: {node: '>= 14.0.0'} 85 | 86 | '@algolia/client-insights@5.15.0': 87 | resolution: {integrity: sha512-bDDEQGfFidDi0UQUCbxXOCdphbVAgbVmxvaV75cypBTQkJ+ABx/Npw7LkFGw1FsoVrttlrrQbwjvUB6mLVKs/w==} 88 | engines: {node: '>= 14.0.0'} 89 | 90 | '@algolia/client-personalization@5.15.0': 91 | resolution: {integrity: sha512-LfaZqLUWxdYFq44QrasCDED5bSYOswpQjSiIL7Q5fYlefAAUO95PzBPKCfUhSwhb4rKxigHfDkd81AvEicIEoA==} 92 | engines: {node: '>= 14.0.0'} 93 | 94 | '@algolia/client-query-suggestions@5.15.0': 95 | resolution: {integrity: sha512-wu8GVluiZ5+il8WIRsGKu8VxMK9dAlr225h878GGtpTL6VBvwyJvAyLdZsfFIpY0iN++jiNb31q2C1PlPL+n/A==} 96 | engines: {node: '>= 14.0.0'} 97 | 98 | '@algolia/client-search@5.15.0': 99 | resolution: {integrity: sha512-Z32gEMrRRpEta5UqVQA612sLdoqY3AovvUPClDfMxYrbdDAebmGDVPtSogUba1FZ4pP5dx20D3OV3reogLKsRA==} 100 | engines: {node: '>= 14.0.0'} 101 | 102 | '@algolia/ingestion@1.15.0': 103 | resolution: {integrity: sha512-MkqkAxBQxtQ5if/EX2IPqFA7LothghVyvPoRNA/meS2AW2qkHwcxjuiBxv4H6mnAVEPfJlhu9rkdVz9LgCBgJg==} 104 | engines: {node: '>= 14.0.0'} 105 | 106 | '@algolia/monitoring@1.15.0': 107 | resolution: {integrity: sha512-QPrFnnGLMMdRa8t/4bs7XilPYnoUXDY8PMQJ1sf9ZFwhUysYYhQNX34/enoO0LBjpoOY6rLpha39YQEFbzgKyQ==} 108 | engines: {node: '>= 14.0.0'} 109 | 110 | '@algolia/recommend@5.15.0': 111 | resolution: {integrity: sha512-5eupMwSqMLDObgSMF0XG958zR6GJP3f7jHDQ3/WlzCM9/YIJiWIUoJFGsko9GYsA5xbLDHE/PhWtq4chcCdaGQ==} 112 | engines: {node: '>= 14.0.0'} 113 | 114 | '@algolia/requester-browser-xhr@5.15.0': 115 | resolution: {integrity: sha512-Po/GNib6QKruC3XE+WKP1HwVSfCDaZcXu48kD+gwmtDlqHWKc7Bq9lrS0sNZ456rfCKhXksOmMfUs4wRM/Y96w==} 116 | engines: {node: '>= 14.0.0'} 117 | 118 | '@algolia/requester-fetch@5.15.0': 119 | resolution: {integrity: sha512-rOZ+c0P7ajmccAvpeeNrUmEKoliYFL8aOR5qGW5pFq3oj3Iept7Y5mEtEsOBYsRt6qLnaXn4zUKf+N8nvJpcIw==} 120 | engines: {node: '>= 14.0.0'} 121 | 122 | '@algolia/requester-node-http@5.15.0': 123 | resolution: {integrity: sha512-b1jTpbFf9LnQHEJP5ddDJKE2sAlhYd7EVSOWgzo/27n/SfCoHfqD0VWntnWYD83PnOKvfe8auZ2+xCb0TXotrQ==} 124 | engines: {node: '>= 14.0.0'} 125 | 126 | '@babel/helper-string-parser@7.25.9': 127 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 128 | engines: {node: '>=6.9.0'} 129 | 130 | '@babel/helper-validator-identifier@7.25.9': 131 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 132 | engines: {node: '>=6.9.0'} 133 | 134 | '@babel/parser@7.26.3': 135 | resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} 136 | engines: {node: '>=6.0.0'} 137 | hasBin: true 138 | 139 | '@babel/types@7.26.3': 140 | resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} 141 | engines: {node: '>=6.9.0'} 142 | 143 | '@docsearch/css@3.8.0': 144 | resolution: {integrity: sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==} 145 | 146 | '@docsearch/js@3.8.0': 147 | resolution: {integrity: sha512-PVuV629f5UcYRtBWqK7ID6vNL5647+2ADJypwTjfeBIrJfwPuHtzLy39hMGMfFK+0xgRyhTR0FZ83EkdEraBlg==} 148 | 149 | '@docsearch/react@3.8.0': 150 | resolution: {integrity: sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==} 151 | peerDependencies: 152 | '@types/react': '>= 16.8.0 < 19.0.0' 153 | react: '>= 16.8.0 < 19.0.0' 154 | react-dom: '>= 16.8.0 < 19.0.0' 155 | search-insights: '>= 1 < 3' 156 | peerDependenciesMeta: 157 | '@types/react': 158 | optional: true 159 | react: 160 | optional: true 161 | react-dom: 162 | optional: true 163 | search-insights: 164 | optional: true 165 | 166 | '@esbuild/aix-ppc64@0.21.5': 167 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 168 | engines: {node: '>=12'} 169 | cpu: [ppc64] 170 | os: [aix] 171 | 172 | '@esbuild/aix-ppc64@0.24.0': 173 | resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} 174 | engines: {node: '>=18'} 175 | cpu: [ppc64] 176 | os: [aix] 177 | 178 | '@esbuild/android-arm64@0.21.5': 179 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 180 | engines: {node: '>=12'} 181 | cpu: [arm64] 182 | os: [android] 183 | 184 | '@esbuild/android-arm64@0.24.0': 185 | resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} 186 | engines: {node: '>=18'} 187 | cpu: [arm64] 188 | os: [android] 189 | 190 | '@esbuild/android-arm@0.21.5': 191 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 192 | engines: {node: '>=12'} 193 | cpu: [arm] 194 | os: [android] 195 | 196 | '@esbuild/android-arm@0.24.0': 197 | resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} 198 | engines: {node: '>=18'} 199 | cpu: [arm] 200 | os: [android] 201 | 202 | '@esbuild/android-x64@0.21.5': 203 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 204 | engines: {node: '>=12'} 205 | cpu: [x64] 206 | os: [android] 207 | 208 | '@esbuild/android-x64@0.24.0': 209 | resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} 210 | engines: {node: '>=18'} 211 | cpu: [x64] 212 | os: [android] 213 | 214 | '@esbuild/darwin-arm64@0.21.5': 215 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 216 | engines: {node: '>=12'} 217 | cpu: [arm64] 218 | os: [darwin] 219 | 220 | '@esbuild/darwin-arm64@0.24.0': 221 | resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} 222 | engines: {node: '>=18'} 223 | cpu: [arm64] 224 | os: [darwin] 225 | 226 | '@esbuild/darwin-x64@0.21.5': 227 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 228 | engines: {node: '>=12'} 229 | cpu: [x64] 230 | os: [darwin] 231 | 232 | '@esbuild/darwin-x64@0.24.0': 233 | resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} 234 | engines: {node: '>=18'} 235 | cpu: [x64] 236 | os: [darwin] 237 | 238 | '@esbuild/freebsd-arm64@0.21.5': 239 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 240 | engines: {node: '>=12'} 241 | cpu: [arm64] 242 | os: [freebsd] 243 | 244 | '@esbuild/freebsd-arm64@0.24.0': 245 | resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} 246 | engines: {node: '>=18'} 247 | cpu: [arm64] 248 | os: [freebsd] 249 | 250 | '@esbuild/freebsd-x64@0.21.5': 251 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 252 | engines: {node: '>=12'} 253 | cpu: [x64] 254 | os: [freebsd] 255 | 256 | '@esbuild/freebsd-x64@0.24.0': 257 | resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} 258 | engines: {node: '>=18'} 259 | cpu: [x64] 260 | os: [freebsd] 261 | 262 | '@esbuild/linux-arm64@0.21.5': 263 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 264 | engines: {node: '>=12'} 265 | cpu: [arm64] 266 | os: [linux] 267 | 268 | '@esbuild/linux-arm64@0.24.0': 269 | resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} 270 | engines: {node: '>=18'} 271 | cpu: [arm64] 272 | os: [linux] 273 | 274 | '@esbuild/linux-arm@0.21.5': 275 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 276 | engines: {node: '>=12'} 277 | cpu: [arm] 278 | os: [linux] 279 | 280 | '@esbuild/linux-arm@0.24.0': 281 | resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} 282 | engines: {node: '>=18'} 283 | cpu: [arm] 284 | os: [linux] 285 | 286 | '@esbuild/linux-ia32@0.21.5': 287 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 288 | engines: {node: '>=12'} 289 | cpu: [ia32] 290 | os: [linux] 291 | 292 | '@esbuild/linux-ia32@0.24.0': 293 | resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} 294 | engines: {node: '>=18'} 295 | cpu: [ia32] 296 | os: [linux] 297 | 298 | '@esbuild/linux-loong64@0.21.5': 299 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 300 | engines: {node: '>=12'} 301 | cpu: [loong64] 302 | os: [linux] 303 | 304 | '@esbuild/linux-loong64@0.24.0': 305 | resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} 306 | engines: {node: '>=18'} 307 | cpu: [loong64] 308 | os: [linux] 309 | 310 | '@esbuild/linux-mips64el@0.21.5': 311 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 312 | engines: {node: '>=12'} 313 | cpu: [mips64el] 314 | os: [linux] 315 | 316 | '@esbuild/linux-mips64el@0.24.0': 317 | resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} 318 | engines: {node: '>=18'} 319 | cpu: [mips64el] 320 | os: [linux] 321 | 322 | '@esbuild/linux-ppc64@0.21.5': 323 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 324 | engines: {node: '>=12'} 325 | cpu: [ppc64] 326 | os: [linux] 327 | 328 | '@esbuild/linux-ppc64@0.24.0': 329 | resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} 330 | engines: {node: '>=18'} 331 | cpu: [ppc64] 332 | os: [linux] 333 | 334 | '@esbuild/linux-riscv64@0.21.5': 335 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 336 | engines: {node: '>=12'} 337 | cpu: [riscv64] 338 | os: [linux] 339 | 340 | '@esbuild/linux-riscv64@0.24.0': 341 | resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} 342 | engines: {node: '>=18'} 343 | cpu: [riscv64] 344 | os: [linux] 345 | 346 | '@esbuild/linux-s390x@0.21.5': 347 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 348 | engines: {node: '>=12'} 349 | cpu: [s390x] 350 | os: [linux] 351 | 352 | '@esbuild/linux-s390x@0.24.0': 353 | resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} 354 | engines: {node: '>=18'} 355 | cpu: [s390x] 356 | os: [linux] 357 | 358 | '@esbuild/linux-x64@0.21.5': 359 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 360 | engines: {node: '>=12'} 361 | cpu: [x64] 362 | os: [linux] 363 | 364 | '@esbuild/linux-x64@0.24.0': 365 | resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} 366 | engines: {node: '>=18'} 367 | cpu: [x64] 368 | os: [linux] 369 | 370 | '@esbuild/netbsd-x64@0.21.5': 371 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 372 | engines: {node: '>=12'} 373 | cpu: [x64] 374 | os: [netbsd] 375 | 376 | '@esbuild/netbsd-x64@0.24.0': 377 | resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} 378 | engines: {node: '>=18'} 379 | cpu: [x64] 380 | os: [netbsd] 381 | 382 | '@esbuild/openbsd-arm64@0.24.0': 383 | resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} 384 | engines: {node: '>=18'} 385 | cpu: [arm64] 386 | os: [openbsd] 387 | 388 | '@esbuild/openbsd-x64@0.21.5': 389 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 390 | engines: {node: '>=12'} 391 | cpu: [x64] 392 | os: [openbsd] 393 | 394 | '@esbuild/openbsd-x64@0.24.0': 395 | resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} 396 | engines: {node: '>=18'} 397 | cpu: [x64] 398 | os: [openbsd] 399 | 400 | '@esbuild/sunos-x64@0.21.5': 401 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 402 | engines: {node: '>=12'} 403 | cpu: [x64] 404 | os: [sunos] 405 | 406 | '@esbuild/sunos-x64@0.24.0': 407 | resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} 408 | engines: {node: '>=18'} 409 | cpu: [x64] 410 | os: [sunos] 411 | 412 | '@esbuild/win32-arm64@0.21.5': 413 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 414 | engines: {node: '>=12'} 415 | cpu: [arm64] 416 | os: [win32] 417 | 418 | '@esbuild/win32-arm64@0.24.0': 419 | resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} 420 | engines: {node: '>=18'} 421 | cpu: [arm64] 422 | os: [win32] 423 | 424 | '@esbuild/win32-ia32@0.21.5': 425 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 426 | engines: {node: '>=12'} 427 | cpu: [ia32] 428 | os: [win32] 429 | 430 | '@esbuild/win32-ia32@0.24.0': 431 | resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} 432 | engines: {node: '>=18'} 433 | cpu: [ia32] 434 | os: [win32] 435 | 436 | '@esbuild/win32-x64@0.21.5': 437 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 438 | engines: {node: '>=12'} 439 | cpu: [x64] 440 | os: [win32] 441 | 442 | '@esbuild/win32-x64@0.24.0': 443 | resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} 444 | engines: {node: '>=18'} 445 | cpu: [x64] 446 | os: [win32] 447 | 448 | '@iconify-json/simple-icons@1.2.14': 449 | resolution: {integrity: sha512-zLqb48pM1B5vegMBDouyv7FzrROV5HRIjDpl+/PKjY3P7AeSySaOeT6mzutF6hDZCJvn1J7qQ7lug3FOgegiiA==} 450 | 451 | '@iconify/types@2.0.0': 452 | resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 453 | 454 | '@isaacs/cliui@8.0.2': 455 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 456 | engines: {node: '>=12'} 457 | 458 | '@jridgewell/gen-mapping@0.3.5': 459 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 460 | engines: {node: '>=6.0.0'} 461 | 462 | '@jridgewell/resolve-uri@3.1.2': 463 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 464 | engines: {node: '>=6.0.0'} 465 | 466 | '@jridgewell/set-array@1.2.1': 467 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 468 | engines: {node: '>=6.0.0'} 469 | 470 | '@jridgewell/sourcemap-codec@1.5.0': 471 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 472 | 473 | '@jridgewell/trace-mapping@0.3.25': 474 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 475 | 476 | '@pkgjs/parseargs@0.11.0': 477 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 478 | engines: {node: '>=14'} 479 | 480 | '@rollup/rollup-android-arm-eabi@4.28.1': 481 | resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} 482 | cpu: [arm] 483 | os: [android] 484 | 485 | '@rollup/rollup-android-arm64@4.28.1': 486 | resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} 487 | cpu: [arm64] 488 | os: [android] 489 | 490 | '@rollup/rollup-darwin-arm64@4.28.1': 491 | resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} 492 | cpu: [arm64] 493 | os: [darwin] 494 | 495 | '@rollup/rollup-darwin-x64@4.28.1': 496 | resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} 497 | cpu: [x64] 498 | os: [darwin] 499 | 500 | '@rollup/rollup-freebsd-arm64@4.28.1': 501 | resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} 502 | cpu: [arm64] 503 | os: [freebsd] 504 | 505 | '@rollup/rollup-freebsd-x64@4.28.1': 506 | resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} 507 | cpu: [x64] 508 | os: [freebsd] 509 | 510 | '@rollup/rollup-linux-arm-gnueabihf@4.28.1': 511 | resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} 512 | cpu: [arm] 513 | os: [linux] 514 | 515 | '@rollup/rollup-linux-arm-musleabihf@4.28.1': 516 | resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} 517 | cpu: [arm] 518 | os: [linux] 519 | 520 | '@rollup/rollup-linux-arm64-gnu@4.28.1': 521 | resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} 522 | cpu: [arm64] 523 | os: [linux] 524 | 525 | '@rollup/rollup-linux-arm64-musl@4.28.1': 526 | resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} 527 | cpu: [arm64] 528 | os: [linux] 529 | 530 | '@rollup/rollup-linux-loongarch64-gnu@4.28.1': 531 | resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} 532 | cpu: [loong64] 533 | os: [linux] 534 | 535 | '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': 536 | resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} 537 | cpu: [ppc64] 538 | os: [linux] 539 | 540 | '@rollup/rollup-linux-riscv64-gnu@4.28.1': 541 | resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} 542 | cpu: [riscv64] 543 | os: [linux] 544 | 545 | '@rollup/rollup-linux-s390x-gnu@4.28.1': 546 | resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} 547 | cpu: [s390x] 548 | os: [linux] 549 | 550 | '@rollup/rollup-linux-x64-gnu@4.28.1': 551 | resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} 552 | cpu: [x64] 553 | os: [linux] 554 | 555 | '@rollup/rollup-linux-x64-musl@4.28.1': 556 | resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} 557 | cpu: [x64] 558 | os: [linux] 559 | 560 | '@rollup/rollup-win32-arm64-msvc@4.28.1': 561 | resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} 562 | cpu: [arm64] 563 | os: [win32] 564 | 565 | '@rollup/rollup-win32-ia32-msvc@4.28.1': 566 | resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} 567 | cpu: [ia32] 568 | os: [win32] 569 | 570 | '@rollup/rollup-win32-x64-msvc@4.28.1': 571 | resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} 572 | cpu: [x64] 573 | os: [win32] 574 | 575 | '@shikijs/core@1.24.0': 576 | resolution: {integrity: sha512-6pvdH0KoahMzr6689yh0QJ3rCgF4j1XsXRHNEeEN6M4xJTfQ6QPWrmHzIddotg+xPJUPEPzYzYCKzpYyhTI6Gw==} 577 | 578 | '@shikijs/engine-javascript@1.24.0': 579 | resolution: {integrity: sha512-ZA6sCeSsF3Mnlxxr+4wGEJ9Tto4RHmfIS7ox8KIAbH0MTVUkw3roHPHZN+LlJMOHJJOVupe6tvuAzRpN8qK1vA==} 580 | 581 | '@shikijs/engine-oniguruma@1.24.0': 582 | resolution: {integrity: sha512-Eua0qNOL73Y82lGA4GF5P+G2+VXX9XnuUxkiUuwcxQPH4wom+tE39kZpBFXfUuwNYxHSkrSxpB1p4kyRW0moSg==} 583 | 584 | '@shikijs/transformers@1.24.0': 585 | resolution: {integrity: sha512-Qf/hby+PRPkoHncjYnJf5svK1aCsOUtQhuLzKPnmeXJtuUZCmbH0pTpdNtXe9tgln/RHlyRJnv7q46HHS1sO0Q==} 586 | 587 | '@shikijs/types@1.24.0': 588 | resolution: {integrity: sha512-aptbEuq1Pk88DMlCe+FzXNnBZ17LCiLIGWAeCWhoFDzia5Q5Krx3DgnULLiouSdd6+LUM39XwXGppqYE0Ghtug==} 589 | 590 | '@shikijs/vscode-textmate@9.3.0': 591 | resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} 592 | 593 | '@types/cli-color@2.0.6': 594 | resolution: {integrity: sha512-uLK0/0dOYdkX8hNsezpYh1gc8eerbhf9bOKZ3e24sP67703mw9S14/yW6mSTatiaKO9v+mU/a1EVy4rOXXeZTA==} 595 | 596 | '@types/estree@1.0.6': 597 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 598 | 599 | '@types/hast@3.0.4': 600 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 601 | 602 | '@types/linkify-it@5.0.0': 603 | resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} 604 | 605 | '@types/lodash@4.17.13': 606 | resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} 607 | 608 | '@types/markdown-it@14.1.2': 609 | resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} 610 | 611 | '@types/mdast@4.0.4': 612 | resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} 613 | 614 | '@types/mdurl@2.0.0': 615 | resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} 616 | 617 | '@types/node@20.17.9': 618 | resolution: {integrity: sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==} 619 | 620 | '@types/unist@3.0.3': 621 | resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 622 | 623 | '@types/web-bluetooth@0.0.20': 624 | resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} 625 | 626 | '@ungap/structured-clone@1.2.1': 627 | resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} 628 | 629 | '@vitejs/plugin-vue@5.2.1': 630 | resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} 631 | engines: {node: ^18.0.0 || >=20.0.0} 632 | peerDependencies: 633 | vite: ^5.0.0 || ^6.0.0 634 | vue: ^3.2.25 635 | 636 | '@vue/compiler-core@3.5.13': 637 | resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} 638 | 639 | '@vue/compiler-dom@3.5.13': 640 | resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} 641 | 642 | '@vue/compiler-sfc@3.5.13': 643 | resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} 644 | 645 | '@vue/compiler-ssr@3.5.13': 646 | resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} 647 | 648 | '@vue/devtools-api@7.6.7': 649 | resolution: {integrity: sha512-PV4I31WaV2rfA8RGauM+69uFEzWkqtP561RiLU2wK+Ce85u3zyKW3aoESlLCNzkc4y0JaJyskH6zAE3xWOP8+Q==} 650 | 651 | '@vue/devtools-kit@7.6.7': 652 | resolution: {integrity: sha512-V8/jrXY/swHgnblABG9U4QCbE60c6RuPasmv2d9FvVqc5d94t1vDiESuvRmdNJBdWz4/D3q6ffgyAfRVjwHYEw==} 653 | 654 | '@vue/devtools-shared@7.6.7': 655 | resolution: {integrity: sha512-QggO6SviAsolrePAXZ/sA1dSicSPt4TueZibCvydfhNDieL1lAuyMTgQDGst7TEvMGb4vgYv2I+1sDkO4jWNnw==} 656 | 657 | '@vue/reactivity@3.5.13': 658 | resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} 659 | 660 | '@vue/runtime-core@3.5.13': 661 | resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} 662 | 663 | '@vue/runtime-dom@3.5.13': 664 | resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} 665 | 666 | '@vue/server-renderer@3.5.13': 667 | resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} 668 | peerDependencies: 669 | vue: 3.5.13 670 | 671 | '@vue/shared@3.5.13': 672 | resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 673 | 674 | '@vueuse/core@10.11.1': 675 | resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} 676 | 677 | '@vueuse/core@11.3.0': 678 | resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} 679 | 680 | '@vueuse/integrations@11.3.0': 681 | resolution: {integrity: sha512-5fzRl0apQWrDezmobchoiGTkGw238VWESxZHazfhP3RM7pDSiyXy18QbfYkILoYNTd23HPAfQTJpkUc5QbkwTw==} 682 | peerDependencies: 683 | async-validator: ^4 684 | axios: ^1 685 | change-case: ^5 686 | drauu: ^0.4 687 | focus-trap: ^7 688 | fuse.js: ^7 689 | idb-keyval: ^6 690 | jwt-decode: ^4 691 | nprogress: ^0.2 692 | qrcode: ^1.5 693 | sortablejs: ^1 694 | universal-cookie: ^7 695 | peerDependenciesMeta: 696 | async-validator: 697 | optional: true 698 | axios: 699 | optional: true 700 | change-case: 701 | optional: true 702 | drauu: 703 | optional: true 704 | focus-trap: 705 | optional: true 706 | fuse.js: 707 | optional: true 708 | idb-keyval: 709 | optional: true 710 | jwt-decode: 711 | optional: true 712 | nprogress: 713 | optional: true 714 | qrcode: 715 | optional: true 716 | sortablejs: 717 | optional: true 718 | universal-cookie: 719 | optional: true 720 | 721 | '@vueuse/metadata@10.11.1': 722 | resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} 723 | 724 | '@vueuse/metadata@11.3.0': 725 | resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} 726 | 727 | '@vueuse/shared@10.11.1': 728 | resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} 729 | 730 | '@vueuse/shared@11.3.0': 731 | resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} 732 | 733 | algoliasearch@5.15.0: 734 | resolution: {integrity: sha512-Yf3Swz1s63hjvBVZ/9f2P1Uu48GjmjCN+Esxb6MAONMGtZB1fRX8/S1AhUTtsuTlcGovbYLxpHgc7wEzstDZBw==} 735 | engines: {node: '>= 14.0.0'} 736 | 737 | ansi-regex@5.0.1: 738 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 739 | engines: {node: '>=8'} 740 | 741 | ansi-regex@6.1.0: 742 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 743 | engines: {node: '>=12'} 744 | 745 | ansi-styles@4.3.0: 746 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 747 | engines: {node: '>=8'} 748 | 749 | ansi-styles@6.2.1: 750 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 751 | engines: {node: '>=12'} 752 | 753 | any-promise@1.3.0: 754 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 755 | 756 | balanced-match@1.0.2: 757 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 758 | 759 | birpc@0.2.19: 760 | resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} 761 | 762 | brace-expansion@2.0.1: 763 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 764 | 765 | bundle-require@5.0.0: 766 | resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} 767 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 768 | peerDependencies: 769 | esbuild: '>=0.18' 770 | 771 | cac@6.7.14: 772 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 773 | engines: {node: '>=8'} 774 | 775 | ccount@2.0.1: 776 | resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 777 | 778 | character-entities-html4@2.1.0: 779 | resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 780 | 781 | character-entities-legacy@3.0.0: 782 | resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 783 | 784 | chokidar@4.0.1: 785 | resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} 786 | engines: {node: '>= 14.16.0'} 787 | 788 | cli-color@2.0.4: 789 | resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} 790 | engines: {node: '>=0.10'} 791 | 792 | color-convert@2.0.1: 793 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 794 | engines: {node: '>=7.0.0'} 795 | 796 | color-name@1.1.4: 797 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 798 | 799 | comma-separated-tokens@2.0.3: 800 | resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 801 | 802 | commander@4.1.1: 803 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 804 | engines: {node: '>= 6'} 805 | 806 | consola@3.2.3: 807 | resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} 808 | engines: {node: ^14.18.0 || >=16.10.0} 809 | 810 | copy-anything@3.0.5: 811 | resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} 812 | engines: {node: '>=12.13'} 813 | 814 | cross-spawn@7.0.6: 815 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 816 | engines: {node: '>= 8'} 817 | 818 | csstype@3.1.3: 819 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 820 | 821 | d@1.0.2: 822 | resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} 823 | engines: {node: '>=0.12'} 824 | 825 | debug@4.4.0: 826 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 827 | engines: {node: '>=6.0'} 828 | peerDependencies: 829 | supports-color: '*' 830 | peerDependenciesMeta: 831 | supports-color: 832 | optional: true 833 | 834 | dequal@2.0.3: 835 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 836 | engines: {node: '>=6'} 837 | 838 | devlop@1.1.0: 839 | resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 840 | 841 | eastasianwidth@0.2.0: 842 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 843 | 844 | emoji-regex-xs@1.0.0: 845 | resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} 846 | 847 | emoji-regex@8.0.0: 848 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 849 | 850 | emoji-regex@9.2.2: 851 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 852 | 853 | entities@4.5.0: 854 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 855 | engines: {node: '>=0.12'} 856 | 857 | es5-ext@0.10.64: 858 | resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} 859 | engines: {node: '>=0.10'} 860 | 861 | es6-iterator@2.0.3: 862 | resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} 863 | 864 | es6-symbol@3.1.4: 865 | resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} 866 | engines: {node: '>=0.12'} 867 | 868 | es6-weak-map@2.0.3: 869 | resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} 870 | 871 | esbuild@0.21.5: 872 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 873 | engines: {node: '>=12'} 874 | hasBin: true 875 | 876 | esbuild@0.24.0: 877 | resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} 878 | engines: {node: '>=18'} 879 | hasBin: true 880 | 881 | esniff@2.0.1: 882 | resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} 883 | engines: {node: '>=0.10'} 884 | 885 | estree-walker@2.0.2: 886 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 887 | 888 | event-emitter@0.3.5: 889 | resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} 890 | 891 | ext@1.7.0: 892 | resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} 893 | 894 | fdir@6.4.2: 895 | resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} 896 | peerDependencies: 897 | picomatch: ^3 || ^4 898 | peerDependenciesMeta: 899 | picomatch: 900 | optional: true 901 | 902 | focus-trap@7.6.2: 903 | resolution: {integrity: sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==} 904 | 905 | foreground-child@3.3.0: 906 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 907 | engines: {node: '>=14'} 908 | 909 | fsevents@2.3.3: 910 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 911 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 912 | os: [darwin] 913 | 914 | glob@10.4.5: 915 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 916 | hasBin: true 917 | 918 | hast-util-to-html@9.0.3: 919 | resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} 920 | 921 | hast-util-whitespace@3.0.0: 922 | resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 923 | 924 | hookable@5.5.3: 925 | resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} 926 | 927 | html-void-elements@3.0.0: 928 | resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 929 | 930 | is-fullwidth-code-point@3.0.0: 931 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 932 | engines: {node: '>=8'} 933 | 934 | is-promise@2.2.2: 935 | resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} 936 | 937 | is-what@4.1.16: 938 | resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} 939 | engines: {node: '>=12.13'} 940 | 941 | isexe@2.0.0: 942 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 943 | 944 | jackspeak@3.4.3: 945 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 946 | 947 | joycon@3.1.1: 948 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 949 | engines: {node: '>=10'} 950 | 951 | json5@2.2.3: 952 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 953 | engines: {node: '>=6'} 954 | hasBin: true 955 | 956 | lilconfig@3.1.3: 957 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 958 | engines: {node: '>=14'} 959 | 960 | lines-and-columns@1.2.4: 961 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 962 | 963 | load-tsconfig@0.2.5: 964 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 965 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 966 | 967 | lodash.sortby@4.7.0: 968 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 969 | 970 | lodash@4.17.21: 971 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 972 | 973 | lru-cache@10.4.3: 974 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 975 | 976 | lru-queue@0.1.0: 977 | resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} 978 | 979 | magic-string@0.30.14: 980 | resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} 981 | 982 | mark.js@8.11.1: 983 | resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} 984 | 985 | mdast-util-to-hast@13.2.0: 986 | resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} 987 | 988 | memoizee@0.4.17: 989 | resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} 990 | engines: {node: '>=0.12'} 991 | 992 | micromark-util-character@2.1.1: 993 | resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} 994 | 995 | micromark-util-encode@2.0.1: 996 | resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} 997 | 998 | micromark-util-sanitize-uri@2.0.1: 999 | resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} 1000 | 1001 | micromark-util-symbol@2.0.1: 1002 | resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} 1003 | 1004 | micromark-util-types@2.0.1: 1005 | resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} 1006 | 1007 | minimatch@9.0.5: 1008 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1009 | engines: {node: '>=16 || 14 >=14.17'} 1010 | 1011 | minipass@7.1.2: 1012 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1013 | engines: {node: '>=16 || 14 >=14.17'} 1014 | 1015 | minisearch@7.1.1: 1016 | resolution: {integrity: sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==} 1017 | 1018 | mitt@3.0.1: 1019 | resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} 1020 | 1021 | ms@2.1.3: 1022 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1023 | 1024 | mz@2.7.0: 1025 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1026 | 1027 | nanoid@3.3.8: 1028 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 1029 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1030 | hasBin: true 1031 | 1032 | next-tick@1.1.0: 1033 | resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} 1034 | 1035 | object-assign@4.1.1: 1036 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1037 | engines: {node: '>=0.10.0'} 1038 | 1039 | oniguruma-to-es@0.7.0: 1040 | resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} 1041 | 1042 | package-json-from-dist@1.0.1: 1043 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1044 | 1045 | path-key@3.1.1: 1046 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1047 | engines: {node: '>=8'} 1048 | 1049 | path-scurry@1.11.1: 1050 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1051 | engines: {node: '>=16 || 14 >=14.18'} 1052 | 1053 | perfect-debounce@1.0.0: 1054 | resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 1055 | 1056 | picocolors@1.1.1: 1057 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1058 | 1059 | picomatch@4.0.2: 1060 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1061 | engines: {node: '>=12'} 1062 | 1063 | pirates@4.0.6: 1064 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1065 | engines: {node: '>= 6'} 1066 | 1067 | postcss-load-config@6.0.1: 1068 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 1069 | engines: {node: '>= 18'} 1070 | peerDependencies: 1071 | jiti: '>=1.21.0' 1072 | postcss: '>=8.0.9' 1073 | tsx: ^4.8.1 1074 | yaml: ^2.4.2 1075 | peerDependenciesMeta: 1076 | jiti: 1077 | optional: true 1078 | postcss: 1079 | optional: true 1080 | tsx: 1081 | optional: true 1082 | yaml: 1083 | optional: true 1084 | 1085 | postcss@8.4.49: 1086 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 1087 | engines: {node: ^10 || ^12 || >=14} 1088 | 1089 | preact@10.25.1: 1090 | resolution: {integrity: sha512-frxeZV2vhQSohQwJ7FvlqC40ze89+8friponWUFeVEkaCfhC6Eu4V0iND5C9CXz8JLndV07QRDeXzH1+Anz5Og==} 1091 | 1092 | property-information@6.5.0: 1093 | resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} 1094 | 1095 | punycode@2.3.1: 1096 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1097 | engines: {node: '>=6'} 1098 | 1099 | readdirp@4.0.2: 1100 | resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} 1101 | engines: {node: '>= 14.16.0'} 1102 | 1103 | regex-recursion@4.3.0: 1104 | resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==} 1105 | 1106 | regex-utilities@2.3.0: 1107 | resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} 1108 | 1109 | regex@5.0.2: 1110 | resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} 1111 | 1112 | resolve-from@5.0.0: 1113 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1114 | engines: {node: '>=8'} 1115 | 1116 | rfdc@1.4.1: 1117 | resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 1118 | 1119 | rollup@4.28.1: 1120 | resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} 1121 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1122 | hasBin: true 1123 | 1124 | search-insights@2.15.0: 1125 | resolution: {integrity: sha512-ch2sPCUDD4sbPQdknVl9ALSi9H7VyoeVbsxznYz6QV55jJ8CI3EtwpO1i84keN4+hF5IeHWIeGvc08530JkVXQ==} 1126 | 1127 | shebang-command@2.0.0: 1128 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1129 | engines: {node: '>=8'} 1130 | 1131 | shebang-regex@3.0.0: 1132 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1133 | engines: {node: '>=8'} 1134 | 1135 | shiki@1.24.0: 1136 | resolution: {integrity: sha512-qIneep7QRwxRd5oiHb8jaRzH15V/S8F3saCXOdjwRLgozZJr5x2yeBhQtqkO3FSzQDwYEFAYuifg4oHjpDghrg==} 1137 | 1138 | signal-exit@4.1.0: 1139 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1140 | engines: {node: '>=14'} 1141 | 1142 | source-map-js@1.2.1: 1143 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1144 | engines: {node: '>=0.10.0'} 1145 | 1146 | source-map@0.8.0-beta.0: 1147 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1148 | engines: {node: '>= 8'} 1149 | 1150 | space-separated-tokens@2.0.2: 1151 | resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 1152 | 1153 | speakingurl@14.0.1: 1154 | resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} 1155 | engines: {node: '>=0.10.0'} 1156 | 1157 | string-width@4.2.3: 1158 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1159 | engines: {node: '>=8'} 1160 | 1161 | string-width@5.1.2: 1162 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1163 | engines: {node: '>=12'} 1164 | 1165 | stringify-entities@4.0.4: 1166 | resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 1167 | 1168 | strip-ansi@6.0.1: 1169 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1170 | engines: {node: '>=8'} 1171 | 1172 | strip-ansi@7.1.0: 1173 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1174 | engines: {node: '>=12'} 1175 | 1176 | sucrase@3.35.0: 1177 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1178 | engines: {node: '>=16 || 14 >=14.17'} 1179 | hasBin: true 1180 | 1181 | superjson@2.2.2: 1182 | resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} 1183 | engines: {node: '>=16'} 1184 | 1185 | tabbable@6.2.0: 1186 | resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} 1187 | 1188 | thenify-all@1.6.0: 1189 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1190 | engines: {node: '>=0.8'} 1191 | 1192 | thenify@3.3.1: 1193 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1194 | 1195 | timers-ext@0.1.8: 1196 | resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} 1197 | engines: {node: '>=0.12'} 1198 | 1199 | tinyexec@0.3.1: 1200 | resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} 1201 | 1202 | tinyglobby@0.2.10: 1203 | resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} 1204 | engines: {node: '>=12.0.0'} 1205 | 1206 | tr46@1.0.1: 1207 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1208 | 1209 | tree-kill@1.2.2: 1210 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1211 | hasBin: true 1212 | 1213 | trim-lines@3.0.1: 1214 | resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 1215 | 1216 | ts-interface-checker@0.1.13: 1217 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1218 | 1219 | tsup@8.3.5: 1220 | resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} 1221 | engines: {node: '>=18'} 1222 | hasBin: true 1223 | peerDependencies: 1224 | '@microsoft/api-extractor': ^7.36.0 1225 | '@swc/core': ^1 1226 | postcss: ^8.4.12 1227 | typescript: '>=4.5.0' 1228 | peerDependenciesMeta: 1229 | '@microsoft/api-extractor': 1230 | optional: true 1231 | '@swc/core': 1232 | optional: true 1233 | postcss: 1234 | optional: true 1235 | typescript: 1236 | optional: true 1237 | 1238 | type@2.7.3: 1239 | resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} 1240 | 1241 | typescript@5.7.2: 1242 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 1243 | engines: {node: '>=14.17'} 1244 | hasBin: true 1245 | 1246 | undici-types@6.19.8: 1247 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 1248 | 1249 | unist-util-is@6.0.0: 1250 | resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} 1251 | 1252 | unist-util-position@5.0.0: 1253 | resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 1254 | 1255 | unist-util-stringify-position@4.0.0: 1256 | resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 1257 | 1258 | unist-util-visit-parents@6.0.1: 1259 | resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} 1260 | 1261 | unist-util-visit@5.0.0: 1262 | resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 1263 | 1264 | vfile-message@4.0.2: 1265 | resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} 1266 | 1267 | vfile@6.0.3: 1268 | resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 1269 | 1270 | vite@5.4.11: 1271 | resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} 1272 | engines: {node: ^18.0.0 || >=20.0.0} 1273 | hasBin: true 1274 | peerDependencies: 1275 | '@types/node': ^18.0.0 || >=20.0.0 1276 | less: '*' 1277 | lightningcss: ^1.21.0 1278 | sass: '*' 1279 | sass-embedded: '*' 1280 | stylus: '*' 1281 | sugarss: '*' 1282 | terser: ^5.4.0 1283 | peerDependenciesMeta: 1284 | '@types/node': 1285 | optional: true 1286 | less: 1287 | optional: true 1288 | lightningcss: 1289 | optional: true 1290 | sass: 1291 | optional: true 1292 | sass-embedded: 1293 | optional: true 1294 | stylus: 1295 | optional: true 1296 | sugarss: 1297 | optional: true 1298 | terser: 1299 | optional: true 1300 | 1301 | 'vitepress-versioning-plugin@file:': 1302 | resolution: {directory: '', type: directory} 1303 | 1304 | vitepress@1.5.0: 1305 | resolution: {integrity: sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==} 1306 | hasBin: true 1307 | peerDependencies: 1308 | markdown-it-mathjax3: ^4 1309 | postcss: ^8 1310 | peerDependenciesMeta: 1311 | markdown-it-mathjax3: 1312 | optional: true 1313 | postcss: 1314 | optional: true 1315 | 1316 | vue-demi@0.14.10: 1317 | resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} 1318 | engines: {node: '>=12'} 1319 | hasBin: true 1320 | peerDependencies: 1321 | '@vue/composition-api': ^1.0.0-rc.1 1322 | vue: ^3.0.0-0 || ^2.6.0 1323 | peerDependenciesMeta: 1324 | '@vue/composition-api': 1325 | optional: true 1326 | 1327 | vue@3.5.13: 1328 | resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} 1329 | peerDependencies: 1330 | typescript: '*' 1331 | peerDependenciesMeta: 1332 | typescript: 1333 | optional: true 1334 | 1335 | webidl-conversions@4.0.2: 1336 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1337 | 1338 | whatwg-url@7.1.0: 1339 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1340 | 1341 | which@2.0.2: 1342 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1343 | engines: {node: '>= 8'} 1344 | hasBin: true 1345 | 1346 | wrap-ansi@7.0.0: 1347 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1348 | engines: {node: '>=10'} 1349 | 1350 | wrap-ansi@8.1.0: 1351 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1352 | engines: {node: '>=12'} 1353 | 1354 | zwitch@2.0.4: 1355 | resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 1356 | 1357 | snapshots: 1358 | 1359 | '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.15.0)': 1360 | dependencies: 1361 | '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.15.0) 1362 | '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) 1363 | transitivePeerDependencies: 1364 | - '@algolia/client-search' 1365 | - algoliasearch 1366 | - search-insights 1367 | 1368 | '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.15.0)': 1369 | dependencies: 1370 | '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) 1371 | search-insights: 2.15.0 1372 | transitivePeerDependencies: 1373 | - '@algolia/client-search' 1374 | - algoliasearch 1375 | 1376 | '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': 1377 | dependencies: 1378 | '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) 1379 | '@algolia/client-search': 5.15.0 1380 | algoliasearch: 5.15.0 1381 | 1382 | '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': 1383 | dependencies: 1384 | '@algolia/client-search': 5.15.0 1385 | algoliasearch: 5.15.0 1386 | 1387 | '@algolia/client-abtesting@5.15.0': 1388 | dependencies: 1389 | '@algolia/client-common': 5.15.0 1390 | '@algolia/requester-browser-xhr': 5.15.0 1391 | '@algolia/requester-fetch': 5.15.0 1392 | '@algolia/requester-node-http': 5.15.0 1393 | 1394 | '@algolia/client-analytics@5.15.0': 1395 | dependencies: 1396 | '@algolia/client-common': 5.15.0 1397 | '@algolia/requester-browser-xhr': 5.15.0 1398 | '@algolia/requester-fetch': 5.15.0 1399 | '@algolia/requester-node-http': 5.15.0 1400 | 1401 | '@algolia/client-common@5.15.0': {} 1402 | 1403 | '@algolia/client-insights@5.15.0': 1404 | dependencies: 1405 | '@algolia/client-common': 5.15.0 1406 | '@algolia/requester-browser-xhr': 5.15.0 1407 | '@algolia/requester-fetch': 5.15.0 1408 | '@algolia/requester-node-http': 5.15.0 1409 | 1410 | '@algolia/client-personalization@5.15.0': 1411 | dependencies: 1412 | '@algolia/client-common': 5.15.0 1413 | '@algolia/requester-browser-xhr': 5.15.0 1414 | '@algolia/requester-fetch': 5.15.0 1415 | '@algolia/requester-node-http': 5.15.0 1416 | 1417 | '@algolia/client-query-suggestions@5.15.0': 1418 | dependencies: 1419 | '@algolia/client-common': 5.15.0 1420 | '@algolia/requester-browser-xhr': 5.15.0 1421 | '@algolia/requester-fetch': 5.15.0 1422 | '@algolia/requester-node-http': 5.15.0 1423 | 1424 | '@algolia/client-search@5.15.0': 1425 | dependencies: 1426 | '@algolia/client-common': 5.15.0 1427 | '@algolia/requester-browser-xhr': 5.15.0 1428 | '@algolia/requester-fetch': 5.15.0 1429 | '@algolia/requester-node-http': 5.15.0 1430 | 1431 | '@algolia/ingestion@1.15.0': 1432 | dependencies: 1433 | '@algolia/client-common': 5.15.0 1434 | '@algolia/requester-browser-xhr': 5.15.0 1435 | '@algolia/requester-fetch': 5.15.0 1436 | '@algolia/requester-node-http': 5.15.0 1437 | 1438 | '@algolia/monitoring@1.15.0': 1439 | dependencies: 1440 | '@algolia/client-common': 5.15.0 1441 | '@algolia/requester-browser-xhr': 5.15.0 1442 | '@algolia/requester-fetch': 5.15.0 1443 | '@algolia/requester-node-http': 5.15.0 1444 | 1445 | '@algolia/recommend@5.15.0': 1446 | dependencies: 1447 | '@algolia/client-common': 5.15.0 1448 | '@algolia/requester-browser-xhr': 5.15.0 1449 | '@algolia/requester-fetch': 5.15.0 1450 | '@algolia/requester-node-http': 5.15.0 1451 | 1452 | '@algolia/requester-browser-xhr@5.15.0': 1453 | dependencies: 1454 | '@algolia/client-common': 5.15.0 1455 | 1456 | '@algolia/requester-fetch@5.15.0': 1457 | dependencies: 1458 | '@algolia/client-common': 5.15.0 1459 | 1460 | '@algolia/requester-node-http@5.15.0': 1461 | dependencies: 1462 | '@algolia/client-common': 5.15.0 1463 | 1464 | '@babel/helper-string-parser@7.25.9': {} 1465 | 1466 | '@babel/helper-validator-identifier@7.25.9': {} 1467 | 1468 | '@babel/parser@7.26.3': 1469 | dependencies: 1470 | '@babel/types': 7.26.3 1471 | 1472 | '@babel/types@7.26.3': 1473 | dependencies: 1474 | '@babel/helper-string-parser': 7.25.9 1475 | '@babel/helper-validator-identifier': 7.25.9 1476 | 1477 | '@docsearch/css@3.8.0': {} 1478 | 1479 | '@docsearch/js@3.8.0(@algolia/client-search@5.15.0)(search-insights@2.15.0)': 1480 | dependencies: 1481 | '@docsearch/react': 3.8.0(@algolia/client-search@5.15.0)(search-insights@2.15.0) 1482 | preact: 10.25.1 1483 | transitivePeerDependencies: 1484 | - '@algolia/client-search' 1485 | - '@types/react' 1486 | - react 1487 | - react-dom 1488 | - search-insights 1489 | 1490 | '@docsearch/react@3.8.0(@algolia/client-search@5.15.0)(search-insights@2.15.0)': 1491 | dependencies: 1492 | '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.15.0) 1493 | '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) 1494 | '@docsearch/css': 3.8.0 1495 | algoliasearch: 5.15.0 1496 | optionalDependencies: 1497 | search-insights: 2.15.0 1498 | transitivePeerDependencies: 1499 | - '@algolia/client-search' 1500 | 1501 | '@esbuild/aix-ppc64@0.21.5': 1502 | optional: true 1503 | 1504 | '@esbuild/aix-ppc64@0.24.0': 1505 | optional: true 1506 | 1507 | '@esbuild/android-arm64@0.21.5': 1508 | optional: true 1509 | 1510 | '@esbuild/android-arm64@0.24.0': 1511 | optional: true 1512 | 1513 | '@esbuild/android-arm@0.21.5': 1514 | optional: true 1515 | 1516 | '@esbuild/android-arm@0.24.0': 1517 | optional: true 1518 | 1519 | '@esbuild/android-x64@0.21.5': 1520 | optional: true 1521 | 1522 | '@esbuild/android-x64@0.24.0': 1523 | optional: true 1524 | 1525 | '@esbuild/darwin-arm64@0.21.5': 1526 | optional: true 1527 | 1528 | '@esbuild/darwin-arm64@0.24.0': 1529 | optional: true 1530 | 1531 | '@esbuild/darwin-x64@0.21.5': 1532 | optional: true 1533 | 1534 | '@esbuild/darwin-x64@0.24.0': 1535 | optional: true 1536 | 1537 | '@esbuild/freebsd-arm64@0.21.5': 1538 | optional: true 1539 | 1540 | '@esbuild/freebsd-arm64@0.24.0': 1541 | optional: true 1542 | 1543 | '@esbuild/freebsd-x64@0.21.5': 1544 | optional: true 1545 | 1546 | '@esbuild/freebsd-x64@0.24.0': 1547 | optional: true 1548 | 1549 | '@esbuild/linux-arm64@0.21.5': 1550 | optional: true 1551 | 1552 | '@esbuild/linux-arm64@0.24.0': 1553 | optional: true 1554 | 1555 | '@esbuild/linux-arm@0.21.5': 1556 | optional: true 1557 | 1558 | '@esbuild/linux-arm@0.24.0': 1559 | optional: true 1560 | 1561 | '@esbuild/linux-ia32@0.21.5': 1562 | optional: true 1563 | 1564 | '@esbuild/linux-ia32@0.24.0': 1565 | optional: true 1566 | 1567 | '@esbuild/linux-loong64@0.21.5': 1568 | optional: true 1569 | 1570 | '@esbuild/linux-loong64@0.24.0': 1571 | optional: true 1572 | 1573 | '@esbuild/linux-mips64el@0.21.5': 1574 | optional: true 1575 | 1576 | '@esbuild/linux-mips64el@0.24.0': 1577 | optional: true 1578 | 1579 | '@esbuild/linux-ppc64@0.21.5': 1580 | optional: true 1581 | 1582 | '@esbuild/linux-ppc64@0.24.0': 1583 | optional: true 1584 | 1585 | '@esbuild/linux-riscv64@0.21.5': 1586 | optional: true 1587 | 1588 | '@esbuild/linux-riscv64@0.24.0': 1589 | optional: true 1590 | 1591 | '@esbuild/linux-s390x@0.21.5': 1592 | optional: true 1593 | 1594 | '@esbuild/linux-s390x@0.24.0': 1595 | optional: true 1596 | 1597 | '@esbuild/linux-x64@0.21.5': 1598 | optional: true 1599 | 1600 | '@esbuild/linux-x64@0.24.0': 1601 | optional: true 1602 | 1603 | '@esbuild/netbsd-x64@0.21.5': 1604 | optional: true 1605 | 1606 | '@esbuild/netbsd-x64@0.24.0': 1607 | optional: true 1608 | 1609 | '@esbuild/openbsd-arm64@0.24.0': 1610 | optional: true 1611 | 1612 | '@esbuild/openbsd-x64@0.21.5': 1613 | optional: true 1614 | 1615 | '@esbuild/openbsd-x64@0.24.0': 1616 | optional: true 1617 | 1618 | '@esbuild/sunos-x64@0.21.5': 1619 | optional: true 1620 | 1621 | '@esbuild/sunos-x64@0.24.0': 1622 | optional: true 1623 | 1624 | '@esbuild/win32-arm64@0.21.5': 1625 | optional: true 1626 | 1627 | '@esbuild/win32-arm64@0.24.0': 1628 | optional: true 1629 | 1630 | '@esbuild/win32-ia32@0.21.5': 1631 | optional: true 1632 | 1633 | '@esbuild/win32-ia32@0.24.0': 1634 | optional: true 1635 | 1636 | '@esbuild/win32-x64@0.21.5': 1637 | optional: true 1638 | 1639 | '@esbuild/win32-x64@0.24.0': 1640 | optional: true 1641 | 1642 | '@iconify-json/simple-icons@1.2.14': 1643 | dependencies: 1644 | '@iconify/types': 2.0.0 1645 | 1646 | '@iconify/types@2.0.0': {} 1647 | 1648 | '@isaacs/cliui@8.0.2': 1649 | dependencies: 1650 | string-width: 5.1.2 1651 | string-width-cjs: string-width@4.2.3 1652 | strip-ansi: 7.1.0 1653 | strip-ansi-cjs: strip-ansi@6.0.1 1654 | wrap-ansi: 8.1.0 1655 | wrap-ansi-cjs: wrap-ansi@7.0.0 1656 | 1657 | '@jridgewell/gen-mapping@0.3.5': 1658 | dependencies: 1659 | '@jridgewell/set-array': 1.2.1 1660 | '@jridgewell/sourcemap-codec': 1.5.0 1661 | '@jridgewell/trace-mapping': 0.3.25 1662 | 1663 | '@jridgewell/resolve-uri@3.1.2': {} 1664 | 1665 | '@jridgewell/set-array@1.2.1': {} 1666 | 1667 | '@jridgewell/sourcemap-codec@1.5.0': {} 1668 | 1669 | '@jridgewell/trace-mapping@0.3.25': 1670 | dependencies: 1671 | '@jridgewell/resolve-uri': 3.1.2 1672 | '@jridgewell/sourcemap-codec': 1.5.0 1673 | 1674 | '@pkgjs/parseargs@0.11.0': 1675 | optional: true 1676 | 1677 | '@rollup/rollup-android-arm-eabi@4.28.1': 1678 | optional: true 1679 | 1680 | '@rollup/rollup-android-arm64@4.28.1': 1681 | optional: true 1682 | 1683 | '@rollup/rollup-darwin-arm64@4.28.1': 1684 | optional: true 1685 | 1686 | '@rollup/rollup-darwin-x64@4.28.1': 1687 | optional: true 1688 | 1689 | '@rollup/rollup-freebsd-arm64@4.28.1': 1690 | optional: true 1691 | 1692 | '@rollup/rollup-freebsd-x64@4.28.1': 1693 | optional: true 1694 | 1695 | '@rollup/rollup-linux-arm-gnueabihf@4.28.1': 1696 | optional: true 1697 | 1698 | '@rollup/rollup-linux-arm-musleabihf@4.28.1': 1699 | optional: true 1700 | 1701 | '@rollup/rollup-linux-arm64-gnu@4.28.1': 1702 | optional: true 1703 | 1704 | '@rollup/rollup-linux-arm64-musl@4.28.1': 1705 | optional: true 1706 | 1707 | '@rollup/rollup-linux-loongarch64-gnu@4.28.1': 1708 | optional: true 1709 | 1710 | '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': 1711 | optional: true 1712 | 1713 | '@rollup/rollup-linux-riscv64-gnu@4.28.1': 1714 | optional: true 1715 | 1716 | '@rollup/rollup-linux-s390x-gnu@4.28.1': 1717 | optional: true 1718 | 1719 | '@rollup/rollup-linux-x64-gnu@4.28.1': 1720 | optional: true 1721 | 1722 | '@rollup/rollup-linux-x64-musl@4.28.1': 1723 | optional: true 1724 | 1725 | '@rollup/rollup-win32-arm64-msvc@4.28.1': 1726 | optional: true 1727 | 1728 | '@rollup/rollup-win32-ia32-msvc@4.28.1': 1729 | optional: true 1730 | 1731 | '@rollup/rollup-win32-x64-msvc@4.28.1': 1732 | optional: true 1733 | 1734 | '@shikijs/core@1.24.0': 1735 | dependencies: 1736 | '@shikijs/engine-javascript': 1.24.0 1737 | '@shikijs/engine-oniguruma': 1.24.0 1738 | '@shikijs/types': 1.24.0 1739 | '@shikijs/vscode-textmate': 9.3.0 1740 | '@types/hast': 3.0.4 1741 | hast-util-to-html: 9.0.3 1742 | 1743 | '@shikijs/engine-javascript@1.24.0': 1744 | dependencies: 1745 | '@shikijs/types': 1.24.0 1746 | '@shikijs/vscode-textmate': 9.3.0 1747 | oniguruma-to-es: 0.7.0 1748 | 1749 | '@shikijs/engine-oniguruma@1.24.0': 1750 | dependencies: 1751 | '@shikijs/types': 1.24.0 1752 | '@shikijs/vscode-textmate': 9.3.0 1753 | 1754 | '@shikijs/transformers@1.24.0': 1755 | dependencies: 1756 | shiki: 1.24.0 1757 | 1758 | '@shikijs/types@1.24.0': 1759 | dependencies: 1760 | '@shikijs/vscode-textmate': 9.3.0 1761 | '@types/hast': 3.0.4 1762 | 1763 | '@shikijs/vscode-textmate@9.3.0': {} 1764 | 1765 | '@types/cli-color@2.0.6': {} 1766 | 1767 | '@types/estree@1.0.6': {} 1768 | 1769 | '@types/hast@3.0.4': 1770 | dependencies: 1771 | '@types/unist': 3.0.3 1772 | 1773 | '@types/linkify-it@5.0.0': {} 1774 | 1775 | '@types/lodash@4.17.13': {} 1776 | 1777 | '@types/markdown-it@14.1.2': 1778 | dependencies: 1779 | '@types/linkify-it': 5.0.0 1780 | '@types/mdurl': 2.0.0 1781 | 1782 | '@types/mdast@4.0.4': 1783 | dependencies: 1784 | '@types/unist': 3.0.3 1785 | 1786 | '@types/mdurl@2.0.0': {} 1787 | 1788 | '@types/node@20.17.9': 1789 | dependencies: 1790 | undici-types: 6.19.8 1791 | 1792 | '@types/unist@3.0.3': {} 1793 | 1794 | '@types/web-bluetooth@0.0.20': {} 1795 | 1796 | '@ungap/structured-clone@1.2.1': {} 1797 | 1798 | '@vitejs/plugin-vue@5.2.1(vite@5.4.11(@types/node@20.17.9))(vue@3.5.13(typescript@5.7.2))': 1799 | dependencies: 1800 | vite: 5.4.11(@types/node@20.17.9) 1801 | vue: 3.5.13(typescript@5.7.2) 1802 | 1803 | '@vue/compiler-core@3.5.13': 1804 | dependencies: 1805 | '@babel/parser': 7.26.3 1806 | '@vue/shared': 3.5.13 1807 | entities: 4.5.0 1808 | estree-walker: 2.0.2 1809 | source-map-js: 1.2.1 1810 | 1811 | '@vue/compiler-dom@3.5.13': 1812 | dependencies: 1813 | '@vue/compiler-core': 3.5.13 1814 | '@vue/shared': 3.5.13 1815 | 1816 | '@vue/compiler-sfc@3.5.13': 1817 | dependencies: 1818 | '@babel/parser': 7.26.3 1819 | '@vue/compiler-core': 3.5.13 1820 | '@vue/compiler-dom': 3.5.13 1821 | '@vue/compiler-ssr': 3.5.13 1822 | '@vue/shared': 3.5.13 1823 | estree-walker: 2.0.2 1824 | magic-string: 0.30.14 1825 | postcss: 8.4.49 1826 | source-map-js: 1.2.1 1827 | 1828 | '@vue/compiler-ssr@3.5.13': 1829 | dependencies: 1830 | '@vue/compiler-dom': 3.5.13 1831 | '@vue/shared': 3.5.13 1832 | 1833 | '@vue/devtools-api@7.6.7': 1834 | dependencies: 1835 | '@vue/devtools-kit': 7.6.7 1836 | 1837 | '@vue/devtools-kit@7.6.7': 1838 | dependencies: 1839 | '@vue/devtools-shared': 7.6.7 1840 | birpc: 0.2.19 1841 | hookable: 5.5.3 1842 | mitt: 3.0.1 1843 | perfect-debounce: 1.0.0 1844 | speakingurl: 14.0.1 1845 | superjson: 2.2.2 1846 | 1847 | '@vue/devtools-shared@7.6.7': 1848 | dependencies: 1849 | rfdc: 1.4.1 1850 | 1851 | '@vue/reactivity@3.5.13': 1852 | dependencies: 1853 | '@vue/shared': 3.5.13 1854 | 1855 | '@vue/runtime-core@3.5.13': 1856 | dependencies: 1857 | '@vue/reactivity': 3.5.13 1858 | '@vue/shared': 3.5.13 1859 | 1860 | '@vue/runtime-dom@3.5.13': 1861 | dependencies: 1862 | '@vue/reactivity': 3.5.13 1863 | '@vue/runtime-core': 3.5.13 1864 | '@vue/shared': 3.5.13 1865 | csstype: 3.1.3 1866 | 1867 | '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.2))': 1868 | dependencies: 1869 | '@vue/compiler-ssr': 3.5.13 1870 | '@vue/shared': 3.5.13 1871 | vue: 3.5.13(typescript@5.7.2) 1872 | 1873 | '@vue/shared@3.5.13': {} 1874 | 1875 | '@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.2))': 1876 | dependencies: 1877 | '@types/web-bluetooth': 0.0.20 1878 | '@vueuse/metadata': 10.11.1 1879 | '@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.7.2)) 1880 | vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) 1881 | transitivePeerDependencies: 1882 | - '@vue/composition-api' 1883 | - vue 1884 | 1885 | '@vueuse/core@11.3.0(vue@3.5.13(typescript@5.7.2))': 1886 | dependencies: 1887 | '@types/web-bluetooth': 0.0.20 1888 | '@vueuse/metadata': 11.3.0 1889 | '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.7.2)) 1890 | vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) 1891 | transitivePeerDependencies: 1892 | - '@vue/composition-api' 1893 | - vue 1894 | 1895 | '@vueuse/integrations@11.3.0(focus-trap@7.6.2)(vue@3.5.13(typescript@5.7.2))': 1896 | dependencies: 1897 | '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.7.2)) 1898 | '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.7.2)) 1899 | vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) 1900 | optionalDependencies: 1901 | focus-trap: 7.6.2 1902 | transitivePeerDependencies: 1903 | - '@vue/composition-api' 1904 | - vue 1905 | 1906 | '@vueuse/metadata@10.11.1': {} 1907 | 1908 | '@vueuse/metadata@11.3.0': {} 1909 | 1910 | '@vueuse/shared@10.11.1(vue@3.5.13(typescript@5.7.2))': 1911 | dependencies: 1912 | vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) 1913 | transitivePeerDependencies: 1914 | - '@vue/composition-api' 1915 | - vue 1916 | 1917 | '@vueuse/shared@11.3.0(vue@3.5.13(typescript@5.7.2))': 1918 | dependencies: 1919 | vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) 1920 | transitivePeerDependencies: 1921 | - '@vue/composition-api' 1922 | - vue 1923 | 1924 | algoliasearch@5.15.0: 1925 | dependencies: 1926 | '@algolia/client-abtesting': 5.15.0 1927 | '@algolia/client-analytics': 5.15.0 1928 | '@algolia/client-common': 5.15.0 1929 | '@algolia/client-insights': 5.15.0 1930 | '@algolia/client-personalization': 5.15.0 1931 | '@algolia/client-query-suggestions': 5.15.0 1932 | '@algolia/client-search': 5.15.0 1933 | '@algolia/ingestion': 1.15.0 1934 | '@algolia/monitoring': 1.15.0 1935 | '@algolia/recommend': 5.15.0 1936 | '@algolia/requester-browser-xhr': 5.15.0 1937 | '@algolia/requester-fetch': 5.15.0 1938 | '@algolia/requester-node-http': 5.15.0 1939 | 1940 | ansi-regex@5.0.1: {} 1941 | 1942 | ansi-regex@6.1.0: {} 1943 | 1944 | ansi-styles@4.3.0: 1945 | dependencies: 1946 | color-convert: 2.0.1 1947 | 1948 | ansi-styles@6.2.1: {} 1949 | 1950 | any-promise@1.3.0: {} 1951 | 1952 | balanced-match@1.0.2: {} 1953 | 1954 | birpc@0.2.19: {} 1955 | 1956 | brace-expansion@2.0.1: 1957 | dependencies: 1958 | balanced-match: 1.0.2 1959 | 1960 | bundle-require@5.0.0(esbuild@0.24.0): 1961 | dependencies: 1962 | esbuild: 0.24.0 1963 | load-tsconfig: 0.2.5 1964 | 1965 | cac@6.7.14: {} 1966 | 1967 | ccount@2.0.1: {} 1968 | 1969 | character-entities-html4@2.1.0: {} 1970 | 1971 | character-entities-legacy@3.0.0: {} 1972 | 1973 | chokidar@4.0.1: 1974 | dependencies: 1975 | readdirp: 4.0.2 1976 | 1977 | cli-color@2.0.4: 1978 | dependencies: 1979 | d: 1.0.2 1980 | es5-ext: 0.10.64 1981 | es6-iterator: 2.0.3 1982 | memoizee: 0.4.17 1983 | timers-ext: 0.1.8 1984 | 1985 | color-convert@2.0.1: 1986 | dependencies: 1987 | color-name: 1.1.4 1988 | 1989 | color-name@1.1.4: {} 1990 | 1991 | comma-separated-tokens@2.0.3: {} 1992 | 1993 | commander@4.1.1: {} 1994 | 1995 | consola@3.2.3: {} 1996 | 1997 | copy-anything@3.0.5: 1998 | dependencies: 1999 | is-what: 4.1.16 2000 | 2001 | cross-spawn@7.0.6: 2002 | dependencies: 2003 | path-key: 3.1.1 2004 | shebang-command: 2.0.0 2005 | which: 2.0.2 2006 | 2007 | csstype@3.1.3: {} 2008 | 2009 | d@1.0.2: 2010 | dependencies: 2011 | es5-ext: 0.10.64 2012 | type: 2.7.3 2013 | 2014 | debug@4.4.0: 2015 | dependencies: 2016 | ms: 2.1.3 2017 | 2018 | dequal@2.0.3: {} 2019 | 2020 | devlop@1.1.0: 2021 | dependencies: 2022 | dequal: 2.0.3 2023 | 2024 | eastasianwidth@0.2.0: {} 2025 | 2026 | emoji-regex-xs@1.0.0: {} 2027 | 2028 | emoji-regex@8.0.0: {} 2029 | 2030 | emoji-regex@9.2.2: {} 2031 | 2032 | entities@4.5.0: {} 2033 | 2034 | es5-ext@0.10.64: 2035 | dependencies: 2036 | es6-iterator: 2.0.3 2037 | es6-symbol: 3.1.4 2038 | esniff: 2.0.1 2039 | next-tick: 1.1.0 2040 | 2041 | es6-iterator@2.0.3: 2042 | dependencies: 2043 | d: 1.0.2 2044 | es5-ext: 0.10.64 2045 | es6-symbol: 3.1.4 2046 | 2047 | es6-symbol@3.1.4: 2048 | dependencies: 2049 | d: 1.0.2 2050 | ext: 1.7.0 2051 | 2052 | es6-weak-map@2.0.3: 2053 | dependencies: 2054 | d: 1.0.2 2055 | es5-ext: 0.10.64 2056 | es6-iterator: 2.0.3 2057 | es6-symbol: 3.1.4 2058 | 2059 | esbuild@0.21.5: 2060 | optionalDependencies: 2061 | '@esbuild/aix-ppc64': 0.21.5 2062 | '@esbuild/android-arm': 0.21.5 2063 | '@esbuild/android-arm64': 0.21.5 2064 | '@esbuild/android-x64': 0.21.5 2065 | '@esbuild/darwin-arm64': 0.21.5 2066 | '@esbuild/darwin-x64': 0.21.5 2067 | '@esbuild/freebsd-arm64': 0.21.5 2068 | '@esbuild/freebsd-x64': 0.21.5 2069 | '@esbuild/linux-arm': 0.21.5 2070 | '@esbuild/linux-arm64': 0.21.5 2071 | '@esbuild/linux-ia32': 0.21.5 2072 | '@esbuild/linux-loong64': 0.21.5 2073 | '@esbuild/linux-mips64el': 0.21.5 2074 | '@esbuild/linux-ppc64': 0.21.5 2075 | '@esbuild/linux-riscv64': 0.21.5 2076 | '@esbuild/linux-s390x': 0.21.5 2077 | '@esbuild/linux-x64': 0.21.5 2078 | '@esbuild/netbsd-x64': 0.21.5 2079 | '@esbuild/openbsd-x64': 0.21.5 2080 | '@esbuild/sunos-x64': 0.21.5 2081 | '@esbuild/win32-arm64': 0.21.5 2082 | '@esbuild/win32-ia32': 0.21.5 2083 | '@esbuild/win32-x64': 0.21.5 2084 | 2085 | esbuild@0.24.0: 2086 | optionalDependencies: 2087 | '@esbuild/aix-ppc64': 0.24.0 2088 | '@esbuild/android-arm': 0.24.0 2089 | '@esbuild/android-arm64': 0.24.0 2090 | '@esbuild/android-x64': 0.24.0 2091 | '@esbuild/darwin-arm64': 0.24.0 2092 | '@esbuild/darwin-x64': 0.24.0 2093 | '@esbuild/freebsd-arm64': 0.24.0 2094 | '@esbuild/freebsd-x64': 0.24.0 2095 | '@esbuild/linux-arm': 0.24.0 2096 | '@esbuild/linux-arm64': 0.24.0 2097 | '@esbuild/linux-ia32': 0.24.0 2098 | '@esbuild/linux-loong64': 0.24.0 2099 | '@esbuild/linux-mips64el': 0.24.0 2100 | '@esbuild/linux-ppc64': 0.24.0 2101 | '@esbuild/linux-riscv64': 0.24.0 2102 | '@esbuild/linux-s390x': 0.24.0 2103 | '@esbuild/linux-x64': 0.24.0 2104 | '@esbuild/netbsd-x64': 0.24.0 2105 | '@esbuild/openbsd-arm64': 0.24.0 2106 | '@esbuild/openbsd-x64': 0.24.0 2107 | '@esbuild/sunos-x64': 0.24.0 2108 | '@esbuild/win32-arm64': 0.24.0 2109 | '@esbuild/win32-ia32': 0.24.0 2110 | '@esbuild/win32-x64': 0.24.0 2111 | 2112 | esniff@2.0.1: 2113 | dependencies: 2114 | d: 1.0.2 2115 | es5-ext: 0.10.64 2116 | event-emitter: 0.3.5 2117 | type: 2.7.3 2118 | 2119 | estree-walker@2.0.2: {} 2120 | 2121 | event-emitter@0.3.5: 2122 | dependencies: 2123 | d: 1.0.2 2124 | es5-ext: 0.10.64 2125 | 2126 | ext@1.7.0: 2127 | dependencies: 2128 | type: 2.7.3 2129 | 2130 | fdir@6.4.2(picomatch@4.0.2): 2131 | optionalDependencies: 2132 | picomatch: 4.0.2 2133 | 2134 | focus-trap@7.6.2: 2135 | dependencies: 2136 | tabbable: 6.2.0 2137 | 2138 | foreground-child@3.3.0: 2139 | dependencies: 2140 | cross-spawn: 7.0.6 2141 | signal-exit: 4.1.0 2142 | 2143 | fsevents@2.3.3: 2144 | optional: true 2145 | 2146 | glob@10.4.5: 2147 | dependencies: 2148 | foreground-child: 3.3.0 2149 | jackspeak: 3.4.3 2150 | minimatch: 9.0.5 2151 | minipass: 7.1.2 2152 | package-json-from-dist: 1.0.1 2153 | path-scurry: 1.11.1 2154 | 2155 | hast-util-to-html@9.0.3: 2156 | dependencies: 2157 | '@types/hast': 3.0.4 2158 | '@types/unist': 3.0.3 2159 | ccount: 2.0.1 2160 | comma-separated-tokens: 2.0.3 2161 | hast-util-whitespace: 3.0.0 2162 | html-void-elements: 3.0.0 2163 | mdast-util-to-hast: 13.2.0 2164 | property-information: 6.5.0 2165 | space-separated-tokens: 2.0.2 2166 | stringify-entities: 4.0.4 2167 | zwitch: 2.0.4 2168 | 2169 | hast-util-whitespace@3.0.0: 2170 | dependencies: 2171 | '@types/hast': 3.0.4 2172 | 2173 | hookable@5.5.3: {} 2174 | 2175 | html-void-elements@3.0.0: {} 2176 | 2177 | is-fullwidth-code-point@3.0.0: {} 2178 | 2179 | is-promise@2.2.2: {} 2180 | 2181 | is-what@4.1.16: {} 2182 | 2183 | isexe@2.0.0: {} 2184 | 2185 | jackspeak@3.4.3: 2186 | dependencies: 2187 | '@isaacs/cliui': 8.0.2 2188 | optionalDependencies: 2189 | '@pkgjs/parseargs': 0.11.0 2190 | 2191 | joycon@3.1.1: {} 2192 | 2193 | json5@2.2.3: {} 2194 | 2195 | lilconfig@3.1.3: {} 2196 | 2197 | lines-and-columns@1.2.4: {} 2198 | 2199 | load-tsconfig@0.2.5: {} 2200 | 2201 | lodash.sortby@4.7.0: {} 2202 | 2203 | lodash@4.17.21: {} 2204 | 2205 | lru-cache@10.4.3: {} 2206 | 2207 | lru-queue@0.1.0: 2208 | dependencies: 2209 | es5-ext: 0.10.64 2210 | 2211 | magic-string@0.30.14: 2212 | dependencies: 2213 | '@jridgewell/sourcemap-codec': 1.5.0 2214 | 2215 | mark.js@8.11.1: {} 2216 | 2217 | mdast-util-to-hast@13.2.0: 2218 | dependencies: 2219 | '@types/hast': 3.0.4 2220 | '@types/mdast': 4.0.4 2221 | '@ungap/structured-clone': 1.2.1 2222 | devlop: 1.1.0 2223 | micromark-util-sanitize-uri: 2.0.1 2224 | trim-lines: 3.0.1 2225 | unist-util-position: 5.0.0 2226 | unist-util-visit: 5.0.0 2227 | vfile: 6.0.3 2228 | 2229 | memoizee@0.4.17: 2230 | dependencies: 2231 | d: 1.0.2 2232 | es5-ext: 0.10.64 2233 | es6-weak-map: 2.0.3 2234 | event-emitter: 0.3.5 2235 | is-promise: 2.2.2 2236 | lru-queue: 0.1.0 2237 | next-tick: 1.1.0 2238 | timers-ext: 0.1.8 2239 | 2240 | micromark-util-character@2.1.1: 2241 | dependencies: 2242 | micromark-util-symbol: 2.0.1 2243 | micromark-util-types: 2.0.1 2244 | 2245 | micromark-util-encode@2.0.1: {} 2246 | 2247 | micromark-util-sanitize-uri@2.0.1: 2248 | dependencies: 2249 | micromark-util-character: 2.1.1 2250 | micromark-util-encode: 2.0.1 2251 | micromark-util-symbol: 2.0.1 2252 | 2253 | micromark-util-symbol@2.0.1: {} 2254 | 2255 | micromark-util-types@2.0.1: {} 2256 | 2257 | minimatch@9.0.5: 2258 | dependencies: 2259 | brace-expansion: 2.0.1 2260 | 2261 | minipass@7.1.2: {} 2262 | 2263 | minisearch@7.1.1: {} 2264 | 2265 | mitt@3.0.1: {} 2266 | 2267 | ms@2.1.3: {} 2268 | 2269 | mz@2.7.0: 2270 | dependencies: 2271 | any-promise: 1.3.0 2272 | object-assign: 4.1.1 2273 | thenify-all: 1.6.0 2274 | 2275 | nanoid@3.3.8: {} 2276 | 2277 | next-tick@1.1.0: {} 2278 | 2279 | object-assign@4.1.1: {} 2280 | 2281 | oniguruma-to-es@0.7.0: 2282 | dependencies: 2283 | emoji-regex-xs: 1.0.0 2284 | regex: 5.0.2 2285 | regex-recursion: 4.3.0 2286 | 2287 | package-json-from-dist@1.0.1: {} 2288 | 2289 | path-key@3.1.1: {} 2290 | 2291 | path-scurry@1.11.1: 2292 | dependencies: 2293 | lru-cache: 10.4.3 2294 | minipass: 7.1.2 2295 | 2296 | perfect-debounce@1.0.0: {} 2297 | 2298 | picocolors@1.1.1: {} 2299 | 2300 | picomatch@4.0.2: {} 2301 | 2302 | pirates@4.0.6: {} 2303 | 2304 | postcss-load-config@6.0.1(postcss@8.4.49): 2305 | dependencies: 2306 | lilconfig: 3.1.3 2307 | optionalDependencies: 2308 | postcss: 8.4.49 2309 | 2310 | postcss@8.4.49: 2311 | dependencies: 2312 | nanoid: 3.3.8 2313 | picocolors: 1.1.1 2314 | source-map-js: 1.2.1 2315 | 2316 | preact@10.25.1: {} 2317 | 2318 | property-information@6.5.0: {} 2319 | 2320 | punycode@2.3.1: {} 2321 | 2322 | readdirp@4.0.2: {} 2323 | 2324 | regex-recursion@4.3.0: 2325 | dependencies: 2326 | regex-utilities: 2.3.0 2327 | 2328 | regex-utilities@2.3.0: {} 2329 | 2330 | regex@5.0.2: 2331 | dependencies: 2332 | regex-utilities: 2.3.0 2333 | 2334 | resolve-from@5.0.0: {} 2335 | 2336 | rfdc@1.4.1: {} 2337 | 2338 | rollup@4.28.1: 2339 | dependencies: 2340 | '@types/estree': 1.0.6 2341 | optionalDependencies: 2342 | '@rollup/rollup-android-arm-eabi': 4.28.1 2343 | '@rollup/rollup-android-arm64': 4.28.1 2344 | '@rollup/rollup-darwin-arm64': 4.28.1 2345 | '@rollup/rollup-darwin-x64': 4.28.1 2346 | '@rollup/rollup-freebsd-arm64': 4.28.1 2347 | '@rollup/rollup-freebsd-x64': 4.28.1 2348 | '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 2349 | '@rollup/rollup-linux-arm-musleabihf': 4.28.1 2350 | '@rollup/rollup-linux-arm64-gnu': 4.28.1 2351 | '@rollup/rollup-linux-arm64-musl': 4.28.1 2352 | '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 2353 | '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 2354 | '@rollup/rollup-linux-riscv64-gnu': 4.28.1 2355 | '@rollup/rollup-linux-s390x-gnu': 4.28.1 2356 | '@rollup/rollup-linux-x64-gnu': 4.28.1 2357 | '@rollup/rollup-linux-x64-musl': 4.28.1 2358 | '@rollup/rollup-win32-arm64-msvc': 4.28.1 2359 | '@rollup/rollup-win32-ia32-msvc': 4.28.1 2360 | '@rollup/rollup-win32-x64-msvc': 4.28.1 2361 | fsevents: 2.3.3 2362 | 2363 | search-insights@2.15.0: {} 2364 | 2365 | shebang-command@2.0.0: 2366 | dependencies: 2367 | shebang-regex: 3.0.0 2368 | 2369 | shebang-regex@3.0.0: {} 2370 | 2371 | shiki@1.24.0: 2372 | dependencies: 2373 | '@shikijs/core': 1.24.0 2374 | '@shikijs/engine-javascript': 1.24.0 2375 | '@shikijs/engine-oniguruma': 1.24.0 2376 | '@shikijs/types': 1.24.0 2377 | '@shikijs/vscode-textmate': 9.3.0 2378 | '@types/hast': 3.0.4 2379 | 2380 | signal-exit@4.1.0: {} 2381 | 2382 | source-map-js@1.2.1: {} 2383 | 2384 | source-map@0.8.0-beta.0: 2385 | dependencies: 2386 | whatwg-url: 7.1.0 2387 | 2388 | space-separated-tokens@2.0.2: {} 2389 | 2390 | speakingurl@14.0.1: {} 2391 | 2392 | string-width@4.2.3: 2393 | dependencies: 2394 | emoji-regex: 8.0.0 2395 | is-fullwidth-code-point: 3.0.0 2396 | strip-ansi: 6.0.1 2397 | 2398 | string-width@5.1.2: 2399 | dependencies: 2400 | eastasianwidth: 0.2.0 2401 | emoji-regex: 9.2.2 2402 | strip-ansi: 7.1.0 2403 | 2404 | stringify-entities@4.0.4: 2405 | dependencies: 2406 | character-entities-html4: 2.1.0 2407 | character-entities-legacy: 3.0.0 2408 | 2409 | strip-ansi@6.0.1: 2410 | dependencies: 2411 | ansi-regex: 5.0.1 2412 | 2413 | strip-ansi@7.1.0: 2414 | dependencies: 2415 | ansi-regex: 6.1.0 2416 | 2417 | sucrase@3.35.0: 2418 | dependencies: 2419 | '@jridgewell/gen-mapping': 0.3.5 2420 | commander: 4.1.1 2421 | glob: 10.4.5 2422 | lines-and-columns: 1.2.4 2423 | mz: 2.7.0 2424 | pirates: 4.0.6 2425 | ts-interface-checker: 0.1.13 2426 | 2427 | superjson@2.2.2: 2428 | dependencies: 2429 | copy-anything: 3.0.5 2430 | 2431 | tabbable@6.2.0: {} 2432 | 2433 | thenify-all@1.6.0: 2434 | dependencies: 2435 | thenify: 3.3.1 2436 | 2437 | thenify@3.3.1: 2438 | dependencies: 2439 | any-promise: 1.3.0 2440 | 2441 | timers-ext@0.1.8: 2442 | dependencies: 2443 | es5-ext: 0.10.64 2444 | next-tick: 1.1.0 2445 | 2446 | tinyexec@0.3.1: {} 2447 | 2448 | tinyglobby@0.2.10: 2449 | dependencies: 2450 | fdir: 6.4.2(picomatch@4.0.2) 2451 | picomatch: 4.0.2 2452 | 2453 | tr46@1.0.1: 2454 | dependencies: 2455 | punycode: 2.3.1 2456 | 2457 | tree-kill@1.2.2: {} 2458 | 2459 | trim-lines@3.0.1: {} 2460 | 2461 | ts-interface-checker@0.1.13: {} 2462 | 2463 | tsup@8.3.5(postcss@8.4.49)(typescript@5.7.2): 2464 | dependencies: 2465 | bundle-require: 5.0.0(esbuild@0.24.0) 2466 | cac: 6.7.14 2467 | chokidar: 4.0.1 2468 | consola: 3.2.3 2469 | debug: 4.4.0 2470 | esbuild: 0.24.0 2471 | joycon: 3.1.1 2472 | picocolors: 1.1.1 2473 | postcss-load-config: 6.0.1(postcss@8.4.49) 2474 | resolve-from: 5.0.0 2475 | rollup: 4.28.1 2476 | source-map: 0.8.0-beta.0 2477 | sucrase: 3.35.0 2478 | tinyexec: 0.3.1 2479 | tinyglobby: 0.2.10 2480 | tree-kill: 1.2.2 2481 | optionalDependencies: 2482 | postcss: 8.4.49 2483 | typescript: 5.7.2 2484 | transitivePeerDependencies: 2485 | - jiti 2486 | - supports-color 2487 | - tsx 2488 | - yaml 2489 | 2490 | type@2.7.3: {} 2491 | 2492 | typescript@5.7.2: {} 2493 | 2494 | undici-types@6.19.8: {} 2495 | 2496 | unist-util-is@6.0.0: 2497 | dependencies: 2498 | '@types/unist': 3.0.3 2499 | 2500 | unist-util-position@5.0.0: 2501 | dependencies: 2502 | '@types/unist': 3.0.3 2503 | 2504 | unist-util-stringify-position@4.0.0: 2505 | dependencies: 2506 | '@types/unist': 3.0.3 2507 | 2508 | unist-util-visit-parents@6.0.1: 2509 | dependencies: 2510 | '@types/unist': 3.0.3 2511 | unist-util-is: 6.0.0 2512 | 2513 | unist-util-visit@5.0.0: 2514 | dependencies: 2515 | '@types/unist': 3.0.3 2516 | unist-util-is: 6.0.0 2517 | unist-util-visit-parents: 6.0.1 2518 | 2519 | vfile-message@4.0.2: 2520 | dependencies: 2521 | '@types/unist': 3.0.3 2522 | unist-util-stringify-position: 4.0.0 2523 | 2524 | vfile@6.0.3: 2525 | dependencies: 2526 | '@types/unist': 3.0.3 2527 | vfile-message: 4.0.2 2528 | 2529 | vite@5.4.11(@types/node@20.17.9): 2530 | dependencies: 2531 | esbuild: 0.21.5 2532 | postcss: 8.4.49 2533 | rollup: 4.28.1 2534 | optionalDependencies: 2535 | '@types/node': 20.17.9 2536 | fsevents: 2.3.3 2537 | 2538 | vitepress-versioning-plugin@file:(@algolia/client-search@5.15.0)(@types/node@20.17.9)(postcss@8.4.49)(search-insights@2.15.0)(typescript@5.7.2): 2539 | dependencies: 2540 | '@types/lodash': 4.17.13 2541 | cli-color: 2.0.4 2542 | json5: 2.2.3 2543 | lodash: 4.17.21 2544 | vite: 5.4.11(@types/node@20.17.9) 2545 | vitepress: 1.5.0(@algolia/client-search@5.15.0)(@types/node@20.17.9)(postcss@8.4.49)(search-insights@2.15.0)(typescript@5.7.2) 2546 | transitivePeerDependencies: 2547 | - '@algolia/client-search' 2548 | - '@types/node' 2549 | - '@types/react' 2550 | - '@vue/composition-api' 2551 | - async-validator 2552 | - axios 2553 | - change-case 2554 | - drauu 2555 | - fuse.js 2556 | - idb-keyval 2557 | - jwt-decode 2558 | - less 2559 | - lightningcss 2560 | - markdown-it-mathjax3 2561 | - nprogress 2562 | - postcss 2563 | - qrcode 2564 | - react 2565 | - react-dom 2566 | - sass 2567 | - sass-embedded 2568 | - search-insights 2569 | - sortablejs 2570 | - stylus 2571 | - sugarss 2572 | - terser 2573 | - typescript 2574 | - universal-cookie 2575 | 2576 | vitepress@1.5.0(@algolia/client-search@5.15.0)(@types/node@20.17.9)(postcss@8.4.49)(search-insights@2.15.0)(typescript@5.7.2): 2577 | dependencies: 2578 | '@docsearch/css': 3.8.0 2579 | '@docsearch/js': 3.8.0(@algolia/client-search@5.15.0)(search-insights@2.15.0) 2580 | '@iconify-json/simple-icons': 1.2.14 2581 | '@shikijs/core': 1.24.0 2582 | '@shikijs/transformers': 1.24.0 2583 | '@shikijs/types': 1.24.0 2584 | '@types/markdown-it': 14.1.2 2585 | '@vitejs/plugin-vue': 5.2.1(vite@5.4.11(@types/node@20.17.9))(vue@3.5.13(typescript@5.7.2)) 2586 | '@vue/devtools-api': 7.6.7 2587 | '@vue/shared': 3.5.13 2588 | '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.7.2)) 2589 | '@vueuse/integrations': 11.3.0(focus-trap@7.6.2)(vue@3.5.13(typescript@5.7.2)) 2590 | focus-trap: 7.6.2 2591 | mark.js: 8.11.1 2592 | minisearch: 7.1.1 2593 | shiki: 1.24.0 2594 | vite: 5.4.11(@types/node@20.17.9) 2595 | vue: 3.5.13(typescript@5.7.2) 2596 | optionalDependencies: 2597 | postcss: 8.4.49 2598 | transitivePeerDependencies: 2599 | - '@algolia/client-search' 2600 | - '@types/node' 2601 | - '@types/react' 2602 | - '@vue/composition-api' 2603 | - async-validator 2604 | - axios 2605 | - change-case 2606 | - drauu 2607 | - fuse.js 2608 | - idb-keyval 2609 | - jwt-decode 2610 | - less 2611 | - lightningcss 2612 | - nprogress 2613 | - qrcode 2614 | - react 2615 | - react-dom 2616 | - sass 2617 | - sass-embedded 2618 | - search-insights 2619 | - sortablejs 2620 | - stylus 2621 | - sugarss 2622 | - terser 2623 | - typescript 2624 | - universal-cookie 2625 | 2626 | vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): 2627 | dependencies: 2628 | vue: 3.5.13(typescript@5.7.2) 2629 | 2630 | vue@3.5.13(typescript@5.7.2): 2631 | dependencies: 2632 | '@vue/compiler-dom': 3.5.13 2633 | '@vue/compiler-sfc': 3.5.13 2634 | '@vue/runtime-dom': 3.5.13 2635 | '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.2)) 2636 | '@vue/shared': 3.5.13 2637 | optionalDependencies: 2638 | typescript: 5.7.2 2639 | 2640 | webidl-conversions@4.0.2: {} 2641 | 2642 | whatwg-url@7.1.0: 2643 | dependencies: 2644 | lodash.sortby: 4.7.0 2645 | tr46: 1.0.1 2646 | webidl-conversions: 4.0.2 2647 | 2648 | which@2.0.2: 2649 | dependencies: 2650 | isexe: 2.0.0 2651 | 2652 | wrap-ansi@7.0.0: 2653 | dependencies: 2654 | ansi-styles: 4.3.0 2655 | string-width: 4.2.3 2656 | strip-ansi: 6.0.1 2657 | 2658 | wrap-ansi@8.1.0: 2659 | dependencies: 2660 | ansi-styles: 6.2.1 2661 | string-width: 5.1.2 2662 | strip-ansi: 7.1.0 2663 | 2664 | zwitch@2.0.4: {} 2665 | -------------------------------------------------------------------------------- /src/components/VersionSwitcher.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 69 | 70 | 79 | 80 | 162 | -------------------------------------------------------------------------------- /src/defaults.ts: -------------------------------------------------------------------------------- 1 | import { Versioned } from "./types"; 2 | 3 | const defaultThemeConfig: Versioned.ThemeConfig = { 4 | versionSwitcher: { 5 | text: "Switch Version", 6 | includeLatestVersion: true, 7 | }, 8 | }; 9 | 10 | const defaultConfig: Versioned.Config = { 11 | versioning: { 12 | latestVersion: null, 13 | sidebars: { 14 | processSidebarURLs: true, 15 | sidebarPathResolver: (version: Versioned.Version) => 16 | `.vitepress/sidebars/versioned/${version}.json`, 17 | sidebarUrlProcessor: (url: string, version: Versioned.Version) => 18 | `/${version}${url}`, 19 | }, 20 | // navbars: { 21 | // processNavbarURLs: true, 22 | // navbarUrlProcessor: (url: string, version: Version) => 23 | // `/${version}${url}`, 24 | // navbarPathResolver: (version: Version) => 25 | // `.vitepress/navbars/versioned/${version}.json`, 26 | // }, 27 | rewrites: { 28 | localePrefix: "", 29 | localeRewriteProcessor: ( 30 | inputFilePath: string, 31 | _version: Versioned.Version, 32 | locale: string 33 | ) => 34 | `${locale}/` + 35 | inputFilePath.replace("versions/", "").replace(`${locale}/`, ""), 36 | rewriteProcessor: (inputFilePath: string, _version: Versioned.Version) => 37 | inputFilePath.replace("versions/", ""), 38 | }, 39 | }, 40 | }; 41 | 42 | export { defaultConfig, defaultThemeConfig }; -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import clc from "cli-color"; 2 | import _ from "lodash"; 3 | import fs from "node:fs"; 4 | import path from "node:path"; 5 | import { createLogger } from "vite"; 6 | import { DefaultTheme, UserConfig } from "vitepress"; 7 | import { generateVersionRewrites } from "./rewrites"; 8 | import { generateVersionSidebars } from "./sidebars"; 9 | import { generateVersionSwitcher } from "./switcher"; 10 | import { Versioned } from "./types"; 11 | import { defaultConfig, defaultThemeConfig } from "./defaults"; 12 | // import { generateVersionedNavbars } from "./navbars"; 13 | 14 | // TODO: Fix nav bar elements (not versioned) - Seems not to be possible due to VitePress limitation... 15 | // TODO: Changing version does not preserve language 16 | // TODO: Change URL format to `/version/lang/file` 17 | 18 | export { Versioned }; 19 | 20 | /** 21 | * Processes the default theme config with versioning config. 22 | * @param config The default theme config with versioning config. 23 | * @param dirname The value of __dirname when used from any typescript file in the `.vitepress` folder and ONLY the `.vitepress` folder. 24 | * @returns The default theme config with versioning config. 25 | */ 26 | export default function defineVersionedConfig( 27 | config: Versioned.Config, 28 | dirname: string 29 | ): UserConfig { 30 | const logger = createLogger(); 31 | 32 | // TODO: Does this convert to UserConfig correctly? 33 | const configBackup = { ...config }; 34 | config = _.defaultsDeep(config, defaultConfig); 35 | 36 | // Load all the versions from the "versions" folder. 37 | const versions: Versioned.Version[] = []; 38 | const versionsFolder = path.resolve(dirname, "..", "versions"); 39 | 40 | if (!fs.existsSync(versionsFolder)) { 41 | fs.mkdirSync(versionsFolder); 42 | fs.writeFileSync(path.resolve(versionsFolder, ".gitkeep"), ""); 43 | } 44 | 45 | const versionFolders = fs 46 | .readdirSync(versionsFolder, { withFileTypes: true }) 47 | .filter((dirent) => dirent.isDirectory()); 48 | versions.push(...versionFolders.map((dirent) => dirent.name)); 49 | 50 | // Convert all `VersionedThemeConfig`s to `DefaultTheme.Config`s 51 | for (let themeConfig of [ 52 | config.themeConfig, 53 | ...Object.values(config.locales ?? {}).map((locale) => locale.themeConfig), 54 | ]) { 55 | if (!themeConfig) continue; 56 | 57 | themeConfig = _.defaultsDeep( 58 | themeConfig, 59 | defaultThemeConfig 60 | ) as Versioned.ThemeConfig; 61 | 62 | // // Generate navbars 63 | // themeConfig.nav = [ 64 | // ...themeConfig.nav ?? [], 65 | // ...generateVersionedNavbars( 66 | // config.versioning.navbars!, 67 | // dirname, 68 | // versions, 69 | // Object.keys(config.locales ?? {}) 70 | // ).flat(), 71 | // ] 72 | 73 | // console.log(themeConfig.nav) 74 | 75 | // Generate the version switcher 76 | const versionSwitcher = generateVersionSwitcher( 77 | themeConfig.versionSwitcher!, 78 | versions, 79 | config.versioning.latestVersion! 80 | ); 81 | if (versionSwitcher) { 82 | themeConfig.nav ??= []; 83 | themeConfig.nav.push(versionSwitcher); 84 | } 85 | 86 | // Add versioning props to navbar items 87 | if (themeConfig.nav) { 88 | themeConfig.nav = themeConfig.nav.map((item: any) => { 89 | if (item.component) { 90 | item.props ??= {}; 91 | item.props.versioningPlugin = { 92 | versions, 93 | latestVersion: config.versioning.latestVersion!, 94 | }; 95 | } 96 | return item; 97 | }); 98 | } 99 | 100 | // Generate the sidebars 101 | if (Array.isArray(themeConfig.sidebar)) { 102 | logger.error( 103 | clc.red(`[vitepress-plugin-versioning]`) + 104 | " The sidebar cannot be an array. Please use a DefaultTheme.MultiSidebar object where the root ('/') is your array." 105 | ); 106 | logger.info( 107 | clc.yellow(`[vitepress-plugin-versioning]`) + 108 | " Versioned sidebar preperation failed, disabling versioning." 109 | ); 110 | return configBackup; // TODO: This entirely disables versioning, is this intentional? 111 | } else { 112 | themeConfig.sidebar = { 113 | ...themeConfig.sidebar, 114 | ...generateVersionSidebars( 115 | config.versioning.sidebars!, 116 | dirname, 117 | versions, 118 | Object.keys(config.locales ?? {}) 119 | ), 120 | }; 121 | } 122 | } 123 | 124 | // Generate the rewrites 125 | config.rewrites = { 126 | ...config.rewrites, 127 | ...generateVersionRewrites( 128 | config.versioning.rewrites!, 129 | dirname, 130 | versions, 131 | Object.keys(config.locales ?? {}) 132 | ), 133 | }; 134 | 135 | try { 136 | if(config.versioning.sidebars) { 137 | if(config.versioning.sidebars.sidebarContentProcessor) { 138 | // For all sidebars, in locales and main themeConfig 139 | for (const locale of Object.keys(config.locales ?? {})) { 140 | if(config.locales?.[locale]?.themeConfig) { 141 | // @ts-ignore 142 | config.locales[locale].themeConfig.sidebar = config.versioning.sidebars.sidebarContentProcessor!(config.locales[locale].themeConfig.sidebar as DefaultTheme.SidebarMulti); 143 | } 144 | } 145 | } 146 | } 147 | } catch (e) { 148 | logger.error("Something went wrong when processing the sidebar content.") 149 | logger.error(e as any); 150 | logger.info("Reverting to pre-processed sidebar configs."); 151 | } 152 | 153 | // For all components within themeConfig.nav and locale.themeConfig.nav, insert version information into the props. 154 | if(config?.themeConfig?.nav) { 155 | 156 | // Recursive map function to process all items in the nav bar. 157 | const processNavbarItemRecursive = (navbarItem: any): DefaultTheme.NavItem => { 158 | 159 | if (navbarItem?.items) { 160 | navbarItem.items = navbarItem.items.map((item: any) => 161 | processNavbarItemRecursive(item) 162 | ) as (DefaultTheme.NavItemWithLink | DefaultTheme.NavItemChildren)[]; 163 | } 164 | 165 | if (navbarItem?.component) { 166 | navbarItem.props ??= {}; 167 | navbarItem.props.versioningPlugin = { 168 | versions, 169 | latestVersion: config.versioning.latestVersion!, 170 | } 171 | } 172 | 173 | return navbarItem; 174 | } 175 | 176 | // Process all items in the nav bar. 177 | config.themeConfig.nav = config.themeConfig.nav.map((item) => processNavbarItemRecursive(item)); 178 | } 179 | 180 | 181 | return config; 182 | } 183 | -------------------------------------------------------------------------------- /src/navbars.ts: -------------------------------------------------------------------------------- 1 | //import path from "node:path"; 2 | //import { Versioned } from "./types"; 3 | //import fs from "node:fs"; 4 | //import JSON5 from "json5"; 5 | //import { DefaultTheme } from "vitepress"; 6 | 7 | //export function processNavbarItemRecursive( 8 | // navbarItem: Versioned.NavbarItem, 9 | // config: Versioned.NavbarConfig, 10 | // version: Versioned.Version 11 | //): Versioned.NavbarItem | Versioned.NavbarItem[] { 12 | // if (Array.isArray(navbarItem)) { 13 | // return navbarItem.map((item) => 14 | // processNavbarItemRecursive(item, config, version) 15 | // ) as Versioned.NavbarItem[]; 16 | // } 17 | 18 | // if (navbarItem.process === false) return navbarItem; 19 | 20 | // if (navbarItem.link) { 21 | // navbarItem.link = config.navbarUrlProcessor!(navbarItem.link, version); 22 | // } 23 | 24 | // if (navbarItem.items) { 25 | // navbarItem.items = navbarItem.items.map((item) => 26 | // processNavbarItemRecursive(item, config, version) 27 | // ) as (DefaultTheme.NavItemChildren | DefaultTheme.NavItemWithLink)[]; 28 | // } 29 | 30 | // // Add activeMatch that matches the version URL. 31 | // if (!navbarItem.activeMatch) { 32 | // navbarItem.activeMatch = `/${version}/.*$`; 33 | // } 34 | 35 | // return navbarItem; 36 | //} 37 | 38 | //export function getNavbar( 39 | // config: Versioned.NavbarConfig, 40 | // dirname: string, 41 | // version: Versioned.Version, 42 | // locale: string 43 | //): Versioned.NavbarItem[] { 44 | // const navbarPath = path.resolve( 45 | // dirname, 46 | // "..", 47 | // config.navbarPathResolver!( 48 | // version + (locale === "root" ? "" : `-${locale}`) 49 | // ) 50 | // ); 51 | 52 | // let navbars = []; 53 | // if (fs.existsSync(navbarPath)) { 54 | // let navbar = JSON5.parse(fs.readFileSync(navbarPath, "utf-8")); 55 | // navbar = processNavbarItemRecursive(navbar, config, version); 56 | // navbars.push(navbar); 57 | // } 58 | 59 | // return navbars; 60 | //} 61 | 62 | //export function generateVersionedNavbars( 63 | // config: Versioned.NavbarConfig | false, 64 | // dirname: string, 65 | // versions: Versioned.Version[], 66 | // locales: string[] 67 | //): Versioned.NavbarItem[] { 68 | // // The goal is to load the navbar from the path specified by config.navbarPathResolver. 69 | // // These loaded navbar items need to have the `activeMatch: '/${version}/'` property set unless they have process set to false. 70 | 71 | // if (config === false) return []; 72 | 73 | // let versionedItems: Versioned.NavbarItem[] = []; 74 | // for (const version of versions) { 75 | // for (const locale of locales) { 76 | // const navbar = getNavbar(config, dirname, version, locale); 77 | // versionedItems.push(...navbar); 78 | // } 79 | // } 80 | 81 | // return versionedItems; 82 | //} 83 | -------------------------------------------------------------------------------- /src/rewrites.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs"; 2 | import path from "node:path"; 3 | import { Versioned } from "./types"; 4 | 5 | function getFilesRecursively(dirname: string, locales: string[]): string[] { 6 | let files: string[] = []; 7 | 8 | for (const entry of fs.readdirSync(dirname, { withFileTypes: true })) { 9 | const entryPath = `${dirname}/${entry.name}`; 10 | 11 | if (entry.isDirectory()) { 12 | // Skip the locale folders 13 | // TODO: some projects may place translations in paths different to this 14 | if (locales.includes(entry.name)) { 15 | continue; 16 | } 17 | 18 | files = [...files, ...getFilesRecursively(entryPath, locales)]; 19 | } else { 20 | files.push(entryPath); 21 | } 22 | } 23 | 24 | return files; 25 | } 26 | 27 | /** 28 | * Generates vitepress rewrites for all versions in the "versions" folder. 29 | * The rewrites are used to format the URLs in `versions` to be more user-friendly. 30 | * @returns {Record} A map of rewrite sources to their destinations. 31 | */ 32 | export function generateVersionRewrites( 33 | config: Versioned.RewritesConfig | false, 34 | dirname: string, 35 | versions: Versioned.Version[], 36 | locales: string[] = [] 37 | ): Record { 38 | const versionRewrites: Record = {}; 39 | if (config === false) return versionRewrites; 40 | 41 | const versionsDir = path.resolve(dirname, "..", "versions"); 42 | 43 | // Generate rewrites for each version's files. 44 | for (const version of versions) { 45 | // Get all files recursively in the version folder 46 | const files = getFilesRecursively( 47 | path.posix.join(versionsDir, version), 48 | locales 49 | ); 50 | 51 | for (const rewriteSource of files.map((filePath) => 52 | filePath.replace(versionsDir, "versions") 53 | )) { 54 | versionRewrites[rewriteSource] = config.rewriteProcessor!( 55 | rewriteSource, 56 | version 57 | ); 58 | } 59 | 60 | // Manage locale rewrites 61 | for (const locale of locales) { 62 | const versionLocalePath = path.resolve( 63 | versionsDir, 64 | version, 65 | config.localePrefix!, 66 | locale 67 | ); 68 | 69 | if (!fs.existsSync(versionLocalePath)) continue; 70 | 71 | const localeFiles = getFilesRecursively( 72 | path.resolve(versionsDir, version, config.localePrefix!, locale), 73 | locales 74 | ); 75 | 76 | const localeRewriteSources = localeFiles.map((filePath) => 77 | filePath.replace(versionsDir, "versions") 78 | ); 79 | 80 | for (const rewriteSource of localeRewriteSources) { 81 | versionRewrites[`${rewriteSource}`] = config.localeRewriteProcessor!( 82 | rewriteSource, 83 | version, 84 | locale 85 | ).replace(`/${config.localePrefix!}`, ""); 86 | } 87 | } 88 | } 89 | 90 | // console.log(versionRewrites) 91 | 92 | return versionRewrites; 93 | } 94 | -------------------------------------------------------------------------------- /src/sidebars.ts: -------------------------------------------------------------------------------- 1 | import JSON5 from "json5"; 2 | import fs from "node:fs"; 3 | import path from "node:path"; 4 | import { DefaultTheme } from "vitepress"; 5 | import { Versioned } from "./types"; 6 | 7 | /** 8 | * Replaces all links in the sidebar with their versioned equivalents. 9 | * @example `{link: '/test'}` becomes `{link: '/0.1.0/test'}` 10 | * @param sidebar The sidebar to replace links in. 11 | * @param version The version to prepend to all links. 12 | * @returns {DefaultTheme.SidebarItem[]} The sidebar with all links prepended with the version. 13 | */ 14 | function replaceLinksRecursive( 15 | sidebar: Versioned.SidebarItem[], 16 | config: Versioned.SidebarConfig, 17 | version: Versioned.Version 18 | ): DefaultTheme.SidebarItem[] { 19 | // Prepend the version to all links. `{VERSION}/$link` 20 | return sidebar.map((item) => { 21 | if (item.process === false) { 22 | return item; 23 | } 24 | 25 | if (item.link) { 26 | item.link = config.sidebarUrlProcessor!(item.link, version); 27 | } 28 | 29 | if (item.items) { 30 | item.items = replaceLinksRecursive(item.items, config, version); 31 | } 32 | 33 | return item; 34 | }); 35 | } 36 | 37 | /** 38 | * Gets the sidebar for a specific version. 39 | * This function will look for a sidebar.json file in the specified version's folder, or else return an empty sidebar. 40 | * @param version Get the sidebar for a specific version. 41 | * @returns {DefaultTheme.SidebarItem[]} The sidebar for the specified version. 42 | */ 43 | function getSidebar( 44 | config: Versioned.SidebarConfig, 45 | dirname: string, 46 | version: Versioned.Version, 47 | locale: string 48 | ): DefaultTheme.Sidebar { 49 | const sidebarPath = path.resolve( 50 | dirname, 51 | "..", 52 | config.sidebarPathResolver!( 53 | version + (locale === "root" ? "" : `-${locale}`) 54 | ) 55 | ); 56 | 57 | if (fs.existsSync(sidebarPath)) { 58 | const sidebar = JSON5.parse(fs.readFileSync(sidebarPath, "utf-8")); 59 | 60 | if (Array.isArray(sidebar)) { 61 | // Replace all links in the sidebar with their versioned equivalents. 62 | return replaceLinksRecursive( 63 | sidebar as Versioned.SidebarItem[], 64 | config, 65 | (locale === "root" ? "" : `${locale}/`) + version 66 | ); 67 | } else { 68 | // Must be a multisidebar instance. 69 | const multiSidebar = sidebar as DefaultTheme.SidebarMulti; 70 | 71 | // Replace all links in the sidebar with their versioned equivalents. 72 | Object.keys(multiSidebar).forEach((key) => { 73 | multiSidebar[key] = replaceLinksRecursive( 74 | multiSidebar[key] as Versioned.SidebarItem[], 75 | config, 76 | (locale === "root" ? "" : `${locale}/`) + version 77 | ); 78 | }); 79 | 80 | return multiSidebar; 81 | } 82 | } 83 | 84 | return []; 85 | } 86 | 87 | /** 88 | * Generates a sidebar for each version in the "versions" folder. 89 | * @returns {DefaultTheme.SidebarMulti} A map of versions to their sidebars. 90 | */ 91 | export function generateVersionSidebars( 92 | config: Versioned.SidebarConfig | false, 93 | dirname: string, 94 | versions: Versioned.Version[], 95 | locales: string[] 96 | ): DefaultTheme.SidebarMulti { 97 | const versionSidebars: DefaultTheme.SidebarMulti = {}; 98 | if (config === false) return versionSidebars; 99 | 100 | for (const version of versions) { 101 | for (const locale of locales) { 102 | const sidebar = getSidebar(config, dirname, version, locale); 103 | 104 | if (Array.isArray(sidebar)) { 105 | versionSidebars[ 106 | (locale === "root" ? "" : `/${locale}`) + `/${version}/` 107 | ] = sidebar; 108 | } else { 109 | Object.keys(sidebar).forEach((key) => { 110 | versionSidebars[ 111 | (locale === "root" ? "" : `/${locale}`) + `/${version}${key}` 112 | ] = (sidebar as DefaultTheme.SidebarMulti)[key]; 113 | }); 114 | } 115 | } 116 | } 117 | 118 | return versionSidebars; 119 | } 120 | -------------------------------------------------------------------------------- /src/switcher.ts: -------------------------------------------------------------------------------- 1 | import { DefaultTheme } from "vitepress"; 2 | import { Versioned } from "./types"; 3 | 4 | /** 5 | * Generates a nav item for the version switcher, which contains all versions in the "versions" folder and the latest version. 6 | * @returns {DefaultTheme.NavItem} A nav item that contains all versions in the "versions" folder. 7 | */ 8 | export function generateVersionSwitcher( 9 | config: Versioned.SwitcherConfig | false, 10 | versions: Versioned.Version[], 11 | latestVersion: Versioned.Version | null 12 | ): DefaultTheme.NavItem | null { 13 | if (config === false) { 14 | return null; 15 | } 16 | 17 | const versionSwitcher: DefaultTheme.NavItem = { 18 | text: config.text, 19 | items: [], 20 | }; 21 | 22 | if (config.includeLatestVersion) { 23 | versionSwitcher.items.push({ 24 | text: latestVersion === null ? "Latest" : `${latestVersion} (latest)`, 25 | link: "/", 26 | }); 27 | } 28 | 29 | for (const version of versions) { 30 | versionSwitcher.items.push({ 31 | text: version, 32 | link: `/${version}/`, 33 | }); 34 | } 35 | 36 | return versionSwitcher; 37 | } 38 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import { DefaultTheme, UserConfig } from "vitepress"; 2 | 3 | export namespace Versioned { 4 | export type Version = string; 5 | 6 | export type SwitcherConfig = { 7 | /** 8 | * The text to display on the version switcher button. 9 | */ 10 | text?: string; 11 | 12 | /** 13 | * Should the latest (root) version be included in the version switcher? 14 | */ 15 | includeLatestVersion?: boolean; 16 | }; 17 | 18 | export type RewritesConfig = { 19 | /** 20 | * The prefix to add to the locale folders. 21 | */ 22 | localePrefix?: string; 23 | 24 | /** 25 | * The function that processes rewrite URLs for locale folders. 26 | * @param inputFilePath The input file path to process. 27 | * @param version The version to process the URL for. 28 | * @param locale The locale to process the URL for. 29 | * @returns The processed URL. 30 | * @default (inputFilePath: string, _version: Version, locale: string) => `${locale}/` + inputFilePath.replace("versions/", "").replace(`${locale}/`, "") 31 | */ 32 | localeRewriteProcessor?: ( 33 | inputFilePath: string, 34 | version: Version, 35 | locale: string 36 | ) => string; 37 | 38 | /** 39 | * The function that processes rewrite URLs. 40 | * @param inputFilePath The input file path to process. 41 | * @param version The version to process the URL for. 42 | * @returns The processed URL. 43 | * @default (inputFilePath: string, _version: Version) => inputFilePath.replace("versions/", "") 44 | * @example // Turns `/versions/1.0.0/index.md` into `/1.0.0/index.md` 45 | */ 46 | rewriteProcessor?: (inputFilePath: string, version: Version) => string; 47 | }; 48 | 49 | export type SidebarConfig = { 50 | /** 51 | * Whether or not to process sidebar URLs. Uses the `sidebarUrlProcessor` function. 52 | * @default true 53 | */ 54 | processSidebarURLs?: boolean; 55 | 56 | /** 57 | * The function that resolves the path to the sidebar file for a given version. 58 | * @param version The version to resolve the sidebar path for. 59 | * @returns The path to the sidebar file for the given version. 60 | * @default (version: Version) => `.vitepress/sidebars/versioned/${version}.json` 61 | */ 62 | sidebarPathResolver?: (version: Version) => string; 63 | 64 | /** 65 | * The function that processes sidebar URLs. 66 | * @param url The URL to process. 67 | * @param version The version to process the URL for. 68 | * @returns The processed URL. 69 | * @default (url: string, version: Version) => `/${version}${url}` 70 | */ 71 | sidebarUrlProcessor?: (url: string, version: Version) => string; 72 | 73 | /** 74 | * Used to process the sidebar content further after versioning has been applied. 75 | * @param sidebar Sidebar input. 76 | * @returns Processed sidebar. 77 | */ 78 | sidebarContentProcessor?: (sidebar: DefaultTheme.SidebarMulti) => DefaultTheme.SidebarMulti 79 | }; 80 | 81 | //export type NavbarConfig = { 82 | // /** 83 | // * Whether or not to process navbar URLs. Uses the `navbarUrlProcessor` function. 84 | // * @default true 85 | // */ 86 | // processNavbarURLs?: boolean; 87 | 88 | // /** 89 | // * The function that processes navbar URLs. 90 | // * @param url The URL to process. 91 | // * @param version The version to process the URL for. 92 | // * @returns The processed URL. 93 | // * @default (url: string, version: Version) => `/${version}${url}` 94 | // */ 95 | // navbarUrlProcessor?: (url: string, version: Version) => string; 96 | 97 | // /** 98 | // * The function that resolves the path to the navbar file for a given version. 99 | // * @param version The version to resolve the navbar path for. 100 | // * @returns The path to the navbar file for the given version. 101 | // * @default (version: Version) => `.vitepress/navbars/versioned/${version}.json` 102 | // */ 103 | // navbarPathResolver?: (version: Version) => string; 104 | //}; 105 | 106 | export type SidebarItem = DefaultTheme.SidebarItem & { 107 | /** 108 | * Set to `false` to disable versioning of this URL. 109 | */ 110 | process?: boolean; 111 | }; 112 | 113 | export type NavbarItem = DefaultTheme.NavItem & { 114 | /** 115 | * Set to `false` to disable versioning of this URL. 116 | */ 117 | process?: boolean; 118 | 119 | link?: string; 120 | }; 121 | 122 | export type Sidebar = { 123 | [path: string]: SidebarItem[] | { items: SidebarItem[]; base: string }; 124 | }; 125 | 126 | //export type Navbar = NavbarItem[]; 127 | 128 | export interface ThemeConfig extends DefaultTheme.Config { 129 | /** 130 | * Configuration relating to the version switcher. 131 | * Set to false to disable the version switcher. 132 | */ 133 | versionSwitcher?: SwitcherConfig | false; 134 | 135 | sidebar?: Sidebar; 136 | 137 | //nav?: Navbar; 138 | } 139 | 140 | export interface Config extends UserConfig { 141 | /** 142 | * Configuration relating to versioning. 143 | */ 144 | versioning: { 145 | /** 146 | * A string representation of the latest version of the project (root). 147 | */ 148 | latestVersion?: Version | null; 149 | 150 | /** 151 | * Configuration relating to versioned sidebar files. 152 | * 153 | * Set this to false to disable all sidebar versioning functionality. 154 | */ 155 | sidebars?: SidebarConfig | false; 156 | 157 | ///** 158 | // * Configuration relating to versioned navbar files. 159 | // * 160 | // * Set this to false to disable all navbar versioning functionality. 161 | // */ 162 | //navbars?: NavbarConfig | false; 163 | 164 | /** 165 | * Configuration relating to versioned rewrites. 166 | * 167 | * Set this to false to disable all rewrite versioning functionality. 168 | */ 169 | rewrites?: RewritesConfig | false; 170 | }; 171 | } 172 | } 173 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2016", 4 | "module": "commonjs", 5 | "outDir": "dist", 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "skipLibCheck": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | entry: ["src/index.ts"], 5 | format: ["cjs", "esm"], 6 | dts: true, 7 | splitting: false, 8 | sourcemap: true, 9 | clean: true, 10 | }); --------------------------------------------------------------------------------