From 6cce76685da39f8b5c75da047f847f82f70b9c4e Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 17 Apr 2026 12:53:10 +0530 Subject: [PATCH 001/187] feat!: support scroll-margin / scroll-padding Replaces the JS-based scroll offset logic with native CSS `scroll-margin-top`. The default theme sets it on headings using `--vp-nav-height` and `--vp-layout-top-height`, and `scrollTo` now uses `scrollIntoView` which respects it natively. BREAKING CHANGE: `scrollOffset` from config is removed. Users wanting to customize scroll offset should customize `scroll-margin-top` via CSS instead. `smoothScroll` support from `router.go` is also removed as it didn't work as expected for most users. Users wanting smooth scrolling should set `scroll-behavior: smooth` in CSS, ideally inside a `@media (prefers-reduced-motion: no-preference)` block. --- .gitignore | 1 + src/client/app/index.ts | 2 +- src/client/app/router.ts | 39 ++++--------------- src/client/app/utils.ts | 33 ---------------- src/client/index.ts | 1 - .../theme-default/composables/outline.ts | 9 +++-- .../styles/components/vp-doc.css | 3 ++ src/node/config.ts | 1 - src/node/siteConfig.ts | 14 ------- types/shared.d.ts | 5 --- 10 files changed, 18 insertions(+), 90 deletions(-) diff --git a/.gitignore b/.gitignore index 64331052..e6e95ca9 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ node_modules pnpm-global TODOs.md *.timestamp-*.mjs +.claude diff --git a/src/client/app/index.ts b/src/client/app/index.ts index 761c2d92..178c98b1 100644 --- a/src/client/app/index.ts +++ b/src/client/app/index.ts @@ -168,7 +168,7 @@ if (inBrowser) { // scroll to hash on new tab during dev if (import.meta.env.DEV && location.hash) { - scrollTo(location.hash) + setTimeout(() => scrollTo(location.hash), 100) } }) }) diff --git a/src/client/app/router.ts b/src/client/app/router.ts index 7a36343a..5d3d86f1 100644 --- a/src/client/app/router.ts +++ b/src/client/app/router.ts @@ -3,7 +3,7 @@ import { inject, markRaw, nextTick, reactive, readonly } from 'vue' import type { Awaitable, PageData, PageDataPayload } from '../shared' import { notFoundPageData, treatAsHtml } from '../shared' import { siteDataRef } from './data' -import { getScrollOffset, inBrowser, withBase } from './utils' +import { inBrowser, withBase } from './utils' export interface Route { path: string @@ -26,8 +26,6 @@ export interface Router { options?: { // @internal initialLoad?: boolean - // Whether to smoothly scroll to the target position. - smoothScroll?: boolean // Whether to replace the current history entry. replace?: boolean } @@ -145,7 +143,7 @@ export function createRouter( history.replaceState({}, '', href) } - if (!initialLoad) scrollTo(targetLoc.hash, false, scrollPosition) + if (!initialLoad) scrollTo(targetLoc.hash, scrollPosition) }) } } @@ -232,10 +230,7 @@ export function createRouter( // only intercept inbound html links if (origin === currentLoc.origin && treatAsHtml(pathname)) { e.preventDefault() - router.go(href, { - // use smooth scroll when clicking on header anchor links - smoothScroll: link.classList.contains('header-anchor') - }) + router.go(href) } }, { capture: true } @@ -270,7 +265,7 @@ export function useRoute(): Route { return useRouter().route } -export function scrollTo(hash: string, smooth = false, scrollPosition = 0) { +export function scrollTo(hash: string, scrollPosition = 0) { if (!hash || scrollPosition) { window.scrollTo(0, scrollPosition) return @@ -284,21 +279,8 @@ export function scrollTo(hash: string, smooth = false, scrollPosition = 0) { } if (!target) return - const targetTop = - window.scrollY + - target.getBoundingClientRect().top - - getScrollOffset() + - Number.parseInt(window.getComputedStyle(target).paddingTop, 10) || 0 - - const behavior = window.matchMedia('(prefers-reduced-motion)').matches - ? 'instant' - : // only smooth scroll if distance is smaller than screen height - smooth && Math.abs(targetTop - window.scrollY) <= window.innerHeight - ? 'smooth' - : 'auto' - const scrollToTarget = () => { - window.scrollTo({ left: 0, top: targetTop, behavior }) + target.scrollIntoView({ block: 'start' }) // focus the target element for better accessibility target.focus({ preventScroll: true }) @@ -361,12 +343,7 @@ function normalizeHref(href: string): string { async function changeRoute( href: string, - { - smoothScroll = false, - initialLoad = false, - replace = false, - hasTextFragment = false - } = {} + { initialLoad = false, replace = false, hasTextFragment = false } = {} ): Promise { const loc = normalizeHref(location.href) const nextUrl = new URL(href, location.origin) @@ -374,7 +351,7 @@ async function changeRoute( if (href === loc) { if (!initialLoad) { - if (!hasTextFragment) scrollTo(nextUrl.hash, smoothScroll) + if (!hasTextFragment) scrollTo(nextUrl.hash) return false } } else { @@ -395,7 +372,7 @@ async function changeRoute( newURL: nextUrl.href }) ) - if (!hasTextFragment) scrollTo(nextUrl.hash, smoothScroll) + if (!hasTextFragment) scrollTo(nextUrl.hash) } return false diff --git a/src/client/app/utils.ts b/src/client/app/utils.ts index b734179c..d63c5ee3 100644 --- a/src/client/app/utils.ts +++ b/src/client/app/utils.ts @@ -102,36 +102,3 @@ export function defineClientComponent( } } } - -export function getScrollOffset() { - let scrollOffset = siteDataRef.value.scrollOffset - let offset = 0 - let padding = 24 - if (typeof scrollOffset === 'object' && 'padding' in scrollOffset) { - padding = scrollOffset.padding - scrollOffset = scrollOffset.selector - } - if (typeof scrollOffset === 'number') { - offset = scrollOffset - } else if (typeof scrollOffset === 'string') { - offset = tryOffsetSelector(scrollOffset, padding) - } else if (Array.isArray(scrollOffset)) { - for (const selector of scrollOffset) { - const res = tryOffsetSelector(selector, padding) - if (res) { - offset = res - break - } - } - } - - return offset -} - -function tryOffsetSelector(selector: string, padding: number): number { - const el = document.querySelector(selector) - if (!el) return 0 - const bot = el.getBoundingClientRect().bottom - if (bot < 0) return 0 - return bot + padding -} diff --git a/src/client/index.ts b/src/client/index.ts index 6054daa4..cd7442e9 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -19,7 +19,6 @@ export { useRoute, useRouter } from './app/router' export { _escapeHtml, defineClientComponent, - getScrollOffset, inBrowser, onContentUpdated, withBase diff --git a/src/client/theme-default/composables/outline.ts b/src/client/theme-default/composables/outline.ts index 752ad15b..669781f1 100644 --- a/src/client/theme-default/composables/outline.ts +++ b/src/client/theme-default/composables/outline.ts @@ -1,4 +1,3 @@ -import { getScrollOffset } from 'vitepress' import type { DefaultTheme } from 'vitepress/theme' import { onMounted, onUnmounted, onUpdated, type Ref } from 'vue' import { throttleAndDebounce } from '../support/utils' @@ -115,7 +114,9 @@ export function useActiveAnchor( const headers = resolvedHeaders .map(({ element, link }) => ({ link, - top: getAbsoluteTop(element) + top: getAbsoluteTop(element), + scrollMarginTop: + Number.parseFloat(getComputedStyle(element).scrollMarginTop) || 0 })) .filter(({ top }) => !Number.isNaN(top)) .sort((a, b) => a.top - b.top) @@ -140,8 +141,8 @@ export function useActiveAnchor( // find the last header above the top of viewport let activeLink: string | null = null - for (const { link, top } of headers) { - if (top > scrollY + getScrollOffset() + 4) { + for (const { link, top, scrollMarginTop } of headers) { + if (top > scrollY + scrollMarginTop + 4) { break } activeLink = link diff --git a/src/client/theme-default/styles/components/vp-doc.css b/src/client/theme-default/styles/components/vp-doc.css index 1c24374a..b5b42596 100644 --- a/src/client/theme-default/styles/components/vp-doc.css +++ b/src/client/theme-default/styles/components/vp-doc.css @@ -11,6 +11,9 @@ position: relative; font-weight: 600; outline: none; + scroll-margin-top: calc( + var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 24px + ); } .vp-doc h1 { diff --git a/src/node/config.ts b/src/node/config.ts index 49649590..bdcd00e1 100644 --- a/src/node/config.ts +++ b/src/node/config.ts @@ -335,7 +335,6 @@ export async function resolveSiteData( appearance: userConfig.appearance ?? true, themeConfig: userConfig.themeConfig || {}, locales: userConfig.locales || {}, - scrollOffset: userConfig.scrollOffset ?? 134, cleanUrls: !!userConfig.cleanUrls, contentProps: userConfig.contentProps, additionalConfig: userConfig.additionalConfig diff --git a/src/node/siteConfig.ts b/src/node/siteConfig.ts index 210bc3d0..a421ced3 100644 --- a/src/node/siteConfig.ts +++ b/src/node/siteConfig.ts @@ -81,20 +81,6 @@ export interface UserConfig< */ vite?: ViteConfig & { configFile?: string | false } - /** - * Configure the scroll offset when the theme has a sticky header. - * Can be a number or a selector element to get the offset from. - * Can also be an array of selectors in case some elements will be - * invisible due to responsive layout. VitePress will fallback to the next - * selector if a selector fails to match, or the matched element is not - * currently visible in viewport. - */ - scrollOffset?: - | number - | string - | string[] - | { selector: string | string[]; padding: number } - /** * Enable MPA / zero-JS mode. * @experimental diff --git a/types/shared.d.ts b/types/shared.d.ts index bc8d28d4..cf40ea71 100644 --- a/types/shared.d.ts +++ b/types/shared.d.ts @@ -136,11 +136,6 @@ export interface SiteData { | 'force-auto' | (Omit & { initialValue?: 'dark' }) themeConfig: ThemeConfig - scrollOffset: - | number - | string - | string[] - | { selector: string | string[]; padding: number } locales: LocaleConfig localeIndex?: string contentProps?: Record From aa587f679c77c47e3d84bb1629ec8d594eb12cc3 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 17 Apr 2026 13:49:23 +0530 Subject: [PATCH 002/187] chore: bump deps --- __tests__/tsconfig.json | 1 - docs/package.json | 6 +- package.json | 40 +- pnpm-lock.yaml | 1175 ++++++++++++++++++++------------------ src/client/tsconfig.json | 3 +- src/node/tsconfig.json | 1 - src/shared/tsconfig.json | 1 - 7 files changed, 645 insertions(+), 582 deletions(-) diff --git a/__tests__/tsconfig.json b/__tests__/tsconfig.json index b8fef70a..9cce3a1e 100644 --- a/__tests__/tsconfig.json +++ b/__tests__/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../tsconfig.json", "compilerOptions": { "isolatedModules": false, - "baseUrl": ".", "types": ["node", "vitest/globals"], "paths": { "client/*": ["../src/client/*"], diff --git a/docs/package.json b/docs/package.json index bf99e78d..ba193304 100644 --- a/docs/package.json +++ b/docs/package.json @@ -13,9 +13,9 @@ "@lunariajs/core": "^0.1.1", "markdown-it-mathjax3": "^4.3.2", "open-cli": "^8.0.0", - "postcss-rtlcss": "^5.7.1", + "postcss-rtlcss": "^6.0.0", "vitepress": "workspace:*", - "vitepress-plugin-group-icons": "1.7.1", - "vitepress-plugin-llms": "^1.12.0" + "vitepress-plugin-group-icons": "^1.7.5", + "vitepress-plugin-llms": "^1.12.1" } } diff --git a/package.json b/package.json index 70775c9d..d3a170ae 100644 --- a/package.json +++ b/package.json @@ -99,25 +99,27 @@ "@docsearch/css": "^4.6.2", "@docsearch/js": "^4.6.2", "@docsearch/sidepanel-js": "^4.6.2", - "@iconify-json/simple-icons": "^1.2.75", + "@iconify-json/simple-icons": "^1.2.78", "@shikijs/core": "^4.0.2", "@shikijs/transformers": "^4.0.2", "@shikijs/types": "^4.0.2", "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^6.0.5", + "@vitejs/plugin-vue": "^6.0.6", "@vue/devtools-api": "^8.1.1", - "@vue/shared": "^3.5.31", + "@vue/shared": "^3.5.32", "@vueuse/core": "^14.2.1", "@vueuse/integrations": "^14.2.1", "focus-trap": "^8.0.1", "mark.js": "8.11.1", "minisearch": "^7.2.0", "shiki": "^4.0.2", - "vite": "^7.3.1", - "vue": "^3.5.31" + "vite": "^7.3.2", + "vue": "^3.5.32" }, "devDependencies": { - "@clack/prompts": "^1.1.0", + "@clack/prompts": "^1.2.0", + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", "@iconify/utils": "^3.1.0", "@mdit-vue/plugin-component": "^3.0.2", "@mdit-vue/plugin-frontmatter": "^3.0.2", @@ -140,21 +142,21 @@ "@types/markdown-it-container": "^4.0.0", "@types/markdown-it-emoji": "^3.0.1", "@types/minimist": "^1.2.5", - "@types/node": "^25.5.0", - "@types/picomatch": "^4.0.2", + "@types/node": "^25.6.0", + "@types/picomatch": "^4.0.3", "@types/prompts": "^2.4.9", "chokidar": "^5.0.0", "conventional-changelog": "^7.2.0", - "conventional-changelog-angular": "^8.3.0", + "conventional-changelog-angular": "^8.3.1", "cross-spawn": "^7.0.6", - "esbuild": "^0.27.4", + "esbuild": "^0.27.7", "execa": "^9.6.1", "fs-extra": "^11.3.4", "get-port": "^7.2.0", "gray-matter": "^4.0.3", "lint-staged": "^16.4.0", - "lodash.template": "^4.5.0", - "lru-cache": "^11.2.7", + "lodash.template": "^4.18.1", + "lru-cache": "^11.3.5", "markdown-it": "^14.1.1", "markdown-it-anchor": "^9.2.0", "markdown-it-async": "^2.2.0", @@ -164,7 +166,7 @@ "markdown-it-emoji": "^3.0.0", "markdown-it-mathjax3": "^4.3.2", "minimist": "^1.2.8", - "nanoid": "^5.1.7", + "nanoid": "^5.1.9", "obug": "^2.1.1", "ora": "^9.3.0", "oxc-minify": "^0.98.0", @@ -173,25 +175,25 @@ "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "picomatch": "^4.0.4", - "playwright-chromium": "^1.58.2", + "playwright-chromium": "^1.59.1", "polka": "^1.0.0-next.28", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.1", - "prettier": "^3.8.1", + "prettier": "^3.8.3", "prompts": "^2.4.2", "punycode": "^2.3.1", - "rollup": "^4.60.0", + "rollup": "^4.60.1", "rollup-plugin-dts": "6.1.1", "rollup-plugin-esbuild": "^6.2.1", "semver": "^7.7.4", "simple-git-hooks": "^2.13.1", "sirv": "^3.0.2", "sitemap": "^9.0.1", - "tinyglobby": "^0.2.15", - "typescript": "^5.9.3", + "tinyglobby": "^0.2.16", + "typescript": "^6.0.3", "vitest": "4.0.0-beta.4", "vue-tsc": "^3.2.6", - "wait-on": "^9.0.4" + "wait-on": "^9.0.5" }, "peerDependencies": { "markdown-it-mathjax3": "^4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 09d943eb..92d23484 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: ^4.6.2 version: 4.6.2 '@iconify-json/simple-icons': - specifier: ^1.2.75 - version: 1.2.75 + specifier: ^1.2.78 + version: 1.2.78 '@shikijs/core': specifier: ^4.0.2 version: 4.0.2 @@ -51,20 +51,20 @@ importers: specifier: ^14.1.2 version: 14.1.2 '@vitejs/plugin-vue': - specifier: ^6.0.5 - version: 6.0.5(rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) + specifier: ^6.0.6 + version: 6.0.6(rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3))(vue@3.5.32(typescript@6.0.3)) '@vue/devtools-api': specifier: ^8.1.1 version: 8.1.1 '@vue/shared': - specifier: ^3.5.31 - version: 3.5.31 + specifier: ^3.5.32 + version: 3.5.32 '@vueuse/core': specifier: ^14.2.1 - version: 14.2.1(vue@3.5.31(typescript@5.9.3)) + version: 14.2.1(vue@3.5.32(typescript@6.0.3)) '@vueuse/integrations': specifier: ^14.2.1 - version: 14.2.1(axios@1.13.6)(focus-trap@8.0.1)(vue@3.5.31(typescript@5.9.3)) + version: 14.2.1(axios@1.15.0)(focus-trap@8.0.1)(vue@3.5.32(typescript@6.0.3)) focus-trap: specifier: ^8.0.1 version: 8.0.1 @@ -79,14 +79,20 @@ importers: version: 4.0.2 vite: specifier: npm:rolldown-vite@latest - version: rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3) + version: rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3) vue: - specifier: ^3.5.31 - version: 3.5.31(typescript@5.9.3) + specifier: ^3.5.32 + version: 3.5.32(typescript@6.0.3) devDependencies: '@clack/prompts': - specifier: ^1.1.0 - version: 1.1.0 + specifier: ^1.2.0 + version: 1.2.0 + '@emnapi/core': + specifier: ^1.10.0 + version: 1.10.0 + '@emnapi/runtime': + specifier: ^1.10.0 + version: 1.10.0 '@iconify/utils': specifier: ^3.1.0 version: 3.1.0 @@ -116,19 +122,19 @@ importers: version: 1.0.0-next.28 '@rollup/plugin-alias': specifier: ^6.0.0 - version: 6.0.0(rollup@4.60.0) + version: 6.0.0(rollup@4.60.1) '@rollup/plugin-commonjs': specifier: ^29.0.2 - version: 29.0.2(rollup@4.60.0) + version: 29.0.2(rollup@4.60.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.60.0) + version: 6.1.0(rollup@4.60.1) '@rollup/plugin-node-resolve': specifier: ^16.0.3 - version: 16.0.3(rollup@4.60.0) + version: 16.0.3(rollup@4.60.1) '@rollup/plugin-replace': specifier: ^6.0.3 - version: 6.0.3(rollup@4.60.0) + version: 6.0.3(rollup@4.60.1) '@types/cross-spawn': specifier: ^6.0.6 version: 6.0.6 @@ -154,11 +160,11 @@ importers: specifier: ^1.2.5 version: 1.2.5 '@types/node': - specifier: ^25.5.0 - version: 25.5.0 + specifier: ^25.6.0 + version: 25.6.0 '@types/picomatch': - specifier: ^4.0.2 - version: 4.0.2 + specifier: ^4.0.3 + version: 4.0.3 '@types/prompts': specifier: ^2.4.9 version: 2.4.9 @@ -169,14 +175,14 @@ importers: specifier: ^7.2.0 version: 7.2.0(conventional-commits-filter@5.0.0) conventional-changelog-angular: - specifier: ^8.3.0 - version: 8.3.0 + specifier: ^8.3.1 + version: 8.3.1 cross-spawn: specifier: ^7.0.6 version: 7.0.6 esbuild: - specifier: ^0.27.4 - version: 0.27.4 + specifier: ^0.27.7 + version: 0.27.7 execa: specifier: ^9.6.1 version: 9.6.1 @@ -193,11 +199,11 @@ importers: specifier: ^16.4.0 version: 16.4.0 lodash.template: - specifier: ^4.5.0 + specifier: ^4.18.1 version: 4.18.1 lru-cache: - specifier: ^11.2.7 - version: 11.2.7 + specifier: ^11.3.5 + version: 11.3.5 markdown-it: specifier: ^14.1.1 version: 14.1.1 @@ -226,8 +232,8 @@ importers: specifier: ^1.2.8 version: 1.2.8 nanoid: - specifier: ^5.1.7 - version: 5.1.7 + specifier: ^5.1.9 + version: 5.1.9 obug: specifier: ^2.1.1 version: 2.1.1 @@ -236,7 +242,7 @@ importers: version: 9.3.0 oxc-minify: specifier: ^0.98.0 - version: 0.98.0 + version: 0.98.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) p-map: specifier: ^7.0.4 version: 7.0.4 @@ -253,20 +259,20 @@ importers: specifier: ^4.0.4 version: 4.0.4 playwright-chromium: - specifier: ^1.58.2 - version: 1.58.2 + specifier: ^1.59.1 + version: 1.59.1 polka: specifier: ^1.0.0-next.28 version: 1.0.0-next.28 postcss: specifier: ^8.5.6 - version: 8.5.8 + version: 8.5.10 postcss-selector-parser: specifier: ^7.1.1 version: 7.1.1 prettier: - specifier: ^3.8.1 - version: 3.8.1 + specifier: ^3.8.3 + version: 3.8.3 prompts: specifier: ^2.4.2 version: 2.4.2 @@ -274,14 +280,14 @@ importers: specifier: ^2.3.1 version: 2.3.1 rollup: - specifier: ^4.60.0 - version: 4.60.0 + specifier: ^4.60.1 + version: 4.60.1 rollup-plugin-dts: specifier: 6.1.1 - version: 6.1.1(rollup@4.60.0)(typescript@5.9.3) + version: 6.1.1(rollup@4.60.1)(typescript@6.0.3) rollup-plugin-esbuild: specifier: ^6.2.1 - version: 6.2.1(esbuild@0.27.4)(rollup@4.60.0) + version: 6.2.1(esbuild@0.27.7)(rollup@4.60.1) semver: specifier: ^7.7.4 version: 7.7.4 @@ -295,20 +301,20 @@ importers: specifier: ^9.0.1 version: 9.0.1 tinyglobby: - specifier: ^0.2.15 - version: 0.2.15 + specifier: ^0.2.16 + version: 0.2.16 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: 4.0.0-beta.4 - version: 4.0.0-beta.4(@types/debug@4.1.13)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3) + version: 4.0.0-beta.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/debug@4.1.13)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3) vue-tsc: specifier: ^3.2.6 - version: 3.2.6(typescript@5.9.3) + version: 3.2.6(typescript@6.0.3) wait-on: - specifier: ^9.0.4 - version: 9.0.4 + specifier: ^9.0.5 + version: 9.0.5 __tests__/e2e: devDependencies: @@ -334,17 +340,17 @@ importers: specifier: ^8.0.0 version: 8.0.0 postcss-rtlcss: - specifier: ^5.7.1 - version: 5.7.1(postcss@8.5.8) + specifier: ^6.0.0 + version: 6.0.0(postcss@8.5.10) vitepress: specifier: workspace:* version: link:.. vitepress-plugin-group-icons: - specifier: 1.7.1 - version: 1.7.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3) + specifier: ^1.7.5 + version: 1.7.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3) vitepress-plugin-llms: - specifier: ^1.12.0 - version: 1.12.0 + specifier: ^1.12.1 + version: 1.12.1 packages: @@ -375,18 +381,18 @@ packages: '@clack/core@0.3.5': resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} - '@clack/core@1.1.0': - resolution: {integrity: sha512-SVcm4Dqm2ukn64/8Gub2wnlA5nS2iWJyCkdNHcvNHPIeBTGojpdJ+9cZKwLfmqy7irD4N5qLteSilJlE0WLAtA==} + '@clack/core@1.2.0': + resolution: {integrity: sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==} - '@clack/prompts@1.1.0': - resolution: {integrity: sha512-pkqbPGtohJAvm4Dphs2M8xE29ggupihHdy1x84HNojZuMtFsHiUlRvqD24tM2+XmI+61LlfNceM3Wr7U5QES5g==} + '@clack/prompts@1.2.0': + resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==} - '@conventional-changelog/git-client@2.6.0': - resolution: {integrity: sha512-T+uPDciKf0/ioNNDpMGc8FDsehJClZP0yR3Q5MN6wE/Y/1QZ7F+80OgznnTCOlMEG4AV0LvH2UJi3C/nBnaBUg==} + '@conventional-changelog/git-client@2.7.0': + resolution: {integrity: sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==} engines: {node: '>=18'} peerDependencies: conventional-commits-filter: ^5.0.0 - conventional-commits-parser: ^6.3.0 + conventional-commits-parser: ^6.4.0 peerDependenciesMeta: conventional-commits-filter: optional: true @@ -402,167 +408,167 @@ packages: '@docsearch/sidepanel-js@4.6.2': resolution: {integrity: sha512-Pni85AP/GwRj7fFg8cBJp0U04tzbueBvWSd3gysgnOsVnQVSZwSYncfErUScLE1CAtR+qocPDFjmYR9AMRNJtQ==} - '@emnapi/core@1.9.1': - resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/runtime@1.9.1': - resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.27.4': - resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.4': - resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.4': - resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.4': - resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.4': - resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.4': - resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.4': - resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.4': - resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.4': - resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.4': - resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.4': - resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.4': - resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.4': - resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.4': - resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.4': - resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.4': - resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.4': - resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.4': - resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.4': - resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.4': - resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.4': - resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.4': - resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.4': - resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.4': - resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.4': - resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.4': - resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -587,11 +593,11 @@ packages: '@hapi/topo@6.0.2': resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} - '@iconify-json/logos@1.2.10': - resolution: {integrity: sha512-qxaXKJ6fu8jzTMPQdHtNxlfx6tBQ0jXRbHZIYy5Ilh8Lx9US9FsAdzZWUR8MXV8PnWTKGDFO4ZZee9VwerCyMA==} + '@iconify-json/logos@1.2.11': + resolution: {integrity: sha512-fOo4pGEatuyuCFNL+cwquYMa2Im0oJHRHV7lt/Qqs5Ode/lPImHCQcfTtPzZj7qYMPb/h8YHN3TG54uEowrjNQ==} - '@iconify-json/simple-icons@1.2.75': - resolution: {integrity: sha512-KvcCUbvcBWb0sbqLIxHoY8z5/piXY08wcY9gfMhF+ph3AfzGMaSmZFkUY71HSXAljQngXkgs4bdKdekO0HQWvg==} + '@iconify-json/simple-icons@1.2.78': + resolution: {integrity: sha512-I3lkNp0Qu7q2iZWkdcf/I2hqGhzK6qxdILh9T7XqowQrnpmG/BayDsiCf6PktDoWlW0U971xA5g+panm+NFrfQ==} '@iconify-json/vscode-icons@1.2.45': resolution: {integrity: sha512-ow+ueibMIq79ueM1kv6cOWgHx8jfh1XJQi2RrqMHb4HLbvIBlxpy5PCMvOJXlA68R6fBAHpWQeh6uWx7VKEVsA==} @@ -648,8 +654,11 @@ packages: resolution: {integrity: sha512-00aAZ0F0NLik6I6Yba2emGbHLxv+QYrPH00qQ5dFKXlAo1Ll2RHDXwY7nN2WAfrx2pP+WrvSRFTGFCNGdzBDHw==} engines: {node: '>=20.0.0'} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -856,8 +865,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.53': resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} - '@rolldown/pluginutils@1.0.0-rc.2': - resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + '@rolldown/pluginutils@1.0.0-rc.13': + resolution: {integrity: sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -913,141 +922,141 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.60.0': - resolution: {integrity: sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==} + '@rollup/rollup-android-arm-eabi@4.60.1': + resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.0': - resolution: {integrity: sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==} + '@rollup/rollup-android-arm64@4.60.1': + resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.0': - resolution: {integrity: sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==} + '@rollup/rollup-darwin-arm64@4.60.1': + resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.0': - resolution: {integrity: sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==} + '@rollup/rollup-darwin-x64@4.60.1': + resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.0': - resolution: {integrity: sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==} + '@rollup/rollup-freebsd-arm64@4.60.1': + resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.0': - resolution: {integrity: sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==} + '@rollup/rollup-freebsd-x64@4.60.1': + resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.0': - resolution: {integrity: sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.0': - resolution: {integrity: sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==} + '@rollup/rollup-linux-arm-musleabihf@4.60.1': + resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.0': - resolution: {integrity: sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==} + '@rollup/rollup-linux-arm64-gnu@4.60.1': + resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.0': - resolution: {integrity: sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==} + '@rollup/rollup-linux-arm64-musl@4.60.1': + resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.0': - resolution: {integrity: sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==} + '@rollup/rollup-linux-loong64-gnu@4.60.1': + resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.0': - resolution: {integrity: sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==} + '@rollup/rollup-linux-loong64-musl@4.60.1': + resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.0': - resolution: {integrity: sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==} + '@rollup/rollup-linux-ppc64-gnu@4.60.1': + resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.0': - resolution: {integrity: sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==} + '@rollup/rollup-linux-ppc64-musl@4.60.1': + resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.0': - resolution: {integrity: sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==} + '@rollup/rollup-linux-riscv64-gnu@4.60.1': + resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.0': - resolution: {integrity: sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==} + '@rollup/rollup-linux-riscv64-musl@4.60.1': + resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.0': - resolution: {integrity: sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==} + '@rollup/rollup-linux-s390x-gnu@4.60.1': + resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.0': - resolution: {integrity: sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==} + '@rollup/rollup-linux-x64-gnu@4.60.1': + resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.0': - resolution: {integrity: sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==} + '@rollup/rollup-linux-x64-musl@4.60.1': + resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.0': - resolution: {integrity: sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==} + '@rollup/rollup-openbsd-x64@4.60.1': + resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.0': - resolution: {integrity: sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==} + '@rollup/rollup-openharmony-arm64@4.60.1': + resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.0': - resolution: {integrity: sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==} + '@rollup/rollup-win32-arm64-msvc@4.60.1': + resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.0': - resolution: {integrity: sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==} + '@rollup/rollup-win32-ia32-msvc@4.60.1': + resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.0': - resolution: {integrity: sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==} + '@rollup/rollup-win32-x64-gnu@4.60.1': + resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.0': - resolution: {integrity: sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==} + '@rollup/rollup-win32-x64-msvc@4.60.1': + resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} cpu: [x64] os: [win32] @@ -1089,6 +1098,12 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@simple-git/args-pathspec@1.0.3': + resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==} + + '@simple-git/argv-parser@1.1.1': + resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==} + '@simple-libs/child-process-utils@1.0.2': resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} engines: {node: '>=18'} @@ -1177,17 +1192,17 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@24.12.0': - resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} - '@types/node@25.5.0': - resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/picomatch@4.0.2': - resolution: {integrity: sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==} + '@types/picomatch@4.0.3': + resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} @@ -1207,8 +1222,8 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitejs/plugin-vue@6.0.5': - resolution: {integrity: sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==} + '@vitejs/plugin-vue@6.0.6': + resolution: {integrity: sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1231,8 +1246,8 @@ packages: '@vitest/pretty-format@4.0.0-beta.4': resolution: {integrity: sha512-BW9Y/t5tGLFi1DgNzs9R4EDqh3MVGiPFBTPGZLK+Y7jBUOFINmLTYTVz1iDnSFLwTOpHxAQfERyOmcu429OQog==} - '@vitest/pretty-format@4.1.2': - resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} + '@vitest/pretty-format@4.1.4': + resolution: {integrity: sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==} '@vitest/runner@4.0.0-beta.4': resolution: {integrity: sha512-27ptMzYl0dNvN6o1jmKDsEX0gR3IwulSgPwJVvoKSQntUFUqMeQh0jbNtdZj60li49Rxbh/rdSE25D/7ABJAJg==} @@ -1255,17 +1270,17 @@ packages: '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} - '@vue/compiler-core@3.5.31': - resolution: {integrity: sha512-k/ueL14aNIEy5Onf0OVzR8kiqF/WThgLdFhxwa4e/KF/0qe38IwIdofoSWBTvvxQOesaz6riAFAUaYjoF9fLLQ==} + '@vue/compiler-core@3.5.32': + resolution: {integrity: sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==} - '@vue/compiler-dom@3.5.31': - resolution: {integrity: sha512-BMY/ozS/xxjYqRFL+tKdRpATJYDTTgWSo0+AJvJNg4ig+Hgb0dOsHPXvloHQ5hmlivUqw1Yt2pPIqp4e0v1GUw==} + '@vue/compiler-dom@3.5.32': + resolution: {integrity: sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==} - '@vue/compiler-sfc@3.5.31': - resolution: {integrity: sha512-M8wpPgR9UJ8MiRGjppvx9uWJfLV7A/T+/rL8s/y3QG3u0c2/YZgff3d6SuimKRIhcYnWg5fTfDMlz2E6seUW8Q==} + '@vue/compiler-sfc@3.5.32': + resolution: {integrity: sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==} - '@vue/compiler-ssr@3.5.31': - resolution: {integrity: sha512-h0xIMxrt/LHOvJKMri+vdYT92BrK3HFLtDqq9Pr/lVVfE4IyKZKvWf0vJFW10Yr6nX02OR4MkJwI0c1HDa1hog==} + '@vue/compiler-ssr@3.5.32': + resolution: {integrity: sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==} '@vue/devtools-api@8.1.1': resolution: {integrity: sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==} @@ -1279,22 +1294,22 @@ packages: '@vue/language-core@3.2.6': resolution: {integrity: sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==} - '@vue/reactivity@3.5.31': - resolution: {integrity: sha512-DtKXxk9E/KuVvt8VxWu+6Luc9I9ETNcqR1T1oW1gf02nXaZ1kuAx58oVu7uX9XxJR0iJCro6fqBLw9oSBELo5g==} + '@vue/reactivity@3.5.32': + resolution: {integrity: sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==} - '@vue/runtime-core@3.5.31': - resolution: {integrity: sha512-AZPmIHXEAyhpkmN7aWlqjSfYynmkWlluDNPHMCZKFHH+lLtxP/30UJmoVhXmbDoP1Ng0jG0fyY2zCj1PnSSA6Q==} + '@vue/runtime-core@3.5.32': + resolution: {integrity: sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==} - '@vue/runtime-dom@3.5.31': - resolution: {integrity: sha512-xQJsNRmGPeDCJq/u813tyonNgWBFjzfVkBwDREdEWndBnGdHLHgkwNBQxLtg4zDrzKTEcnikUy1UUNecb3lJ6g==} + '@vue/runtime-dom@3.5.32': + resolution: {integrity: sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==} - '@vue/server-renderer@3.5.31': - resolution: {integrity: sha512-GJuwRvMcdZX/CriUnyIIOGkx3rMV3H6sOu0JhdKbduaeCji6zb60iOGMY7tFoN24NfsUYoFBhshZtGxGpxO4iA==} + '@vue/server-renderer@3.5.32': + resolution: {integrity: sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==} peerDependencies: - vue: 3.5.31 + vue: 3.5.32 - '@vue/shared@3.5.31': - resolution: {integrity: sha512-nBxuiuS9Lj5bPkPbWogPUnjxxWpkRniX7e5UBQDWl6Fsf4roq9wwV+cR7ezQ4zXswNvPIlsdj1slcLB7XCsRAw==} + '@vue/shared@3.5.32': + resolution: {integrity: sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==} '@vueuse/core@14.2.1': resolution: {integrity: sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==} @@ -1351,8 +1366,8 @@ packages: peerDependencies: vue: ^3.5.0 - '@xmldom/xmldom@0.9.8': - resolution: {integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==} + '@xmldom/xmldom@0.9.9': + resolution: {integrity: sha512-qycIHAucxy/LXAYIjmLmtQ8q9GPnMbnjG1KXhWm9o5sCr6pOYDATkMPiTNa6/v8eELyqOQ2FsEqeoFYmgv/gJg==} engines: {node: '>=14.6'} abort-controller@3.0.0: @@ -1410,8 +1425,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.13.6: - resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} + axios@1.15.0: + resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1541,8 +1556,8 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - conventional-changelog-angular@8.3.0: - resolution: {integrity: sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==} + conventional-changelog-angular@8.3.1: + resolution: {integrity: sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==} engines: {node: '>=18'} conventional-changelog-preset-loader@5.0.0: @@ -1563,8 +1578,8 @@ packages: resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} engines: {node: '>=18'} - conventional-commits-parser@6.3.0: - resolution: {integrity: sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==} + conventional-commits-parser@6.4.0: + resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} engines: {node: '>=18'} hasBin: true @@ -1709,8 +1724,8 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.27.4: - resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true @@ -1771,6 +1786,15 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-string-truncated-width@1.2.1: + resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} + + fast-string-width@1.1.0: + resolution: {integrity: sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==} + + fast-wrap-ansi@0.1.6: + resolution: {integrity: sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==} + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -1808,8 +1832,8 @@ packages: focus-trap@8.0.1: resolution: {integrity: sha512-9ptSG6z51YQOstI/oN4XuVGP/03u2nh0g//qz7L6zX0i6PZiPnkcf3GenXq7N2hZnASXaMxTPpbKwdI+PFvxlw==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -1865,8 +1889,8 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1883,8 +1907,8 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} engines: {node: '>=0.4.7'} hasBin: true @@ -2008,8 +2032,8 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - joi@18.1.1: - resolution: {integrity: sha512-pJkBiPtNo+o0h19LfSvUN46Y5zY+ck99AtHwch9n2HqVLNRgP0ZMyIH8FRMoP+HV8hy/+AG99dXFfwpf83iZfQ==} + joi@18.1.2: + resolution: {integrity: sha512-rF5MAmps5esSlhCA+N1b6IYHDw9j/btzGaqfgie522jS02Ju/HXBxamlXVlKEHAxoMKQL77HWI8jlqWsFuekZA==} engines: {node: '>= 20'} js-tokens@4.0.0: @@ -2134,8 +2158,8 @@ packages: lodash.templatesettings@4.2.0: resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} @@ -2154,8 +2178,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.7: - resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} + lru-cache@11.3.5: + resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} magic-string@0.30.21: @@ -2344,8 +2368,8 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} minimist@1.2.8: @@ -2375,8 +2399,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.7: - resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==} + nanoid@5.1.9: + resolution: {integrity: sha512-ZUvP7KeBLe3OZ1ypw6dI/TzYJuvHP77IM4Ry73waSQTLn8/g8rpdjfyVAh7t1/+FjBtG4lCP42MEbDxOsRpBMw==} engines: {node: ^18 || >=20} hasBin: true @@ -2499,13 +2523,13 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-chromium@1.58.2: - resolution: {integrity: sha512-SCoQ3hjBs7FfO46CoOtgAUg77BuYwCni1bzQgm47IUyLBTipnGkLxLnaUNRKXvPYO4hAyt8++Z6wVShVnhrzmw==} + playwright-chromium@1.59.1: + resolution: {integrity: sha512-aTsPenkxsr9np4vIHuMEND6comqepVvzbL0MwkozFNliwGZjTqrBUQ7TF6Ay1ZIU/e7rcUpGsCTUG+nqwxG2Xw==} engines: {node: '>=18'} hasBin: true - playwright-core@1.58.2: - resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} engines: {node: '>=18'} hasBin: true @@ -2513,8 +2537,8 @@ packages: resolution: {integrity: sha512-ryc8D/B5E/YnlWHkNMnRvNntPc4GwU1/+iDBjiXVz1SUjDRqlxYX5Ic0IaDLA/cQ+g7/x+jUzEjv2K16u1J+wA==} engines: {node: '>=8'} - postcss-rtlcss@5.7.1: - resolution: {integrity: sha512-zE68CuARv5StOG/UQLa0W1Y/raUTzgJlfjtas43yh3/G1BFmoPEaHxPRHgeowXRFFhW33FehrNgsljxRLmPVWw==} + postcss-rtlcss@6.0.0: + resolution: {integrity: sha512-iJMOT4vM6EOnvNUm+uZycpqqTeHCTMGPsyxIHloVUioECgKIrvtWtPIczc5NMc14x5ZJGadwUs0L1o6iZDCldg==} engines: {node: '>=18.0.0'} peerDependencies: postcss: ^8.4.21 @@ -2523,12 +2547,12 @@ packages: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true @@ -2551,8 +2575,9 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} @@ -2609,8 +2634,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true @@ -2685,8 +2710,8 @@ packages: esbuild: '>=0.18.0' rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - rollup@4.60.0: - resolution: {integrity: sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==} + rollup@4.60.1: + resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2744,8 +2769,8 @@ packages: resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==} hasBin: true - simple-git@3.33.0: - resolution: {integrity: sha512-D4V/tGC2sjsoNhoMybKyGoE+v8A60hRawKQ1iFRA1zwuDgGZCBJ4ByOzZ5J8joBbi4Oam0qiPH+GhzmSBwbJng==} + simple-git@3.36.0: + resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==} sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} @@ -2793,8 +2818,8 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - speech-rule-engine@4.1.2: - resolution: {integrity: sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==} + speech-rule-engine@4.1.3: + resolution: {integrity: sha512-SBMgkuJYvP4F62daRfBNwYC2nXTEhNXAfsBZ/BB7Ly85/KnbnjmKM7/45ZrFbH6jIMiAliDUDPSZFUuXDvcg6A==} hasBin: true sprintf-js@1.0.3: @@ -2806,8 +2831,8 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - stdin-discarder@0.3.1: - resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} + stdin-discarder@0.3.2: + resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} engines: {node: '>=18'} string-argv@0.3.2: @@ -2884,12 +2909,12 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} tinypool@1.1.1: @@ -2947,8 +2972,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -2969,8 +2994,8 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} @@ -3030,11 +3055,11 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vitepress-plugin-group-icons@1.7.1: - resolution: {integrity: sha512-3ZPcIqwHNBg1btrOOSecOqv8yJxHdu3W2ugxE5LusclDF005LAm60URMEmBQrkgl4JvM32AqJirqghK6lGIk8g==} + vitepress-plugin-group-icons@1.7.5: + resolution: {integrity: sha512-QzcroUuIiVKyXpmEiiHVbfRTQIy9Zbwxpk5JC/zavO8mavitwumz2RZWlwTchMCCHducYyPptkYvXvdnNUWkog==} - vitepress-plugin-llms@1.12.0: - resolution: {integrity: sha512-zuzL7a8UJuGl46le5cAy/QxKMGlpSylcsLjDDn6BYPc1u+eP3nzoQk9ne9XFBqrE7exoJlIYJELVN8HMgYlFKQ==} + vitepress-plugin-llms@1.12.1: + resolution: {integrity: sha512-mUbjxXbNCWIxTZPuxh1smbjRpU1j5Bw5sXKoWeU/kfWCyALE92HyiAXhOgNVAB8QOLCuXticf3Qwsj/YlWROlw==} engines: {node: '>=18.0.0'} vitest@4.0.0-beta.4: @@ -3074,16 +3099,16 @@ packages: peerDependencies: typescript: '>=5.0.0' - vue@3.5.31: - resolution: {integrity: sha512-iV/sU9SzOlmA/0tygSmjkEN6Jbs3nPoIPFhCMLD2STrjgOU8DX7ZtzMhg4ahVwf5Rp9KoFzcXeB1ZrVbLBp5/Q==} + vue@3.5.32: + resolution: {integrity: sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - wait-on@9.0.4: - resolution: {integrity: sha512-k8qrgfwrPVJXTeFY8tl6BxVHiclK11u72DVKhpybHfUL/K6KM4bdyK9EhIVYGytB5MJe/3lq4Tf0hrjM+pvJZQ==} + wait-on@9.0.5: + resolution: {integrity: sha512-qgnbHDfDTRIp73ANEJNRW/7kn8CrDUcvZz18xotJQku/P4saTGkbIzvnMZebPmVvVNUiRq1qWAPyqCH+W4H8KA==} engines: {node: '>=20.0.0'} hasBin: true @@ -3161,7 +3186,7 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 - tinyexec: 1.0.4 + tinyexec: 1.1.1 '@babel/code-frame@7.29.0': dependencies: @@ -3188,23 +3213,26 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/core@1.1.0': + '@clack/core@1.2.0': dependencies: + fast-wrap-ansi: 0.1.6 sisteransi: 1.0.5 - '@clack/prompts@1.1.0': + '@clack/prompts@1.2.0': dependencies: - '@clack/core': 1.1.0 + '@clack/core': 1.2.0 + fast-string-width: 1.1.0 + fast-wrap-ansi: 0.1.6 sisteransi: 1.0.5 - '@conventional-changelog/git-client@2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0)': + '@conventional-changelog/git-client@2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)': dependencies: '@simple-libs/child-process-utils': 1.0.2 '@simple-libs/stream-utils': 1.2.0 semver: 7.7.4 optionalDependencies: conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.3.0 + conventional-commits-parser: 6.4.0 '@docsearch/css@4.6.2': {} @@ -3212,98 +3240,95 @@ snapshots: '@docsearch/sidepanel-js@4.6.2': {} - '@emnapi/core@1.9.1': + '@emnapi/core@1.10.0': dependencies: - '@emnapi/wasi-threads': 1.2.0 + '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.9.1': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 - optional: true - '@emnapi/wasi-threads@1.2.0': + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 - optional: true - '@esbuild/aix-ppc64@0.27.4': + '@esbuild/aix-ppc64@0.27.7': optional: true - '@esbuild/android-arm64@0.27.4': + '@esbuild/android-arm64@0.27.7': optional: true - '@esbuild/android-arm@0.27.4': + '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/android-x64@0.27.4': + '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.27.4': + '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/darwin-x64@0.27.4': + '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.27.4': + '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.27.4': + '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/linux-arm64@0.27.4': + '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/linux-arm@0.27.4': + '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/linux-ia32@0.27.4': + '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-loong64@0.27.4': + '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-mips64el@0.27.4': + '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-ppc64@0.27.4': + '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-riscv64@0.27.4': + '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-s390x@0.27.4': + '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-x64@0.27.4': + '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/netbsd-arm64@0.27.4': + '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.27.4': + '@esbuild/netbsd-x64@0.27.7': optional: true - '@esbuild/openbsd-arm64@0.27.4': + '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.27.4': + '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/openharmony-arm64@0.27.4': + '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/sunos-x64@0.27.4': + '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/win32-arm64@0.27.4': + '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-ia32@0.27.4': + '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-x64@0.27.4': + '@esbuild/win32-x64@0.27.7': optional: true '@hapi/address@5.1.1': @@ -3322,11 +3347,11 @@ snapshots: dependencies: '@hapi/hoek': 11.0.7 - '@iconify-json/logos@1.2.10': + '@iconify-json/logos@1.2.11': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.75': + '@iconify-json/simple-icons@1.2.78': dependencies: '@iconify/types': 2.0.0 @@ -3361,7 +3386,7 @@ snapshots: micromatch: 4.0.8 path-to-regexp: 6.3.0 picocolors: 1.1.1 - simple-git: 3.33.0 + simple-git: 3.36.0 ultramatter: 0.0.4 zod: 3.25.76 transitivePeerDependencies: @@ -3414,10 +3439,10 @@ snapshots: '@mdit-vue/types@3.0.2': {} - '@napi-rs/wasm-runtime@1.1.1': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -3469,9 +3494,12 @@ snapshots: '@oxc-minify/binding-linux-x64-musl@0.98.0': optional: true - '@oxc-minify/binding-wasm32-wasi@0.98.0': + '@oxc-minify/binding-wasm32-wasi@0.98.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true '@oxc-minify/binding-win32-arm64-msvc@0.98.0': @@ -3518,9 +3546,12 @@ snapshots: '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.53(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': @@ -3531,15 +3562,15 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.53': {} - '@rolldown/pluginutils@1.0.0-rc.2': {} + '@rolldown/pluginutils@1.0.0-rc.13': {} - '@rollup/plugin-alias@6.0.0(rollup@4.60.0)': + '@rollup/plugin-alias@6.0.0(rollup@4.60.1)': optionalDependencies: - rollup: 4.60.0 + rollup: 4.60.1 - '@rollup/plugin-commonjs@29.0.2(rollup@4.60.0)': + '@rollup/plugin-commonjs@29.0.2(rollup@4.60.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.0) + '@rollup/pluginutils': 5.3.0(rollup@4.60.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.4) @@ -3547,112 +3578,112 @@ snapshots: magic-string: 0.30.21 picomatch: 4.0.4 optionalDependencies: - rollup: 4.60.0 + rollup: 4.60.1 - '@rollup/plugin-json@6.1.0(rollup@4.60.0)': + '@rollup/plugin-json@6.1.0(rollup@4.60.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.0) + '@rollup/pluginutils': 5.3.0(rollup@4.60.1) optionalDependencies: - rollup: 4.60.0 + rollup: 4.60.1 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.0)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.0) + '@rollup/pluginutils': 5.3.0(rollup@4.60.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.11 + resolve: 1.22.12 optionalDependencies: - rollup: 4.60.0 + rollup: 4.60.1 - '@rollup/plugin-replace@6.0.3(rollup@4.60.0)': + '@rollup/plugin-replace@6.0.3(rollup@4.60.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.0) + '@rollup/pluginutils': 5.3.0(rollup@4.60.1) magic-string: 0.30.21 optionalDependencies: - rollup: 4.60.0 + rollup: 4.60.1 - '@rollup/pluginutils@5.3.0(rollup@4.60.0)': + '@rollup/pluginutils@5.3.0(rollup@4.60.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: - rollup: 4.60.0 + rollup: 4.60.1 - '@rollup/rollup-android-arm-eabi@4.60.0': + '@rollup/rollup-android-arm-eabi@4.60.1': optional: true - '@rollup/rollup-android-arm64@4.60.0': + '@rollup/rollup-android-arm64@4.60.1': optional: true - '@rollup/rollup-darwin-arm64@4.60.0': + '@rollup/rollup-darwin-arm64@4.60.1': optional: true - '@rollup/rollup-darwin-x64@4.60.0': + '@rollup/rollup-darwin-x64@4.60.1': optional: true - '@rollup/rollup-freebsd-arm64@4.60.0': + '@rollup/rollup-freebsd-arm64@4.60.1': optional: true - '@rollup/rollup-freebsd-x64@4.60.0': + '@rollup/rollup-freebsd-x64@4.60.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.0': + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.0': + '@rollup/rollup-linux-arm-musleabihf@4.60.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.0': + '@rollup/rollup-linux-arm64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.0': + '@rollup/rollup-linux-arm64-musl@4.60.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.0': + '@rollup/rollup-linux-loong64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.0': + '@rollup/rollup-linux-loong64-musl@4.60.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.0': + '@rollup/rollup-linux-ppc64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.0': + '@rollup/rollup-linux-ppc64-musl@4.60.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.0': + '@rollup/rollup-linux-riscv64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.0': + '@rollup/rollup-linux-riscv64-musl@4.60.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.0': + '@rollup/rollup-linux-s390x-gnu@4.60.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.0': + '@rollup/rollup-linux-x64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-x64-musl@4.60.0': + '@rollup/rollup-linux-x64-musl@4.60.1': optional: true - '@rollup/rollup-openbsd-x64@4.60.0': + '@rollup/rollup-openbsd-x64@4.60.1': optional: true - '@rollup/rollup-openharmony-arm64@4.60.0': + '@rollup/rollup-openharmony-arm64@4.60.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.0': + '@rollup/rollup-win32-arm64-msvc@4.60.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.0': + '@rollup/rollup-win32-ia32-msvc@4.60.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.0': + '@rollup/rollup-win32-x64-gnu@4.60.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.0': + '@rollup/rollup-win32-x64-msvc@4.60.1': optional: true '@sec-ant/readable-stream@0.4.1': {} @@ -3702,6 +3733,12 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@simple-git/args-pathspec@1.0.3': {} + + '@simple-git/argv-parser@1.1.1': + dependencies: + '@simple-git/args-pathspec': 1.0.3 + '@simple-libs/child-process-utils@1.0.2': dependencies: '@simple-libs/stream-utils': 1.2.0 @@ -3728,7 +3765,7 @@ snapshots: '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/debug@4.1.13': dependencies: @@ -3741,7 +3778,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/hast@3.0.4': dependencies: @@ -3751,7 +3788,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/linkify-it@5.0.0': {} @@ -3792,28 +3829,28 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@24.12.0': + '@types/node@24.12.2': dependencies: undici-types: 7.16.0 - '@types/node@25.5.0': + '@types/node@25.6.0': dependencies: - undici-types: 7.18.2 + undici-types: 7.19.2 '@types/normalize-package-data@2.4.4': {} - '@types/picomatch@4.0.2': {} + '@types/picomatch@4.0.3': {} '@types/prompts@2.4.9': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 kleur: 3.0.3 '@types/resolve@1.20.2': {} '@types/sax@1.2.7': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/unist@3.0.3': {} @@ -3821,11 +3858,11 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@6.0.5(rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.6(rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3))(vue@3.5.32(typescript@6.0.3))': dependencies: - '@rolldown/pluginutils': 1.0.0-rc.2 - vite: rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3) - vue: 3.5.31(typescript@5.9.3) + '@rolldown/pluginutils': 1.0.0-rc.13 + vite: rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3) + vue: 3.5.32(typescript@6.0.3) '@vitest/expect@4.0.0-beta.4': dependencies: @@ -3835,19 +3872,19 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@4.0.0-beta.4(rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3))': + '@vitest/mocker@4.0.0-beta.4(rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.0.0-beta.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3) + vite: rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3) '@vitest/pretty-format@4.0.0-beta.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.1.2': + '@vitest/pretty-format@4.1.4': dependencies: tinyrainbow: 3.1.0 @@ -3885,35 +3922,35 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.31': + '@vue/compiler-core@3.5.32': dependencies: '@babel/parser': 7.29.2 - '@vue/shared': 3.5.31 + '@vue/shared': 3.5.32 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.31': + '@vue/compiler-dom@3.5.32': dependencies: - '@vue/compiler-core': 3.5.31 - '@vue/shared': 3.5.31 + '@vue/compiler-core': 3.5.32 + '@vue/shared': 3.5.32 - '@vue/compiler-sfc@3.5.31': + '@vue/compiler-sfc@3.5.32': dependencies: '@babel/parser': 7.29.2 - '@vue/compiler-core': 3.5.31 - '@vue/compiler-dom': 3.5.31 - '@vue/compiler-ssr': 3.5.31 - '@vue/shared': 3.5.31 + '@vue/compiler-core': 3.5.32 + '@vue/compiler-dom': 3.5.32 + '@vue/compiler-ssr': 3.5.32 + '@vue/shared': 3.5.32 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.8 + postcss: 8.5.10 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.31': + '@vue/compiler-ssr@3.5.32': dependencies: - '@vue/compiler-dom': 3.5.31 - '@vue/shared': 3.5.31 + '@vue/compiler-dom': 3.5.32 + '@vue/shared': 3.5.32 '@vue/devtools-api@8.1.1': dependencies: @@ -3931,60 +3968,60 @@ snapshots: '@vue/language-core@3.2.6': dependencies: '@volar/language-core': 2.4.28 - '@vue/compiler-dom': 3.5.31 - '@vue/shared': 3.5.31 + '@vue/compiler-dom': 3.5.32 + '@vue/shared': 3.5.32 alien-signals: 3.1.2 muggle-string: 0.4.1 path-browserify: 1.0.1 picomatch: 4.0.4 - '@vue/reactivity@3.5.31': + '@vue/reactivity@3.5.32': dependencies: - '@vue/shared': 3.5.31 + '@vue/shared': 3.5.32 - '@vue/runtime-core@3.5.31': + '@vue/runtime-core@3.5.32': dependencies: - '@vue/reactivity': 3.5.31 - '@vue/shared': 3.5.31 + '@vue/reactivity': 3.5.32 + '@vue/shared': 3.5.32 - '@vue/runtime-dom@3.5.31': + '@vue/runtime-dom@3.5.32': dependencies: - '@vue/reactivity': 3.5.31 - '@vue/runtime-core': 3.5.31 - '@vue/shared': 3.5.31 + '@vue/reactivity': 3.5.32 + '@vue/runtime-core': 3.5.32 + '@vue/shared': 3.5.32 csstype: 3.2.3 - '@vue/server-renderer@3.5.31(vue@3.5.31(typescript@5.9.3))': + '@vue/server-renderer@3.5.32(vue@3.5.32(typescript@6.0.3))': dependencies: - '@vue/compiler-ssr': 3.5.31 - '@vue/shared': 3.5.31 - vue: 3.5.31(typescript@5.9.3) + '@vue/compiler-ssr': 3.5.32 + '@vue/shared': 3.5.32 + vue: 3.5.32(typescript@6.0.3) - '@vue/shared@3.5.31': {} + '@vue/shared@3.5.32': {} - '@vueuse/core@14.2.1(vue@3.5.31(typescript@5.9.3))': + '@vueuse/core@14.2.1(vue@3.5.32(typescript@6.0.3))': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 14.2.1 - '@vueuse/shared': 14.2.1(vue@3.5.31(typescript@5.9.3)) - vue: 3.5.31(typescript@5.9.3) + '@vueuse/shared': 14.2.1(vue@3.5.32(typescript@6.0.3)) + vue: 3.5.32(typescript@6.0.3) - '@vueuse/integrations@14.2.1(axios@1.13.6)(focus-trap@8.0.1)(vue@3.5.31(typescript@5.9.3))': + '@vueuse/integrations@14.2.1(axios@1.15.0)(focus-trap@8.0.1)(vue@3.5.32(typescript@6.0.3))': dependencies: - '@vueuse/core': 14.2.1(vue@3.5.31(typescript@5.9.3)) - '@vueuse/shared': 14.2.1(vue@3.5.31(typescript@5.9.3)) - vue: 3.5.31(typescript@5.9.3) + '@vueuse/core': 14.2.1(vue@3.5.32(typescript@6.0.3)) + '@vueuse/shared': 14.2.1(vue@3.5.32(typescript@6.0.3)) + vue: 3.5.32(typescript@6.0.3) optionalDependencies: - axios: 1.13.6 + axios: 1.15.0 focus-trap: 8.0.1 '@vueuse/metadata@14.2.1': {} - '@vueuse/shared@14.2.1(vue@3.5.31(typescript@5.9.3))': + '@vueuse/shared@14.2.1(vue@3.5.32(typescript@6.0.3))': dependencies: - vue: 3.5.31(typescript@5.9.3) + vue: 3.5.32(typescript@6.0.3) - '@xmldom/xmldom@0.9.8': {} + '@xmldom/xmldom@0.9.9': {} abort-controller@3.0.0: dependencies: @@ -4024,11 +4061,11 @@ snapshots: asynckit@0.4.0: {} - axios@1.13.6: + axios@1.15.0: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.16.0 form-data: 4.0.5 - proxy-from-env: 1.1.0 + proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -4154,7 +4191,7 @@ snapshots: confbox@0.1.8: {} - conventional-changelog-angular@8.3.0: + conventional-changelog-angular@8.3.1: dependencies: compare-func: 2.0.0 @@ -4164,18 +4201,18 @@ snapshots: dependencies: '@simple-libs/stream-utils': 1.2.0 conventional-commits-filter: 5.0.0 - handlebars: 4.7.8 + handlebars: 4.7.9 meow: 13.2.0 semver: 7.7.4 conventional-changelog@7.2.0(conventional-commits-filter@5.0.0): dependencies: - '@conventional-changelog/git-client': 2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0) + '@conventional-changelog/git-client': 2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@simple-libs/hosted-git-info': 1.0.2 '@types/normalize-package-data': 2.4.4 conventional-changelog-preset-loader: 5.0.0 conventional-changelog-writer: 8.4.0 - conventional-commits-parser: 6.3.0 + conventional-commits-parser: 6.4.0 fd-package-json: 2.0.0 meow: 13.2.0 normalize-package-data: 7.0.1 @@ -4184,7 +4221,7 @@ snapshots: conventional-commits-filter@5.0.0: {} - conventional-commits-parser@6.3.0: + conventional-commits-parser@6.4.0: dependencies: '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 @@ -4309,34 +4346,34 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild@0.27.4: + esbuild@0.27.7: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.4 - '@esbuild/android-arm': 0.27.4 - '@esbuild/android-arm64': 0.27.4 - '@esbuild/android-x64': 0.27.4 - '@esbuild/darwin-arm64': 0.27.4 - '@esbuild/darwin-x64': 0.27.4 - '@esbuild/freebsd-arm64': 0.27.4 - '@esbuild/freebsd-x64': 0.27.4 - '@esbuild/linux-arm': 0.27.4 - '@esbuild/linux-arm64': 0.27.4 - '@esbuild/linux-ia32': 0.27.4 - '@esbuild/linux-loong64': 0.27.4 - '@esbuild/linux-mips64el': 0.27.4 - '@esbuild/linux-ppc64': 0.27.4 - '@esbuild/linux-riscv64': 0.27.4 - '@esbuild/linux-s390x': 0.27.4 - '@esbuild/linux-x64': 0.27.4 - '@esbuild/netbsd-arm64': 0.27.4 - '@esbuild/netbsd-x64': 0.27.4 - '@esbuild/openbsd-arm64': 0.27.4 - '@esbuild/openbsd-x64': 0.27.4 - '@esbuild/openharmony-arm64': 0.27.4 - '@esbuild/sunos-x64': 0.27.4 - '@esbuild/win32-arm64': 0.27.4 - '@esbuild/win32-ia32': 0.27.4 - '@esbuild/win32-x64': 0.27.4 + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 escalade@3.2.0: {} @@ -4391,6 +4428,16 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-string-truncated-width@1.2.1: {} + + fast-string-width@1.1.0: + dependencies: + fast-string-truncated-width: 1.2.1 + + fast-wrap-ansi@0.1.6: + dependencies: + fast-string-width: 1.1.0 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -4427,7 +4474,7 @@ snapshots: dependencies: tabbable: 6.4.0 - follow-redirects@1.15.11: {} + follow-redirects@1.16.0: {} form-data@4.0.5: dependencies: @@ -4481,7 +4528,7 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-tsconfig@4.13.7: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -4500,7 +4547,7 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - handlebars@4.7.8: + handlebars@4.7.9: dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -4615,7 +4662,7 @@ snapshots: jiti@1.21.7: {} - joi@18.1.1: + joi@18.1.2: dependencies: '@hapi/address': 5.1.1 '@hapi/formula': 3.0.2 @@ -4714,7 +4761,7 @@ snapshots: listr2: 9.0.5 picomatch: 4.0.4 string-argv: 0.3.2 - tinyexec: 1.0.4 + tinyexec: 1.1.1 yaml: 2.8.3 listr2@9.0.5: @@ -4737,7 +4784,7 @@ snapshots: dependencies: lodash._reinterpolate: 3.0.0 - lodash@4.17.23: {} + lodash@4.18.1: {} log-symbols@7.0.1: dependencies: @@ -4758,7 +4805,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.7: {} + lru-cache@11.3.5: {} magic-string@0.30.21: dependencies: @@ -4816,7 +4863,7 @@ snapshots: esm: 3.2.25 mhchemparser: 4.2.1 mj-context-menu: 0.6.1 - speech-rule-engine: 4.1.2 + speech-rule-engine: 4.1.3 mdast-util-from-markdown@2.0.3: dependencies: @@ -5050,7 +5097,7 @@ snapshots: mimic-function@5.0.1: {} - minimatch@10.2.4: + minimatch@10.2.5: dependencies: brace-expansion: 5.0.5 @@ -5075,7 +5122,7 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.7: {} + nanoid@5.1.9: {} neo-async@2.6.2: {} @@ -5135,10 +5182,10 @@ snapshots: is-interactive: 2.0.0 is-unicode-supported: 2.1.0 log-symbols: 7.0.1 - stdin-discarder: 0.3.1 + stdin-discarder: 0.3.2 string-width: 5.1.2 - oxc-minify@0.98.0: + oxc-minify@0.98.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): optionalDependencies: '@oxc-minify/binding-android-arm64': 0.98.0 '@oxc-minify/binding-darwin-arm64': 0.98.0 @@ -5152,9 +5199,12 @@ snapshots: '@oxc-minify/binding-linux-s390x-gnu': 0.98.0 '@oxc-minify/binding-linux-x64-gnu': 0.98.0 '@oxc-minify/binding-linux-x64-musl': 0.98.0 - '@oxc-minify/binding-wasm32-wasi': 0.98.0 + '@oxc-minify/binding-wasm32-wasi': 0.98.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@oxc-minify/binding-win32-arm64-msvc': 0.98.0 '@oxc-minify/binding-win32-x64-msvc': 0.98.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' p-map@7.0.4: {} @@ -5202,20 +5252,20 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - playwright-chromium@1.58.2: + playwright-chromium@1.59.1: dependencies: - playwright-core: 1.58.2 + playwright-core: 1.59.1 - playwright-core@1.58.2: {} + playwright-core@1.59.1: {} polka@1.0.0-next.28: dependencies: '@polka/url': 1.0.0-next.29 trouter: 4.0.0 - postcss-rtlcss@5.7.1(postcss@8.5.8): + postcss-rtlcss@6.0.0(postcss@8.5.10): dependencies: - postcss: 8.5.8 + postcss: 8.5.10 rtlcss: 4.3.0 postcss-selector-parser@7.1.1: @@ -5223,13 +5273,13 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.8: + postcss@8.5.10: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@3.8.1: {} + prettier@3.8.3: {} pretty-bytes@7.1.0: {} @@ -5246,7 +5296,7 @@ snapshots: property-information@7.1.0: {} - proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} punycode.js@2.3.1: {} @@ -5317,8 +5367,9 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: + resolve@1.22.12: dependencies: + es-errors: 1.3.0 is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5332,23 +5383,26 @@ snapshots: rfdc@1.4.1: {} - rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3): + rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3): dependencies: '@oxc-project/runtime': 0.101.0 fdir: 6.5.0(picomatch@4.0.4) lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.8 - rolldown: 1.0.0-beta.53 - tinyglobby: 0.2.15 + postcss: 8.5.10 + rolldown: 1.0.0-beta.53(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.5.0 - esbuild: 0.27.4 + '@types/node': 25.6.0 + esbuild: 0.27.7 fsevents: 2.3.3 jiti: 1.21.7 yaml: 2.8.3 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - rolldown@1.0.0-beta.53: + rolldown@1.0.0-beta.53(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): dependencies: '@oxc-project/types': 0.101.0 '@rolldown/pluginutils': 1.0.0-beta.53 @@ -5363,65 +5417,68 @@ snapshots: '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.53 '@rolldown/binding-linux-x64-musl': 1.0.0-beta.53 '@rolldown/binding-openharmony-arm64': 1.0.0-beta.53 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.53 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.53(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.53 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.53 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - rollup-plugin-dts@6.1.1(rollup@4.60.0)(typescript@5.9.3): + rollup-plugin-dts@6.1.1(rollup@4.60.1)(typescript@6.0.3): dependencies: magic-string: 0.30.21 - rollup: 4.60.0 - typescript: 5.9.3 + rollup: 4.60.1 + typescript: 6.0.3 optionalDependencies: '@babel/code-frame': 7.29.0 - rollup-plugin-esbuild@6.2.1(esbuild@0.27.4)(rollup@4.60.0): + rollup-plugin-esbuild@6.2.1(esbuild@0.27.7)(rollup@4.60.1): dependencies: debug: 4.4.3 es-module-lexer: 1.7.0 - esbuild: 0.27.4 - get-tsconfig: 4.13.7 - rollup: 4.60.0 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 + rollup: 4.60.1 unplugin-utils: 0.2.5 transitivePeerDependencies: - supports-color - rollup@4.60.0: + rollup@4.60.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.0 - '@rollup/rollup-android-arm64': 4.60.0 - '@rollup/rollup-darwin-arm64': 4.60.0 - '@rollup/rollup-darwin-x64': 4.60.0 - '@rollup/rollup-freebsd-arm64': 4.60.0 - '@rollup/rollup-freebsd-x64': 4.60.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.0 - '@rollup/rollup-linux-arm-musleabihf': 4.60.0 - '@rollup/rollup-linux-arm64-gnu': 4.60.0 - '@rollup/rollup-linux-arm64-musl': 4.60.0 - '@rollup/rollup-linux-loong64-gnu': 4.60.0 - '@rollup/rollup-linux-loong64-musl': 4.60.0 - '@rollup/rollup-linux-ppc64-gnu': 4.60.0 - '@rollup/rollup-linux-ppc64-musl': 4.60.0 - '@rollup/rollup-linux-riscv64-gnu': 4.60.0 - '@rollup/rollup-linux-riscv64-musl': 4.60.0 - '@rollup/rollup-linux-s390x-gnu': 4.60.0 - '@rollup/rollup-linux-x64-gnu': 4.60.0 - '@rollup/rollup-linux-x64-musl': 4.60.0 - '@rollup/rollup-openbsd-x64': 4.60.0 - '@rollup/rollup-openharmony-arm64': 4.60.0 - '@rollup/rollup-win32-arm64-msvc': 4.60.0 - '@rollup/rollup-win32-ia32-msvc': 4.60.0 - '@rollup/rollup-win32-x64-gnu': 4.60.0 - '@rollup/rollup-win32-x64-msvc': 4.60.0 + '@rollup/rollup-android-arm-eabi': 4.60.1 + '@rollup/rollup-android-arm64': 4.60.1 + '@rollup/rollup-darwin-arm64': 4.60.1 + '@rollup/rollup-darwin-x64': 4.60.1 + '@rollup/rollup-freebsd-arm64': 4.60.1 + '@rollup/rollup-freebsd-x64': 4.60.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 + '@rollup/rollup-linux-arm-musleabihf': 4.60.1 + '@rollup/rollup-linux-arm64-gnu': 4.60.1 + '@rollup/rollup-linux-arm64-musl': 4.60.1 + '@rollup/rollup-linux-loong64-gnu': 4.60.1 + '@rollup/rollup-linux-loong64-musl': 4.60.1 + '@rollup/rollup-linux-ppc64-gnu': 4.60.1 + '@rollup/rollup-linux-ppc64-musl': 4.60.1 + '@rollup/rollup-linux-riscv64-gnu': 4.60.1 + '@rollup/rollup-linux-riscv64-musl': 4.60.1 + '@rollup/rollup-linux-s390x-gnu': 4.60.1 + '@rollup/rollup-linux-x64-gnu': 4.60.1 + '@rollup/rollup-linux-x64-musl': 4.60.1 + '@rollup/rollup-openbsd-x64': 4.60.1 + '@rollup/rollup-openharmony-arm64': 4.60.1 + '@rollup/rollup-win32-arm64-msvc': 4.60.1 + '@rollup/rollup-win32-ia32-msvc': 4.60.1 + '@rollup/rollup-win32-x64-gnu': 4.60.1 + '@rollup/rollup-win32-x64-msvc': 4.60.1 fsevents: 2.3.3 rtlcss@4.3.0: dependencies: escalade: 3.2.0 picocolors: 1.1.1 - postcss: 8.5.8 + postcss: 8.5.10 strip-json-comments: 3.1.1 run-applescript@7.1.0: {} @@ -5468,10 +5525,12 @@ snapshots: simple-git-hooks@2.13.1: {} - simple-git@3.33.0: + simple-git@3.36.0: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 + '@simple-git/args-pathspec': 1.0.3 + '@simple-git/argv-parser': 1.1.1 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -5486,7 +5545,7 @@ snapshots: sitemap@9.0.1: dependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 '@types/sax': 1.2.7 arg: 5.0.2 sax: 1.6.0 @@ -5523,9 +5582,9 @@ snapshots: spdx-license-ids@3.0.23: {} - speech-rule-engine@4.1.2: + speech-rule-engine@4.1.3: dependencies: - '@xmldom/xmldom': 0.9.8 + '@xmldom/xmldom': 0.9.9 commander: 13.1.0 wicked-good-xpath: 1.3.0 @@ -5535,7 +5594,7 @@ snapshots: std-env@3.10.0: {} - stdin-discarder@0.3.1: {} + stdin-discarder@0.3.2: {} string-argv@0.3.2: {} @@ -5611,9 +5670,9 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.0.4: {} + tinyexec@1.1.1: {} - tinyglobby@0.2.15: + tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 @@ -5655,7 +5714,7 @@ snapshots: type-fest@2.19.0: {} - typescript@5.9.3: {} + typescript@6.0.3: {} uc.micro@2.1.0: {} @@ -5668,7 +5727,7 @@ snapshots: undici-types@7.16.0: {} - undici-types@7.18.2: {} + undici-types@7.19.2: {} unicorn-magic@0.3.0: {} @@ -5741,14 +5800,16 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@4.0.0-beta.4(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3): + vite-node@4.0.0-beta.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3) + vite: rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3) transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - '@types/node' - esbuild - jiti @@ -5762,13 +5823,15 @@ snapshots: - tsx - yaml - vitepress-plugin-group-icons@1.7.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3): + vitepress-plugin-group-icons@1.7.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3): dependencies: - '@iconify-json/logos': 1.2.10 + '@iconify-json/logos': 1.2.11 '@iconify-json/vscode-icons': 1.2.45 '@iconify/utils': 3.1.0 - vite: rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3) + vite: rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3) transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - '@types/node' - esbuild - jiti @@ -5781,14 +5844,14 @@ snapshots: - tsx - yaml - vitepress-plugin-llms@1.12.0: + vitepress-plugin-llms@1.12.1: dependencies: gray-matter: 4.0.3 markdown-it: 14.1.1 markdown-title: 1.0.2 mdast-util-from-markdown: 2.0.3 millify: 6.1.0 - minimatch: 10.2.4 + minimatch: 10.2.5 path-to-regexp: 6.3.0 picocolors: 1.1.1 pretty-bytes: 7.1.0 @@ -5800,12 +5863,12 @@ snapshots: transitivePeerDependencies: - supports-color - vitest@4.0.0-beta.4(@types/debug@4.1.13)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3): + vitest@4.0.0-beta.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/debug@4.1.13)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 4.0.0-beta.4 - '@vitest/mocker': 4.0.0-beta.4(rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.2 + '@vitest/mocker': 4.0.0-beta.4(rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.4 '@vitest/runner': 4.0.0-beta.4 '@vitest/snapshot': 4.0.0-beta.4 '@vitest/spy': 4.0.0-beta.4 @@ -5819,16 +5882,18 @@ snapshots: std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: rolldown-vite@7.3.1(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3) - vite-node: 4.0.0-beta.4(@types/node@25.5.0)(esbuild@0.27.4)(jiti@1.21.7)(yaml@2.8.3) + vite: rolldown-vite@7.3.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3) + vite-node: 4.0.0-beta.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.6.0)(esbuild@0.27.7)(jiti@1.21.7)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.13 - '@types/node': 25.5.0 + '@types/node': 25.6.0 transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - esbuild - jiti - less @@ -5844,27 +5909,27 @@ snapshots: vscode-uri@3.1.0: {} - vue-tsc@3.2.6(typescript@5.9.3): + vue-tsc@3.2.6(typescript@6.0.3): dependencies: '@volar/typescript': 2.4.28 '@vue/language-core': 3.2.6 - typescript: 5.9.3 + typescript: 6.0.3 - vue@3.5.31(typescript@5.9.3): + vue@3.5.32(typescript@6.0.3): dependencies: - '@vue/compiler-dom': 3.5.31 - '@vue/compiler-sfc': 3.5.31 - '@vue/runtime-dom': 3.5.31 - '@vue/server-renderer': 3.5.31(vue@3.5.31(typescript@5.9.3)) - '@vue/shared': 3.5.31 + '@vue/compiler-dom': 3.5.32 + '@vue/compiler-sfc': 3.5.32 + '@vue/runtime-dom': 3.5.32 + '@vue/server-renderer': 3.5.32(vue@3.5.32(typescript@6.0.3)) + '@vue/shared': 3.5.32 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 - wait-on@9.0.4: + wait-on@9.0.5: dependencies: - axios: 1.13.6 - joi: 18.1.1 - lodash: 4.17.23 + axios: 1.15.0 + joi: 18.1.2 + lodash: 4.18.1 minimist: 1.2.8 rxjs: 7.8.2 transitivePeerDependencies: diff --git a/src/client/tsconfig.json b/src/client/tsconfig.json index 7dca07bf..f88ca8e9 100644 --- a/src/client/tsconfig.json +++ b/src/client/tsconfig.json @@ -1,13 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "baseUrl": ".", "outDir": "../../dist/client", "declaration": true, "declarationDir": "../../dist/client-types", "types": ["../../client.d.ts", "@types/node"], "paths": { - "vitepress": ["index.ts"], + "vitepress": ["./index.ts"], "vitepress/theme": ["../../theme.d.ts"] } }, diff --git a/src/node/tsconfig.json b/src/node/tsconfig.json index 98a0ea23..f2ca0ef1 100644 --- a/src/node/tsconfig.json +++ b/src/node/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "baseUrl": ".", "outDir": "../../dist/node", "types": ["node"], "sourceMap": true diff --git a/src/shared/tsconfig.json b/src/shared/tsconfig.json index f29d6459..8d64877e 100644 --- a/src/shared/tsconfig.json +++ b/src/shared/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "baseUrl": ".", "lib": ["esnext", "dom", "dom.iterable"] }, "include": ["."] From c608981324bfa7cde734e0b2bb4d62dc3d925606 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 17 Apr 2026 16:04:23 +0530 Subject: [PATCH 003/187] chore: clarify preview release instruction it needs actual comment, adding the command in the body won't work --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index f8cd3d5a..560d76ff 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -13,4 +13,4 @@ --- > [!TIP] -> The author of this PR can publish a _preview release_ by commenting `/publish` below. +> The author can publish a _preview release_ by commenting `/publish` after creating the PR. From 01987c4c0838478a8fda81f427775f28476c5557 Mon Sep 17 00:00:00 2001 From: /bin/cat Date: Thu, 23 Apr 2026 02:40:27 +0800 Subject: [PATCH 004/187] fix(build): apply `base` to links with download attribute (#5186) --- src/node/markdown/plugins/link.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/node/markdown/plugins/link.ts b/src/node/markdown/plugins/link.ts index de5b564c..e606351e 100644 --- a/src/node/markdown/plugins/link.ts +++ b/src/node/markdown/plugins/link.ts @@ -30,8 +30,6 @@ export const linkPlugin = ( const hrefIndex = token.attrIndex('href') if ( hrefIndex >= 0 && - token.attrIndex('target') < 0 && - token.attrIndex('download') < 0 && token.attrGet('class') !== 'header-anchor' // header anchors are already normalized ) { const hrefAttr = token.attrs![hrefIndex] @@ -54,6 +52,9 @@ export const linkPlugin = ( !url.startsWith('#') && // skip mail/custom protocol links protocol.startsWith('http') && + // skip links with target/download attribute as they are meant to be opened/downloaded as-is + token.attrIndex('target') < 0 && + token.attrIndex('download') < 0 && // skip links to files (other than html/md) treatAsHtml(pathname) ) { From 4967e9bab4c1fdd1a1ea40b7225651eabaaf6b71 Mon Sep 17 00:00:00 2001 From: SaintaDream Date: Sun, 26 Apr 2026 00:05:29 +0800 Subject: [PATCH 005/187] docs(zh): fix typos, punctuation and broken references (#5189) * docs(zh): fix typos, missing words and broken references [lunaria-ignore] --- docs/zh/guide/deploy.md | 4 ++-- docs/zh/guide/i18n.md | 4 ++-- docs/zh/guide/migration-from-vitepress-0.md | 10 +++++----- docs/zh/guide/using-vue.md | 4 ++-- docs/zh/reference/cli.md | 2 +- docs/zh/reference/default-theme-config.md | 2 +- docs/zh/reference/default-theme-last-updated.md | 4 ++-- docs/zh/reference/default-theme-layout.md | 6 +++--- docs/zh/reference/default-theme-team-page.md | 6 +++--- docs/zh/reference/frontmatter-config.md | 4 ++-- docs/zh/reference/site-config.md | 6 +++--- 11 files changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/zh/guide/deploy.md b/docs/zh/guide/deploy.md index 75c99ed3..79ddf35a 100644 --- a/docs/zh/guide/deploy.md +++ b/docs/zh/guide/deploy.md @@ -52,7 +52,7 @@ description: 将 VitePress 站点部署到 Netlify、Vercel、GitHub Pages 等 默认情况下,我们假设站点将部署在域名 (`/`) 的根路径上。如果站点在子路径中提供服务,例如 `https://mywebsite.com/blog/`,则需要在 VitePress 配置中将 [`base`](../reference/site-config#base) 选项设置为 `'/blog/'`。 -**例**:如果你使用的是 Github(或 GitLab)页面并部署到 `user.github.io/repo/`,请将 `base` 设置为 `/repo/`。 +**例**:如果你使用的是 GitHub(或 GitLab)页面并部署到 `user.github.io/repo/`,请将 `base` 设置为 `/repo/`。 ## HTTP 缓存标头 {#http-cache-headers} @@ -201,7 +201,7 @@ Cache-Control: max-age=31536000,immutable ### GitLab Pages -1. 如果你想部署到 `https:// .gitlab.io/ /`,将 VitePress 配置中的 `outDir` 设置为 `../public`。将 `base` 选项配置为 `'//'`。如果你部署到自定义域名、用户或组织页面,或在 GitLab 中启用了“Use unique domain”设置,则不需要 `base`。 +1. 如果你想部署到 `https://.gitlab.io//`,将 VitePress 配置中的 `outDir` 设置为 `../public`。将 `base` 选项配置为 `'//'`。如果你部署到自定义域名、用户或组织页面,或在 GitLab 中启用了“Use unique domain”设置,则不需要 `base`。 2. 在项目的根目录中创建一个名为 `.gitlab-ci.yml` 的文件,其中包含以下内容。每当你更改内容时,这都会构建和部署你的站点: diff --git a/docs/zh/guide/i18n.md b/docs/zh/guide/i18n.md index 4a5ccc59..96b16705 100644 --- a/docs/zh/guide/i18n.md +++ b/docs/zh/guide/i18n.md @@ -55,7 +55,7 @@ interface LocaleSpecificConfig { 有关自定义默认主题的文本占位符的信息,请参考 [`DefaultTheme.Config`](https://github.com/vuejs/vitepress/blob/main/types/default-theme.d.ts) 接口。不要在 locale 级别覆盖 `themeConfig.algolia` 或 `themeConfig.carbonAds`。想获取多语言搜索的信息,请参考 [Algolia 文档](../reference/default-theme-search#i18n)。 -**提示**:配置文件也可以是 `docs/.vitepress/config/index.ts`。通过为每个语言环境创建一个配置文件,然后从 `index.ts` 合并并导出它们,可以更好的组织文件。 +**提示**:配置文件也可以是 `docs/.vitepress/config/index.ts`。通过为每个语言环境创建一个配置文件,然后从 `index.ts` 合并并导出它们,可以更好地组织文件。 ## 为本地化设置子目录 {#separate-directory-for-each-locale} @@ -79,7 +79,7 @@ docs/ /* /en/:splat 302 ``` -**提示:** 如果使用上述的方法,可以使用`nf_lang` cookie 来保存用户的语言选择。例如,可以在主题中添加以下代码: +**提示:** 如果使用上述的方法,可以使用 `nf_lang` cookie 来保存用户的语言选择。例如,可以在主题中添加以下代码: ```ts [docs/.vitepress/theme/index.ts] import DefaultTheme from 'vitepress/theme' diff --git a/docs/zh/guide/migration-from-vitepress-0.md b/docs/zh/guide/migration-from-vitepress-0.md index fc2bf97a..64f9460e 100644 --- a/docs/zh/guide/migration-from-vitepress-0.md +++ b/docs/zh/guide/migration-from-vitepress-0.md @@ -1,4 +1,4 @@ -n# 从 VitePress 0.x 迁移 {#migration-from-vitepress-0-x} +# 从 VitePress 0.x 迁移 {#migration-from-vitepress-0-x} 如果你来自 VitePress 0.x 版本,VitePress 有了一些重大更改。请按照本指南了解如何将应用程序迁移到最新的 VitePress。 @@ -11,13 +11,13 @@ n# 从 VitePress 0.x 迁移 {#migration-from-vitepress-0-x} - `sidebar` 选项改变了它的结构。 - `children` 现在命名为 `items`。 - 顶级侧边栏不包含 `link`。我们打算把它改回来。 -- 删除了 `repo`、`repoLabel`、`docsDir`、`docsBranch`、`editLinks`、`editLinkText`,以支持更灵活的api。 +- 删除了 `repo`、`repoLabel`、`docsDir`、`docsBranch`、`editLinks`、`editLinkText`,以支持更灵活的 API。 - 要将带有图标的 GitHub 链接添加到导航,请使用 [社交链接](../reference/default-theme-config#nav) 功能。 - 要添加“编辑此页面”功能,请使用 [编辑链接](../reference/default-theme-edit-link) 功能。 -- `lastUpdated` 选项现在分为` config.lastUpdated` 和 `themeConfig.lastUpdatedText`。 -- `carbonAds.carbon` 更改为 `carbonAds.code`. +- `lastUpdated` 选项现在分为 `config.lastUpdated` 和 `themeConfig.lastUpdatedText`。 +- `carbonAds.carbon` 更改为 `carbonAds.code`。 ## frontmatter 配置 {#frontmatter-config} - `home: true` 选项已更改为 `layout: home`。此外,还修改了许多与主页相关的设置以提供附加功能。详情请参阅 [主页指南](../reference/default-theme-home-page)。 -- `footer` 选项移至 [`themeConfig.footer`](../reference/default-theme-footer). +- `footer` 选项移至 [`themeConfig.footer`](../reference/default-theme-footer)。 diff --git a/docs/zh/guide/using-vue.md b/docs/zh/guide/using-vue.md index 4dc856d9..6c378a8d 100644 --- a/docs/zh/guide/using-vue.md +++ b/docs/zh/guide/using-vue.md @@ -2,7 +2,7 @@ description: 在 VitePress 的 Markdown 文件中直接使用 Vue 组件和动态模板功能。 --- -# 在 Markdown 使用 Vue {#using-vue-in-markdown} +# 在 Markdown 中使用 Vue {#using-vue-in-markdown} 在 VitePress 中,每个 Markdown 文件都被编译成 HTML,而且将其作为 [Vue 单文件组件](https://cn.vuejs.org/guide/scaling-up/sfc.html)处理。这意味着可以在 Markdown 中使用任何 Vue 功能,包括动态模板、使用 Vue 组件或通过添加 `` @@ -208,8 +207,8 @@ export async function renderPage( function resolvePageImports( config: SiteConfig, page: string, - result: Rollup.RollupOutput, - appChunk: Rollup.OutputChunk + result: Rolldown.RolldownOutput, + appChunk: Rolldown.OutputChunk ) { page = config.rewrites.inv[page] || page // find the page's js chunk and inject script tags for its imports so that @@ -226,7 +225,7 @@ function resolvePageImports( srcPath = normalizePath(srcPath) const pageChunk = result.output.find( (chunk) => chunk.type === 'chunk' && chunk.facadeModuleId === srcPath - ) as Rollup.OutputChunk + ) as Rolldown.OutputChunk return [ ...appChunk.imports, // ...appChunk.dynamicImports, @@ -265,14 +264,7 @@ function renderAttrs(attrs: Record): string { } async function minifyScript(code: string, filename: string): Promise { - // @ts-ignore use oxc-minify when rolldown-vite is used - if (vite.rolldownVersion) { - const oxcMinify = await import('oxc-minify') - return (await oxcMinify.minify(filename, code)).code.trim() - } - return ( - await transformWithEsbuild(code, filename, { minify: true }) - ).code.trim() + return (await minify(filename, code)).code.trim() } function filterOutHeadDescription(head: HeadConfig[] = []) { diff --git a/src/node/plugin.ts b/src/node/plugin.ts index 6739a75e..09bc3e88 100644 --- a/src/node/plugin.ts +++ b/src/node/plugin.ts @@ -7,7 +7,7 @@ import { type EnvironmentModuleNode, type Plugin, type ResolvedConfig, - type Rollup, + type Rolldown, type UserConfig } from 'vite' import { @@ -54,8 +54,8 @@ const staticRestoreRE = /__VP_STATIC_(START|END)__/g const scriptClientRE = /]*client\b[^>]*>([^]*?)<\/script>/ const isPageChunk = ( - chunk: Rollup.OutputAsset | Rollup.OutputChunk -): chunk is Rollup.OutputChunk & { facadeModuleId: string } => + chunk: Rolldown.OutputAsset | Rolldown.OutputChunk +): chunk is Rolldown.OutputChunk & { facadeModuleId: string } => !!( chunk.type === 'chunk' && chunk.isEntry && @@ -285,7 +285,7 @@ export async function createVitePressPlugin( }, renderChunk(code, chunk) { - if (!ssr && isPageChunk(chunk as Rollup.OutputChunk)) { + if (!ssr && isPageChunk(chunk as Rolldown.OutputChunk)) { // For each page chunk, inject marker for start/end of static strings. // we do this here because in generateBundle the chunks would have been // minified and we won't be able to safely locate the strings. diff --git a/src/node/utils/nativeImport.ts b/src/node/utils/nativeImport.ts new file mode 100644 index 00000000..276c8f16 --- /dev/null +++ b/src/node/utils/nativeImport.ts @@ -0,0 +1,24 @@ +import { createRequire } from 'node:module' +import { pathToFileURL } from 'node:url' + +const require = createRequire(import.meta.url) + +// vitepress may itself be executed inside a vite module runner, e.g. when +// `build()` is called from a vitest global setup file with vitepress not +// externalized. the runner rewrites every dynamic import to be resolved +// through vite, which cannot load the temp SSR bundle and its relative page +// imports, and runtime-constructed `import()` wrappers fail there with +// ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING. require(esm) is supported by all +// node versions vitepress runs on and always uses node's own loader. +export async function nativeImport(file: string): Promise { + try { + return require(file) + } catch (e: any) { + // require() cannot load modules that use top-level await - fall back to + // a plain dynamic import, which only misbehaves inside a module runner + if (e.code === 'ERR_REQUIRE_ASYNC_MODULE') { + return import(pathToFileURL(file).href) + } + throw e + } +} From e6e90ed5a9b8939f28619e7c964077a155b3996f Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sat, 4 Jul 2026 04:42:18 +0530 Subject: [PATCH 034/187] refactor: drop fs-extra and organize imports --- __tests__/init/init.test.ts | 6 +-- docs/config.ts | 2 +- docs/en/guide/routing.md | 2 +- docs/es/config.ts | 2 +- docs/es/guide/routing.md | 2 +- docs/fa/config.ts | 2 +- docs/fa/guide/routing.md | 2 +- docs/ja/config.ts | 2 +- docs/ja/guide/routing.md | 2 +- docs/ko/config.ts | 2 +- docs/ko/guide/routing.md | 2 +- docs/pt/config.ts | 2 +- docs/pt/guide/routing.md | 2 +- docs/ru/config.ts | 2 +- docs/ru/guide/routing.md | 2 +- docs/zh/config.ts | 2 +- docs/zh/guide/routing.md | 2 +- package.json | 2 - pnpm-lock.yaml | 51 ------------------- scripts/copyClient.js | 4 +- scripts/copyShared.js | 6 +-- scripts/release.js | 2 +- scripts/watchAndCopy.js | 16 +++--- src/client/index.ts | 2 +- .../theme-default/components/VPButton.vue | 2 +- .../theme-default/components/VPCarbonAds.vue | 2 +- .../theme-default/components/VPDocAside.vue | 2 +- .../components/VPDocAsideCarbonAds.vue | 2 +- .../components/VPDocAsideOutline.vue | 2 +- .../components/VPDocAsideSponsors.vue | 2 +- .../theme-default/components/VPDocFooter.vue | 2 +- .../theme-default/components/VPHome.vue | 6 +-- .../theme-default/components/VPMenuLink.vue | 2 +- .../components/VPNavBarExtra.vue | 6 +-- .../theme-default/components/VPNavBarMenu.vue | 2 +- .../components/VPNavBarMenuGroup.vue | 2 +- .../components/VPNavBarMenuLink.vue | 2 +- .../components/VPNavBarTranslations.vue | 4 +- .../components/VPNavScreenMenu.vue | 2 +- .../components/VPNavScreenMenuGroupLink.vue | 2 +- .../components/VPNavScreenMenuLink.vue | 2 +- .../theme-default/components/VPSkipLink.vue | 2 +- .../theme-default/components/VPSponsors.vue | 2 +- .../components/VPSponsorsGrid.vue | 2 +- src/node/build/build.ts | 11 ++-- src/node/build/bundle.ts | 11 ++-- src/node/build/generateSitemap.ts | 2 +- src/node/build/render.ts | 10 ++-- src/node/config.ts | 10 ++-- src/node/contentLoader.ts | 2 +- src/node/init/init.ts | 5 +- src/node/markdown/plugins/snippet.ts | 2 +- src/node/markdownToVue.ts | 4 +- src/node/plugins/dynamicRoutesPlugin.ts | 2 +- src/node/plugins/localSearchPlugin.ts | 4 +- src/node/serve/serve.ts | 2 +- src/node/siteConfig.ts | 8 +-- src/node/utils/getGitTimestamp.ts | 2 +- src/shared/shared.ts | 8 +-- 59 files changed, 105 insertions(+), 149 deletions(-) diff --git a/__tests__/init/init.test.ts b/__tests__/init/init.test.ts index 7766b060..1497fd92 100644 --- a/__tests__/init/init.test.ts +++ b/__tests__/init/init.test.ts @@ -1,4 +1,4 @@ -import fs from 'fs-extra' +import fs from 'node:fs' import getPort from 'get-port' import { nanoid } from 'nanoid' import path from 'node:path' @@ -33,12 +33,12 @@ const variations = themes.flatMap((theme) => afterAll(async () => { await page.close() await browser.close() - await fs.remove(tempDir) + await fs.promises.rm(tempDir, { recursive: true, force: true }) }) test.each(variations)('init %s', async (_, { theme, useTs }) => { const root = getTempRoot() - await fs.remove(root) + await fs.promises.rm(root, { recursive: true, force: true }) scaffold({ root, theme, useTs, injectNpmScripts: false }) const port = await getPort() diff --git a/docs/config.ts b/docs/config.ts index 8620d955..8f38b2b4 100644 --- a/docs/config.ts +++ b/docs/config.ts @@ -1,4 +1,4 @@ -import { createRequire } from 'module' +import { createRequire } from 'node:module' import { defineAdditionalConfig, type DefaultTheme } from 'vitepress' const require = createRequire(import.meta.url) diff --git a/docs/en/guide/routing.md b/docs/en/guide/routing.md index 2631c632..c858ec13 100644 --- a/docs/en/guide/routing.md +++ b/docs/en/guide/routing.md @@ -329,7 +329,7 @@ The paths loader module is run in Node.js and only executed during build time. Y Generating paths from local files: ```js -import fs from 'fs' +import fs from 'node:fs' export default { paths() { diff --git a/docs/es/config.ts b/docs/es/config.ts index fee38361..382ad71b 100644 --- a/docs/es/config.ts +++ b/docs/es/config.ts @@ -1,4 +1,4 @@ -import { createRequire } from 'module' +import { createRequire } from 'node:module' import { defineAdditionalConfig, type DefaultTheme } from 'vitepress' const require = createRequire(import.meta.url) diff --git a/docs/es/guide/routing.md b/docs/es/guide/routing.md index e3c42162..e4d2894b 100644 --- a/docs/es/guide/routing.md +++ b/docs/es/guide/routing.md @@ -290,7 +290,7 @@ El módulo de carga de paths es ejecutado en Node.js y apenas durante el momento Generando paths a partir de archivos locales: ```js -import fs from 'fs' +import fs from 'node:fs' export default { paths() { diff --git a/docs/fa/config.ts b/docs/fa/config.ts index 4cb8c245..c3b34727 100644 --- a/docs/fa/config.ts +++ b/docs/fa/config.ts @@ -1,4 +1,4 @@ -import { createRequire } from 'module' +import { createRequire } from 'node:module' import { defineAdditionalConfig, type DefaultTheme } from 'vitepress' const require = createRequire(import.meta.url) diff --git a/docs/fa/guide/routing.md b/docs/fa/guide/routing.md index f159a876..b8c3a99b 100644 --- a/docs/fa/guide/routing.md +++ b/docs/fa/guide/routing.md @@ -295,7 +295,7 @@ export default { تولید مسیرها از فایل‌های محلی: ```js -import fs from 'fs' +import fs from 'node:fs' export default { paths() { diff --git a/docs/ja/config.ts b/docs/ja/config.ts index 0631ca82..bc92b006 100644 --- a/docs/ja/config.ts +++ b/docs/ja/config.ts @@ -1,4 +1,4 @@ -import { createRequire } from 'module' +import { createRequire } from 'node:module' import { defineAdditionalConfig, type DefaultTheme } from 'vitepress' const require = createRequire(import.meta.url) diff --git a/docs/ja/guide/routing.md b/docs/ja/guide/routing.md index f624bee0..a77e6062 100644 --- a/docs/ja/guide/routing.md +++ b/docs/ja/guide/routing.md @@ -304,7 +304,7 @@ export default { ローカルファイルから生成する例: ```js -import fs from 'fs' +import fs from 'node:fs' export default { paths() { diff --git a/docs/ko/config.ts b/docs/ko/config.ts index 4a076036..7a275cd3 100644 --- a/docs/ko/config.ts +++ b/docs/ko/config.ts @@ -1,4 +1,4 @@ -import { createRequire } from 'module' +import { createRequire } from 'node:module' import { defineAdditionalConfig, type DefaultTheme } from 'vitepress' const require = createRequire(import.meta.url) diff --git a/docs/ko/guide/routing.md b/docs/ko/guide/routing.md index b0a8e23e..35c7621e 100644 --- a/docs/ko/guide/routing.md +++ b/docs/ko/guide/routing.md @@ -291,7 +291,7 @@ export default { 로컬 파일에서 경로 생성: ```js -import fs from 'fs' +import fs from 'node:fs' export default { paths() { diff --git a/docs/pt/config.ts b/docs/pt/config.ts index 5f71d84f..193eb2f4 100644 --- a/docs/pt/config.ts +++ b/docs/pt/config.ts @@ -1,4 +1,4 @@ -import { createRequire } from 'module' +import { createRequire } from 'node:module' import { defineAdditionalConfig, type DefaultTheme } from 'vitepress' const require = createRequire(import.meta.url) diff --git a/docs/pt/guide/routing.md b/docs/pt/guide/routing.md index 996f75bb..eb97ff01 100644 --- a/docs/pt/guide/routing.md +++ b/docs/pt/guide/routing.md @@ -290,7 +290,7 @@ O módulo de carregamento de caminhos é executado no Node.js e apenas durante o Gerando caminhos a partir de arquivos locais: ```js -import fs from 'fs' +import fs from 'node:fs' export default { paths() { diff --git a/docs/ru/config.ts b/docs/ru/config.ts index 515cffba..aec80866 100644 --- a/docs/ru/config.ts +++ b/docs/ru/config.ts @@ -1,4 +1,4 @@ -import { createRequire } from 'module' +import { createRequire } from 'node:module' import { defineAdditionalConfig, type DefaultTheme } from 'vitepress' const require = createRequire(import.meta.url) diff --git a/docs/ru/guide/routing.md b/docs/ru/guide/routing.md index d7971f77..37e48109 100644 --- a/docs/ru/guide/routing.md +++ b/docs/ru/guide/routing.md @@ -329,7 +329,7 @@ export default { Генерация путей из локальных файлов: ```js -import fs from 'fs' +import fs from 'node:fs' export default { paths() { diff --git a/docs/zh/config.ts b/docs/zh/config.ts index 3f20ec50..9769c1a9 100644 --- a/docs/zh/config.ts +++ b/docs/zh/config.ts @@ -1,4 +1,4 @@ -import { createRequire } from 'module' +import { createRequire } from 'node:module' import { defineAdditionalConfig, type DefaultTheme } from 'vitepress' const require = createRequire(import.meta.url) diff --git a/docs/zh/guide/routing.md b/docs/zh/guide/routing.md index db652f97..06fa2eba 100644 --- a/docs/zh/guide/routing.md +++ b/docs/zh/guide/routing.md @@ -291,7 +291,7 @@ export default { 从本地文件生成路径: ```js -import fs from 'fs' +import fs from 'node:fs' export default { paths() { diff --git a/package.json b/package.json index dfc1b25f..0a5624ab 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,6 @@ "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-replace": "^6.0.3", "@types/cross-spawn": "^6.0.6", - "@types/fs-extra": "^11.0.4", "@types/lodash.template": "^4.5.3", "@types/mark.js": "^8.11.12", "@types/markdown-it-attrs": "^4.1.3", @@ -150,7 +149,6 @@ "conventional-changelog-angular": "^8.3.1", "cross-spawn": "^7.0.6", "esbuild": "^0.27.7", - "fs-extra": "^11.3.5", "get-port": "^7.2.0", "gray-matter": "^4.0.3", "lint-staged": "^16.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a5a2014..46c7c3c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -137,9 +137,6 @@ importers: '@types/cross-spawn': specifier: ^6.0.6 version: 6.0.6 - '@types/fs-extra': - specifier: ^11.0.4 - version: 11.0.4 '@types/lodash.template': specifier: ^4.5.3 version: 4.5.3 @@ -182,9 +179,6 @@ importers: esbuild: specifier: ^0.27.7 version: 0.27.7 - fs-extra: - specifier: ^11.3.5 - version: 11.3.5 get-port: specifier: ^7.2.0 version: 7.2.0 @@ -1044,18 +1038,12 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/fs-extra@11.0.4': - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} - '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} '@types/jquery@4.0.1': resolution: {integrity: sha512-9a59A/tycXgYuPABcp6/3spSShn0NT2UOM4EfHvMumjYi4lJWTsK5SZWjhx3yRm9IHGCeWXdV2YfNsrWrft/CA==} - '@types/jsonfile@6.1.4': - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -1728,10 +1716,6 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - fs-extra@11.3.5: - resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} - engines: {node: '>=14.14'} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1775,9 +1759,6 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} @@ -1917,9 +1898,6 @@ packages: resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==} hasBin: true - jsonfile@6.2.1: - resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} - juice@8.1.0: resolution: {integrity: sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==} engines: {node: '>=10.0.0'} @@ -2799,10 +2777,6 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - unplugin-utils@0.2.5: resolution: {integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==} engines: {node: '>=18.12.0'} @@ -3551,21 +3525,12 @@ snapshots: '@types/estree@1.0.9': {} - '@types/fs-extra@11.0.4': - dependencies: - '@types/jsonfile': 6.1.4 - '@types/node': 25.9.4 - '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 '@types/jquery@4.0.1': {} - '@types/jsonfile@6.1.4': - dependencies: - '@types/node': 25.9.4 - '@types/linkify-it@5.0.0': {} '@types/lodash.template@4.5.3': @@ -4234,12 +4199,6 @@ snapshots: format@0.2.2: {} - fs-extra@11.3.5: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - fsevents@2.3.3: optional: true @@ -4281,8 +4240,6 @@ snapshots: gopd@1.2.0: {} - graceful-fs@4.2.11: {} - gray-matter@4.0.3: dependencies: js-yaml: 3.15.0 @@ -4428,12 +4385,6 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - jsonfile@6.2.1: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - juice@8.1.0: dependencies: cheerio: 1.0.0-rc.10 @@ -5437,8 +5388,6 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - universalify@2.0.1: {} - unplugin-utils@0.2.5: dependencies: pathe: 2.0.3 diff --git a/scripts/copyClient.js b/scripts/copyClient.js index 465be10c..5815352a 100644 --- a/scripts/copyClient.js +++ b/scripts/copyClient.js @@ -1,4 +1,4 @@ -import { copy } from 'fs-extra' +import { cp } from 'node:fs/promises' import { globSync } from 'tinyglobby' function toDest(file) { @@ -7,5 +7,5 @@ function toDest(file) { globSync(['src/client/**']).forEach((file) => { if (/(\.ts|tsconfig\.json)$/.test(file)) return - copy(file, toDest(file)) + cp(file, toDest(file)) }) diff --git a/scripts/copyShared.js b/scripts/copyShared.js index af73c48e..c9512bd1 100644 --- a/scripts/copyShared.js +++ b/scripts/copyShared.js @@ -1,9 +1,9 @@ -import { copy } from 'fs-extra' +import { cp } from 'node:fs/promises' import { globSync } from 'tinyglobby' globSync(['src/shared/**/*.ts']).forEach(async (file) => { await Promise.all([ - copy(file, file.replace(/^src\/shared\//, 'src/node/')), - copy(file, file.replace(/^src\/shared\//, 'src/client/')) + cp(file, file.replace(/^src\/shared\//, 'src/node/')), + cp(file, file.replace(/^src\/shared\//, 'src/client/')) ]) }) diff --git a/scripts/release.js b/scripts/release.js index b35c9019..69ab8efc 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -1,8 +1,8 @@ import { spawn } from 'node:child_process' import { readFileSync, writeFileSync } from 'node:fs' +import { createRequire } from 'node:module' import { resolve } from 'node:path' import { fileURLToPath } from 'node:url' -import { createRequire } from 'node:module' import c from 'picocolors' import prompts from 'prompts' import semver from 'semver' diff --git a/scripts/watchAndCopy.js b/scripts/watchAndCopy.js index c66085f8..66da6f0d 100644 --- a/scripts/watchAndCopy.js +++ b/scripts/watchAndCopy.js @@ -1,15 +1,15 @@ import { watch } from 'chokidar' -import { copy, remove } from 'fs-extra' +import { cp, rm } from 'node:fs/promises' import { normalizePath } from 'vite' function toClientAndNode(method, file) { file = normalizePath(file) if (method === 'copy') { - copy(file, file.replace(/^src\/shared\//, 'src/node/')) - copy(file, file.replace(/^src\/shared\//, 'src/client/')) + cp(file, file.replace(/^src\/shared\//, 'src/node/')) + cp(file, file.replace(/^src\/shared\//, 'src/client/')) } else if (method === 'remove') { - remove(file.replace(/^src\/shared\//, 'src/node/')) - remove(file.replace(/^src\/shared\//, 'src/client/')) + rm(file.replace(/^src\/shared\//, 'src/node/'), { force: true }) + rm(file.replace(/^src\/shared\//, 'src/client/'), { force: true }) } } @@ -31,6 +31,6 @@ watch('src/client', { ignored: (path, stats) => stats?.isFile() && (path.endsWith('.ts') || path.endsWith('tsconfig.json')) }) - .on('change', (file) => copy(file, toDist(file))) - .on('add', (file) => copy(file, toDist(file))) - .on('unlink', (file) => remove(toDist(file))) + .on('change', (file) => cp(file, toDist(file))) + .on('add', (file) => cp(file, toDist(file))) + .on('unlink', (file) => rm(toDist(file), { force: true })) diff --git a/src/client/index.ts b/src/client/index.ts index 6112e866..47074c43 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -2,8 +2,8 @@ // so the user can do `import { useRoute, useData } from 'vitepress'` // generic types -export type { VitePressData } from './shared' export type { Route, Router } from './app/router' +export type { VitePressData } from './shared' // theme types export type { EnhanceAppContext, Theme } from './app/theme' diff --git a/src/client/theme-default/components/VPButton.vue b/src/client/theme-default/components/VPButton.vue index d0a5de70..707b9180 100644 --- a/src/client/theme-default/components/VPButton.vue +++ b/src/client/theme-default/components/VPButton.vue @@ -1,7 +1,7 @@ diff --git a/src/client/theme-default/components/VPDocAsideCarbonAds.vue b/src/client/theme-default/components/VPDocAsideCarbonAds.vue index d10598dd..a04d4f67 100644 --- a/src/client/theme-default/components/VPDocAsideCarbonAds.vue +++ b/src/client/theme-default/components/VPDocAsideCarbonAds.vue @@ -1,6 +1,6 @@ diff --git a/src/client/theme-default/components/VPMenuLink.vue b/src/client/theme-default/components/VPMenuLink.vue index 028d3e82..c98bf19c 100644 --- a/src/client/theme-default/components/VPMenuLink.vue +++ b/src/client/theme-default/components/VPMenuLink.vue @@ -1,8 +1,8 @@ diff --git a/src/client/theme-default/components/VPNavBarMenuGroup.vue b/src/client/theme-default/components/VPNavBarMenuGroup.vue index 85350d47..4d014a49 100644 --- a/src/client/theme-default/components/VPNavBarMenuGroup.vue +++ b/src/client/theme-default/components/VPNavBarMenuGroup.vue @@ -1,8 +1,8 @@ diff --git a/src/client/theme-default/components/VPNavScreenMenuGroupLink.vue b/src/client/theme-default/components/VPNavScreenMenuGroupLink.vue index 0ed634c0..9a884e01 100644 --- a/src/client/theme-default/components/VPNavScreenMenuGroupLink.vue +++ b/src/client/theme-default/components/VPNavScreenMenuGroupLink.vue @@ -1,8 +1,8 @@ ` - fs.removeSync(path.resolve(config.outDir, matchingChunk.fileName)) + fs.rmSync(path.resolve(config.outDir, matchingChunk.fileName), { + force: true + }) } else { inlinedScript = `` } @@ -189,7 +191,7 @@ export async function renderPage( ` const htmlFileName = path.join(config.outDir, page.replace(/\.md$/, '.html')) - await fs.ensureDir(path.dirname(htmlFileName)) + await fs.promises.mkdir(path.dirname(htmlFileName), { recursive: true }) const transformedHtml = await config.transformHtml?.(html, htmlFileName, { page, siteConfig: config, @@ -201,7 +203,7 @@ export async function renderPage( content, assets }) - await fs.writeFile(htmlFileName, transformedHtml || html) + await fs.promises.writeFile(htmlFileName, transformedHtml || html) } function resolvePageImports( diff --git a/src/node/config.ts b/src/node/config.ts index 24ae5c2b..f2deaf32 100644 --- a/src/node/config.ts +++ b/src/node/config.ts @@ -1,6 +1,6 @@ -import { createDebug } from 'obug' -import fs from 'fs-extra' +import fs from 'node:fs' import path from 'node:path' +import { createDebug } from 'obug' import c from 'picocolors' import { createLogger, @@ -12,6 +12,7 @@ import { } from 'vite' import { DEFAULT_THEME_PATH } from './alias' import type { DefaultTheme } from './defaultTheme' +import type { MarkdownOptions } from './markdown/markdown' import { resolvePages } from './plugins/dynamicRoutesPlugin' import { APPEARANCE_KEY, @@ -23,7 +24,6 @@ import { type HeadConfig, type SiteData } from './shared' -import type { MarkdownOptions } from './markdown/markdown' import type { RawConfigExports, SiteConfig, UserConfig } from './siteConfig' import { glob } from './utils/glob' @@ -124,7 +124,7 @@ export async function resolveConfig( // resolve theme path const userThemeDir = resolve(root, 'theme') - const themeDir = (await fs.pathExists(userThemeDir)) + const themeDir = fs.existsSync(userThemeDir) ? userThemeDir : DEFAULT_THEME_PATH @@ -240,7 +240,7 @@ export async function resolveUserConfig( resolve(root, `config/index.${ext}`), resolve(root, `config.${ext}`) ]) - .find(fs.pathExistsSync) + .find(fs.existsSync) let userConfig: RawConfigExports = {} let configDeps: string[] = [] diff --git a/src/node/contentLoader.ts b/src/node/contentLoader.ts index 406dcf6d..6a15ecd9 100644 --- a/src/node/contentLoader.ts +++ b/src/node/contentLoader.ts @@ -1,5 +1,5 @@ -import fs from 'fs-extra' import matter from 'gray-matter' +import fs from 'node:fs' import path from 'node:path' import pMap from 'p-map' import { normalizePath } from 'vite' diff --git a/src/node/init/init.ts b/src/node/init/init.ts index 71120541..0037ac33 100644 --- a/src/node/init/init.ts +++ b/src/node/init/init.ts @@ -7,8 +7,8 @@ import { select, text } from '@clack/prompts' -import fs from 'fs-extra' import template from 'lodash.template' +import fs from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' import c from 'picocolors' @@ -200,7 +200,8 @@ export function scaffold({ const content = fs.readFileSync(filePath, 'utf-8') const compiled = template(content)(data) - fs.outputFileSync(targetPath, compiled) + fs.mkdirSync(path.dirname(targetPath), { recursive: true }) + fs.writeFileSync(targetPath, compiled) } const filesToScaffold = [ diff --git a/src/node/markdown/plugins/snippet.ts b/src/node/markdown/plugins/snippet.ts index 71e5e76c..576e56c7 100644 --- a/src/node/markdown/plugins/snippet.ts +++ b/src/node/markdown/plugins/snippet.ts @@ -1,6 +1,6 @@ -import fs from 'fs-extra' import type { MarkdownItAsync } from 'markdown-it-async' import type { RuleBlock } from 'markdown-it/lib/parser_block.mjs' +import fs from 'node:fs' import path from 'node:path' import type { MarkdownEnv } from '../../shared' diff --git a/src/node/markdownToVue.ts b/src/node/markdownToVue.ts index 03bc31d2..6f744acc 100644 --- a/src/node/markdownToVue.ts +++ b/src/node/markdownToVue.ts @@ -1,8 +1,8 @@ import { resolveTitleFromToken } from '@mdit-vue/shared' -import { createDebug } from 'obug' -import fs from 'fs-extra' import { LRUCache } from 'lru-cache' +import fs from 'node:fs' import path from 'node:path' +import { createDebug } from 'obug' import type { SiteConfig } from './config' import { createMarkdownRenderer, diff --git a/src/node/plugins/dynamicRoutesPlugin.ts b/src/node/plugins/dynamicRoutesPlugin.ts index 7b3b326d..4eecfa99 100644 --- a/src/node/plugins/dynamicRoutesPlugin.ts +++ b/src/node/plugins/dynamicRoutesPlugin.ts @@ -1,4 +1,4 @@ -import fs from 'fs-extra' +import fs from 'node:fs' import path from 'node:path' import c from 'picocolors' import pm from 'picomatch' diff --git a/src/node/plugins/localSearchPlugin.ts b/src/node/plugins/localSearchPlugin.ts index 3c260e20..7ba43c1f 100644 --- a/src/node/plugins/localSearchPlugin.ts +++ b/src/node/plugins/localSearchPlugin.ts @@ -1,7 +1,7 @@ -import { createDebug } from 'obug' -import fs from 'fs-extra' import MiniSearch from 'minisearch' +import fs from 'node:fs' import path from 'node:path' +import { createDebug } from 'obug' import type { Plugin, ViteDevServer } from 'vite' import type { SiteConfig } from '../config' import type { DefaultTheme } from '../defaultTheme' diff --git a/src/node/serve/serve.ts b/src/node/serve/serve.ts index 7acaea62..3ff1f0ac 100644 --- a/src/node/serve/serve.ts +++ b/src/node/serve/serve.ts @@ -1,5 +1,5 @@ import compression from '@polka/compression' -import fs from 'fs-extra' +import fs from 'node:fs' import path from 'node:path' import polka, { type IOptions } from 'polka' import sirv from 'sirv' diff --git a/src/node/siteConfig.ts b/src/node/siteConfig.ts index d3181fbf..e727087c 100644 --- a/src/node/siteConfig.ts +++ b/src/node/siteConfig.ts @@ -2,6 +2,10 @@ import type { Options as VuePluginOptions } from '@vitejs/plugin-vue' import type { UseDarkOptions } from '@vueuse/core' import type { SitemapStreamOptions } from 'sitemap' import type { Logger, UserConfig as ViteConfig } from 'vite' +import type { + AdditionalConfigDict, + AdditionalConfigLoader +} from '../../types/shared' import type { SitemapItem } from './build/generateSitemap' import type { MarkdownOptions } from './markdown/markdown' import type { ResolvedRouteConfig } from './plugins/dynamicRoutesPlugin' @@ -14,10 +18,6 @@ import type { SSGContext, SiteData } from './shared' -import type { - AdditionalConfigDict, - AdditionalConfigLoader -} from '../../types/shared' export type RawConfigExports = | Awaitable> diff --git a/src/node/utils/getGitTimestamp.ts b/src/node/utils/getGitTimestamp.ts index 11729aa1..d5ac5ec9 100644 --- a/src/node/utils/getGitTimestamp.ts +++ b/src/node/utils/getGitTimestamp.ts @@ -1,8 +1,8 @@ import { spawn, sync } from 'cross-spawn' -import { createDebug } from 'obug' import fs from 'node:fs' import path from 'node:path' import { Transform, type TransformCallback } from 'node:stream' +import { createDebug } from 'obug' import { slash } from '../shared' const debug = createDebug('vitepress:git') diff --git a/src/shared/shared.ts b/src/shared/shared.ts index c73019e6..59e1a31e 100644 --- a/src/shared/shared.ts +++ b/src/shared/shared.ts @@ -6,6 +6,9 @@ import type { } from '../../types/shared' export type { + AdditionalConfig, + AdditionalConfigDict, + AdditionalConfigLoader, Awaitable, DefaultTheme, HeadConfig, @@ -16,11 +19,8 @@ export type { PageData, PageDataPayload, SiteData, - VitePressData, SSGContext, - AdditionalConfig, - AdditionalConfigDict, - AdditionalConfigLoader + VitePressData } from '../../types/shared' export const EXTERNAL_URL_RE = /^(?:[a-z]+:|\/\/)/i From 1ade7bd422e18e2aee6086939fb16f10b8b74f99 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sat, 4 Jul 2026 05:09:00 +0530 Subject: [PATCH 035/187] refactor: migrate scripts to typescript and organize imports --- __tests__/e2e/data-loading/data.test.ts | 14 ++++---- __tests__/init/init.test.ts | 6 ++-- .../theme-default/composables/langs.test.ts | 4 +-- __tests__/unit/node/config.test.ts | 2 +- __tests__/unit/node/markdownToVue.test.ts | 4 +-- .../node/plugins/localSearchPlugin.test.ts | 6 ++-- package.json | 11 ++++--- pnpm-lock.yaml | 8 +++++ rollup.config.ts | 4 +-- scripts/{copyClient.js => copyClient.ts} | 2 +- scripts/{copyShared.js => copyShared.ts} | 0 scripts/{release.js => release.ts} | 32 +++++++++---------- scripts/{watchAndCopy.js => watchAndCopy.ts} | 9 +++--- src/node/build/bundle.ts | 5 +-- src/node/build/render.ts | 5 +-- src/node/plugins/localSearchPlugin.ts | 3 +- tsconfig.json | 3 +- 17 files changed, 65 insertions(+), 53 deletions(-) rename scripts/{copyClient.js => copyClient.ts} (88%) rename scripts/{copyShared.js => copyShared.ts} (100%) rename scripts/{release.js => release.ts} (77%) rename scripts/{watchAndCopy.js => watchAndCopy.ts} (81%) diff --git a/__tests__/e2e/data-loading/data.test.ts b/__tests__/e2e/data-loading/data.test.ts index 21cfa061..4a4e87a8 100644 --- a/__tests__/e2e/data-loading/data.test.ts +++ b/__tests__/e2e/data-loading/data.test.ts @@ -1,4 +1,4 @@ -import fs from 'node:fs/promises' +import { writeFile, unlink } from 'node:fs/promises' import { fileURLToPath } from 'node:url' describe('static data file support in vite 3', () => { @@ -48,20 +48,20 @@ describe('static data file support in vite 3', () => { const b = fileURLToPath(new URL('./data/b.json', import.meta.url)) try { - await fs.writeFile(a, JSON.stringify({ a: false }, null, 2) + '\n') + await writeFile(a, JSON.stringify({ a: false }, null, 2) + '\n') await page.waitForFunction( () => document.querySelector('pre#basic')?.textContent === JSON.stringify([{ a: false }, { b: true }], null, 2) ) } finally { - await fs.writeFile(a, JSON.stringify({ a: true }, null, 2) + '\n') + await writeFile(a, JSON.stringify({ a: true }, null, 2) + '\n') } let err = true try { - await fs.unlink(b) + await unlink(b) await page.waitForFunction( () => document.querySelector('pre#basic')?.textContent === @@ -70,19 +70,19 @@ describe('static data file support in vite 3', () => { err = false } finally { if (err) { - await fs.writeFile(b, JSON.stringify({ b: true }, null, 2) + '\n') + await writeFile(b, JSON.stringify({ b: true }, null, 2) + '\n') } } try { - await fs.writeFile(b, JSON.stringify({ b: false }, null, 2) + '\n') + await writeFile(b, JSON.stringify({ b: false }, null, 2) + '\n') await page.waitForFunction( () => document.querySelector('pre#basic')?.textContent === JSON.stringify([{ a: true }, { b: false }], null, 2) ) } finally { - await fs.writeFile(b, JSON.stringify({ b: true }, null, 2) + '\n') + await writeFile(b, JSON.stringify({ b: true }, null, 2) + '\n') } }) diff --git a/__tests__/init/init.test.ts b/__tests__/init/init.test.ts index 1497fd92..0066f43d 100644 --- a/__tests__/init/init.test.ts +++ b/__tests__/init/init.test.ts @@ -1,6 +1,6 @@ -import fs from 'node:fs' import getPort from 'get-port' import { nanoid } from 'nanoid' +import { rm } from 'node:fs/promises' import path from 'node:path' import { fileURLToPath, URL } from 'node:url' import { chromium } from 'playwright-chromium' @@ -33,12 +33,12 @@ const variations = themes.flatMap((theme) => afterAll(async () => { await page.close() await browser.close() - await fs.promises.rm(tempDir, { recursive: true, force: true }) + await rm(tempDir, { recursive: true, force: true }) }) test.each(variations)('init %s', async (_, { theme, useTs }) => { const root = getTempRoot() - await fs.promises.rm(root, { recursive: true, force: true }) + await rm(root, { recursive: true, force: true }) scaffold({ root, theme, useTs, injectNpmScripts: false }) const port = await getPort() diff --git a/__tests__/unit/client/theme-default/composables/langs.test.ts b/__tests__/unit/client/theme-default/composables/langs.test.ts index 565a4a23..dc91bbe7 100644 --- a/__tests__/unit/client/theme-default/composables/langs.test.ts +++ b/__tests__/unit/client/theme-default/composables/langs.test.ts @@ -1,7 +1,7 @@ -import { ref } from 'vue' +import { resolveLocaleLink } from 'client/theme-default/composables/langs' import type { VitePressData } from 'vitepress' import type { DefaultTheme } from 'vitepress/theme' -import { resolveLocaleLink } from 'client/theme-default/composables/langs' +import { ref } from 'vue' function createData( themeConfig: DefaultTheme.Config, diff --git a/__tests__/unit/node/config.test.ts b/__tests__/unit/node/config.test.ts index 9837879c..22f7d034 100644 --- a/__tests__/unit/node/config.test.ts +++ b/__tests__/unit/node/config.test.ts @@ -1,5 +1,5 @@ -import { mergeConfig } from 'node/config' import type { MarkdownItAsync } from 'markdown-it-async' +import { mergeConfig } from 'node/config' describe('node/config', () => { test('merges markdown config hooks from extended configs', async () => { diff --git a/__tests__/unit/node/markdownToVue.test.ts b/__tests__/unit/node/markdownToVue.test.ts index ec89e7e0..232496df 100644 --- a/__tests__/unit/node/markdownToVue.test.ts +++ b/__tests__/unit/node/markdownToVue.test.ts @@ -1,8 +1,8 @@ +import { resolveConfig } from 'node/config' +import { createMarkdownToVueRenderFn } from 'node/markdownToVue' import { mkdtemp, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import path from 'node:path' -import { resolveConfig } from 'node/config' -import { createMarkdownToVueRenderFn } from 'node/markdownToVue' describe('node/markdownToVue', () => { let root: string | undefined diff --git a/__tests__/unit/node/plugins/localSearchPlugin.test.ts b/__tests__/unit/node/plugins/localSearchPlugin.test.ts index c71d628f..c972795c 100644 --- a/__tests__/unit/node/plugins/localSearchPlugin.test.ts +++ b/__tests__/unit/node/plugins/localSearchPlugin.test.ts @@ -1,9 +1,9 @@ +import MiniSearch from 'minisearch' +import { resolveConfig } from 'node/config' +import { localSearchPlugin } from 'node/plugins/localSearchPlugin' import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import path from 'node:path' -import { resolveConfig } from 'node/config' -import { localSearchPlugin } from 'node/plugins/localSearchPlugin' -import MiniSearch from 'minisearch' describe('node/plugins/localSearchPlugin', () => { let root: string | undefined diff --git a/package.json b/package.json index 0a5624ab..4fe35fc8 100644 --- a/package.json +++ b/package.json @@ -56,11 +56,11 @@ "dev:start": "pnpm --stream '/^dev:(client|node|watch)$/'", "dev:client": "tsc --sourcemap -w --preserveWatchOutput -p src/client", "dev:node": "DEV=true pnpm build:node -w", - "dev:shared": "node scripts/copyShared", - "dev:watch": "node scripts/watchAndCopy", + "dev:shared": "node scripts/copyShared.ts", + "dev:watch": "node scripts/watchAndCopy.ts", "build": "pnpm build:prepare && pnpm build:client && pnpm build:node", - "build:prepare": "pnpm clean && node scripts/copyShared", - "build:client": "vue-tsc --noEmit -p src/client && tsc -p src/client && node scripts/copyClient", + "build:prepare": "pnpm clean && node scripts/copyShared.ts", + "build:client": "vue-tsc --noEmit -p src/client && tsc -p src/client && node scripts/copyClient.ts", "build:node": "tsc -p src/node --noEmit && rollup --config rollup.config.ts --configPlugin esbuild", "test": "pnpm --aggregate-output --reporter=append-only '/^test:(unit|e2e|init)$/'", "test:unit": "vitest run -r __tests__/unit", @@ -87,7 +87,7 @@ "format:fail": "prettier --experimental-cli --check .", "check": "pnpm format:fail && pnpm build && pnpm test", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", - "release": "node scripts/release.js" + "release": "node scripts/release.ts" }, "simple-git-hooks": { "pre-commit": "pnpm lint-staged" @@ -144,6 +144,7 @@ "@types/node": "^25.9.4", "@types/picomatch": "^4.0.3", "@types/prompts": "^2.4.9", + "@types/semver": "^7.7.1", "chokidar": "^5.0.0", "conventional-changelog": "^7.2.1", "conventional-changelog-angular": "^8.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46c7c3c9..6775cb74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,6 +164,9 @@ importers: '@types/prompts': specifier: ^2.4.9 version: 2.4.9 + '@types/semver': + specifier: ^7.7.1 + version: 7.7.1 chokidar: specifier: ^5.0.0 version: 5.0.0 @@ -1101,6 +1104,9 @@ packages: '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -3593,6 +3599,8 @@ snapshots: dependencies: '@types/node': 25.9.4 + '@types/semver@7.7.1': {} + '@types/unist@3.0.3': {} '@types/web-bluetooth@0.0.21': {} diff --git a/rollup.config.ts b/rollup.config.ts index e0e9c3ba..23c9d41f 100644 --- a/rollup.config.ts +++ b/rollup.config.ts @@ -3,7 +3,7 @@ import commonjs from '@rollup/plugin-commonjs' import json from '@rollup/plugin-json' import { nodeResolve } from '@rollup/plugin-node-resolve' import replace from '@rollup/plugin-replace' -import * as fs from 'node:fs/promises' +import { rm } from 'node:fs/promises' import { builtinModules, createRequire } from 'node:module' import { type RollupOptions, defineConfig } from 'rollup' import dts from 'rollup-plugin-dts' @@ -88,7 +88,7 @@ const clientTypes: RollupOptions = { name: 'cleanup', async closeBundle() { if (PROD) { - await fs.rm('dist/client-types', { recursive: true }) + await rm('dist/client-types', { recursive: true }) } } } diff --git a/scripts/copyClient.js b/scripts/copyClient.ts similarity index 88% rename from scripts/copyClient.js rename to scripts/copyClient.ts index 5815352a..7257748e 100644 --- a/scripts/copyClient.js +++ b/scripts/copyClient.ts @@ -1,7 +1,7 @@ import { cp } from 'node:fs/promises' import { globSync } from 'tinyglobby' -function toDest(file) { +function toDest(file: string) { return file.replace(/^src\//, 'dist/') } diff --git a/scripts/copyShared.js b/scripts/copyShared.ts similarity index 100% rename from scripts/copyShared.js rename to scripts/copyShared.ts diff --git a/scripts/release.js b/scripts/release.ts similarity index 77% rename from scripts/release.js rename to scripts/release.ts index 69ab8efc..2d4d1505 100644 --- a/scripts/release.js +++ b/scripts/release.ts @@ -1,5 +1,6 @@ -import { spawn } from 'node:child_process' -import { readFileSync, writeFileSync } from 'node:fs' +import { spawn } from 'cross-spawn' +import type { SpawnOptions } from 'node:child_process' +import fs from 'node:fs' import { createRequire } from 'node:module' import { resolve } from 'node:path' import { fileURLToPath } from 'node:url' @@ -12,17 +13,16 @@ const { version: currentVersion } = createRequire(import.meta.url)( ) const { inc: _inc, valid } = semver -const versionIncrements = ['patch', 'minor', 'major'] +const versionIncrements = ['patch', 'minor', 'major'] as const -const tags = ['latest', 'next'] +const tags = ['latest', 'next'] as const const dir = fileURLToPath(new URL('.', import.meta.url)) -const inc = (i) => _inc(currentVersion, i) -const run = (bin, args, opts = {}) => - new Promise((resolve, reject) => { +const inc = (i: semver.ReleaseType) => _inc(currentVersion, i) +const run = (bin: string, args: string[], opts: SpawnOptions = {}) => + new Promise((resolve, reject) => { const child = spawn(bin, args, { stdio: 'inherit', - shell: process.platform === 'win32', ...opts }) @@ -37,10 +37,10 @@ const run = (bin, args, opts = {}) => } }) }) -const step = (msg) => console.log(c.cyan(msg)) +const step = (msg: string) => console.log(c.cyan(msg)) async function main() { - let targetVersion + let targetVersion: string const versions = versionIncrements .map((i) => `${i} (${inc(i)})`) @@ -50,7 +50,7 @@ async function main() { type: 'select', name: 'release', message: 'Select release type', - choices: versions + choices: versions.map((title, value) => ({ title, value })) }) if (release === 3) { @@ -63,7 +63,7 @@ async function main() { }) ).version } else { - targetVersion = versions[release].match(/\((.*)\)/)[1] + targetVersion = versions[release].match(/\((.*)\)/)![1] } if (!valid(targetVersion)) { @@ -74,7 +74,7 @@ async function main() { type: 'select', name: 'tag', message: 'Select tag type', - choices: tags + choices: tags.map((title, value) => ({ title, value })) }) const { yes: tagOk } = await prompts({ @@ -132,13 +132,13 @@ async function main() { await run('git', ['push']) } -function updatePackage(version) { +function updatePackage(version: string) { const pkgPath = resolve(resolve(dir, '..'), 'package.json') - const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) + const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) pkg.version = version - writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n') + fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n') } main().catch((err) => console.error(err)) diff --git a/scripts/watchAndCopy.js b/scripts/watchAndCopy.ts similarity index 81% rename from scripts/watchAndCopy.js rename to scripts/watchAndCopy.ts index 66da6f0d..8f4b6679 100644 --- a/scripts/watchAndCopy.js +++ b/scripts/watchAndCopy.ts @@ -2,7 +2,7 @@ import { watch } from 'chokidar' import { cp, rm } from 'node:fs/promises' import { normalizePath } from 'vite' -function toClientAndNode(method, file) { +function toClientAndNode(method: 'copy' | 'remove', file: string) { file = normalizePath(file) if (method === 'copy') { cp(file, file.replace(/^src\/shared\//, 'src/node/')) @@ -13,13 +13,13 @@ function toClientAndNode(method, file) { } } -function toDist(file) { +function toDist(file: string) { return normalizePath(file).replace(/^src\//, 'dist/') } // copy shared files to the client and node directory whenever they change. watch('src/shared', { - ignored: (path, stats) => stats?.isFile() && !path.endsWith('.ts') + ignored: (path, stats) => !!stats?.isFile() && !path.endsWith('.ts') }) .on('change', (file) => toClientAndNode('copy', file)) .on('add', (file) => toClientAndNode('copy', file)) @@ -29,7 +29,8 @@ watch('src/shared', { // they change. watch('src/client', { ignored: (path, stats) => - stats?.isFile() && (path.endsWith('.ts') || path.endsWith('tsconfig.json')) + !!stats?.isFile() && + (path.endsWith('.ts') || path.endsWith('tsconfig.json')) }) .on('change', (file) => cp(file, toDist(file))) .on('add', (file) => cp(file, toDist(file))) diff --git a/src/node/build/bundle.ts b/src/node/build/bundle.ts index cac239ed..c98eaa1a 100644 --- a/src/node/build/bundle.ts +++ b/src/node/build/bundle.ts @@ -1,4 +1,5 @@ import fs from 'node:fs' +import { cp } from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' import { @@ -202,7 +203,7 @@ export async function bundle( if (!chunk.fileName.endsWith('.js')) { const tempPath = path.resolve(config.tempDir, chunk.fileName) const outPath = path.resolve(config.outDir, chunk.fileName) - await fs.promises.cp(tempPath, outPath) + await cp(tempPath, outPath) } }) ) @@ -211,7 +212,7 @@ export async function bundle( if (fs.existsSync(publicDir)) { // dereference symlinks like vite's own publicDir copy does, and so that // copying over an existing symlinked file does not fail with EEXIST - await fs.promises.cp(publicDir, config.outDir, { + await cp(publicDir, config.outDir, { recursive: true, dereference: true }) diff --git a/src/node/build/render.ts b/src/node/build/render.ts index 3cf54953..14410fe5 100644 --- a/src/node/build/render.ts +++ b/src/node/build/render.ts @@ -1,5 +1,6 @@ import { isBooleanAttr } from '@vue/shared' import fs from 'node:fs' +import { mkdir, writeFile } from 'node:fs/promises' import path from 'node:path' import { minify, normalizePath, type Rolldown } from 'vite' import { version } from '../../../package.json' @@ -191,7 +192,7 @@ export async function renderPage( ` const htmlFileName = path.join(config.outDir, page.replace(/\.md$/, '.html')) - await fs.promises.mkdir(path.dirname(htmlFileName), { recursive: true }) + await mkdir(path.dirname(htmlFileName), { recursive: true }) const transformedHtml = await config.transformHtml?.(html, htmlFileName, { page, siteConfig: config, @@ -203,7 +204,7 @@ export async function renderPage( content, assets }) - await fs.promises.writeFile(htmlFileName, transformedHtml || html) + await writeFile(htmlFileName, transformedHtml || html) } function resolvePageImports( diff --git a/src/node/plugins/localSearchPlugin.ts b/src/node/plugins/localSearchPlugin.ts index 7ba43c1f..332c3294 100644 --- a/src/node/plugins/localSearchPlugin.ts +++ b/src/node/plugins/localSearchPlugin.ts @@ -1,5 +1,6 @@ import MiniSearch from 'minisearch' import fs from 'node:fs' +import { readFile } from 'node:fs/promises' import path from 'node:path' import { createDebug } from 'obug' import type { Plugin, ViteDevServer } from 'vite' @@ -54,7 +55,7 @@ export async function localSearchPlugin( const { srcDir, cleanUrls = false } = siteConfig const relativePath = slash(path.relative(srcDir, file)) const env: MarkdownEnv = { path: file, relativePath, cleanUrls } - const md_raw = await fs.promises.readFile(file, 'utf-8') + const md_raw = await readFile(file, 'utf-8') const md_src = processIncludes(md, srcDir, md_raw, file, [], cleanUrls) if (options._render) { return await options._render(md_src, env, md) diff --git a/tsconfig.json b/tsconfig.json index 6d6abf89..a0a5c69b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,7 +17,6 @@ "**/dist/**", "template", "bin", - "docs/snippets", - "scripts" + "docs/snippets" ] } From c0e2e1809464c48435a22a0aa9468ff5e562791d Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sun, 5 Jul 2026 10:04:42 +0530 Subject: [PATCH 036/187] fix: don't invalidate framework chunk when a new asset is added --- src/node/build/bundle.ts | 39 ++++++++++++++------------------------- src/node/build/render.ts | 8 ++------ 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/node/build/bundle.ts b/src/node/build/bundle.ts index c98eaa1a..ad25459b 100644 --- a/src/node/build/bundle.ts +++ b/src/node/build/bundle.ts @@ -16,7 +16,7 @@ import { escapeRegExp, sanitizeFileName, slash } from '../shared' import { task } from '../utils/task' import { buildMPAClient } from './buildMPAClient' -// https://github.com/vitejs/vite/blob/d2aa0969ee316000d3b957d7e879f001e85e369e/packages/vite/src/node/plugins/splitVendorChunk.ts#L14 +// https://github.com/vitejs/vite/blob/a55d0b34400e3360c4100d05e422ae9cf10fa07b/packages/vite/src/node/constants.ts#L50 const CSS_LANGS_RE = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/ @@ -125,35 +125,24 @@ export async function bundle( codeSplitting: { groups: [ { - name( - id: string, - ctx: Pick - ) { - // ctx.getModuleInfo must not be called detached from ctx - const getModuleInfo: Rolldown.GetModuleInfo = ( - moduleId - ) => ctx.getModuleInfo(moduleId) + name(id, ctx) { + const getModuleInfo = ctx.getModuleInfo.bind(ctx) + + // avoid emitting multiple files for assets + // see: https://github.com/rolldown/rolldown/issues/4246 + if (getModuleInfo(id)?.meta['vite:asset']) { + return 'assets' + } // move known framework code into a stable chunk so that // custom theme changes do not invalidate hash for all pages if ( id.startsWith('\0vite') || - getModuleInfo(id)?.meta['vite:asset'] - ) { - return 'framework' - } - if (id.includes('plugin-vue:export-helper')) { - return 'framework' - } - if ( - id.includes(`${clientDir}/app`) && - id !== `${clientDir}/app/index.js` - ) { - return 'framework' - } - if ( - isEagerChunk(id, getModuleInfo) && - /@vue\/(runtime|shared|reactivity)/.test(id) + id.includes('plugin-vue:export-helper') || + (id.includes(`${clientDir}/app`) && + id !== `${clientDir}/app/index.js`) || + (isEagerChunk(id, getModuleInfo) && + /@vue\/(runtime|shared|reactivity)/.test(id)) ) { return 'framework' } diff --git a/src/node/build/render.ts b/src/node/build/render.ts index 14410fe5..570418ff 100644 --- a/src/node/build/render.ts +++ b/src/node/build/render.ts @@ -2,7 +2,7 @@ import { isBooleanAttr } from '@vue/shared' import fs from 'node:fs' import { mkdir, writeFile } from 'node:fs/promises' import path from 'node:path' -import { minify, normalizePath, type Rolldown } from 'vite' +import { minifySync, normalizePath, type Rolldown } from 'vite' import { version } from '../../../package.json' import type { SiteConfig } from '../config' import { @@ -246,7 +246,7 @@ async function renderHead(head: HeadConfig[]): Promise { tag === 'script' && (attrs.type === undefined || attrs.type.includes('javascript')) ) { - innerHTML = await minifyScript(innerHTML, 'inline-script.js') + innerHTML = minifySync('inline-script.js', innerHTML).code } return `${openTag}${innerHTML}` } else { @@ -266,10 +266,6 @@ function renderAttrs(attrs: Record): string { .join('') } -async function minifyScript(code: string, filename: string): Promise { - return (await minify(filename, code)).code.trim() -} - function filterOutHeadDescription(head: HeadConfig[] = []) { return head.filter(([type, attrs]) => { return !(type === 'meta' && attrs?.name === 'description') From 470c4e018a4006dc9b79bae8beb0c181aebad10e Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sun, 5 Jul 2026 10:47:51 +0530 Subject: [PATCH 037/187] refactor: clean up types --- src/node/build/build.ts | 65 +++++++++++++++++++++------------------- src/node/build/bundle.ts | 35 +++++++++++----------- src/node/build/render.ts | 17 ++++++----- src/node/plugin.ts | 11 ++++--- 4 files changed, 65 insertions(+), 63 deletions(-) diff --git a/src/node/build/build.ts b/src/node/build/build.ts index 0b1da0c2..3bce78bd 100644 --- a/src/node/build/build.ts +++ b/src/node/build/build.ts @@ -65,39 +65,42 @@ export async function build( const { render } = await nativeImport(entryPath) await task('rendering pages', async () => { - const appChunk = - clientResult && - (clientResult.output.find( - (chunk) => - chunk.type === 'chunk' && - chunk.isEntry && - chunk.facadeModuleId?.endsWith('.js') - ) as Rolldown.OutputChunk) - - const cssChunk = ( - siteConfig.mpa ? serverResult : clientResult! - ).output.find( - (chunk) => chunk.type === 'asset' && chunk.fileName.endsWith('.css') - ) as Rolldown.OutputAsset - - const assets = (siteConfig.mpa ? serverResult : clientResult!).output - .filter( - (chunk) => chunk.type === 'asset' && !chunk.fileName.endsWith('.css') - ) - .map((asset) => siteConfig.site.base + asset.fileName) + const clientOutput: (Rolldown.OutputChunk | Rolldown.OutputAsset)[] = + clientResult?.output || [] + + const appChunk = clientOutput.find( + (chunk): chunk is Rolldown.OutputChunk => + chunk.type === 'chunk' && + chunk.isEntry && + !!chunk.facadeModuleId?.endsWith('.js') + ) - // default theme special handling: inject font preload - // custom themes will need to use `transformHead` to inject this - const additionalHeadTags: HeadConfig[] = [] - const isDefaultTheme = - clientResult && - clientResult.output.some( - (chunk) => - chunk.type === 'chunk' && - chunk.name === 'theme' && - chunk.moduleIds.some((id) => id.includes('client/theme-default')) - ) + const isDefaultTheme = clientOutput.some( + (chunk): chunk is Rolldown.OutputChunk => + chunk.type === 'chunk' && + chunk.name === 'theme' && + chunk.moduleIds.some((id) => id.includes('client/theme-default')) + ) + + // ---- + const resultOutput: (Rolldown.OutputChunk | Rolldown.OutputAsset)[] = + (siteConfig.mpa ? serverResult : clientResult)?.output || [] + + const cssChunk = resultOutput.find( + (chunk): chunk is Rolldown.OutputAsset => + chunk.type === 'asset' && chunk.fileName.endsWith('.css') + ) + + // prettier-ignore + const assets = resultOutput.filter( + (chunk): chunk is Rolldown.OutputAsset => + chunk.type === 'asset' && !chunk.fileName.endsWith('.css') + ).map((asset) => siteConfig.site.base + asset.fileName) + + // ---- + + const additionalHeadTags: HeadConfig[] = [] const metadataScript = generateMetadataScript(pageToHashMap, siteConfig) if (isDefaultTheme) { diff --git a/src/node/build/bundle.ts b/src/node/build/bundle.ts index ad25459b..f851b3d5 100644 --- a/src/node/build/bundle.ts +++ b/src/node/build/bundle.ts @@ -2,6 +2,7 @@ import fs from 'node:fs' import { cp } from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' +import pMap from 'p-map' import { build, normalizePath, @@ -102,8 +103,8 @@ export async function bundle( app: path.resolve(APP_PATH, ssr ? 'ssr.js' : 'index.js'), ...input }, - // important so that each page chunk and the index export things for each - // other + // important so that each page chunk and the index export things for + // each other preserveEntrySignatures: 'allow-extension', output: { sanitizeFileName, @@ -170,42 +171,40 @@ export async function bundle( configFile: config.vite?.configFile }) - let clientResult!: Rolldown.RolldownOutput | null + let clientResult: Rolldown.RolldownOutput | null = null let serverResult!: Rolldown.RolldownOutput + // prettier-ignore await task('building client + server bundles', async () => { - clientResult = config.mpa - ? null - : ((await build( - await resolveViteConfig(false) - )) as Rolldown.RolldownOutput) - serverResult = (await build( - await resolveViteConfig(true) - )) as Rolldown.RolldownOutput + if (!config.mpa) clientResult = + (await build(await resolveViteConfig(false))) as Rolldown.RolldownOutput + serverResult = + (await build(await resolveViteConfig(true))) as Rolldown.RolldownOutput }) if (config.mpa) { // in MPA mode, we need to copy over the non-js asset files from the // server build since there is no client-side build. - await Promise.all( - serverResult.output.map(async (chunk) => { + await pMap( + serverResult.output, + async (chunk) => { if (!chunk.fileName.endsWith('.js')) { const tempPath = path.resolve(config.tempDir, chunk.fileName) const outPath = path.resolve(config.outDir, chunk.fileName) await cp(tempPath, outPath) } - }) + }, + { concurrency: config.buildConcurrency } ) + // also copy over public dir const publicDir = path.resolve(config.srcDir, 'public') if (fs.existsSync(publicDir)) { // dereference symlinks like vite's own publicDir copy does, and so that // copying over an existing symlinked file does not fail with EEXIST - await cp(publicDir, config.outDir, { - recursive: true, - dereference: true - }) + await cp(publicDir, config.outDir, { recursive: true, dereference: true }) } + // build ` @@ -227,12 +227,13 @@ function resolvePageImports( } srcPath = normalizePath(srcPath) const pageChunk = result.output.find( - (chunk) => chunk.type === 'chunk' && chunk.facadeModuleId === srcPath - ) as Rolldown.OutputChunk + (chunk): chunk is Rolldown.OutputChunk => + chunk.type === 'chunk' && chunk.facadeModuleId === srcPath + ) return [ ...appChunk.imports, // ...appChunk.dynamicImports, - ...pageChunk.imports + ...(pageChunk?.imports || []) // ...pageChunk.dynamicImports ] } diff --git a/src/node/plugin.ts b/src/node/plugin.ts index 09bc3e88..e415bde6 100644 --- a/src/node/plugin.ts +++ b/src/node/plugin.ts @@ -53,14 +53,13 @@ const staticRestoreRE = /__VP_STATIC_(START|END)__/g // media queries. const scriptClientRE = /]*client\b[^>]*>([^]*?)<\/script>/ -const isPageChunk = ( - chunk: Rolldown.OutputAsset | Rolldown.OutputChunk -): chunk is Rolldown.OutputChunk & { facadeModuleId: string } => +const isPageChunk = ( + chunk: Rolldown.OutputAsset | T +): chunk is T => !!( chunk.type === 'chunk' && chunk.isEntry && - chunk.facadeModuleId && - chunk.facadeModuleId.endsWith('.md') + chunk.facadeModuleId?.endsWith('.md') ) const cleanUrl = (url: string): string => url.replace(/[?#].*$/s, '') @@ -285,7 +284,7 @@ export async function createVitePressPlugin( }, renderChunk(code, chunk) { - if (!ssr && isPageChunk(chunk as Rolldown.OutputChunk)) { + if (!ssr && isPageChunk(chunk)) { // For each page chunk, inject marker for start/end of static strings. // we do this here because in generateBundle the chunks would have been // minified and we won't be able to safely locate the strings. From 9315fc182229f13ee793dc44107947b2fe6ab50e Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Tue, 7 Jul 2026 00:49:39 +0530 Subject: [PATCH 038/187] fix: disable pluginTimings and invalidAnnotation for now --- src/node/build/bundle.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/node/build/bundle.ts b/src/node/build/bundle.ts index f851b3d5..be280a3a 100644 --- a/src/node/build/bundle.ts +++ b/src/node/build/bundle.ts @@ -165,6 +165,11 @@ export async function bundle( ] } }) + }, + checks: { + invalidAnnotation: false, // FIXME: remove when vueuse releases a new version + pluginTimings: false, + ...rolldownOptions?.checks } } }, From ca5789090ebe23b2bcba9e1d8662c2b7e9d56a70 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Tue, 7 Jul 2026 00:58:05 +0530 Subject: [PATCH 039/187] release: v2.0.0-alpha.18 --- CHANGELOG.md | 42 ++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3c1b636..624343d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,45 @@ +## [2.0.0-alpha.18](https://github.com/vuejs/vitepress/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2026-07-06) + +### Bug Fixes + +- **build:** apply `base` to links with download attribute ([#5186](https://github.com/vuejs/vitepress/issues/5186)) ([01987c4](https://github.com/vuejs/vitepress/commit/01987c4c0838478a8fda81f427775f28476c5557)) +- **build:** normalize rewrite drive letters ([#5245](https://github.com/vuejs/vitepress/issues/5245)) ([5c50b99](https://github.com/vuejs/vitepress/commit/5c50b99724815a6fb3d2311e801dcad4aeb9b412)) +- **build:** show dead link line numbers ([#5230](https://github.com/vuejs/vitepress/issues/5230)) ([c37bde6](https://github.com/vuejs/vitepress/commit/c37bde6308fb9f202e224f5eb38c0fac35468ea6)) +- compose markdown config when extending configs ([#5236](https://github.com/vuejs/vitepress/issues/5236)) ([04f4fba](https://github.com/vuejs/vitepress/commit/04f4fbadbdc05c75dbf3564c21404540d570d43b)) +- delete undefined values while merging sidepanel props ([cc30b10](https://github.com/vuejs/vitepress/commit/cc30b10b60beb862f85915055dc97651703bf250)) +- disable pluginTimings and invalidAnnotation for now ([9315fc1](https://github.com/vuejs/vitepress/commit/9315fc182229f13ee793dc44107947b2fe6ab50e)) +- don't invalidate framework chunk when a new asset is added ([c0e2e18](https://github.com/vuejs/vitepress/commit/c0e2e1809464c48435a22a0aa9468ff5e562791d)) +- escape description in head ([d96bf1d](https://github.com/vuejs/vitepress/commit/d96bf1dc616599609d8a24af7183aee6a7b9ae07)) +- index rewritten local search pages by locale ([#5241](https://github.com/vuejs/vitepress/issues/5241)) ([80cf265](https://github.com/vuejs/vitepress/commit/80cf2650aa5fa4b49093509f60766cc5b28c19bc)) +- keep translation links in the current tab ([#5158](https://github.com/vuejs/vitepress/issues/5158)) ([202ee70](https://github.com/vuejs/vitepress/commit/202ee7026054ac5c721bbdbf196426628b0c9b18)) +- normalize `/index` to `/` ([856858d](https://github.com/vuejs/vitepress/commit/856858d26a78f2e19e2c8ee23c2e85a95dbfdd29)), closes [#5165](https://github.com/vuejs/vitepress/issues/5165) +- preserve Agent Studio DocSearch options ([#5254](https://github.com/vuejs/vitepress/issues/5254)) ([f29ffdb](https://github.com/vuejs/vitepress/commit/f29ffdbb33022eb41327fec836f9cfbc16bf01d8)) +- preserve external sidebar links with base ([#5243](https://github.com/vuejs/vitepress/issues/5243)) ([ddf178a](https://github.com/vuejs/vitepress/commit/ddf178a170967527bafe7c9b262fb66aa10ec9de)) +- prevent DocSearch SVG clipping in WebKit ([#5240](https://github.com/vuejs/vitepress/issues/5240)) ([a357e5e](https://github.com/vuejs/vitepress/commit/a357e5ef67ed266861877eb08da753b2141a784f)) +- strip frontmatter before heading includes ([#5246](https://github.com/vuejs/vitepress/issues/5246)) ([e68fade](https://github.com/vuejs/vitepress/commit/e68fade75d2259b10695e85277f5483a084e3ae7)) +- **theme:** avatars misaligned in team member cards ([6730fb8](https://github.com/vuejs/vitepress/commit/6730fb84620c852b516de59f6f7c39c4f04f0e37)), closes [#5160](https://github.com/vuejs/vitepress/issues/5160) +- **theme:** correct mixed LTR/RTL text rendering in code blocks ([73f7b0b](https://github.com/vuejs/vitepress/commit/73f7b0b984853758d41e897dd43e5e93a1066266)) +- **theme:** keep external link icon inline ([#5232](https://github.com/vuejs/vitepress/issues/5232)) ([756a88c](https://github.com/vuejs/vitepress/commit/756a88cfa2f8f71400362327d2255cb8b5ccacfa)) +- **theme:** prevent `sub` and `sup` elements from affecting line height ([19357f9](https://github.com/vuejs/vitepress/commit/19357f9d337472572a500b8d2af8ef97932bfdda)), closes [#5173](https://github.com/vuejs/vitepress/issues/5173) +- use resolveDynamicComponent instead of resolveComponent ([9da1e3e](https://github.com/vuejs/vitepress/commit/9da1e3e70f41b7b8cb81f791307c778d65854f7a)) + +### Features + +- add macOS local search navigation shortcuts ([#5237](https://github.com/vuejs/vitepress/issues/5237)) ([e635e9e](https://github.com/vuejs/vitepress/commit/e635e9e5ea2876a293954970c6a00d6e09cb50a5)) +- add support for `format` option in Carbon options ([#5188](https://github.com/vuejs/vitepress/issues/5188)) ([6ee01bf](https://github.com/vuejs/vitepress/commit/6ee01bf30534cbf7847fe8c94fbf23efd9637f68)) +- allow custom i18n routing ([#5239](https://github.com/vuejs/vitepress/issues/5239)) ([eef5742](https://github.com/vuejs/vitepress/commit/eef57427f4861939ff27f07d71587e68118064e2)) +- allow VPContent to use custom components ([#5176](https://github.com/vuejs/vitepress/issues/5176)) ([c0b38d5](https://github.com/vuejs/vitepress/commit/c0b38d52c270e4efb59effa8ab7207535c48ec05)) +- **markdown:** expose Shiki color replacements in markdown options ([#5153](https://github.com/vuejs/vitepress/issues/5153)) ([fccc617](https://github.com/vuejs/vitepress/commit/fccc6171024f1b0087dd963dbe5a6236081b5d3d)) +- migrate to vite 8 ([228eef1](https://github.com/vuejs/vitepress/commit/228eef187ae33d1676a79e466d289c0e6e9ab321)) +- show local search loading state ([#5252](https://github.com/vuejs/vitepress/issues/5252)) ([7e2273a](https://github.com/vuejs/vitepress/commit/7e2273a3e470da2777c2510b51262e85879f2ee9)) +- support scroll-margin / scroll-padding ([6cce766](https://github.com/vuejs/vitepress/commit/6cce76685da39f8b5c75da047f847f82f70b9c4e)) +- support social link target option ([#5242](https://github.com/vuejs/vitepress/issues/5242)) ([d0159c8](https://github.com/vuejs/vitepress/commit/d0159c8a850cbd2a010a3d44bdeb97c3db651d0e)) + +### BREAKING CHANGES + +- VitePress now uses Vite 8. If you are using Vite plugins in your config, please check the Vite 8 migration guide for any breaking changes that may affect you. +- `scrollOffset` from config is removed. Users wanting to customize scroll offset should customize `scroll-margin-top` via CSS instead. `smoothScroll` support from `router.go` is also removed as it didn't work as expected for most users. Users wanting smooth scrolling should set `scroll-behavior: smooth` in CSS, ideally inside a `@media (prefers-reduced-motion: no-preference)` block. + ## [2.0.0-alpha.17](https://github.com/vuejs/vitepress/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2026-03-19) ### Bug Fixes diff --git a/package.json b/package.json index 4fe35fc8..99fd0c10 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vitepress", - "version": "2.0.0-alpha.17", + "version": "2.0.0-alpha.18", "description": "Vite & Vue powered static site generator", "keywords": [ "vite", From 26a6d405efe7bfd192745c6467c711fbb9efd40f Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Tue, 7 Jul 2026 01:07:40 +0530 Subject: [PATCH 040/187] docs: mention dropped node 20 support in changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 624343d5..a2b103aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ ### BREAKING CHANGES - VitePress now uses Vite 8. If you are using Vite plugins in your config, please check the Vite 8 migration guide for any breaking changes that may affect you. +- Node 20 support is dropped. v22 or higher is needed. - `scrollOffset` from config is removed. Users wanting to customize scroll offset should customize `scroll-margin-top` via CSS instead. `smoothScroll` support from `router.go` is also removed as it didn't work as expected for most users. Users wanting smooth scrolling should set `scroll-behavior: smooth` in CSS, ideally inside a `@media (prefers-reduced-motion: no-preference)` block. ## [2.0.0-alpha.17](https://github.com/vuejs/vitepress/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2026-03-19) From 529241c26edf9cd747429cca28ce4a524403ebef Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Tue, 7 Jul 2026 01:08:34 +0530 Subject: [PATCH 041/187] docs: add link to vite 8 migration guide --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2b103aa..3240a3db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,7 +37,7 @@ ### BREAKING CHANGES -- VitePress now uses Vite 8. If you are using Vite plugins in your config, please check the Vite 8 migration guide for any breaking changes that may affect you. +- VitePress now uses Vite 8. If you are using Vite plugins in your config, please check the [Vite 8 migration guide](https://vite.dev/guide/migration) for any breaking changes that may affect you. - Node 20 support is dropped. v22 or higher is needed. - `scrollOffset` from config is removed. Users wanting to customize scroll offset should customize `scroll-margin-top` via CSS instead. `smoothScroll` support from `router.go` is also removed as it didn't work as expected for most users. Users wanting smooth scrolling should set `scroll-behavior: smooth` in CSS, ideally inside a `@media (prefers-reduced-motion: no-preference)` block. From d30f32246dffcf279e7bc2bc73a979821bd9f24c Mon Sep 17 00:00:00 2001 From: Bugo <229402+dragomano@users.noreply.github.com> Date: Tue, 7 Jul 2026 10:14:30 +0500 Subject: [PATCH 042/187] docs(ru): update translations (#5296) --- docs/ru/config.ts | 2 +- docs/ru/guide/cms.md | 2 +- docs/ru/guide/custom-theme.md | 20 +++- docs/ru/guide/deploy.md | 7 ++ docs/ru/guide/getting-started.md | 4 + docs/ru/reference/default-theme-config.md | 22 +++- docs/ru/reference/default-theme-search.md | 3 +- docs/ru/reference/runtime-api.md | 14 +++ docs/ru/reference/site-config.md | 129 ++++++++++++++++------ 9 files changed, 165 insertions(+), 38 deletions(-) diff --git a/docs/ru/config.ts b/docs/ru/config.ts index aec80866..86f8452a 100644 --- a/docs/ru/config.ts +++ b/docs/ru/config.ts @@ -189,7 +189,7 @@ function searchOptions(): Partial { clearButtonAriaLabel: 'Очистить запрос', closeButtonText: 'Закрыть', closeButtonAriaLabel: 'Закрыть', - placeholderText: 'Поиск по документации или задайте вопрос Ask AI', + placeholderText: 'Искать в документации или задать вопрос Ask AI', placeholderTextAskAi: 'Задайте другой вопрос...', placeholderTextAskAiStreaming: 'Отвечаю...', searchInputLabel: 'Поиск', diff --git a/docs/ru/guide/cms.md b/docs/ru/guide/cms.md index c55040c0..b3d12dee 100644 --- a/docs/ru/guide/cms.md +++ b/docs/ru/guide/cms.md @@ -1,5 +1,5 @@ --- -description: Подключите VitePress к безголовой CMS с помощью динамических маршрутов и загрузчиков данных. +description: Подключите VitePress к CMS без встроенного интерфейса с помощью динамических маршрутов и загрузчиков данных. outline: deep --- diff --git a/docs/ru/guide/custom-theme.md b/docs/ru/guide/custom-theme.md index fdbd1caf..3cb62035 100644 --- a/docs/ru/guide/custom-theme.md +++ b/docs/ru/guide/custom-theme.md @@ -67,6 +67,24 @@ export default { } ``` +Значение `router` представляет собой тот же экземпляр маршрутизатора VitePress, который возвращает [`useRouter()`](../reference/runtime-api#userouter). Чтобы отслеживать изменения маршрутов, назначьте обработчики для маршрутизатора: + +```ts [.vitepress/theme/index.ts] +export default { + enhanceApp({ router }) { + router.onBeforeRouteChange = (to) => { + console.log('navigating to', to) + } + + router.onAfterRouteChange = (to) => { + console.log('navigated to', to) + } + } +} +``` + +Верните `false` из `onBeforeRouteChange` или `onBeforePageLoad`, чтобы отменить переход. + Экспорт по умолчанию является единственным контрактом для пользовательской темы, и только свойство `Layout` является обязательным. Таким образом, технически тема VitePress может быть простой, как один компонент Vue. Внутри компонент макета работает так же, как и обычное приложение Vite + Vue 3. Обратите внимание, что тема также должна быть [SSR-совместимой](./ssr-compat). @@ -156,7 +174,7 @@ const { page, frontmatter } = useData() ## Распространение пользовательской темы {#distributing-a-custom-theme} -Самый простой способ распространить пользовательскую тему — предоставить её в виде [репозитория шаблонов на GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-template-repository). +Самый простой способ распространить пользовательскую тему — предоставить её в виде [репозитория шаблонов на GitHub](https://docs.github.com/ru/repositories/creating-and-managing-repositories/creating-a-template-repository). Если вы хотите распространить тему в виде пакета npm, выполните следующие действия: diff --git a/docs/ru/guide/deploy.md b/docs/ru/guide/deploy.md index f92761e5..56cc8a0a 100644 --- a/docs/ru/guide/deploy.md +++ b/docs/ru/guide/deploy.md @@ -166,6 +166,13 @@ Cache-Control: max-age=31536000,immutable with: node-version: 24 cache: npm # или pnpm / yarn + - name: Cache VitePress + uses: actions/cache@v4 + with: + path: docs/.vitepress/cache + key: ${{ runner.os }}-vitepress-${{ hashFiles('docs/**', 'package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lockb') }} + restore-keys: | + ${{ runner.os }}-vitepress- - name: Setup Pages uses: actions/configure-pages@v4 - name: Install dependencies diff --git a/docs/ru/guide/getting-started.md b/docs/ru/guide/getting-started.md index 7a4650fb..e88ddc00 100644 --- a/docs/ru/guide/getting-started.md +++ b/docs/ru/guide/getting-started.md @@ -37,6 +37,10 @@ $ yarn add -D vitepress@next vue $ bun add -D vitepress@next ``` +```sh [deno] +$ deno add -D vitepress@next +``` + ::: ::: tip ПРИМЕЧАНИЕ diff --git a/docs/ru/reference/default-theme-config.md b/docs/ru/reference/default-theme-config.md index 99689bd1..796b5bb4 100644 --- a/docs/ru/reference/default-theme-config.md +++ b/docs/ru/reference/default-theme-config.md @@ -25,10 +25,28 @@ export default { ## i18nRouting -- Тип: `boolean` +- Тип: `boolean | ((data: VitePressData, hash: string, targetLocale: string) => string)` При смене локали на `ru` URL изменится с `/foo` (или `/en/foo/`) на `/ru/foo`. Вы можете отключить это поведение, установив для параметра `themeConfig.i18nRouting` значение `false`. +Установите для `themeConfig.i18nRouting` функцию, чтобы настроить ссылки для переключения локали. Эта функция получает текущие данные VitePress, текущий хеш и ключ целевой локали, а затем возвращает ссылку для перехода на неё. + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + i18nRouting(data, hash, targetLocale) { + const target = data.site.value.locales[targetLocale] + const targetLink = + target.link || (targetLocale === 'root' ? '/' : `/${targetLocale}/`) + + return `${targetLink}${data.page.value.relativePath.replace(/\.md$/, '')}${hash}` + } + } +}) +``` + ## logo - Тип: `ThemeableImage` @@ -235,6 +253,7 @@ export default { // Можно добавить любую иконку из simple-icons (https://simpleicons.org/): { icon: 'github', link: 'https://github.com/vuejs/vitepress' }, { icon: 'twitter', link: '...' }, + { icon: 'discord', link: '/community', target: '_self' }, // Можно добавить пользовательские иконки, передав SVG в виде строки: { icon: { @@ -254,6 +273,7 @@ interface SocialLink { icon: string | { svg: string } link: string ariaLabel?: string + target?: string } ``` diff --git a/docs/ru/reference/default-theme-search.md b/docs/ru/reference/default-theme-search.md index 838e7cea..efead057 100644 --- a/docs/ru/reference/default-theme-search.md +++ b/docs/ru/reference/default-theme-search.md @@ -276,7 +276,6 @@ export default defineConfig({ askAi: { assistantId: 'XXXYYY', sidePanel: { - // Отражает API @docsearch/sidepanel-js SidepanelProps panel: { variant: 'floating', // или 'inline' side: 'right', @@ -292,6 +291,8 @@ export default defineConfig({ }) ``` +Используйте `askAi.sidePanel.panel.suggestedQuestions` для настройки рекомендуемых вопросов в боковой панели. В примерах автономного Ask AI от Algolia также упоминается `askAi.suggestedQuestions`, однако одного этого параметра верхнего уровня недостаточно для режима боковой панели VitePress, и он не позволяет встроенному модальному окну поиска по ключевым словам отображать рекомендуемые вопросы при первом открытии. + Если вам нужно отключить сочетание клавиш, используйте опцию `keyboardShortcuts` боковой панели: ```ts diff --git a/docs/ru/reference/runtime-api.md b/docs/ru/reference/runtime-api.md index efbaae88..5157bd67 100644 --- a/docs/ru/reference/runtime-api.md +++ b/docs/ru/reference/runtime-api.md @@ -62,6 +62,8 @@ interface PageData { } ``` +`page.headers` заполняется только в том случае, если включён параметр [markdown.headers](./site-config#markdown). Без него это свойство остаётся пустым массивом. Оглавление в теме по умолчанию получает заголовки из уже отрендеренного содержимого страницы, поэтому оно может отображаться, даже если `page.headers` пуст. + **Пример:** ```vue @@ -122,6 +124,18 @@ interface Router { } ``` +Назначьте обработчики изменения маршрутов для экземпляра маршрутизатора: + +```ts +const router = useRouter() + +router.onBeforeRouteChange = (to) => { + console.log('переход к', to) +} +``` + +В пользовательских темах этот же экземпляр маршрутизатора доступен через [`enhanceApp`](../guide/custom-theme#theme-interface). + ## `withBase` {#withbase} - **Тип**: `(path: string) => string` diff --git a/docs/ru/reference/site-config.md b/docs/ru/reference/site-config.md index d8c0d255..b04a3bdd 100644 --- a/docs/ru/reference/site-config.md +++ b/docs/ru/reference/site-config.md @@ -134,13 +134,43 @@ export default defineConfigWithTheme({ Вы можете настроить базовый экземпляр [Markdown-It](https://github.com/markdown-it/markdown-it) с помощью опции [markdown](#markdown) в конфигурации VitePress. +### Переопределение на уровне страницы {#page-level-overrides} + +Некоторые настройки можно переопределить для отдельных страниц с помощью метаданных. + +Подробности см. в разделе [Конфигурация метаданных](./frontmatter-config). + +### Переопределение на уровне директории {#directory-level-overrides} + +Некоторые параметры конфигурации можно переопределить на уровне директории, что позволяет всем страницам в этой директории использовать общие настройки без необходимости повторять их в блоке метаданных каждой страницы. + +Для этого добавьте файл с именем `config.ts` (или `.js`, `.mjs` или `.mts`) в соответствующую директорию. Этот файл должен экспортировать объект конфигурации с помощью `export default`, аналогично основному файлу конфигурации. + +Вложенные директории наследуют настройки от родительской директории, при этом переопределения конфигурации объединяются соответствующим образом. + +Вспомогательную функцию `defineAdditionalConfig` можно использовать для получения подсказок TypeScript по доступным параметрам, однако, как и в случае с `defineConfig`, её использование необязательно. + +Например, для сайта с несколькими языками может потребоваться разное значение `description` для каждого языка. Мы можем добавить файл `es/config.ts` со следующим содержимым: + +```ts +import { defineAdditionalConfig } from 'vitepress' + +export default defineAdditionalConfig({ + description: 'Generador de Sitios Estáticos desarrollado con Vite y Vue.' +}) +``` + +Этот `description` затем будет использоваться для всех страниц в директории `es`. + +В качестве альтернативы, при использовании встроенных возможностей i18n настройки для директории локали можно переопределить через параметр `locales` в основном файле конфигурации. Подробности см. в разделе [Интернационализация](../guide/i18n). + ## Метаданные сайта {#site-metadata} ### title {#title} - Тип: `string` - По умолчанию: `VitePress` -- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#title) +- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#title) или на [уровне директории](#directory-level-overrides) Название для сайта. При использовании темы по умолчанию оно будет отображаться в панели навигации. @@ -161,7 +191,7 @@ export default { ### titleTemplate {##titletemplate} - Тип: `string | boolean` -- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#titletemplate) +- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#titletemplate) или на [уровне директории](#directory-level-overrides) Позволяет настраивать суффикс заголовка каждой страницы или весь заголовок. Например: @@ -194,7 +224,7 @@ export default { - Тип: `string` - По умолчанию: `A VitePress site` -- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#description) +- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#description) или на [уровне директории](#directory-level-overrides) Описание для сайта. Это будет отображаться как тег `` в HTML-странице. @@ -208,7 +238,7 @@ export default { - Тип: `HeadConfig[]` - По умолчанию: `[]` -- Можно добавлять на страницу через [метаданные](./frontmatter-config#head) +- Можно добавлять на страницу через [метаданные](./frontmatter-config#head) или на [уровне директории](#directory-level-overrides) Дополнительные элементы для отображения в теге `` в HTML-странице. Добавленные пользователем теги выводятся перед закрывающим тегом `head`, после тегов VitePress. @@ -320,6 +350,7 @@ export default { - Тип: `string` - По умолчанию: `en-US` +- Может быть переопределено [на уровне директории](#directory-level-overrides) Атрибут lang для сайта. Будет выглядеть как тег `` в HTML-странице. @@ -530,6 +561,8 @@ export default { Проверьте [объявление типа и jsdocs](https://github.com/vuejs/vitepress/blob/main/src/node/markdown/markdown.ts) на наличие всех доступных опций. +Установите `markdown.headers` в значение `true` или передайте параметры [`@mdit-vue/plugin-headers`](https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-headers), чтобы собирать заголовки в [`useData().page.headers`](./runtime-api#usedata). Этот параметр отключён по умолчанию. + ### vite {#vite} - Тип: `import('vite').UserConfig` @@ -607,7 +640,7 @@ interface SSGContext { - Тип: `(context: TransformContext) => Awaitable` -`transformHead` — это хук сборки для преобразования заголовка перед генерацией каждой страницы. Это позволит вам добавить в конфигурацию VitePress записи, которые не могут быть добавлены статически. Вам нужно только вернуть дополнительные записи, они будут автоматически объединены с существующими. +`transformHead` — это хук сборки для добавления дополнительных тегов в `` каждой страницы. Он позволяет добавлять элементы в head, которые невозможно статически добавить в конфигурацию VitePress. Вам нужно только вернуть дополнительные элементы — они будут автоматически объединены с уже существующими. ::: warning ПРЕДУПРЕЖДЕНИЕ Не мутируйте ничего внутри `context`. @@ -635,44 +668,38 @@ interface TransformContext { } ``` -Обратите внимание, что этот хук вызывается только при статической генерации сайта. Он не вызывается во время разработки. Если вам нужно добавить динамические записи в голову во время разработки, вместо этого вы можете использовать хук [`transformPageData`](#transformpagedata): +Этот хук вызывается только при выполнении сборки и не вызывается в режиме разработки. -```ts -export default { - transformPageData(pageData) { - pageData.frontmatter.head ??= [] - pageData.frontmatter.head.push([ - 'meta', - { - name: 'og:title', - content: - pageData.frontmatter.layout === 'home' - ? `VitePress` - : `${pageData.title} | VitePress` - } - ]) - } -} -``` +Дополнительные теги будут добавлены в статические HTML-файлы, созданные во время сборки. Они не будут обновляться при навигации на стороне клиента. -#### Пример: Добавление канонического URL-адреса `` {#example-adding-a-canonical-url-link} +Во многих случаях более подходящим решением будет использование хука [`transformPageData`](#transformpagedata). Этот хук также применяется как при клиентской навигации, так и в режиме разработки. Однако если генерация тегов head требует значительных вычислительных ресурсов, `transformHead` позволяет избежать этих затрат во время разработки. + +#### Пример: добавление мета-тега `og:image` {#example-adding-og-image-meta} ```ts export default { - transformPageData(pageData) { - const canonicalUrl = `https://example.com/${pageData.relativePath}` - .replace(/index\.md$/, '') - .replace(/\.md$/, '.html') + async transformHead(context) { + if (context.page === '404.md') { + return + } - pageData.frontmatter.head ??= [] - pageData.frontmatter.head.push([ - 'link', - { rel: 'canonical', href: canonicalUrl } - ]) + // Детали реализации `generatePageImage` зависят от ваших требований. + // Здесь мы предполагаем, что она создаёт подходящее изображение + // для каждой страницы и возвращает URL изображения. + const imageUrl = await generatePageImage(context) + + return [[ + 'meta', + { name: 'og:image', content: imageUrl } + ]] } } ``` +Здесь мы предполагаем, что URL изображения является динамическим и требует много времени для генерации. Использование `transformHead` позволяет избежать этих затрат во время разработки. + +Для более простых случаев может быть достаточно использовать параметр [`head`](./frontmatter-config#head) в метаданных или [`transformPageData`](#transformpagedata). + ### transformHtml {#transformhtml} - Тип: `(code: string, id: string, context: TransformContext) => Awaitable` @@ -721,3 +748,39 @@ interface TransformPageContext { siteConfig: SiteConfig } ``` + +#### Пример: добавление `` {#example-adding-a-meta-name-og-title} + +```ts +export default { + transformPageData(pageData) { + const title = pageData.frontmatter.layout === 'home' + ? 'VitePress' + : `${pageData.title} | VitePress` + + pageData.frontmatter.head ??= [] + pageData.frontmatter.head.push([ + 'meta', + { name: 'og:title', content: title } + ]) + } +} +``` + +#### Пример: добавление `` с каноническим URL {#example-adding-a-canonical-url-link} + +```ts +export default { + transformPageData(pageData) { + const canonicalUrl = `https://example.com/${pageData.relativePath}` + .replace(/index\.md$/, '') + .replace(/\.md$/, '.html') + + pageData.frontmatter.head ??= [] + pageData.frontmatter.head.push([ + 'link', + { rel: 'canonical', href: canonicalUrl } + ]) + } +} +``` From 6b5e7704a01500d87a3702f7b27f95a4bdcfa10d Mon Sep 17 00:00:00 2001 From: TowyTowy <85077986+TowyTowy@users.noreply.github.com> Date: Wed, 8 Jul 2026 20:25:44 +0200 Subject: [PATCH 043/187] fix(theme): pass target and rel to prev/next page links (#5297) Co-authored-by: Claude Fable 5 --- .../theme-default/support/sidebar.test.ts | 43 ++++++++++++++++++- .../theme-default/components/VPDocFooter.vue | 4 ++ .../theme-default/composables/prev-next.ts | 24 +++++++++-- src/client/theme-default/support/sidebar.ts | 6 ++- 4 files changed, 71 insertions(+), 6 deletions(-) diff --git a/__tests__/unit/client/theme-default/support/sidebar.test.ts b/__tests__/unit/client/theme-default/support/sidebar.test.ts index 91e8085b..7232757c 100644 --- a/__tests__/unit/client/theme-default/support/sidebar.test.ts +++ b/__tests__/unit/client/theme-default/support/sidebar.test.ts @@ -1,4 +1,8 @@ -import { getSidebar, hasActiveLink } from 'client/theme-default/support/sidebar' +import { + getFlatSideBarLinks, + getSidebar, + hasActiveLink +} from 'client/theme-default/support/sidebar' describe('client/theme-default/support/sidebar', () => { describe('getSidebar', () => { @@ -137,6 +141,43 @@ describe('client/theme-default/support/sidebar', () => { }) }) + describe('getFlatSideBarLinks', () => { + test('flattens nested items and preserves link metadata', () => { + const sidebar = [ + { + text: 'Group', + items: [ + { text: 'Intro', link: '/intro' }, + { + text: 'External', + link: 'https://example.com/', + target: '_self', + rel: 'noopener', + docFooterText: 'Go external' + } + ] + } + ] + + expect(getFlatSideBarLinks(sidebar)).toStrictEqual([ + { + text: 'Intro', + link: '/intro', + docFooterText: undefined, + rel: undefined, + target: undefined + }, + { + text: 'External', + link: 'https://example.com/', + docFooterText: 'Go external', + rel: 'noopener', + target: '_self' + } + ]) + }) + }) + describe('hasActiveLink', () => { test('checks `SidebarItem`', () => { const item = { diff --git a/src/client/theme-default/components/VPDocFooter.vue b/src/client/theme-default/components/VPDocFooter.vue index a05ca71a..45c6e32a 100644 --- a/src/client/theme-default/components/VPDocFooter.vue +++ b/src/client/theme-default/components/VPDocFooter.vue @@ -53,6 +53,8 @@ const showFooter = computed( v-if="control.prev?.link" class="pager-link prev" :href="control.prev.link" + :target="control.prev.target" + :rel="control.prev.rel" > Date: Thu, 9 Jul 2026 06:10:23 -0500 Subject: [PATCH 044/187] fix(theme): ensure outline marker follows click (#3879) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- .../theme-default/composables/outline.ts | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/client/theme-default/composables/outline.ts b/src/client/theme-default/composables/outline.ts index d12dc721..bc03203f 100644 --- a/src/client/theme-default/composables/outline.ts +++ b/src/client/theme-default/composables/outline.ts @@ -85,10 +85,12 @@ export function useActiveAnchor( const onScroll = throttleAndDebounce(setActiveLink, 100) let prevActiveLink: HTMLAnchorElement | null = null + let ignoreScrollOnce: boolean = false onMounted(() => { requestAnimationFrame(setActiveLink) window.addEventListener('scroll', onScroll) + container.value.addEventListener('click', onClick) }) onUpdated(() => { @@ -98,13 +100,33 @@ export function useActiveAnchor( onUnmounted(() => { window.removeEventListener('scroll', onScroll) + container.value.removeEventListener('click', onClick) }) + function onClick(e: MouseEvent) { + if (!isAsideEnabled.value) { + return + } + + const hash = + e.target instanceof Element ? e.target.closest('a')?.hash : null + + if (hash) { + ignoreScrollOnce = true + activateLink(hash) + } + } + function setActiveLink() { if (!isAsideEnabled.value) { return } + if (ignoreScrollOnce) { + ignoreScrollOnce = false + return + } + const scrollY = window.scrollY const innerHeight = window.innerHeight const offsetHeight = document.body.offsetHeight @@ -159,7 +181,7 @@ export function useActiveAnchor( prevActiveLink = null } else { prevActiveLink = container.value.querySelector( - `a[href="${decodeURIComponent(hash)}"]` + `a[href$="${decodeURIComponent(hash)}"]` ) } From 505278c2cb06c5ed4ca094b193d6dc912376818c Mon Sep 17 00:00:00 2001 From: Heptazhou Date: Fri, 10 Jul 2026 07:09:48 +0000 Subject: [PATCH 045/187] fix: prevent duplicate IDs in MiniSearch (#5303) --- src/node/plugins/localSearchPlugin.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/node/plugins/localSearchPlugin.ts b/src/node/plugins/localSearchPlugin.ts index 332c3294..b00552b8 100644 --- a/src/node/plugins/localSearchPlugin.ts +++ b/src/node/plugins/localSearchPlugin.ts @@ -134,6 +134,7 @@ export async function localSearchPlugin( if (!section || !(section.text || section.titles)) break const { anchor, text, titles } = section const id = anchor ? [fileId, anchor].join('#') : fileId + index.has(id) && index.discard(id) index.add({ id, text, From c8313a4bcd24af21cd829d7c4fd3792ecd0c17a7 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 10 Jul 2026 17:31:46 +0530 Subject: [PATCH 046/187] Revert "fix: prevent DocSearch SVG clipping in WebKit" (#5304) Revert "fix: prevent DocSearch SVG clipping in WebKit (#5240)" This reverts commit a357e5ef67ed266861877eb08da753b2141a784f. --- src/client/theme-default/styles/docsearch.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/client/theme-default/styles/docsearch.css b/src/client/theme-default/styles/docsearch.css index e71ba033..df9e8e64 100644 --- a/src/client/theme-default/styles/docsearch.css +++ b/src/client/theme-default/styles/docsearch.css @@ -41,10 +41,6 @@ --docsearch-modal-shadow: none; } -:is(.DocSearch-Container, .DocSearch-Sidepanel) svg { - overflow: visible; -} - .DocSearch-AskAiScreen-RelatedSources-Item-Link { padding: 8px 12px 8px 10px; } From d24d099cbd6069aa929d0c91f427dd750989cf54 Mon Sep 17 00:00:00 2001 From: Jackestar Date: Sat, 11 Jul 2026 11:14:01 -0400 Subject: [PATCH 047/187] docs(github): remove relative links from contributing.md (#5308) --- .github/contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/contributing.md b/.github/contributing.md index 5738cbc2..c2f14f4a 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -19,7 +19,7 @@ Hi! We're really excited that you are interested in contributing to VitePress. B - It's OK to have multiple small commits as you work on the PR - GitHub can automatically squash them before merging. -- Commit messages must follow the [commit message convention](./commit-convention.md) so that changelogs can be automatically generated. +- Commit messages must follow the [commit message convention](/.github/commit-convention.md) so that changelogs can be automatically generated. ## Development Setup From 225c94afd2c355a33fbbb93871fb9b064da475b8 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sun, 12 Jul 2026 16:14:14 +0530 Subject: [PATCH 048/187] fix(theme): external link icon not showing in navbar links closes #5306 --- src/client/theme-default/components/VPLink.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/client/theme-default/components/VPLink.vue b/src/client/theme-default/components/VPLink.vue index f087a88c..36977697 100644 --- a/src/client/theme-default/components/VPLink.vue +++ b/src/client/theme-default/components/VPLink.vue @@ -2,14 +2,16 @@ import { computed } from 'vue' import { isLinkExternal, normalizeLink } from '../support/utils' -const props = defineProps<{ +const props = withDefaults(defineProps<{ tag?: string href?: string noIcon?: boolean external?: boolean target?: string rel?: string -}>() +}>(), { + external: undefined, +}) const tag = computed(() => props.tag ?? (props.href ? 'a' : 'span')) const isExternal = computed(() => From 51ff681f4e5caf7dfff1f5c1c79a70aaf4785081 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sun, 12 Jul 2026 16:31:07 +0530 Subject: [PATCH 049/187] feat(theme): allow internal social links closes #5305 --- src/client/theme-default/components/VPSocialLink.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/theme-default/components/VPSocialLink.vue b/src/client/theme-default/components/VPSocialLink.vue index 7e441ebb..bed90fed 100644 --- a/src/client/theme-default/components/VPSocialLink.vue +++ b/src/client/theme-default/components/VPSocialLink.vue @@ -1,7 +1,7 @@ diff --git a/src/client/theme-default/components/VPNavBarExtra.vue b/src/client/theme-default/components/VPNavBarExtra.vue index 7201623b..1ddde9b9 100644 --- a/src/client/theme-default/components/VPNavBarExtra.vue +++ b/src/client/theme-default/components/VPNavBarExtra.vue @@ -8,7 +8,9 @@ import VPSocialLinks from './VPSocialLinks.vue' import VPSwitchAppearance from './VPSwitchAppearance.vue' const { site, theme } = useData() -const { localeLinks, currentLang } = useLangs({ correspondingLink: true }) +const { localeLinks, currentLang } = useLangs({ + linkToCorrespondingPage: true +}) const hasExtraContent = computed( () => @@ -38,6 +40,7 @@ const hasExtraContent = computed( :hreflang="locale.lang" rel="alternate" :dir="locale.dir" + data-allow-mismatch="attribute" /> diff --git a/src/client/theme-default/components/VPNavBarMenuGroup.vue b/src/client/theme-default/components/VPNavBarMenuGroup.vue index 4d014a49..61004f3f 100644 --- a/src/client/theme-default/components/VPNavBarMenuGroup.vue +++ b/src/client/theme-default/components/VPNavBarMenuGroup.vue @@ -1,19 +1,24 @@ diff --git a/src/client/theme-default/components/VPNavScreenMenu.vue b/src/client/theme-default/components/VPNavScreenMenu.vue index 77f358cb..8fa72da2 100644 --- a/src/client/theme-default/components/VPNavScreenMenu.vue +++ b/src/client/theme-default/components/VPNavScreenMenu.vue @@ -8,19 +8,21 @@ const { theme } = useData() diff --git a/src/client/theme-default/components/VPNavScreenMenuGroup.vue b/src/client/theme-default/components/VPNavScreenMenuGroup.vue index f5d78e66..78baed24 100644 --- a/src/client/theme-default/components/VPNavScreenMenuGroup.vue +++ b/src/client/theme-default/components/VPNavScreenMenuGroup.vue @@ -31,8 +31,8 @@ function toggle() { -
- -
+ + diff --git a/src/client/theme-default/components/VPNavScreenMenuGroupSection.vue b/src/client/theme-default/components/VPNavScreenMenuGroupSection.vue index a7e2cd38..e094a707 100644 --- a/src/client/theme-default/components/VPNavScreenMenuGroupSection.vue +++ b/src/client/theme-default/components/VPNavScreenMenuGroupSection.vue @@ -11,7 +11,11 @@ defineProps<{ diff --git a/src/client/theme-default/components/VPSidebarItem.vue b/src/client/theme-default/components/VPSidebarItem.vue index d71d1062..e4c63f2b 100644 --- a/src/client/theme-default/components/VPSidebarItem.vue +++ b/src/client/theme-default/components/VPSidebarItem.vue @@ -94,16 +94,16 @@ function onCaretClick() { -
- -
+ + diff --git a/src/client/theme-default/components/VPSocialLinks.vue b/src/client/theme-default/components/VPSocialLinks.vue index 062f7f62..f30b86c9 100644 --- a/src/client/theme-default/components/VPSocialLinks.vue +++ b/src/client/theme-default/components/VPSocialLinks.vue @@ -11,17 +11,17 @@ withDefaults(defineProps<{ diff --git a/src/client/theme-default/components/VPSponsorsGrid.vue b/src/client/theme-default/components/VPSponsorsGrid.vue index 65dbe81b..370e5af0 100644 --- a/src/client/theme-default/components/VPSponsorsGrid.vue +++ b/src/client/theme-default/components/VPSponsorsGrid.vue @@ -22,8 +22,8 @@ useSponsorsGrid({ el, size: props.size }) diff --git a/src/client/theme-default/components/VPTeamMembers.vue b/src/client/theme-default/components/VPTeamMembers.vue index 0337eb5a..6b83e4a6 100644 --- a/src/client/theme-default/components/VPTeamMembers.vue +++ b/src/client/theme-default/components/VPTeamMembers.vue @@ -17,11 +17,11 @@ const classes = computed(() => [props.size, `count-${props.members.length}`]) @@ -63,4 +63,15 @@ const classes = computed(() => [props.size, `count-${props.members.length}`]) margin: 0 auto; max-width: 1152px; } + +/* Reset styles from vp-doc if used in markdown */ +.vp-doc .VPTeamMembers .container { + list-style: none; + margin: 0 auto; + padding: 0; +} +.vp-doc .VPTeamMembers .item { + margin: 0; + padding: 0; +} diff --git a/src/client/theme-default/styles/components/vp-sponsor.css b/src/client/theme-default/styles/components/vp-sponsor.css index 9e677ab9..79de6b73 100644 --- a/src/client/theme-default/styles/components/vp-sponsor.css +++ b/src/client/theme-default/styles/components/vp-sponsor.css @@ -153,3 +153,11 @@ .dark .vp-sponsor-grid-image { filter: grayscale(1) invert(1); } + +/* Reset styles from vp-doc if used in markdown */ +.vp-doc .vp-sponsor-grid, +.vp-doc .vp-sponsor-grid-item { + list-style: none; + margin: 0; + padding: 0; +} From 70a918751b7c64dbecf3bd29edc2204014cbb84e Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 17 Jul 2026 13:29:05 +0530 Subject: [PATCH 065/187] docs: update vite's domain --- CHANGELOG.md | 2 +- docs/en/guide/asset-handling.md | 2 +- docs/en/guide/extending-default-theme.md | 4 ++-- docs/en/guide/getting-started.md | 2 +- docs/en/guide/ssr-compat.md | 2 +- docs/en/guide/using-vue.md | 2 +- docs/en/guide/what-is-vitepress.md | 4 ++-- docs/en/reference/site-config.md | 4 ++-- docs/es/guide/asset-handling.md | 2 +- docs/es/guide/extending-default-theme.md | 4 ++-- docs/es/guide/getting-started.md | 2 +- docs/es/guide/ssr-compat.md | 2 +- docs/es/guide/using-vue.md | 2 +- docs/es/guide/what-is-vitepress.md | 4 ++-- docs/es/reference/site-config.md | 4 ++-- docs/fa/guide/asset-handling.md | 2 +- docs/fa/guide/extending-default-theme.md | 4 ++-- docs/fa/guide/getting-started.md | 2 +- docs/fa/guide/ssr-compat.md | 2 +- docs/fa/guide/using-vue.md | 2 +- docs/fa/guide/what-is-vitepress.md | 4 ++-- docs/fa/reference/site-config.md | 4 ++-- docs/ja/guide/asset-handling.md | 2 +- docs/ja/guide/extending-default-theme.md | 4 ++-- docs/ja/guide/getting-started.md | 2 +- docs/ja/guide/ssr-compat.md | 2 +- docs/ja/guide/using-vue.md | 2 +- docs/ja/guide/what-is-vitepress.md | 4 ++-- docs/ja/reference/site-config.md | 4 ++-- docs/ko/guide/asset-handling.md | 2 +- docs/ko/guide/extending-default-theme.md | 4 ++-- docs/ko/guide/getting-started.md | 2 +- docs/ko/guide/ssr-compat.md | 2 +- docs/ko/guide/using-vue.md | 2 +- docs/ko/guide/what-is-vitepress.md | 4 ++-- docs/ko/reference/site-config.md | 4 ++-- docs/pt/guide/asset-handling.md | 2 +- docs/pt/guide/extending-default-theme.md | 4 ++-- docs/pt/guide/getting-started.md | 2 +- docs/pt/guide/ssr-compat.md | 2 +- docs/pt/guide/using-vue.md | 2 +- docs/pt/guide/what-is-vitepress.md | 4 ++-- docs/pt/reference/site-config.md | 4 ++-- docs/ru/guide/asset-handling.md | 2 +- docs/ru/guide/extending-default-theme.md | 4 ++-- docs/ru/guide/getting-started.md | 2 +- docs/ru/guide/ssr-compat.md | 2 +- docs/ru/guide/using-vue.md | 2 +- docs/ru/guide/what-is-vitepress.md | 2 +- docs/ru/reference/site-config.md | 4 ++-- docs/zh/guide/asset-handling.md | 2 +- docs/zh/guide/extending-default-theme.md | 4 ++-- docs/zh/guide/getting-started.md | 2 +- docs/zh/guide/ssr-compat.md | 2 +- docs/zh/guide/using-vue.md | 2 +- docs/zh/guide/what-is-vitepress.md | 4 ++-- docs/zh/reference/site-config.md | 4 ++-- 57 files changed, 80 insertions(+), 80 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b39ee7c..94b87b81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -820,7 +820,7 @@ Users who intentionally reference non-existent files or want to document include ### BREAKING CHANGES -- VitePress now runs on Vite 5. Please refer https://vitejs.dev/guide/migration for breaking changes and migration guide if you're relying on some Vite-specific things. +- VitePress now runs on Vite 5. Please refer https://vite.dev/guide/migration for breaking changes and migration guide if you're relying on some Vite-specific things. # [1.0.0-rc.25](https://github.com/vuejs/vitepress/compare/v1.0.0-rc.24...v1.0.0-rc.25) (2023-11-05) diff --git a/docs/en/guide/asset-handling.md b/docs/en/guide/asset-handling.md index 00819d1a..63394fd0 100644 --- a/docs/en/guide/asset-handling.md +++ b/docs/en/guide/asset-handling.md @@ -6,7 +6,7 @@ description: Learn how to reference and handle static assets such as images, med ## Referencing Static Assets -All Markdown files are compiled into Vue components and processed by [Vite](https://vitejs.dev/guide/assets.html). You can, **and should**, reference any assets using relative URLs: +All Markdown files are compiled into Vue components and processed by [Vite](https://vite.dev/guide/assets.html). You can, **and should**, reference any assets using relative URLs: ```md ![An image](./image.png) diff --git a/docs/en/guide/extending-default-theme.md b/docs/en/guide/extending-default-theme.md index 5ff15f5b..8a109e34 100644 --- a/docs/en/guide/extending-default-theme.md +++ b/docs/en/guide/extending-default-theme.md @@ -119,7 +119,7 @@ export default { } satisfies Theme ``` -Since we are using Vite, you can also leverage Vite's [glob import feature](https://vitejs.dev/guide/features.html#glob-import) to auto register a directory of components. +Since we are using Vite, you can also leverage Vite's [glob import feature](https://vite.dev/guide/features.html#glob-import) to auto register a directory of components. ## Layout Slots @@ -309,7 +309,7 @@ Coming soon. ## Overriding Internal Components -You can use Vite's [aliases](https://vitejs.dev/config/shared-options.html#resolve-alias) to replace default theme components with your custom ones: +You can use Vite's [aliases](https://vite.dev/config/shared-options.html#resolve-alias) to replace default theme components with your custom ones: ```ts import { fileURLToPath, URL } from 'node:url' diff --git a/docs/en/guide/getting-started.md b/docs/en/guide/getting-started.md index 31e45695..a181192d 100644 --- a/docs/en/guide/getting-started.md +++ b/docs/en/guide/getting-started.md @@ -45,7 +45,7 @@ $ deno add -D vitepress@next ::: tip NOTE -VitePress is an ESM-only package. Don't use `require()` to import it, and make sure your nearest `package.json` contains `"type": "module"`, or change the file extension of your relevant files like `.vitepress/config.js` to `.mjs`/`.mts`. Refer to [Vite's troubleshooting guide](http://vitejs.dev/guide/troubleshooting.html#this-package-is-esm-only) for more details. Also, inside async CJS contexts, you can use `await import('vitepress')` instead. +VitePress is an ESM-only package. Don't use `require()` to import it, and make sure your nearest `package.json` contains `"type": "module"`, or change the file extension of your relevant files like `.vitepress/config.js` to `.mjs`/`.mts`. Refer to [Vite's troubleshooting guide](http://vite.dev/guide/troubleshooting.html#this-package-is-esm-only) for more details. Also, inside async CJS contexts, you can use `await import('vitepress')` instead. ::: diff --git a/docs/en/guide/ssr-compat.md b/docs/en/guide/ssr-compat.md index 99171ad6..f532b16a 100644 --- a/docs/en/guide/ssr-compat.md +++ b/docs/en/guide/ssr-compat.md @@ -39,7 +39,7 @@ onMounted(() => { ### Conditional Import -You can also conditionally import a dependency using the `import.meta.env.SSR` flag (part of [Vite env variables](https://vitejs.dev/guide/env-and-mode.html#env-variables)): +You can also conditionally import a dependency using the `import.meta.env.SSR` flag (part of [Vite env variables](https://vite.dev/guide/env-and-mode.html#env-variables)): ```js if (!import.meta.env.SSR) { diff --git a/docs/en/guide/using-vue.md b/docs/en/guide/using-vue.md index a9b9a389..4d6c7e87 100644 --- a/docs/en/guide/using-vue.md +++ b/docs/en/guide/using-vue.md @@ -204,7 +204,7 @@ Note that this might prevent certain tokens from being syntax highlighted proper ## Using CSS Pre-processors -VitePress has [built-in support](https://vitejs.dev/guide/features.html#css-pre-processors) for CSS pre-processors: `.scss`, `.sass`, `.less`, `.styl` and `.stylus` files. There is no need to install Vite-specific plugins for them, but the corresponding pre-processor itself must be installed: +VitePress has [built-in support](https://vite.dev/guide/features.html#css-pre-processors) for CSS pre-processors: `.scss`, `.sass`, `.less`, `.styl` and `.stylus` files. There is no need to install Vite-specific plugins for them, but the corresponding pre-processor itself must be installed: ``` # .scss and .sass diff --git a/docs/en/guide/what-is-vitepress.md b/docs/en/guide/what-is-vitepress.md index b63eb7ea..fd6930e1 100644 --- a/docs/en/guide/what-is-vitepress.md +++ b/docs/en/guide/what-is-vitepress.md @@ -16,7 +16,7 @@ Just want to try it out? Skip to the [Quickstart](./getting-started). - **Documentation** - VitePress ships with a default theme designed for technical documentation. It powers this page you are reading right now, along with the documentation for [Vite](https://vitejs.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) and [many more](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code). + VitePress ships with a default theme designed for technical documentation. It powers this page you are reading right now, along with the documentation for [Vite](https://vite.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) and [many more](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code). The [official Vue.js documentation](https://vuejs.org/) is also based on VitePress, but uses a custom theme shared between multiple translations. @@ -30,7 +30,7 @@ Just want to try it out? Skip to the [Quickstart](./getting-started). VitePress aims to provide a great Developer Experience (DX) when working with Markdown content. -- **[Vite-Powered:](https://vitejs.dev/)** instant server start, with edits always instantly reflected (<100ms) without page reload. +- **[Vite-Powered:](https://vite.dev/)** instant server start, with edits always instantly reflected (<100ms) without page reload. - **[Built-in Markdown Extensions:](./markdown)** Frontmatter, tables, syntax highlighting... you name it. Specifically, VitePress provides many advanced features for working with code blocks, making it ideal for highly technical documentation. diff --git a/docs/en/reference/site-config.md b/docs/en/reference/site-config.md index b5f4c8f2..8ddae74a 100644 --- a/docs/en/reference/site-config.md +++ b/docs/en/reference/site-config.md @@ -461,7 +461,7 @@ export default { - Type: `string` - Default: `./.vitepress/cache` -The directory for cache files, relative to [project root](../guide/routing#root-and-source-directory). See also: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir). +The directory for cache files, relative to [project root](../guide/routing#root-and-source-directory). See also: [cacheDir](https://vite.dev/config/shared-options.html#cachedir). ```ts export default { @@ -560,7 +560,7 @@ Set `markdown.headers` to `true` or pass [`@mdit-vue/plugin-headers`](https://gi - Type: `import('vite').UserConfig` -Pass raw [Vite Config](https://vitejs.dev/config/) to internal Vite dev server / bundler. +Pass raw [Vite Config](https://vite.dev/config/) to internal Vite dev server / bundler. ```js export default { diff --git a/docs/es/guide/asset-handling.md b/docs/es/guide/asset-handling.md index c3580347..30c9034d 100644 --- a/docs/es/guide/asset-handling.md +++ b/docs/es/guide/asset-handling.md @@ -6,7 +6,7 @@ description: Aprende cómo referenciar y manejar recursos estáticos como imáge ## Referenciando Assets Estáticos {#referencing-static-assets} -Todos los archivos Markdown son compilados en componentes Vue y procesados por [Vite](https://vitejs.dev/guide/assets.html). Usted puede **y debe** referenciar cualquier asset usando URLs relativas: +Todos los archivos Markdown son compilados en componentes Vue y procesados por [Vite](https://vite.dev/guide/assets.html). Usted puede **y debe** referenciar cualquier asset usando URLs relativas: ```md ![Una imagen](./imagen.png) diff --git a/docs/es/guide/extending-default-theme.md b/docs/es/guide/extending-default-theme.md index b9b9a67f..1e4a7885 100644 --- a/docs/es/guide/extending-default-theme.md +++ b/docs/es/guide/extending-default-theme.md @@ -119,7 +119,7 @@ export default { } satisfies Theme ``` -Como estamos usando Vite, puede también aprovechar la [funcionalidad de importación glob](https://vitejs.dev/guide/features.html#glob-import) de Vite para registrar automaticamente un directorio de componetes. +Como estamos usando Vite, puede también aprovechar la [funcionalidad de importación glob](https://vite.dev/guide/features.html#glob-import) de Vite para registrar automaticamente un directorio de componetes. ## _Slots_ en el Layout {#layout-slots} @@ -309,7 +309,7 @@ En breve. ## Substituyendo Componentes Internos {#overriding-internal-components} -Puede usar los [aliases](https://vitejs.dev/config/shared-options.html#resolve-alias) Vite para substituir los componentes del tema por defecto por los suyos personalizados: +Puede usar los [aliases](https://vite.dev/config/shared-options.html#resolve-alias) Vite para substituir los componentes del tema por defecto por los suyos personalizados: ```ts import { fileURLToPath, URL } from 'node:url' diff --git a/docs/es/guide/getting-started.md b/docs/es/guide/getting-started.md index 10408445..9461c808 100644 --- a/docs/es/guide/getting-started.md +++ b/docs/es/guide/getting-started.md @@ -41,7 +41,7 @@ $ bun add -D vitepress@next ::: tip NOTA -VitePress es un paquete apenas para ESM. No use `require()` para importarlo, y asegurese de que el `package.json` más cercano contiene `"type": "module"`, o cambie la extensión de archivo de sus archivos relevantes como `.vitepress/config.js` a `.mjs`/`.mts`. Consulte la [Guía de resolución de problemas Vite](http://vitejs.dev/guide/troubleshooting.html#this-package-is-esm-only) para más detalles. Además de eso, dentro de contextos de JavaScript asíncronos, puede usar `await import('vitepress')`. +VitePress es un paquete apenas para ESM. No use `require()` para importarlo, y asegurese de que el `package.json` más cercano contiene `"type": "module"`, o cambie la extensión de archivo de sus archivos relevantes como `.vitepress/config.js` a `.mjs`/`.mts`. Consulte la [Guía de resolución de problemas Vite](http://vite.dev/guide/troubleshooting.html#this-package-is-esm-only) para más detalles. Además de eso, dentro de contextos de JavaScript asíncronos, puede usar `await import('vitepress')`. ::: diff --git a/docs/es/guide/ssr-compat.md b/docs/es/guide/ssr-compat.md index 38021653..77ca3dac 100644 --- a/docs/es/guide/ssr-compat.md +++ b/docs/es/guide/ssr-compat.md @@ -39,7 +39,7 @@ onMounted(() => { ### Importación Condicional {#conditional-import} -También puede importar una dependencia condicionalmente utilizando la bandera `import.meta.env.SSR` (que forma parte de las [variables de entorno Vite](https://vitejs.dev/guide/env-and-mode.html#env-variables)): +También puede importar una dependencia condicionalmente utilizando la bandera `import.meta.env.SSR` (que forma parte de las [variables de entorno Vite](https://vite.dev/guide/env-and-mode.html#env-variables)): ```js if (!import.meta.env.SSR) { diff --git a/docs/es/guide/using-vue.md b/docs/es/guide/using-vue.md index 2682acfd..7d6fe5a2 100644 --- a/docs/es/guide/using-vue.md +++ b/docs/es/guide/using-vue.md @@ -204,7 +204,7 @@ Observe que esto puede impedir que ciertos tokens sean realzados correctamente. ## Usando Preprocesadores CSS {#using-css-pre-processors} -VitePress poseé [soporte embutido](https://vitejs.dev/guide/features.html#css-pre-processors) para preprocesadores CSS: archivos `.scss`, `.sass`, `.less`, `.styl` e `.stylus`. No es necesario instalar plugins específicos de Vite para ellos, pero el propio preprocesados correspondiente debe ser instalado: +VitePress poseé [soporte embutido](https://vite.dev/guide/features.html#css-pre-processors) para preprocesadores CSS: archivos `.scss`, `.sass`, `.less`, `.styl` e `.stylus`. No es necesario instalar plugins específicos de Vite para ellos, pero el propio preprocesados correspondiente debe ser instalado: ``` # .scss e .sass diff --git a/docs/es/guide/what-is-vitepress.md b/docs/es/guide/what-is-vitepress.md index 22c4b946..0a57e85e 100644 --- a/docs/es/guide/what-is-vitepress.md +++ b/docs/es/guide/what-is-vitepress.md @@ -16,7 +16,7 @@ VitePress es un [Generador de Sitios Estáticos](https://en.wikipedia.org/wiki/S - **Documentación** - VitePress incluye un tema por defecto diseñado para documentación técnica. Este tema es el que se utiliza en la página que estás leyendo ahora, así como en la documentación de [Vite](https://vitejs.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) y [muchos otros](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code). + VitePress incluye un tema por defecto diseñado para documentación técnica. Este tema es el que se utiliza en la página que estás leyendo ahora, así como en la documentación de [Vite](https://vite.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) y [muchos otros](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code). La [documentación oficial Vue.js](https://vuejs.org/) también está basada en VitePress, pero utiliza un tema personalizado compartido entre varias traducciones. @@ -30,7 +30,7 @@ VitePress es un [Generador de Sitios Estáticos](https://en.wikipedia.org/wiki/S VitePress busca ofrecer una excelente Experiencia de Desarrollador (DX) al trabajar con contenido Markdown. -- **[Con tecnología Vite:](https://vitejs.dev/)** inicio instantáneo del servidor, con los cambios reflejados al instante (<100ms) sin recargar la página. +- **[Con tecnología Vite:](https://vite.dev/)** inicio instantáneo del servidor, con los cambios reflejados al instante (<100ms) sin recargar la página. - **[Extensiones Markdown Integradas:](./markdown)** Frontmatter, tablas, destaque de sintaxis... tú decides. Específicamente, VitePress proporciona muchos recursos para trabajar con bloques de código, tornándolo ideal para documentación altamente técnica. diff --git a/docs/es/reference/site-config.md b/docs/es/reference/site-config.md index 21792600..3884b45d 100644 --- a/docs/es/reference/site-config.md +++ b/docs/es/reference/site-config.md @@ -430,7 +430,7 @@ export default { - Tipo: `string` - Predeterminado: `./.vitepress/cache` -El directorio para los archivos de caché, en relación con el [raiz del proyecto](../guide/routing#root-and-source-directory). Vea también: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir). +El directorio para los archivos de caché, en relación con el [raiz del proyecto](../guide/routing#root-and-source-directory). Vea también: [cacheDir](https://vite.dev/config/shared-options.html#cachedir). ```ts export default { @@ -525,7 +525,7 @@ Consulte la [declaración de tipo y jsdocs](https://github.com/vuejs/vitepress/b - Tipo: `import('vite').UserConfig` -Pase la [Configuración Vite](https://vitejs.dev/config/) sin procesar al servidor interno / empaquetador Vite. +Pase la [Configuración Vite](https://vite.dev/config/) sin procesar al servidor interno / empaquetador Vite. ```js export default { diff --git a/docs/fa/guide/asset-handling.md b/docs/fa/guide/asset-handling.md index cda20c7d..ade26214 100644 --- a/docs/fa/guide/asset-handling.md +++ b/docs/fa/guide/asset-handling.md @@ -6,7 +6,7 @@ description: نحوه ارجاع و مدیریت منابع ایستا مانن ## ارجاع به منابع ایستا {#referencing-static-assets} -تمام فایل‌های Markdown به کامپوننت‌های Vue تبدیل و توسط [Vite](https://vitejs.dev/guide/assets.html) پردازش می‌شوند. شما می‌توانید، **و باید**، هر نوع دارایی را با استفاده از URL‌های نسبی مرجع قرار دهید: +تمام فایل‌های Markdown به کامپوننت‌های Vue تبدیل و توسط [Vite](https://vite.dev/guide/assets.html) پردازش می‌شوند. شما می‌توانید، **و باید**، هر نوع دارایی را با استفاده از URL‌های نسبی مرجع قرار دهید: ```md ![تصویر](./image.png) diff --git a/docs/fa/guide/extending-default-theme.md b/docs/fa/guide/extending-default-theme.md index 76418ed2..ccea29a6 100644 --- a/docs/fa/guide/extending-default-theme.md +++ b/docs/fa/guide/extending-default-theme.md @@ -119,7 +119,7 @@ export default { } satisfies Theme ``` -از آنجا که از Vite استفاده می‌کنیم، می‌توانید از ویژگی [import glob](https://vitejs.dev/guide/features.html#glob-import) در Vite برای خودکار ثبت یک پوشه از مولفه‌ها استفاده کنید. +از آنجا که از Vite استفاده می‌کنیم، می‌توانید از ویژگی [import glob](https://vite.dev/guide/features.html#glob-import) در Vite برای خودکار ثبت یک پوشه از مولفه‌ها استفاده کنید. ## slot ‌های طرح {#layout-slots} @@ -311,7 +311,7 @@ provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => { ## جایگزینی کامپوننت‌های داخلی {#overriding-internal-components} -شما می‌توانید با استفاده از [alias های Vite](https://vitejs.dev/config/shared-options.html#resolve-alias)، کامپوننت‌های تم پیش‌فرض را با کامپوننت‌های سفارشی خود جایگزین کنید: +شما می‌توانید با استفاده از [alias های Vite](https://vite.dev/config/shared-options.html#resolve-alias)، کامپوننت‌های تم پیش‌فرض را با کامپوننت‌های سفارشی خود جایگزین کنید: ```ts import { fileURLToPath, URL } from 'node:url' diff --git a/docs/fa/guide/getting-started.md b/docs/fa/guide/getting-started.md index d9d7d660..97775e0d 100644 --- a/docs/fa/guide/getting-started.md +++ b/docs/fa/guide/getting-started.md @@ -41,7 +41,7 @@ $ bun add -D vitepress@next ::: tip نکته -ویت‌پرس یک بسته فقط ESM است. از `require()` برای وارد کردن آن استفاده نکنید و اطمینان حاصل کنید که نزدیک‌ترین `package.json` شما شامل `"type": "module"` است، یا پسوند فایل‌های مربوطه خود مانند `.vitepress/config.js` را به `.mjs`/`.mts` تغییر دهید. برای جزئیات بیشتر به [راهنمای عیب‌یابی Vite](http://vitejs.dev/guide/troubleshooting.html#this-package-is-esm-only) مراجعه کنید. همچنین، در زمینه‌های async CJS می‌توانید از `await import('vitepress')` استفاده کنید. +ویت‌پرس یک بسته فقط ESM است. از `require()` برای وارد کردن آن استفاده نکنید و اطمینان حاصل کنید که نزدیک‌ترین `package.json` شما شامل `"type": "module"` است، یا پسوند فایل‌های مربوطه خود مانند `.vitepress/config.js` را به `.mjs`/`.mts` تغییر دهید. برای جزئیات بیشتر به [راهنمای عیب‌یابی Vite](http://vite.dev/guide/troubleshooting.html#this-package-is-esm-only) مراجعه کنید. همچنین، در زمینه‌های async CJS می‌توانید از `await import('vitepress')` استفاده کنید. ::: diff --git a/docs/fa/guide/ssr-compat.md b/docs/fa/guide/ssr-compat.md index 75e698a7..76f91f90 100644 --- a/docs/fa/guide/ssr-compat.md +++ b/docs/fa/guide/ssr-compat.md @@ -39,7 +39,7 @@ onMounted(() => { ### وارد کردن شرطی {#conditional-import} -می‌توانید همچنین وابستگی را با استفاده از `import.meta.env.SSR` (قسمتی از [متغیرهای env Vite](https://vitejs.dev/guide/env-and-mode.html#env-variables)) به شرط وارد کنید: +می‌توانید همچنین وابستگی را با استفاده از `import.meta.env.SSR` (قسمتی از [متغیرهای env Vite](https://vite.dev/guide/env-and-mode.html#env-variables)) به شرط وارد کنید: ```js if (!import.meta.env.SSR) { diff --git a/docs/fa/guide/using-vue.md b/docs/fa/guide/using-vue.md index 1b618f60..d0b25e46 100644 --- a/docs/fa/guide/using-vue.md +++ b/docs/fa/guide/using-vue.md @@ -205,7 +205,7 @@ Hello {{ 1 + 1 }} ## استفاده از پیش‌پردازنده‌های CSS {#using-css-pre-processors} -ویت‌پرس از [پشتیبانی داخلی](https://vitejs.dev/guide/features.html#css-pre-processors) برای پیش‌پردازنده‌های CSS مانند فایل‌های `.scss`، `.sass`، `.less`، `.styl` و `.stylus` پشتیبانی می‌کند. برای استفاده از آنها نیازی به نصب پلاگین‌های خاص Vite نیست، اما خود پیش‌پردازنده مربوطه باید نصب شده باشد: +ویت‌پرس از [پشتیبانی داخلی](https://vite.dev/guide/features.html#css-pre-processors) برای پیش‌پردازنده‌های CSS مانند فایل‌های `.scss`، `.sass`، `.less`، `.styl` و `.stylus` پشتیبانی می‌کند. برای استفاده از آنها نیازی به نصب پلاگین‌های خاص Vite نیست، اما خود پیش‌پردازنده مربوطه باید نصب شده باشد: ``` # .scss و .sass diff --git a/docs/fa/guide/what-is-vitepress.md b/docs/fa/guide/what-is-vitepress.md index 44fde866..6ddb879b 100644 --- a/docs/fa/guide/what-is-vitepress.md +++ b/docs/fa/guide/what-is-vitepress.md @@ -16,7 +16,7 @@ description: ویت‌پرس یک تولیدکننده سایت ایستا بر - **مستندسازی** - ویت‌پرس با یک تم پیش‌فرض طراحی شده برای مستندات فنی ارائه می‌شود. این صفحه‌ای که اکنون در حال خواندن آن هستید و همچنین مستندات [Vite](https://vitejs.dev/)، [Rollup](https://rollupjs.org/)، [Pinia](https://pinia.vuejs.org/)، [VueUse](https://vueuse.org/)، [Vitest](https://vitest.dev/)، [D3](https://d3js.org/)، [UnoCSS](https://unocss.dev/)، [Iconify](https://iconify.design/) و [بسیاری دیگر](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code) با استفاده از ویت‌پرس ساخته شده‌اند. + ویت‌پرس با یک تم پیش‌فرض طراحی شده برای مستندات فنی ارائه می‌شود. این صفحه‌ای که اکنون در حال خواندن آن هستید و همچنین مستندات [Vite](https://vite.dev/)، [Rollup](https://rollupjs.org/)، [Pinia](https://pinia.vuejs.org/)، [VueUse](https://vueuse.org/)، [Vitest](https://vitest.dev/)، [D3](https://d3js.org/)، [UnoCSS](https://unocss.dev/)، [Iconify](https://iconify.design/) و [بسیاری دیگر](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code) با استفاده از ویت‌پرس ساخته شده‌اند. [مستندات رسمی Vue.js](https://vuejs.org/) نیز بر پایه ویت‌پرس ساخته شده است، اما از یک تم سفارشی که بین چندین ترجمه مشترک است استفاده می‌کند. @@ -30,7 +30,7 @@ description: ویت‌پرس یک تولیدکننده سایت ایستا بر ویت‌پرس هدف ارائه یک تجربه عالی برای توسعه دهنده (DX) هنگام کار با محتوای Markdown را دارد. -- **[قدرت گرفته از Vite:](https://vitejs.dev/)** شروع سرور فوری، با بازتاب ویرایش‌ها به صورت آنی (<100ms) بدون بارگذاری مجدد صفحه. +- **[قدرت گرفته از Vite:](https://vite.dev/)** شروع سرور فوری، با بازتاب ویرایش‌ها به صورت آنی (<100ms) بدون بارگذاری مجدد صفحه. - **[افزونه‌های داخلی Markdown:](./markdown)** استفاده از Frontmatter، جداول، syntax highlighting... هرچه که بخواهید. ویت‌پرس به ویژه ویژگی‌های پیشرفته زیادی برای کار با بلوک‌های کد فراهم می‌کند، که آن را برای مستندات فنی بسیار مناسب می‌کند. diff --git a/docs/fa/reference/site-config.md b/docs/fa/reference/site-config.md index b0dbaea1..82a3c55b 100644 --- a/docs/fa/reference/site-config.md +++ b/docs/fa/reference/site-config.md @@ -432,7 +432,7 @@ export default { - نوع: `string` - پیش‌فرض: `./.vitepress/cache` -دایرکتوری برای فایل‌های کش، نسبت به [ریشه پروژه](../guide/routing#root-and-source-directory). همچنین ببینید: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir). +دایرکتوری برای فایل‌های کش، نسبت به [ریشه پروژه](../guide/routing#root-and-source-directory). همچنین ببینید: [cacheDir](https://vite.dev/config/shared-options.html#cachedir). ```ts export default { @@ -529,7 +529,7 @@ export default { - نوع: `import('vite').UserConfig` -پیکربندی خام [Vite Config](https://vitejs.dev/config/) را به سرور توسعه داخلی / بسته‌بند Vite ارسال کنید. +پیکربندی خام [Vite Config](https://vite.dev/config/) را به سرور توسعه داخلی / بسته‌بند Vite ارسال کنید. ```js export default { diff --git a/docs/ja/guide/asset-handling.md b/docs/ja/guide/asset-handling.md index 319963ca..42ae9d61 100644 --- a/docs/ja/guide/asset-handling.md +++ b/docs/ja/guide/asset-handling.md @@ -6,7 +6,7 @@ description: VitePressで画像、メディア、フォントなどの静的ア ## 静的アセットの参照 {#referencing-static-assets} -すべての Markdown ファイルは Vue コンポーネントにコンパイルされ、[Vite](https://vitejs.dev/guide/assets.html) によって処理されます。Markdown 内では、相対 URL を使ってアセットを参照することが **推奨されます**。 +すべての Markdown ファイルは Vue コンポーネントにコンパイルされ、[Vite](https://vite.dev/guide/assets.html) によって処理されます。Markdown 内では、相対 URL を使ってアセットを参照することが **推奨されます**。 ```md ![画像](./image.png) diff --git a/docs/ja/guide/extending-default-theme.md b/docs/ja/guide/extending-default-theme.md index 8e26243c..2abe4d84 100644 --- a/docs/ja/guide/extending-default-theme.md +++ b/docs/ja/guide/extending-default-theme.md @@ -122,7 +122,7 @@ export default { } satisfies Theme ``` -Vite を使っているため、Vite の [glob import 機能](https://vitejs.dev/guide/features.html#glob-import) を利用してディレクトリ内のコンポーネントを自動登録することもできます。 +Vite を使っているため、Vite の [glob import 機能](https://vite.dev/guide/features.html#glob-import) を利用してディレクトリ内のコンポーネントを自動登録することもできます。 ## レイアウトスロット {#layout-slots} @@ -311,7 +311,7 @@ provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => { ## 内部コンポーネントの置き換え {#overriding-internal-components} -Vite の [エイリアス](https://vitejs.dev/config/shared-options.html#resolve-alias) を使って、デフォルトテーマのコンポーネントを独自のものに置き換えられます。 +Vite の [エイリアス](https://vite.dev/config/shared-options.html#resolve-alias) を使って、デフォルトテーマのコンポーネントを独自のものに置き換えられます。 ```ts import { fileURLToPath, URL } from 'node:url' diff --git a/docs/ja/guide/getting-started.md b/docs/ja/guide/getting-started.md index 5e164aa1..91a85076 100644 --- a/docs/ja/guide/getting-started.md +++ b/docs/ja/guide/getting-started.md @@ -40,7 +40,7 @@ $ bun add -D vitepress@next ::: ::: tip 注意 -VitePress は ESM 専用パッケージです。`require()` を使ってインポートせず、最も近い `package.json` に `"type": "module"` を含めるか、`.vitepress/config.js` を `.mjs` / `.mts` に変更してください。詳しくは [Vite のトラブルシューティングガイド](http://vitejs.dev/guide/troubleshooting.html#this-package-is-esm-only) を参照してください。また、非同期 CJS コンテキスト内では `await import('vitepress')` を使用できます。 +VitePress は ESM 専用パッケージです。`require()` を使ってインポートせず、最も近い `package.json` に `"type": "module"` を含めるか、`.vitepress/config.js` を `.mjs` / `.mts` に変更してください。詳しくは [Vite のトラブルシューティングガイド](http://vite.dev/guide/troubleshooting.html#this-package-is-esm-only) を参照してください。また、非同期 CJS コンテキスト内では `await import('vitepress')` を使用できます。 ::: ### セットアップウィザード {#setup-wizard} diff --git a/docs/ja/guide/ssr-compat.md b/docs/ja/guide/ssr-compat.md index ec94a4a4..01a58c38 100644 --- a/docs/ja/guide/ssr-compat.md +++ b/docs/ja/guide/ssr-compat.md @@ -39,7 +39,7 @@ onMounted(() => { ### 条件付きインポート {#conditional-import} -[`import.meta.env.SSR`](https://vitejs.dev/guide/env-and-mode.html#env-variables) フラグ(Vite の環境変数の一部)を使って、依存関係を条件付きでインポートすることもできます。 +[`import.meta.env.SSR`](https://vite.dev/guide/env-and-mode.html#env-variables) フラグ(Vite の環境変数の一部)を使って、依存関係を条件付きでインポートすることもできます。 ```js if (!import.meta.env.SSR) { diff --git a/docs/ja/guide/using-vue.md b/docs/ja/guide/using-vue.md index 9cbc7608..cdbbb01f 100644 --- a/docs/ja/guide/using-vue.md +++ b/docs/ja/guide/using-vue.md @@ -203,7 +203,7 @@ Hello {{ 1 + 1 }} ## CSS プリプロセッサの利用 {#using-css-pre-processors} -VitePress は CSS プリプロセッサ(`.scss`、`.sass`、`.less`、`.styl`、`.stylus`)を[標準サポート](https://vitejs.dev/guide/features.html#css-pre-processors)しています。Vite 固有のプラグインは不要ですが、各プリプロセッサ本体のインストールは必要です。 +VitePress は CSS プリプロセッサ(`.scss`、`.sass`、`.less`、`.styl`、`.stylus`)を[標準サポート](https://vite.dev/guide/features.html#css-pre-processors)しています。Vite 固有のプラグインは不要ですが、各プリプロセッサ本体のインストールは必要です。 ``` # .scss / .sass diff --git a/docs/ja/guide/what-is-vitepress.md b/docs/ja/guide/what-is-vitepress.md index 1920adaf..0c9e9fc0 100644 --- a/docs/ja/guide/what-is-vitepress.md +++ b/docs/ja/guide/what-is-vitepress.md @@ -16,7 +16,7 @@ VitePress は、高速でコンテンツ中心の Web サイトを構築する - **ドキュメント** - VitePress には技術ドキュメント向けに設計されたデフォルトテーマが同梱されています。今あなたが読んでいるこのページのほか、[Vite](https://vitejs.dev/)、[Rollup](https://rollupjs.org/)、[Pinia](https://pinia.vuejs.org/)、[VueUse](https://vueuse.org/)、[Vitest](https://vitest.dev/)、[D3](https://d3js.org/)、[UnoCSS](https://unocss.dev/)、[Iconify](https://iconify.design/) など、[まだまだたくさん](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code)のドキュメントサイトで使われています。 + VitePress には技術ドキュメント向けに設計されたデフォルトテーマが同梱されています。今あなたが読んでいるこのページのほか、[Vite](https://vite.dev/)、[Rollup](https://rollupjs.org/)、[Pinia](https://pinia.vuejs.org/)、[VueUse](https://vueuse.org/)、[Vitest](https://vitest.dev/)、[D3](https://d3js.org/)、[UnoCSS](https://unocss.dev/)、[Iconify](https://iconify.design/) など、[まだまだたくさん](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code)のドキュメントサイトで使われています。 [公式の Vue.js ドキュメント](https://vuejs.org/) も VitePress をベースにしています(複数言語で共有されるカスタムテーマを使用)。 @@ -30,7 +30,7 @@ VitePress は、高速でコンテンツ中心の Web サイトを構築する VitePress は、Markdown コンテンツを扱う際の優れた開発体験(DX)を目指しています。 -- **[Vite 駆動](https://vitejs.dev/)**:即時サーバー起動、編集はページリロードなしで常に瞬時(<100ms)に反映。 +- **[Vite 駆動](https://vite.dev/)**:即時サーバー起動、編集はページリロードなしで常に瞬時(<100ms)に反映。 - **[ビルトインの Markdown 拡張](./markdown)**:Frontmatter、表、シンタックスハイライト…必要なものはひと通り。特にコードブロック周りの機能が充実しており、高度な技術ドキュメントに最適です。 diff --git a/docs/ja/reference/site-config.md b/docs/ja/reference/site-config.md index 5f23ec71..a8e7f04b 100644 --- a/docs/ja/reference/site-config.md +++ b/docs/ja/reference/site-config.md @@ -430,7 +430,7 @@ export default { - 型: `string` - 既定値: `./.vitepress/cache` -キャッシュファイル用ディレクトリ([プロジェクトルート](../guide/routing#root-and-source-directory) からの相対パス)。参考: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir) +キャッシュファイル用ディレクトリ([プロジェクトルート](../guide/routing#root-and-source-directory) からの相対パス)。参考: [cacheDir](https://vite.dev/config/shared-options.html#cachedir) ```ts export default { @@ -527,7 +527,7 @@ export default { - 型: `import('vite').UserConfig` -内部の Vite 開発サーバ/バンドラへ生の [Vite Config](https://vitejs.dev/config/) を渡します。 +内部の Vite 開発サーバ/バンドラへ生の [Vite Config](https://vite.dev/config/) を渡します。 ```js export default { diff --git a/docs/ko/guide/asset-handling.md b/docs/ko/guide/asset-handling.md index 5d7a9bbb..3b9efb02 100644 --- a/docs/ko/guide/asset-handling.md +++ b/docs/ko/guide/asset-handling.md @@ -6,7 +6,7 @@ description: VitePress에서 이미지, 미디어, 글꼴 등 정적 에셋을 ## 정적 에셋 참조하기 {#referencing-static-assets} -모든 마크다운 파일은 Vue 컴포넌트로 컴파일되어 [Vite](https://vitejs.dev/guide/assets.html)에 의해 처리됩니다. 모든 에셋은 상대 URL을 사용하여 참조할 수 있으며, **참조해야 합니다**: +모든 마크다운 파일은 Vue 컴포넌트로 컴파일되어 [Vite](https://vite.dev/guide/assets.html)에 의해 처리됩니다. 모든 에셋은 상대 URL을 사용하여 참조할 수 있으며, **참조해야 합니다**: ```md ![이미지](./image.png) diff --git a/docs/ko/guide/extending-default-theme.md b/docs/ko/guide/extending-default-theme.md index e87bfa1a..2c450b8b 100644 --- a/docs/ko/guide/extending-default-theme.md +++ b/docs/ko/guide/extending-default-theme.md @@ -119,7 +119,7 @@ export default { } satisfies Theme ``` -Vite를 사용하므로, Vite의 [glob import 기능](https://vitejs.dev/guide/features.html#glob-import)을 활용하여 컴포넌트 디렉터리를 자동으로 등록할 수 있습니다. +Vite를 사용하므로, Vite의 [glob import 기능](https://vite.dev/guide/features.html#glob-import)을 활용하여 컴포넌트 디렉터리를 자동으로 등록할 수 있습니다. ## 레이아웃 슬롯 {#layout-slots} @@ -309,7 +309,7 @@ provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => { ## 내부 컴포넌트 재정의하기 {#overriding-internal-components} -Vite의 [별칭](https://vitejs.dev/config/shared-options.html#resolve-alias)을 사용하여 기본 테마 컴포넌트를 커스텀 컴포넌트로 대체할 수 있습니다: +Vite의 [별칭](https://vite.dev/config/shared-options.html#resolve-alias)을 사용하여 기본 테마 컴포넌트를 커스텀 컴포넌트로 대체할 수 있습니다: ```ts import { fileURLToPath, URL } from 'node:url' diff --git a/docs/ko/guide/getting-started.md b/docs/ko/guide/getting-started.md index ca6e743b..807dca71 100644 --- a/docs/ko/guide/getting-started.md +++ b/docs/ko/guide/getting-started.md @@ -41,7 +41,7 @@ $ bun add -D vitepress@next ::: tip 참고 -VitePress는 ESM 전용 패키지입니다. `require()`를 사용하여 가져오지 마시고, `package.json`에 `"type": "module"`이 포함되어 있는지 확인하거나, 관련 파일(예: `.vitepress/config.js`)의 확장자를 `.mjs`/`.mts`로 변경하세요. 자세한 내용은 [Vite 문제 해결 가이드](http://vitejs.dev/ko/guide/troubleshooting.html#this-package-is-esm-only)를 참고하세요. 또한, 비동기 CJS 컨텍스트에서는 `await import('vitepress')`를 사용할 수 있습니다. +VitePress는 ESM 전용 패키지입니다. `require()`를 사용하여 가져오지 마시고, `package.json`에 `"type": "module"`이 포함되어 있는지 확인하거나, 관련 파일(예: `.vitepress/config.js`)의 확장자를 `.mjs`/`.mts`로 변경하세요. 자세한 내용은 [Vite 문제 해결 가이드](http://vite.dev/ko/guide/troubleshooting.html#this-package-is-esm-only)를 참고하세요. 또한, 비동기 CJS 컨텍스트에서는 `await import('vitepress')`를 사용할 수 있습니다. ::: diff --git a/docs/ko/guide/ssr-compat.md b/docs/ko/guide/ssr-compat.md index 9e58ec18..a2e9cc63 100644 --- a/docs/ko/guide/ssr-compat.md +++ b/docs/ko/guide/ssr-compat.md @@ -39,7 +39,7 @@ onMounted(() => { ### 조건부 가져오기 {#conditional-import} -`import.meta.env.SSR` 플래그([Vite 환경 변수](https://vitejs.dev/guide/env-and-mode.html#env-variables)의 일부)를 사용하여 종속성을 조건부로 "import" 할 수도 있습니다: +`import.meta.env.SSR` 플래그([Vite 환경 변수](https://vite.dev/guide/env-and-mode.html#env-variables)의 일부)를 사용하여 종속성을 조건부로 "import" 할 수도 있습니다: ```js if (!import.meta.env.SSR) { diff --git a/docs/ko/guide/using-vue.md b/docs/ko/guide/using-vue.md index 9f595b7f..5c93dabc 100644 --- a/docs/ko/guide/using-vue.md +++ b/docs/ko/guide/using-vue.md @@ -204,7 +204,7 @@ Vue 보간 문법을 회피하려면, `` 또는 다른 엘리먼트에 `v- ## CSS 전처리기 사용하기 {#using-css-pre-processors} -VitePress는 CSS 전처리기인 `.scss`, `.sass`, `.less`, `.styl`, `.stylus` 파일에 대해 [기본 지원](https://vitejs.dev/guide/features.html#css-pre-processors)을 제공합니다. 이를 위해 Vite 전용 플러그인을 설치할 필요는 없지만, 해당 전처리기 자체는 설치해야 합니다: +VitePress는 CSS 전처리기인 `.scss`, `.sass`, `.less`, `.styl`, `.stylus` 파일에 대해 [기본 지원](https://vite.dev/guide/features.html#css-pre-processors)을 제공합니다. 이를 위해 Vite 전용 플러그인을 설치할 필요는 없지만, 해당 전처리기 자체는 설치해야 합니다: ``` # .scss 및 .sass diff --git a/docs/ko/guide/what-is-vitepress.md b/docs/ko/guide/what-is-vitepress.md index 2c2cdaf2..20e23725 100644 --- a/docs/ko/guide/what-is-vitepress.md +++ b/docs/ko/guide/what-is-vitepress.md @@ -16,7 +16,7 @@ VitePress는 빠르고 컨텐츠 중심의 웹사이트를 구축하기 위해 - **문서화** - VitePress는 기술 문서를 위해 설계된 기본 테마가 함께 제공됩니다. 지금 읽고 있는 이 페이지와 [Vite](https://vitejs.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) 및 [다양한 프로젝트](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code) 문서는 모두 이 테마를 기반으로 합니다. + VitePress는 기술 문서를 위해 설계된 기본 테마가 함께 제공됩니다. 지금 읽고 있는 이 페이지와 [Vite](https://vite.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) 및 [다양한 프로젝트](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code) 문서는 모두 이 테마를 기반으로 합니다. [Vue.js 공식 문서](https://vuejs.org/)도 VitePress 기반으로 되어 있으며, 여러 번역본에 걸쳐 공유되는 커스텀 테마를 사용합니다. @@ -30,7 +30,7 @@ VitePress는 빠르고 컨텐츠 중심의 웹사이트를 구축하기 위해 VitePress는 마크다운 컨텐츠를 다룰 때 훌륭한 개발자 경험(DX)을 제공하고자 합니다. -- **[Vite로 작동](https://vitejs.dev/)**: 즉각적인 서버 시작 가능, 페이지 새로고침 없이 즉시(<100ms) 수정 사항 반영. +- **[Vite로 작동](https://vite.dev/)**: 즉각적인 서버 시작 가능, 페이지 새로고침 없이 즉시(<100ms) 수정 사항 반영. - **[내장된 마크다운 확장 기능](./markdown)**: 서문, 표, 구문 강조 등 무엇이든 가능. 특히 VitePress는 코드 블록 작업을 위한 고급 기능을 많이 제공하여 기술적 문서에 이상적. diff --git a/docs/ko/reference/site-config.md b/docs/ko/reference/site-config.md index d5482754..53e94d52 100644 --- a/docs/ko/reference/site-config.md +++ b/docs/ko/reference/site-config.md @@ -430,7 +430,7 @@ export default { - 타입: `string` - 기본값: `./.vitepress/cache` -캐시 파일을 위한 디렉터리입니다. [프로젝트 루트](../guide/routing#root-and-source-directory)에 상대적입니다. [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir)을 참고하세요. +캐시 파일을 위한 디렉터리입니다. [프로젝트 루트](../guide/routing#root-and-source-directory)에 상대적입니다. [cacheDir](https://vite.dev/config/shared-options.html#cachedir)을 참고하세요. ```ts export default { @@ -527,7 +527,7 @@ export default { - 타입: `import('vite').UserConfig` -내부 Vite 개발 서버/번들러에 직접 [Vite 구성](https://vitejs.dev/config/)을 전달합니다. +내부 Vite 개발 서버/번들러에 직접 [Vite 구성](https://vite.dev/config/)을 전달합니다. ```js export default { diff --git a/docs/pt/guide/asset-handling.md b/docs/pt/guide/asset-handling.md index f7b4a937..620beb49 100644 --- a/docs/pt/guide/asset-handling.md +++ b/docs/pt/guide/asset-handling.md @@ -6,7 +6,7 @@ description: Aprenda a referenciar e manipular ativos estáticos como imagens, m ## Referenciando Ativos Estáticos {#referencing-static-assets} -Todos os arquivos Markdown são compilados em componentes Vue e processados por [Vite](https://vitejs.dev/guide/assets.html). Você pode **e deve** referenciar quaisquer ativos usando URLs relativas: +Todos os arquivos Markdown são compilados em componentes Vue e processados por [Vite](https://vite.dev/guide/assets.html). Você pode **e deve** referenciar quaisquer ativos usando URLs relativas: ```md ![Uma imagem](./imagem.png) diff --git a/docs/pt/guide/extending-default-theme.md b/docs/pt/guide/extending-default-theme.md index 31527390..99db5b75 100644 --- a/docs/pt/guide/extending-default-theme.md +++ b/docs/pt/guide/extending-default-theme.md @@ -119,7 +119,7 @@ export default { } satisfies Theme ``` -Como estamos usando Vite, você também pode aproveitar a [funcionalidade de importação glob](https://vitejs.dev/guide/features.html#glob-import) do Vite para registrar automaticamente um diretório de componentes. +Como estamos usando Vite, você também pode aproveitar a [funcionalidade de importação glob](https://vite.dev/guide/features.html#glob-import) do Vite para registrar automaticamente um diretório de componentes. ## _Slots_ no Layout {#layout-slots} @@ -309,7 +309,7 @@ Em breve. ## Substituindo Componentes Internos {#overriding-internal-components} -Você pode usar os [aliases](https://vitejs.dev/config/shared-options.html#resolve-alias) Vite para substituir os componentes do tema padrão pelos seus personalizados: +Você pode usar os [aliases](https://vite.dev/config/shared-options.html#resolve-alias) Vite para substituir os componentes do tema padrão pelos seus personalizados: ```ts import { fileURLToPath, URL } from 'node:url' diff --git a/docs/pt/guide/getting-started.md b/docs/pt/guide/getting-started.md index 056626ff..5f083143 100644 --- a/docs/pt/guide/getting-started.md +++ b/docs/pt/guide/getting-started.md @@ -41,7 +41,7 @@ $ bun add -D vitepress@next ::: tip NOTA -VitePress é um pacote apenas para ESM. Não use `require()` para importá-lo, e certifique de que o `package.json` mais próximo contém `"type": "module"`, ou mude a extensão do arquivo de seus arquivos releavantes como `.vitepress/config.js` para `.mjs`/`.mts`. Refira-se ao [Guia de resolução de problemas Vite](http://vitejs.dev/guide/troubleshooting.html#this-package-is-esm-only) para mais detalhes. Além disso, dentro de contextos de JavaScript comum assíncronos, você pode usar `await import('vitepress')`. +VitePress é um pacote apenas para ESM. Não use `require()` para importá-lo, e certifique de que o `package.json` mais próximo contém `"type": "module"`, ou mude a extensão do arquivo de seus arquivos releavantes como `.vitepress/config.js` para `.mjs`/`.mts`. Refira-se ao [Guia de resolução de problemas Vite](http://vite.dev/guide/troubleshooting.html#this-package-is-esm-only) para mais detalhes. Além disso, dentro de contextos de JavaScript comum assíncronos, você pode usar `await import('vitepress')`. ::: diff --git a/docs/pt/guide/ssr-compat.md b/docs/pt/guide/ssr-compat.md index fcd36f38..ecd95d81 100644 --- a/docs/pt/guide/ssr-compat.md +++ b/docs/pt/guide/ssr-compat.md @@ -39,7 +39,7 @@ onMounted(() => { ### Importação Condicional {#conditional-import} -Você também pode importar condicionalmente uma dependência usando o sinalizador `import.meta.env.SSR` (parte das [variáveis de ambiente Vite](https://vitejs.dev/guide/env-and-mode.html#env-variables)): +Você também pode importar condicionalmente uma dependência usando o sinalizador `import.meta.env.SSR` (parte das [variáveis de ambiente Vite](https://vite.dev/guide/env-and-mode.html#env-variables)): ```js if (!import.meta.env.SSR) { diff --git a/docs/pt/guide/using-vue.md b/docs/pt/guide/using-vue.md index 5878bebc..d4fdd415 100644 --- a/docs/pt/guide/using-vue.md +++ b/docs/pt/guide/using-vue.md @@ -203,7 +203,7 @@ Observe que isso pode impedir que certos tokens sejam realçados corretamente. ## Usando Pré-processadores CSS {#using-css-pre-processors} -O VitePress possui [suporte embutido](https://vitejs.dev/guide/features.html#css-pre-processors) para pré-processadores CSS: arquivos `.scss`, `.sass`, `.less`, `.styl` e `.stylus`. Não é necessário instalar plugins específicos do Vite para eles, mas o próprio pré-processador correspondente deve ser instalado: +O VitePress possui [suporte embutido](https://vite.dev/guide/features.html#css-pre-processors) para pré-processadores CSS: arquivos `.scss`, `.sass`, `.less`, `.styl` e `.stylus`. Não é necessário instalar plugins específicos do Vite para eles, mas o próprio pré-processador correspondente deve ser instalado: ``` # .scss e .sass diff --git a/docs/pt/guide/what-is-vitepress.md b/docs/pt/guide/what-is-vitepress.md index 45b83db9..e11e7031 100644 --- a/docs/pt/guide/what-is-vitepress.md +++ b/docs/pt/guide/what-is-vitepress.md @@ -16,7 +16,7 @@ Quer apenas experimentar? Pule para o [Início Rápido](./getting-started). - **Documentação** - VitePress vem com um tema padrão projetado para documentação técnica. Ele alimenta esta página que você está lendo agora, juntamente com a documentação [Vite](https://vitejs.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) e [muitos outros](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code). + VitePress vem com um tema padrão projetado para documentação técnica. Ele alimenta esta página que você está lendo agora, juntamente com a documentação [Vite](https://vite.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) e [muitos outros](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code). A [documentação oficial Vue.js](https://vuejs.org/) também é baseada em VitePress, mas usa um tema personalizado compartilhado entre várias traduções. @@ -30,7 +30,7 @@ Quer apenas experimentar? Pule para o [Início Rápido](./getting-started). VitePress visa proporcionar excelente Experiência de Desenvolvedor (DX) ao trabalhar com conteúdo em Markdown. -- **[Alimentado por Vite:](https://vitejs.dev/)** inicialização instantânea do servidor, com edições sempre refletidas instantaneamente (<100ms) sem recarregamento de página. +- **[Alimentado por Vite:](https://vite.dev/)** inicialização instantânea do servidor, com edições sempre refletidas instantaneamente (<100ms) sem recarregamento de página. - **[Extensões Markdown Integradas:](./markdown)** Frontmatter, tabelas, destaque de sintaxe... você escolhe. Especificamente, VitePress fornece muitos recursos avançados para trabalhar com blocos de código, tornando-o ideal para documentação altamente técnica. diff --git a/docs/pt/reference/site-config.md b/docs/pt/reference/site-config.md index 88b639f3..d1125d1d 100644 --- a/docs/pt/reference/site-config.md +++ b/docs/pt/reference/site-config.md @@ -430,7 +430,7 @@ export default { - Tipo: `string` - Padrão: `./.vitepress/cache` -O diretório para arquivos de cache, relativo à [raiz do projeto](../guide/routing#root-and-source-directory). Veja também: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir). +O diretório para arquivos de cache, relativo à [raiz do projeto](../guide/routing#root-and-source-directory). Veja também: [cacheDir](https://vite.dev/config/shared-options.html#cachedir). ```ts export default { @@ -525,7 +525,7 @@ Verifique a [declaração de tipo e jsdocs](https://github.com/vuejs/vitepress/b - Tipo: `import('vite').UserConfig` -Passe a [Configuração Vite](https://vitejs.dev/config/) crua para o servidor interno / empacotador Vite. +Passe a [Configuração Vite](https://vite.dev/config/) crua para o servidor interno / empacotador Vite. ```js export default { diff --git a/docs/ru/guide/asset-handling.md b/docs/ru/guide/asset-handling.md index 692e2c97..fd1852a4 100644 --- a/docs/ru/guide/asset-handling.md +++ b/docs/ru/guide/asset-handling.md @@ -6,7 +6,7 @@ description: Узнайте, как ссылаться на статически ## Ссылки на статические ресурсы {#referencing-static-assets} -Все файлы Markdown компилируются в компоненты Vue и обрабатываются [Vite](https://vitejs.dev/guide/assets.html). Вы можете, **и должны**, ссылаться на любые ресурсы, используя относительные URL: +Все файлы Markdown компилируются в компоненты Vue и обрабатываются [Vite](https://vite.dev/guide/assets.html). Вы можете, **и должны**, ссылаться на любые ресурсы, используя относительные URL: ```md ![Изображение](./image.png) diff --git a/docs/ru/guide/extending-default-theme.md b/docs/ru/guide/extending-default-theme.md index c3883625..6b7c011a 100644 --- a/docs/ru/guide/extending-default-theme.md +++ b/docs/ru/guide/extending-default-theme.md @@ -120,7 +120,7 @@ export default { } satisfies Theme ``` -Поскольку мы используем Vite, можно применять [глобальную функцию импорта](https://vitejs.dev/guide/features.html#glob-import) Vite для автоматической регистрации каталога компонентов. +Поскольку мы используем Vite, можно применять [глобальную функцию импорта](https://vite.dev/guide/features.html#glob-import) Vite для автоматической регистрации каталога компонентов. ## Слоты макета {#layout-slots} @@ -310,7 +310,7 @@ provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => { ## Переопределение внутренних компонентов {#overriding-internal-components} -Вы можете использовать [псевдонимы](https://vitejs.dev/config/shared-options.html#resolve-alias) Vite, чтобы заменить стандартные компоненты темы на свои собственные: +Вы можете использовать [псевдонимы](https://vite.dev/config/shared-options.html#resolve-alias) Vite, чтобы заменить стандартные компоненты темы на свои собственные: ```ts import { fileURLToPath, URL } from 'node:url' diff --git a/docs/ru/guide/getting-started.md b/docs/ru/guide/getting-started.md index e88ddc00..873ebafc 100644 --- a/docs/ru/guide/getting-started.md +++ b/docs/ru/guide/getting-started.md @@ -45,7 +45,7 @@ $ deno add -D vitepress@next ::: tip ПРИМЕЧАНИЕ -VitePress — это пакет, предназначенный только для ESM. Не используйте `require()` для импорта, и убедитесь, что ближайший `package.json` содержит `"type": "module"`, или измените расширение соответствующих файлов, например, `.vitepress/config.js` на `.mjs`/`.mts`. Более подробную информацию см. в [Руководстве по устранению неполадок Vite](https://vitejs.dev/guide/troubleshooting.html#this-package-is-esm-only). Кроме того, внутри асинхронных контекстов CJS можно использовать `await import('vitepress')` вместо этого. +VitePress — это пакет, предназначенный только для ESM. Не используйте `require()` для импорта, и убедитесь, что ближайший `package.json` содержит `"type": "module"`, или измените расширение соответствующих файлов, например, `.vitepress/config.js` на `.mjs`/`.mts`. Более подробную информацию см. в [Руководстве по устранению неполадок Vite](https://vite.dev/guide/troubleshooting.html#this-package-is-esm-only). Кроме того, внутри асинхронных контекстов CJS можно использовать `await import('vitepress')` вместо этого. ::: diff --git a/docs/ru/guide/ssr-compat.md b/docs/ru/guide/ssr-compat.md index 5473d368..42dc06ca 100644 --- a/docs/ru/guide/ssr-compat.md +++ b/docs/ru/guide/ssr-compat.md @@ -39,7 +39,7 @@ onMounted(() => { ### Условный импорт {#conditional-import} -Вы также можете условно импортировать зависимость с помощью флага `import.meta.env.SSR` (часть [env-переменных Vite](https://vitejs.dev/guide/env-and-mode.html#env-variables)): +Вы также можете условно импортировать зависимость с помощью флага `import.meta.env.SSR` (часть [env-переменных Vite](https://vite.dev/guide/env-and-mode.html#env-variables)): ```js if (!import.meta.env.SSR) { diff --git a/docs/ru/guide/using-vue.md b/docs/ru/guide/using-vue.md index f0e933b1..9650af4e 100644 --- a/docs/ru/guide/using-vue.md +++ b/docs/ru/guide/using-vue.md @@ -201,7 +201,7 @@ HTML, обёрнутый ``, будет отображаться как е ## Использование препроцессоров CSS {#using-css-pre-processors} -VitePress имеет [встроенную поддержку](https://vitejs.dev/guide/features.html#css-pre-processors) для препроцессоров CSS: файлы `.scss`, `.sass`, `.less`, `.styl` и `.stylus`. Для них не нужно устанавливать специфические для Vite плагины, но сам соответствующий препроцессор должен быть установлен: +VitePress имеет [встроенную поддержку](https://vite.dev/guide/features.html#css-pre-processors) для препроцессоров CSS: файлы `.scss`, `.sass`, `.less`, `.styl` и `.stylus`. Для них не нужно устанавливать специфические для Vite плагины, но сам соответствующий препроцессор должен быть установлен: ::: code-group diff --git a/docs/ru/guide/what-is-vitepress.md b/docs/ru/guide/what-is-vitepress.md index ea21140c..d70b1308 100644 --- a/docs/ru/guide/what-is-vitepress.md +++ b/docs/ru/guide/what-is-vitepress.md @@ -30,7 +30,7 @@ VitePress — это [Генератор статических сайтов](ht VitePress стремится обеспечить отличные возможности для разработчиков при работе с содержимым в формате Markdown. -- **[На базе Vite:](https://vitejs.dev/)** мгновенный запуск сервера, правки всегда отражаются мгновенно (<100 мс) без перезагрузки страницы. +- **[На базе Vite:](https://vite.dev/)** мгновенный запуск сервера, правки всегда отражаются мгновенно (<100 мс) без перезагрузки страницы. - **[Встроенные расширения Markdown:](./markdown)** Frontmatter, таблицы, подсветка синтаксиса... называйте как хотите. В частности, VitePress предоставляет множество расширенных возможностей для работы с блоками кода, что делает его идеальным для создания технической документации. diff --git a/docs/ru/reference/site-config.md b/docs/ru/reference/site-config.md index eff970c4..bc54a368 100644 --- a/docs/ru/reference/site-config.md +++ b/docs/ru/reference/site-config.md @@ -461,7 +461,7 @@ export default { - Тип: `string` - По умолчанию: `./.vitepress/cache` -Каталог для файлов кэша, относительно [корня проекта](../guide/routing#root-and-source-directory). См. также: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir). +Каталог для файлов кэша, относительно [корня проекта](../guide/routing#root-and-source-directory). См. также: [cacheDir](https://vite.dev/config/shared-options.html#cachedir). ```ts export default { @@ -560,7 +560,7 @@ export default { - Тип: `import('vite').UserConfig` -Передаёт необработанную [конфигурацию Vite](https://vitejs.dev/config/) внутреннему серверу разработки / сборщику Vite. +Передаёт необработанную [конфигурацию Vite](https://vite.dev/config/) внутреннему серверу разработки / сборщику Vite. ```js export default { diff --git a/docs/zh/guide/asset-handling.md b/docs/zh/guide/asset-handling.md index 2d0328dc..209a96d3 100644 --- a/docs/zh/guide/asset-handling.md +++ b/docs/zh/guide/asset-handling.md @@ -6,7 +6,7 @@ description: 了解如何在 VitePress 中引用和处理静态资源,如图 ## 引用静态资源 {#referencing-static-assets} -所有的 Markdown 文件都会被编译成 Vue 组件,并由 [Vite](https://cn.vitejs.dev/guide/assets.html) 处理。可以**并且应该**使用相对路径来引用资源: +所有的 Markdown 文件都会被编译成 Vue 组件,并由 [Vite](https://cn.vite.dev/guide/assets.html) 处理。可以**并且应该**使用相对路径来引用资源: ```md ![An image](./image.png) diff --git a/docs/zh/guide/extending-default-theme.md b/docs/zh/guide/extending-default-theme.md index 88488fa7..974fca81 100644 --- a/docs/zh/guide/extending-default-theme.md +++ b/docs/zh/guide/extending-default-theme.md @@ -119,7 +119,7 @@ export default { } satisfies Theme ``` -因为我们使用 Vite,还可以利用 Vite 的 [glob 导入功能](https://cn.vitejs.dev/guide/features.html#glob-import)来自动注册一个组件目录。 +因为我们使用 Vite,还可以利用 Vite 的 [glob 导入功能](https://cn.vite.dev/guide/features.html#glob-import)来自动注册一个组件目录。 ## 布局插槽 {#layout-slots} @@ -308,7 +308,7 @@ provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => { ## 重写内部组件 {#overriding-internal-components} -可以使用 Vite 的 [aliases](https://vitejs.dev/config/shared-options.html#resolve-alias) 来用自定义组件替换默认主题的组件: +可以使用 Vite 的 [aliases](https://vite.dev/config/shared-options.html#resolve-alias) 来用自定义组件替换默认主题的组件: ```ts import { fileURLToPath, URL } from 'node:url' diff --git a/docs/zh/guide/getting-started.md b/docs/zh/guide/getting-started.md index 847c117a..1f4bf0c1 100644 --- a/docs/zh/guide/getting-started.md +++ b/docs/zh/guide/getting-started.md @@ -41,7 +41,7 @@ $ bun add -D vitepress@next ::: tip 注意 -VitePress 是仅 ESM 的软件包。不要使用 `require()` 导入它,并确保最新的 `package.json` 包含 `"type": "module"`,或者更改相关文件的文件扩展名,例如 `.vitepress/config.js` 到 `.mjs`/`.mts`。更多详情请参考 [Vite 故障排除指南](http://vitejs.dev/guide/troubleshooting.html#this-package-is-esm-only)。此外,在异步 CJS 上下文中,可以使用 `await import('vitepress')` 代替。 +VitePress 是仅 ESM 的软件包。不要使用 `require()` 导入它,并确保最新的 `package.json` 包含 `"type": "module"`,或者更改相关文件的文件扩展名,例如 `.vitepress/config.js` 到 `.mjs`/`.mts`。更多详情请参考 [Vite 故障排除指南](http://vite.dev/guide/troubleshooting.html#this-package-is-esm-only)。此外,在异步 CJS 上下文中,可以使用 `await import('vitepress')` 代替。 ::: diff --git a/docs/zh/guide/ssr-compat.md b/docs/zh/guide/ssr-compat.md index c4f4dfd8..16b567cc 100644 --- a/docs/zh/guide/ssr-compat.md +++ b/docs/zh/guide/ssr-compat.md @@ -39,7 +39,7 @@ onMounted(() => { ### 条件导入 {#conditional-import} -也可以使用 `import.meta.env.SSR` 标志 ([Vite 环境变量](https://cn.vitejs.dev/guide/env-and-mode.html#env-variables)的一部分) 来有条件地导入依赖项: +也可以使用 `import.meta.env.SSR` 标志 ([Vite 环境变量](https://cn.vite.dev/guide/env-and-mode.html#env-variables)的一部分) 来有条件地导入依赖项: ```js if (!import.meta.env.SSR) { diff --git a/docs/zh/guide/using-vue.md b/docs/zh/guide/using-vue.md index 6c378a8d..de868f39 100644 --- a/docs/zh/guide/using-vue.md +++ b/docs/zh/guide/using-vue.md @@ -204,7 +204,7 @@ Hello {{ 1 + 1 }} ## 使用 CSS 预处理器 {#using-css-pre-processors} -VitePress [内置支持](https://cn.vitejs.dev/guide/features.html#css-pre-processors) CSS 预处理器:`.scss`、`.sass`、.`less`、`.styl` 和 `.stylus` 文件。无需为它们安装 Vite 专用插件,但必须安装相应的预处理器: +VitePress [内置支持](https://cn.vite.dev/guide/features.html#css-pre-processors) CSS 预处理器:`.scss`、`.sass`、.`less`、`.styl` 和 `.stylus` 文件。无需为它们安装 Vite 专用插件,但必须安装相应的预处理器: ``` # .scss and .sass diff --git a/docs/zh/guide/what-is-vitepress.md b/docs/zh/guide/what-is-vitepress.md index 25fdc01c..f2dae037 100644 --- a/docs/zh/guide/what-is-vitepress.md +++ b/docs/zh/guide/what-is-vitepress.md @@ -16,7 +16,7 @@ VitePress 是一个[静态站点生成器](https://en.wikipedia.org/wiki/Static_ - **文档** - VitePress 附带一个专为技术文档设计的默认主题。你现在正在阅读的这个页面以及 [Vite](https://vitejs.dev/)、[Rollup](https://rollupjs.org/)、[Pinia](https://pinia.vuejs.org/)、[VueUse](https://vueuse.org/)、[Vitest](https://vitest.dev/)、[D3](https://d3js.org/)、[UnoCSS](https://unocss.dev/)、[Iconify](https://iconify.design/) [等](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code)文档都是基于这个主题的。 + VitePress 附带一个专为技术文档设计的默认主题。你现在正在阅读的这个页面以及 [Vite](https://vite.dev/)、[Rollup](https://rollupjs.org/)、[Pinia](https://pinia.vuejs.org/)、[VueUse](https://vueuse.org/)、[Vitest](https://vitest.dev/)、[D3](https://d3js.org/)、[UnoCSS](https://unocss.dev/)、[Iconify](https://iconify.design/) [等](https://github.com/search?q=/%22vitepress%22:+/+path:/(?:package%7Cdeno)%5C.jsonc?$/+NOT+is:fork+NOT+is:archived&type=code)文档都是基于这个主题的。 [Vue.js 官方文档](https://cn.vuejs.org/)也是基于 VitePress 的。但是为了可以在不同的翻译文档之间切换,它自定义了自己的主题。 @@ -30,7 +30,7 @@ VitePress 是一个[静态站点生成器](https://en.wikipedia.org/wiki/Static_ VitePress 旨在使用 Markdown 生成内容时提供出色的开发体验。 -- **[Vite 驱动](https://cn.vitejs.dev/)**:即时服务器启动,始终立即反映 (<100ms) 编辑变化,无需重新加载页面。 +- **[Vite 驱动](https://cn.vite.dev/)**:即时服务器启动,始终立即反映 (<100ms) 编辑变化,无需重新加载页面。 - **[内置 Markdown 扩展](./markdown)**:frontmatter、表格、语法高亮……应有尽有。具体来说,VitePress 提供了许多用于处理代码块的高级功能,使其真正成为技术文档的理想选择。 diff --git a/docs/zh/reference/site-config.md b/docs/zh/reference/site-config.md index 35133b98..e47cb364 100644 --- a/docs/zh/reference/site-config.md +++ b/docs/zh/reference/site-config.md @@ -430,7 +430,7 @@ export default { - 类型:`string` - 默认值: `./.vitepress/cache` -缓存文件的目录,相对于[项目根目录](../guide/routing#root-and-source-directory)。另请参阅:[cacheDir](https://vitejs.dev/config/shared-options.html#cachedir)。 +缓存文件的目录,相对于[项目根目录](../guide/routing#root-and-source-directory)。另请参阅:[cacheDir](https://vite.dev/config/shared-options.html#cachedir)。 ```ts export default { @@ -525,7 +525,7 @@ export default { - 类型:`import('vite').UserConfig` -将原始 [Vite 配置](https://vitejs.dev/config/)传递给内部 Vite 开发服务器 / bundler。 +将原始 [Vite 配置](https://vite.dev/config/)传递给内部 Vite 开发服务器 / bundler。 ```js export default { From 711840222700804dbb6fb39ee9b9580a3e6220e7 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 17 Jul 2026 13:30:04 +0530 Subject: [PATCH 066/187] fix(theme): safari not showing external link icon properly --- docs/.vitepress/config.ts | 5 +---- src/client/theme-default/styles/components/vp-doc.css | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index f13da450..0a5413ee 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -144,10 +144,7 @@ export default defineConfig({ } }), prod && llmstxt({ workDir: 'en', ignoreFiles: ['index.md'] }) - ], - experimental: { - enableNativePlugin: true - } + ] }, // prettier-ignore diff --git a/src/client/theme-default/styles/components/vp-doc.css b/src/client/theme-default/styles/components/vp-doc.css index 904427fc..9dbfe4b5 100644 --- a/src/client/theme-default/styles/components/vp-doc.css +++ b/src/client/theme-default/styles/components/vp-doc.css @@ -576,6 +576,8 @@ -webkit-mask-size: 11px 11px; mask-size: 11px 11px; /*rtl:raw:transform: scaleX(-1);*/ + vertical-align: bottom; + font-size: 10px; } .vp-external-link-icon::after { From 3b560a0efa8bdbf6f621413b3e8a27b19f4a638f Mon Sep 17 00:00:00 2001 From: chencu <82279230+chencu5958@users.noreply.github.com> Date: Sun, 19 Jul 2026 06:25:07 +0800 Subject: [PATCH 067/187] feat: support `note`, `important`, `caution` markdown containers (#5161) closes #4427 closes #3928 --- __tests__/e2e/markdown-extensions/index.md | 12 ++++++++++++ src/node/markdown/plugins/containers.ts | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/__tests__/e2e/markdown-extensions/index.md b/__tests__/e2e/markdown-extensions/index.md index 3446b4ef..c95d60e0 100644 --- a/__tests__/e2e/markdown-extensions/index.md +++ b/__tests__/e2e/markdown-extensions/index.md @@ -56,6 +56,18 @@ This is a dangerous warning. This is a details block. ::: +::: note +This is a note. +::: + +::: important +This is an important note. +::: + +::: caution +This is a caution note. +::: + ### Custom Title ::: danger STOP diff --git a/src/node/markdown/plugins/containers.ts b/src/node/markdown/plugins/containers.ts index 39efce17..20a49167 100644 --- a/src/node/markdown/plugins/containers.ts +++ b/src/node/markdown/plugins/containers.ts @@ -14,6 +14,15 @@ export const containerPlugin = ( .use(...createContainer('warning', options?.warningLabel || 'WARNING', md)) .use(...createContainer('danger', options?.dangerLabel || 'DANGER', md)) .use(...createContainer('details', options?.detailsLabel || 'Details', md)) + .use(...createContainer('note', options?.noteLabel || 'NOTE', md)) + .use( + ...createContainer( + 'important', + options?.importantLabel || 'IMPORTANT', + md + ) + ) + .use(...createContainer('caution', options?.cautionLabel || 'CAUTION', md)) // explicitly escape Vue syntax .use(container, 'v-pre', { render: (tokens: Token[], idx: number) => From 028ee31b06c398368f2dfa401c132c64964ec223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B0=E5=86=BB=E5=A4=A7=E8=A5=BF=E7=93=9C?= <34816426+bd-dxg@users.noreply.github.com> Date: Sun, 19 Jul 2026 16:20:44 +0800 Subject: [PATCH 068/187] docs: add base path prefix docs to sidebar reference (#5324) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- docs/en/reference/default-theme-sidebar.md | 60 ++++++++++++++++++++++ docs/zh/reference/default-theme-sidebar.md | 60 ++++++++++++++++++++++ 2 files changed, 120 insertions(+) diff --git a/docs/en/reference/default-theme-sidebar.md b/docs/en/reference/default-theme-sidebar.md index cd44425d..559cd61d 100644 --- a/docs/en/reference/default-theme-sidebar.md +++ b/docs/en/reference/default-theme-sidebar.md @@ -184,3 +184,63 @@ export default { } } ``` + +## Path Prefix + +When your documentation structure has deep directories or groups located under the same subdirectory, you can use the `base` option to automatically prepend a path prefix to all nested `items` inside that group. This avoids repeating the same path prefix for every `link`. + +The `base` option is supported in both multiple sidebar configurations and nested sidebar groups. + +### In Multiple Sidebars + +You can define `base` at the root of a sidebar section configuration: + +```js {5} +export default { + themeConfig: { + sidebar: { + '/guide/': { + base: '/guide/', + items: [ + // This link is resolved to `/guide/introduction` + { text: 'Introduction', link: 'introduction' }, + // This link is resolved to `/guide/getting-started` + { text: 'Getting Started', link: 'getting-started' } + ] + } + } + } +} +``` + +### In Nested Groups + +You can also use `base` inside nested sidebar groups. It will apply to the immediate children of that group: + +```js{6,13} +export default { + themeConfig: { + sidebar: [ + { + text: 'Reference', + base: '/reference/', + items: [ + // This link is resolved to `/reference/site-config` + { text: 'Site Config', link: 'site-config' }, + { + text: 'Default Theme', + // Nested base overrides the parent path prefix + base: '/reference/default-theme-', + items: [ + // This link is resolved to `/reference/default-theme-nav` + { text: 'Nav', link: 'nav' }, + // This link is resolved to `/reference/default-theme-sidebar` + { text: 'Sidebar', link: 'sidebar' } + ] + } + ] + } + ] + } +} +``` diff --git a/docs/zh/reference/default-theme-sidebar.md b/docs/zh/reference/default-theme-sidebar.md index d6cb585c..b98c46e4 100644 --- a/docs/zh/reference/default-theme-sidebar.md +++ b/docs/zh/reference/default-theme-sidebar.md @@ -182,3 +182,63 @@ export default { } } ``` + +## 路径前缀 {#path-prefix} + +当文档结构具有较深的目录,或者多个分组位于同一个子目录下时,可以使用 `base` 选项为该分组下的所有嵌套 `items` 拼接的一个路径前缀。 + +这样可以避免为每个 `link` 重复书写相同的路径。`base` 选项既支持在多侧边栏配置中使用,也支持在嵌套的侧边栏分组中使用。 + +### 在多侧边栏中使用 {#in-multiple-sidebars} + +可以在多侧边栏配置的根部定义 `base`: + +```js {5} +export default { + themeConfig: { + sidebar: { + '/guide/': { + base: '/guide/', + items: [ + // 实际解析为 `/guide/introduction` + { text: 'Introduction', link: 'introduction' }, + // 实际解析为 `/guide/getting-started` + { text: 'Getting Started', link: 'getting-started' } + ] + } + } + } +} +``` + +### 在嵌套分组中使用 {#in-nested-groups} + +也可以在嵌套的侧边栏分组内部使用 `base`,它将作用于该分组的直接子项: + +```js {6,13} +export default { + themeConfig: { + sidebar: [ + { + text: 'Reference', + base: '/reference/', + items: [ + // 实际解析为 `/reference/site-config` + { text: 'Site Config', link: 'site-config' }, + { + text: 'Default Theme', + // 嵌套的 base 会覆盖父级的路径前缀 + base: '/reference/default-theme-', + items: [ + // 实际解析为 `/reference/default-theme-nav` + { text: 'Nav', link: 'nav' }, + // 实际解析为 `/reference/default-theme-sidebar` + { text: 'Sidebar', link: 'sidebar' } + ] + } + ] + } + ] + } +} +``` From ef64198b4b87413d80a97a37b0a0f8ef3ce4cc9f Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sun, 19 Jul 2026 14:44:32 +0530 Subject: [PATCH 069/187] docs: add example for nesting custom containers --- docs/en/guide/markdown.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/en/guide/markdown.md b/docs/en/guide/markdown.md index 3246afff..5bdee9fa 100644 --- a/docs/en/guide/markdown.md +++ b/docs/en/guide/markdown.md @@ -229,6 +229,36 @@ export default defineConfig({ }) ``` +### Nesting + +The `:::` markers follow the same rules as fenced code blocks (` ``` `): a fence is only closed by a matching fence that is **at least as long** as the one that opened it. To nest containers (or to mix them with [code groups](#code-groups)) make the outer fence longer than the ones inside it. + +**Input** + +`````md +:::: info Outer container +This box contains another container. + +::: details Inner container +```js +console.log('Hello, VitePress!') +``` +::: +:::: +````` + +**Output** + +:::: info Outer container +This box contains another container. + +::: details Inner container +```js +console.log('Hello, VitePress!') +``` +::: +:::: + ### Additional Attributes You can add additional attributes to the custom containers. We use [markdown-it-attrs](https://github.com/arve0/markdown-it-attrs) for this feature, and it is supported on almost all markdown elements. For example, you can set the `open` attribute to make the details block open by default: From c39a85a2ac88dca978d6a7b07fac3353fe0ae7fe Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Mon, 20 Jul 2026 00:47:00 +0530 Subject: [PATCH 070/187] fix(build): compose markdown `preConfig` hook when extending configs x-ref: #5205 Co-authored-by: Jonathan Doughty --- __tests__/unit/node/config.test.ts | 42 +++++++++++++++++++++++++++--- src/node/config.ts | 23 ++++++++++------ 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/__tests__/unit/node/config.test.ts b/__tests__/unit/node/config.test.ts index 22f7d034..4abb8ed6 100644 --- a/__tests__/unit/node/config.test.ts +++ b/__tests__/unit/node/config.test.ts @@ -1,15 +1,18 @@ import type { MarkdownItAsync } from 'markdown-it-async' -import { mergeConfig } from 'node/config' +import { mergeConfig, type UserConfig } from 'node/config' describe('node/config', () => { - test('merges markdown config hooks from extended configs', async () => { + test('merges markdown hooks from extended configs', async () => { const calls: string[] = [] const md = {} as MarkdownItAsync - const merged = mergeConfig( + const merged = mergeConfig( { markdown: { lineNumbers: true, + preConfig() { + calls.push('base-pre') + }, config() { calls.push('base') } @@ -20,6 +23,9 @@ describe('node/config', () => { attrs: { allowedAttributes: ['id'] }, + async preConfig() { + calls.push('extended-pre') + }, async config() { calls.push('extended') } @@ -32,8 +38,36 @@ describe('node/config', () => { allowedAttributes: ['id'] }) + await merged.markdown?.preConfig?.(md) + await merged.markdown?.config?.(md) + + expect(calls).toEqual(['base-pre', 'extended-pre', 'base', 'extended']) + }) + + test('keeps one-sided markdown hooks when the other config omits them', async () => { + const calls: string[] = [] + const md = {} as MarkdownItAsync + + const merged = mergeConfig( + { + markdown: { + preConfig() { + calls.push('base-pre') + } + } + }, + { + markdown: { + config() { + calls.push('extended') + } + } + } + ) + + await merged.markdown?.preConfig?.(md) await merged.markdown?.config?.(md) - expect(calls).toEqual(['base', 'extended']) + expect(calls).toEqual(['base-pre', 'extended']) }) }) diff --git a/src/node/config.ts b/src/node/config.ts index 55d791e0..749e1f39 100644 --- a/src/node/config.ts +++ b/src/node/config.ts @@ -332,17 +332,24 @@ export function mergeConfig( function mergeMarkdownConfig(a: MarkdownOptions, b: MarkdownOptions) { const merged = mergeConfig(a, b, false) - const baseConfig = a.config - const extendedConfig = b.config - if (baseConfig && extendedConfig) { - merged.config = async (md) => { - await baseConfig(md) - await extendedConfig(md) - } - } + merged.preConfig = mergeMarkdownHooks(a.preConfig, b.preConfig) + merged.config = mergeMarkdownHooks(a.config, b.config) return merged } +function mergeMarkdownHooks( + base: MarkdownOptions['config'], + extended: MarkdownOptions['config'] +): MarkdownOptions['config'] { + if (!base || !extended) { + return base ?? extended + } + return async (md) => { + await base(md) + await extended(md) + } +} + export async function resolveSiteData( root: string, userConfig?: UserConfig, From 4666fc277609f8bb916e6a54eb0ac9327784d073 Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Tue, 21 Jul 2026 14:11:03 +0800 Subject: [PATCH 071/187] feat(cli): show vite version in startup log (#5328) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- src/node/cli.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/node/cli.ts b/src/node/cli.ts index 93b0f8c5..2e12748c 100644 --- a/src/node/cli.ts +++ b/src/node/cli.ts @@ -1,6 +1,6 @@ import minimist from 'minimist' import c from 'picocolors' -import { createLogger, type Logger } from 'vite' +import { createLogger, version as viteVersion, type Logger } from 'vite' import { build, createServer, @@ -24,9 +24,10 @@ Object.keys(argv).forEach((key) => { }) const logVersion = (logger: Logger) => { - logger.info(`\n ${c.green(`${c.bold('vitepress')} v${version}`)}\n`, { - clear: !logger.hasWarned - }) + logger.info( + `\n ${c.green(`${c.bold('vitepress')} ${version}`)} ${c.gray(`(using vite ${viteVersion})`)}\n`, + { clear: !logger.hasWarned } + ) } const command = argv._[0] From cf973b20ef53d2663ef50eaff29be038f61e9357 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Tue, 21 Jul 2026 16:00:36 +0800 Subject: [PATCH 072/187] docs: update vite logo (#5319) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- docs/.vitepress/theme/styles.css | 29 +++++++++++++++++++ docs/en/index.md | 8 ++--- docs/es/index.md | 8 ++--- docs/fa/index.md | 8 ++--- docs/ja/index.md | 8 ++--- docs/ko/index.md | 8 ++--- docs/pt/index.md | 8 ++--- docs/ru/index.md | 8 ++--- docs/zh/index.md | 8 ++--- .../theme-default/components/VPImage.vue | 2 +- 10 files changed, 62 insertions(+), 33 deletions(-) diff --git a/docs/.vitepress/theme/styles.css b/docs/.vitepress/theme/styles.css index fbc4f012..113a4ead 100644 --- a/docs/.vitepress/theme/styles.css +++ b/docs/.vitepress/theme/styles.css @@ -35,3 +35,32 @@ filter: drop-shadow(-2px 4px 6px rgba(0, 0, 0, 0.2)); padding: 18px; } + +.VPFeature .icon span { + display: inline-block; + width: 1em; + height: 1em; + background-position: center; + background-repeat: no-repeat; + background-size: contain; + + &.memo { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath fill='%23efd8b1' d='M0 20.3S28.2 50.2 31.2 64c0 0 8.1-17.9 32.8-25.4c0 0-8.8-20.6-32.2-37c0 0-23.9 7.2-31.8 18.7'/%3E%3Cpath fill='%23fff6d7' d='M3.2 7.9s22 38.2 22.4 52.5c0 0 11-14.8 36.4-14c0 0-4.8-22.9-24.6-46.3c0-.1-24.5-.9-34.2 7.8'/%3E%3Cg fill='%237d8b91'%3E%3Cpath d='M19.9 9.4c-.3.4.2-.4 0 0'/%3E%3Cpath d='M19.9 9.4c.2-.3.3-.8.6-1.1c.4-.3.8-.1 1.2-.4c.8-.6 1.2-1.6 1.9-2.3c.8-.8 1.8-1.3 2.9-1.6c1.1-.4 2.2-1.2 3.3-1.2c-.5 1.5-1.5 2.8-1.7 4.5c-.1.9 0 1.8.1 2.7c.2-.7.4-1.4.6-2c.4-.9 1.3-.8 2.1-1.1c.8-.4 1.5-1.1 2.2-1.7c.3.5 1.4-.3 1.6.4c.1.3 2.8-.1 3-.2c-.6 0-2.7.1-2.8-.4c-.3-.1-.9-.2-1.3-.2v-.7c-.6.4-1.2.9-1.8 1.4c-.9.7-2 .5-2.9 1.2c.3-1 .9-1.9 1.3-2.9c.2-.4.3-.9.4-1.3s0-.2-.3-.4c-1.4-.4-2.8.7-4 1.2c-1.1.5-2.1 1.1-2.9 1.9c-.5.5-1.3 2.3-2 2.5c-1.4 0-.9 1.3-1.8 1.7c-.5.2-.8.2-1.3.5c-.5.4-1.2 1.1-2 1c0-.6 0-1.2-.2-1.8c-.8.4-1.1 1.1-1.8 1.6c.2-1.6.9-2.9.9-4.6c-.9.6-1.4 1.3-1.9 2.2c-.6 1.1-1.1 2.9-2.3 3.5c0-1.5.7-3 .5-4.6c-.3.8-.3 1.8-.5 2.5c-.2.9-.4 1.8-.4 2.8c2.2-.3 2.6-3.5 3.9-4.9c-.3 1.4-.8 2.7-.7 4.2c.9-.5 1.3-1.5 2.1-2.1c.3.9-.4 2.1 1.1 1.4c.6-.3 1.1-.8 1.7-1.2c.3-.2.9 0 1.2-.5m21.5 4.4c-.4-.4-1.1-.5-1.6-.9c-.6-.5-1.6-.3-2.2-.1c-1.6.4-2.7.8-4.2 0c0 .5.1 2.5-.7 2.4c-.7 0-.5-2.1-.6-2.8c-.4.6-.7 1.1-.7 1.8c0 .5.2.8-.2 1.3c-.6.5-1.5.4-2.2.3c-.2-1.1.1-2.4.2-3.6c-.2 1-.5 2-.7 3.1c-.2.8-.9.9-1.5.7c-.1-.2.1-1 .1-1.2c-.6 1.1-1 2.5-1.8 3.5c-.4.5-1.3 1-1.7.2c-.3-.5-.1-1.2 0-1.8c-.5.6-1 2.3-1.8 2.3c.1-.4.4-.8-.1-1c-.2.4-.4.9-.7 1.4c.2-.6.4-1.3.5-2c-1.3.8-2.1 1.9-2.8 3.2c0-.2.1-.7.1-.9c-.1.4-.9 1.9-.4 2.2c.7-1.1 1.3-2.3 2.3-3.2c-.5 1.5-1.1 2.8-1.4 4.3c.6-.7 1.2-1.5 1.7-2.3c.1-.3.3-.6.4-.9c.3-.8.3-.2.9-.6c.5-.4.8-1.1 1.1-1.7c-.1 1.8 1.4 2.1 2.4.7c.4-.6.7-1.2 1-1.8l.8.2c.4 0 .7 0 1-.2c1.1.4 2.8.5 3.5-.8c1.2 1.3 2-.7 2.1-1.7c1.2.5 2.3-.1 3.5-.5c.7-.2 2-.8 2.5 0c.2.3.7.3 1.2.4M30.8 24.1s.1 0 0 0m0 0c0-.4-.3-.6-.7-.3c-.5.4-.2-.3-.2-.7c0-.5.1-.9.1-1.4c-.2.4-.5.8-.7 1.2c-.4.7-.3 2-1.3 2.1c.2-.5.3-1 .4-1.5c-.5.5-1.1.8-1.1 1.6c0 1-1 3.4-2.3 3.1c.1-2 1.2-3.8 1.7-5.7c-2 1.2-3.7 4.2-3.9 6.4c1-1.7 1.7-3.6 3.1-5c-.4 1.5-.9 2.9-1 4.4c0 .3.8.1.9.1c.7-.2 1.2-.9 1.5-1.5c.1-.2.3-.5.4-.7c.3-.6.4-.2.9-.5c.7-.3.7-1.2 1.4-1.1s2.2-.1 2.7-.4c-.6 0-1.2.1-1.9-.1m-.5-.4l.2.2c-.1 0-.2-.1-.2-.2m13.8 18.7c.5-.7-.2-.1 0 0'/%3E%3Cpath d='M58.4 39.7c-1.8-1.3-3.9-2.1-5.9-3.2c.4.6 1 1.3 1.3 2c-1 .1-.9 1.9-1 1.9c-.5-.3-1.9 0-2.5.1c0-.1 0-.2.1-.3c-1.8 1.2-3.3 3-5.7 2.5c1.1-1.7 2-3.6 1.9-5.7c-1.8.6-2.8 2.3-3.6 3.9c-.2-.6-1-1.1-1.5-.6c-.6.5-.9 1.5-1.1 2.2c-.3.9-.4 1.9-.5 2.8c0 .7-.1.8.6.8c1.7 0 3.2-2 4-3.2c2.2.6 3.5-.4 5.2-1.6c0 .8.6 1.3 1.4 1.1s1.2-1.2 1.8-1.2c.5 0 .8.2 1.3.2s1.1-.1 1.6-.2c-.6-.7-.8-1.2-1-2.1c1.2.3 2.3.6 3.6.6m-16.2 4.9c.2-.2.3-.3 0 0c-.3.2-.2.2-.1.1c-.5.4-1.1.9-1.8.9c0-1.5.2-3.3.9-4.6c.4-.6.9-.8 1.5-.3c.4.4-.1.8-.1 1.2c.1-.2.2-.4.3-.5c.1.6.4 1 1 1.3c-.5.6-1 1.3-1.7 1.9m1.9-2.2c-2.4-1 .7-4.1 2.1-4.7c-.2 1.7-1.1 3.3-2.1 4.7m6.9-.8c-.8.2-.8-.6-.7-1.1c.5.2 1 .4 1.6.5c-.2.3-.5.6-.9.6m2.7-.7v-.1zm.2-.6c.1-.1.1-.3.1-.4c-.3.1-.5.2-.8.3c0-.3-.1-1.1.3-1.2c.8-.4.8.9.9 1.4c-.2 0-.4 0-.5-.1m.9-1.8h-.2c-.1-.1 0-.1.2 0'/%3E%3C/g%3E%3Cpath fill='%23ffce31' d='m35.658 20.801l16.124-16.12l7.565 7.567l-16.124 16.12z'/%3E%3Cpath fill='%23ed4c5c' d='m62.6 2.3l-1-1c-1.8-1.8-4.8-1.8-6.6 0l-3.3 3.3l7.6 7.6l3.3-3.3c1.9-1.8 1.9-4.7 0-6.6'/%3E%3Cpath fill='%2393a2aa' d='m49.703 6.679l2.05-2.05l7.566 7.567l-2.051 2.05z'/%3E%3Cpath fill='%23c7d3d8' d='m50.552 7.527l2.05-2.05l5.94 5.939l-2.05 2.05z'/%3E%3Cpath fill='%23fed0ac' d='m35.6 20.8l-3.3 8.6l2.3 2.3l8.6-3.3z'/%3E%3Cpath fill='%23333' d='M31.8 30.9c-.5 1.2.2 1.8 1.3 1.3l4.2-1.6l-3.9-3.9z'/%3E%3Cpath fill='%23ffdf85' d='M35.672 20.82L49.744 6.75l2.545 2.545l-14.071 14.071z'/%3E%3Cpath fill='%23ff8736' d='m40.656 25.869l14.07-14.074l2.545 2.546l-14.07 14.073z'/%3E%3C/svg%3E"); + } + + &.rocket { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cg fill='%23ff9d27'%3E%3Cpath d='M10.9 48.7c4-4 4.4-5 6.9-2.5s1.5 2.8-2.5 6.9c-3 3-6.8 2.4-6.8 2.4s-.6-3.8 2.4-6.8'/%3E%3Cpath d='M18.5 52.8c1.6-4.2 2.1-4.7-.2-6s-2.3-.4-3.8 3.8c-1.2 3.1.2 5.9.2 5.9s2.7-.5 3.8-3.7'/%3E%3C/g%3E%3Cpath fill='%23fdf516' d='M16.2 48.9c.9-2.3.9-2.8 2.1-2.1c1.3.7 1 1 .1 3.3c-.6 1.7-2.1 2.1-2.1 2.1s-.7-1.5-.1-3.3'/%3E%3Cpath fill='%23ff9d27' d='M17.1 45.7c-1.3-2.3-1.8-1.8-6-.2c-3.1 1.2-3.7 3.8-3.7 3.8s2.8 1.4 5.9.2c4.2-1.6 5.1-1.6 3.8-3.8'/%3E%3Cg fill='%23fdf516'%3E%3Cpath d='M15 47.8c2.3-.9 2.8-.9 2.1-2.1c-.7-1.3-1-1-3.3-.1c-1.7.6-2.1 2.1-2.1 2.1s1.6.7 3.3.1'/%3E%3Cpath d='M13.9 47.6c2.2-2.2 2.4-2.8 3.8-1.4s.8 1.6-1.4 3.8c-1.7 1.7-3.8 1.3-3.8 1.3s-.2-2 1.4-3.7'/%3E%3C/g%3E%3Cpath fill='%233baacf' d='M18.5 38C12.3 27.6 2 31.9 2 31.9s14.7-14.7 24.6-4.8z'/%3E%3Cpath fill='%23428bc1' d='m23.3 30.3l3.2-3.2C16.7 17.2 2 31.9 2 31.9s12.9-9.2 21.3-1.6'/%3E%3Cpath fill='%233baacf' d='M26 45.5C36.4 51.7 32.1 62 32.1 62s14.7-14.7 4.8-24.6z'/%3E%3Cpath fill='%23428bc1' d='m33.7 40.7l3.2-3.2c9.9 9.9-4.8 24.6-4.8 24.6s9.2-13 1.6-21.4'/%3E%3Cpath fill='%23c5d0d8' d='M48.8 30.9C37.1 42.5 24.2 48.8 19.7 44.3s1.8-17.4 13.4-29.1c13.6-13.6 28.7-13 28.7-13s.5 15.1-13 28.7'/%3E%3Cpath fill='%23dae3ea' d='M45.8 27.6C34.2 39.2 22.6 46.8 19.9 44.1s4.9-14.3 16.5-25.9C50 4.6 62 2 62 2s-2.6 12-16.2 25.6'/%3E%3Cpath fill='%23c94747' d='M24.3 47.5c-.5.5-1.3.5-1.8 0l-6-6c-.5-.5-.5-1.4 0-1.9l1.8-1.8l7.8 7.8z'/%3E%3Cpath fill='%23f15744' d='M22.6 45.7c-.5.5-1.1.7-1.4.4l-3.4-3.4c-.3-.3-.1-.9.4-1.4l1.8-1.8l4.4 4.4z'/%3E%3Cpath fill='%233e4347' d='M20.9 48.2c-.3.3-1 .3-1.3 0l-3.9-3.9c-.3-.3-.2-.9.1-1.2l1.2-1.2l5.1 5.1z'/%3E%3Cpath fill='%2362727a' d='M20.1 47.4c-.3.3-.9.4-1.1.2l-2.7-2.7c-.2-.2-.1-.7.3-1l1.2-1.2l3.5 3.5z'/%3E%3Cpath fill='%23c94747' d='M61.8 2.2S56.4 2 49.1 4.8l10.1 10.1C62 7.6 61.8 2.2 61.8 2.2'/%3E%3Cpath fill='%23f15744' d='M61.8 2.2s-4.3.9-10.8 4.6l6.2 6.2c3.7-6.5 4.6-10.8 4.6-10.8'/%3E%3Ccircle cx='43.5' cy='20.5' r='5' fill='%23edf4f9'/%3E%3Ccircle cx='43.5' cy='20.5' r='3.3' fill='%233baacf'/%3E%3Ccircle cx='33.5' cy='30.5' r='5' fill='%23edf4f9'/%3E%3Ccircle cx='33.5' cy='30.5' r='3.3' fill='%233baacf'/%3E%3Cg fill='%23fff'%3E%3Cpath d='M48.9 6.9c-.3.3-.9.3-1.2 0s-.3-.9 0-1.2s.9-.3 1.2 0s.3.9 0 1.2'/%3E%3Ccircle cx='50.6' cy='8.6' r='.8'/%3E%3Ccircle cx='53' cy='11' r='.8'/%3E%3Ccircle cx='55.3' cy='13.4' r='.8'/%3E%3Ccircle cx='57.7' cy='15.7' r='.8'/%3E%3C/g%3E%3C/svg%3E"); + } + + &.vite { + background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='1 6.8 30 18.4'%3E%3Cmask id='SVGgudELdDz'%3E%3Cpath fill='%23fff' d='M40.05 45.7c-.67.85-2.02.38-2.02-.69v-10.3a2.26 2.26 0 0 0-2.27-2.26H24.4a1.13 1.13 0 0 1-.92-1.8l7.48-10.46c1.07-1.5 0-3.58-1.84-3.58H15.34a1.13 1.13 0 0 1-.92-1.79l9.7-13.57c.2-.3.55-.48.92-.48h28.89c.92 0 1.46 1.04.92 1.79l-7.48 10.47a2.26 2.26 0 0 0 1.84 3.58H60.6c.94 0 1.47 1.09.89 1.83z'/%3E%3C/mask%3E%3Cg fill='none'%3E%3Cg mask='url(%23SVGgudELdDz)' transform='translate(1 6.8)scale(.393)'%3E%3Cpath fill='%239135ff' d='M0 0h62v47H0z'/%3E%3Cg filter='url(%23SVGNp06lekD)'%3E%3Cellipse cx='24.46' cy='37.75' fill='%23eee6ff' rx='5.51' ry='14.7' transform='rotate(89.8 24.46 37.75)'/%3E%3C/g%3E%3Cg filter='url(%23SVGNp06lekD)'%3E%3Cellipse cx='4.76' cy='18.96' fill='%23eee6ff' rx='10.4' ry='29.85' transform='rotate(89.8 4.76 18.96)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='4.24' cy='17.5' fill='%238900ff' rx='5.51' ry='30.49' transform='rotate(89.8 4.24 17.5)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='8.95' cy='35.5' fill='%238900ff' rx='5.51' ry='30.6' transform='rotate(89.8 8.95 35.5)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='10.48' cy='36.65' fill='%238900ff' rx='5.51' ry='30.6' transform='rotate(89.8 10.48 36.65)'/%3E%3C/g%3E%3Cg filter='url(%23SVGNp06lekD)'%3E%3Cellipse cx='67.34' cy='12.3' fill='%23eee6ff' rx='14.07' ry='22.08' transform='rotate(-86.7 67.34 12.3)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='68.44' cy='15.74' fill='%238900ff' rx='3.47' ry='21.5' transform='rotate(-91 68.44 15.74)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='68.44' cy='15.74' fill='%238900ff' rx='3.47' ry='21.5' transform='rotate(-91 68.44 15.74)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='14.59' cy='9.74' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(39.5 14.6 9.74)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='61.73' cy='-5.32' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(37.9 61.73 -5.32)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='55.62' cy='7.1' fill='%2300c2ff' rx='5.97' ry='9.67' transform='rotate(37.9 55.62 7.1)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='12.33' cy='39.1' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(37.9 12.33 39.1)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='12.33' cy='39.1' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(37.9 12.33 39.1)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='49.86' cy='30.68' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(37.9 49.86 30.68)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='52.62' cy='33.17' fill='%2300c2ff' rx='5.97' ry='15.3' transform='rotate(37.9 52.62 33.17)'/%3E%3C/g%3E%3C/g%3E%3Cpath fill='%2308060e' d='M3.72 6.8C.1 11.98.08 20 3.72 25.2h2.45c-3.64-5.2-3.62-13.22 0-18.4zm24.56 0h-2.45c3.62 5.18 3.64 13.2 0 18.4h2.45c3.64-5.2 3.62-13.22 0-18.4'/%3E%3Cdefs%3E%3Cfilter id='SVGNp06lekD' width='4' height='4' x='-2' y='-2' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='7.66'/%3E%3C/filter%3E%3Cfilter id='SVGQv8P6csY' width='4' height='4' x='-2' y='-2' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='4.6'/%3E%3C/filter%3E%3C/defs%3E%3C/g%3E%3C/svg%3E"); + .dark & { + background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='1 6.8 30 18.4'%3E%3Cmask id='SVGgudELdDz'%3E%3Cpath fill='%23fff' d='M40.05 45.7c-.67.85-2.02.38-2.02-.69v-10.3a2.26 2.26 0 0 0-2.27-2.26H24.4a1.13 1.13 0 0 1-.92-1.8l7.48-10.46c1.07-1.5 0-3.58-1.84-3.58H15.34a1.13 1.13 0 0 1-.92-1.79l9.7-13.57c.2-.3.55-.48.92-.48h28.89c.92 0 1.46 1.04.92 1.79l-7.48 10.47a2.26 2.26 0 0 0 1.84 3.58H60.6c.94 0 1.47 1.09.89 1.83z'/%3E%3C/mask%3E%3Cg fill='none'%3E%3Cg mask='url(%23SVGgudELdDz)' transform='translate(1 6.8)scale(.393)'%3E%3Cpath fill='%239135ff' d='M0 0h62v47H0z'/%3E%3Cg filter='url(%23SVGNp06lekD)'%3E%3Cellipse cx='24.46' cy='37.75' fill='%23eee6ff' rx='5.51' ry='14.7' transform='rotate(89.8 24.46 37.75)'/%3E%3C/g%3E%3Cg filter='url(%23SVGNp06lekD)'%3E%3Cellipse cx='4.76' cy='18.96' fill='%23eee6ff' rx='10.4' ry='29.85' transform='rotate(89.8 4.76 18.96)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='4.24' cy='17.5' fill='%238900ff' rx='5.51' ry='30.49' transform='rotate(89.8 4.24 17.5)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='8.95' cy='35.5' fill='%238900ff' rx='5.51' ry='30.6' transform='rotate(89.8 8.95 35.5)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='10.48' cy='36.65' fill='%238900ff' rx='5.51' ry='30.6' transform='rotate(89.8 10.48 36.65)'/%3E%3C/g%3E%3Cg filter='url(%23SVGNp06lekD)'%3E%3Cellipse cx='67.34' cy='12.3' fill='%23eee6ff' rx='14.07' ry='22.08' transform='rotate(-86.7 67.34 12.3)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='68.44' cy='15.74' fill='%238900ff' rx='3.47' ry='21.5' transform='rotate(-91 68.44 15.74)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='68.44' cy='15.74' fill='%238900ff' rx='3.47' ry='21.5' transform='rotate(-91 68.44 15.74)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='14.59' cy='9.74' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(39.5 14.6 9.74)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='61.73' cy='-5.32' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(37.9 61.73 -5.32)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='55.62' cy='7.1' fill='%2300c2ff' rx='5.97' ry='9.67' transform='rotate(37.9 55.62 7.1)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='12.33' cy='39.1' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(37.9 12.33 39.1)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='12.33' cy='39.1' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(37.9 12.33 39.1)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='49.86' cy='30.68' fill='%238900ff' rx='4.41' ry='29.11' transform='rotate(37.9 49.86 30.68)'/%3E%3C/g%3E%3Cg filter='url(%23SVGQv8P6csY)'%3E%3Cellipse cx='52.62' cy='33.17' fill='%2300c2ff' rx='5.97' ry='15.3' transform='rotate(37.9 52.62 33.17)'/%3E%3C/g%3E%3C/g%3E%3Cpath fill='%23fff' d='M3.72 6.8C.1 11.98.08 20 3.72 25.2h2.45c-3.64-5.2-3.62-13.22 0-18.4zm24.56 0h-2.45c3.62 5.18 3.64 13.2 0 18.4h2.45c3.64-5.2 3.62-13.22 0-18.4'/%3E%3Cdefs%3E%3Cfilter id='SVGNp06lekD' width='4' height='4' x='-2' y='-2' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='7.66'/%3E%3C/filter%3E%3Cfilter id='SVGQv8P6csY' width='4' height='4' x='-2' y='-2' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='4.6'/%3E%3C/filter%3E%3C/defs%3E%3C/g%3E%3C/svg%3E"); + } + width: 1.3em; + } + + &.vue { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='2 3.92 28 24.15'%3E%3Cpath fill='%2341b883' d='M24.4 3.925H30l-14 24.15L2 3.925h10.71l3.29 5.6l3.22-5.6Z'%3E%3C/path%3E%3Cpath fill='%2341b883' d='m2 3.925l14 24.15l14-24.15h-5.6L16 18.415L7.53 3.925Z'%3E%3C/path%3E%3Cpath fill='%2335495e' d='M7.53 3.925L16 18.485l8.4-14.56h-5.18L16 9.525l-3.29-5.6Z'%3E%3C/path%3E%3C/svg%3E"); + } +} diff --git a/docs/en/index.md b/docs/en/index.md index ce9015b2..93f8f3f6 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -21,16 +21,16 @@ hero: alt: VitePress features: - - icon: 📝 + - icon: title: Focus on your content details: Effortlessly create beautiful documentation sites with just markdown. - - icon: + - icon: title: Enjoy the Vite DX details: Instant server start, lightning fast hot updates, and leverage Vite ecosystem plugins. - - icon: + - icon: title: Customize with Vue details: Use Vue syntax and components directly in markdown, or build custom themes with Vue. - - icon: 🚀 + - icon: title: Ship fast sites details: Fast initial load with static HTML, fast post-load navigation with client-side routing. --- diff --git a/docs/es/index.md b/docs/es/index.md index b4c8673f..1eb31f82 100644 --- a/docs/es/index.md +++ b/docs/es/index.md @@ -21,16 +21,16 @@ hero: alt: VitePress features: - - icon: 📝 + - icon: title: Concéntrese en su contenido details: Cree lindos sitios de documentación apenas con markdown. - - icon: + - icon: title: Disfruta de la experiencia Vite details: Inicio instantaneo de servidor, actualizaciones ultrarrápidas, y plugins del ecosistema Vite. - - icon: + - icon: title: Personaliza con Vue details: Usa la sintaxis y componentes Vue directamente en markdown, o construye temas personalizados con Vue. - - icon: 🚀 + - icon: title: Entrega rápida de sitios details: Carga inicial rápida con HTML estático, navegación rápida con enrutamiento del lado del cliente. --- diff --git a/docs/fa/index.md b/docs/fa/index.md index d36e6a2c..c8f263fd 100644 --- a/docs/fa/index.md +++ b/docs/fa/index.md @@ -21,16 +21,16 @@ hero: alt: ویت‌پرس features: - - icon: 📝 + - icon: title: تمرکز روی محتوا details: ایجاد سایت‌های مستند‌سازی زیبا بدون زحمت و فقط با Markdown - - icon: + - icon: title: لذت از تجربه توسعه با Vite details: شروع فوری سرور، به‌روزرسانی‌های سریع و استفاده از افزونه‌های اکوسیستم Vite - - icon: + - icon: title: شخصی‌سازی با Vue details: استفاده مستقیم از syntax و کامپوننت‌های Vue در Markdown، یا ایجاد تم‌های شخصی به کمک Vue - - icon: 🚀 + - icon: title: ارسال سایت های سریع details: بارگذاری اولیه سریع با HTML ایستا، ناوبری سریع پس از بارگیری با مسیریابی سمت کلاینت --- diff --git a/docs/ja/index.md b/docs/ja/index.md index b5be770b..665ad78e 100644 --- a/docs/ja/index.md +++ b/docs/ja/index.md @@ -21,16 +21,16 @@ hero: alt: VitePress features: - - icon: 📝 + - icon: title: コンテンツに集中 details: Markdown だけで、美しいドキュメントサイトを簡単に作成できます。 - - icon: + - icon: title: Vite の開発体験を享受 details: 即時サーバー起動、超高速ホットリロード、そして Vite エコシステムのプラグイン活用。 - - icon: + - icon: title: Vue でカスタマイズ details: Markdown 内で直接 Vue 構文やコンポーネントを利用したり、Vue で独自テーマを構築できます。 - - icon: 🚀 + - icon: title: 高速サイトを公開 details: 静的 HTML による高速初期ロードと、クライアントサイドルーティングによる快適なページ遷移。 --- diff --git a/docs/ko/index.md b/docs/ko/index.md index d5a6c1a2..fa302470 100644 --- a/docs/ko/index.md +++ b/docs/ko/index.md @@ -21,16 +21,16 @@ hero: alt: VitePress features: - - icon: 📝 + - icon: title: 콘텐츠에 집중 details: 마크다운으로만 아름다운 문서 사이트를 쉽게 만들기. - - icon: + - icon: title: Vite DX(개발자 경험) 즐겨보기 details: 즉각적인 서버 시작, 매우 빠른 업데이트, Vite 생태계 플러그인을 활용. - - icon: + - icon: title: Vue로 커스터마이징 details: Vue 문법과 컴포넌트를 마크다운에서 직접 사용하거나 Vue로 커스텀 테마를 구축. - - icon: 🚀 + - icon: title: 웹사이트를 빠르게 제공 details: 정적 HTML로 빠른 초기 로딩, 클라이언트 측 라우팅을 통한 빠른 탐색. --- diff --git a/docs/pt/index.md b/docs/pt/index.md index ca621454..6143921b 100644 --- a/docs/pt/index.md +++ b/docs/pt/index.md @@ -21,16 +21,16 @@ hero: alt: VitePress features: - - icon: 📝 + - icon: title: Foco no seu conteúdo details: Cria sites de documentação belos e sem esforço apenas com markdown. - - icon: + - icon: title: Aproveite a experiência Vite details: Início de servidor instantâneo, atualizações ultrarrápidas, e plugins do ecossistema Vite. - - icon: + - icon: title: Personalize com Vue details: Use sintaxe e componentes Vue diretamente em markdown, ou construa temas personalizados com Vue. - - icon: 🚀 + - icon: title: Entregue Sites Rápidos details: Carregamento inicial rápido com HTML estático, navegação rápida com roteamento no lado do cliente. --- diff --git a/docs/ru/index.md b/docs/ru/index.md index 2fb82def..5d151a85 100644 --- a/docs/ru/index.md +++ b/docs/ru/index.md @@ -21,16 +21,16 @@ hero: alt: VitePress features: - - icon: 📝 + - icon: title: Сосредоточьтесь на своем контенте details: Легко создавайте красивые сайты с документацией, используя только Markdown. - - icon: + - icon: title: Наслаждайтесь опытом разработчиков Vite details: Мгновенный запуск сервера, молниеносные горячие обновления и использование плагинов экосистемы Vite. - - icon: + - icon: title: Настройка с помощью Vue details: Используйте синтаксис Vue и компоненты прямо в Markdown или создавайте собственные темы с помощью Vue. - - icon: 🚀 + - icon: title: Быстрый запуск веб-сайтов details: Быстрая начальная загрузка с помощью статического HTML, быстрая навигация после загрузки с помощью маршрутизации на стороне клиента. --- diff --git a/docs/zh/index.md b/docs/zh/index.md index 6be83546..55275f6a 100644 --- a/docs/zh/index.md +++ b/docs/zh/index.md @@ -21,16 +21,16 @@ hero: alt: VitePress features: - - icon: 📝 + - icon: title: 专注内容 details: 只需 Markdown 即可轻松创建美观的文档站点。 - - icon: + - icon: title: 享受 Vite 无可比拟的体验 details: 服务器即时启动,闪电般的热更新,还可以使用基于 Vite 生态的插件。 - - icon: + - icon: title: 使用 Vue 自定义 details: 直接在 Markdown 中使用 Vue 语法和组件,或者使用 Vue 组件构建自定义主题。 - - icon: 🚀 + - icon: title: 速度真的很快! details: 采用静态 HTML 实现快速的页面初次加载,使用客户端路由实现快速的页面切换导航。 --- diff --git a/src/client/theme-default/components/VPImage.vue b/src/client/theme-default/components/VPImage.vue index 8a2f5131..0a014d3c 100644 --- a/src/client/theme-default/components/VPImage.vue +++ b/src/client/theme-default/components/VPImage.vue @@ -40,7 +40,7 @@ defineOptions({ inheritAttrs: false }) html:not(.dark) .VPImage.dark { display: none; } -.dark .VPImage.light { +html.dark .VPImage.light { display: none; } From 9376c58abec557dd8c5b63f991a1d1068586f175 Mon Sep 17 00:00:00 2001 From: Henrikh Kantuni Date: Wed, 22 Jul 2026 16:17:25 -0400 Subject: [PATCH 073/187] fix(theme): prevent TypeError when navigating to page without outline (#5329) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- src/client/theme-default/composables/outline.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/client/theme-default/composables/outline.ts b/src/client/theme-default/composables/outline.ts index bc03203f..e17a005c 100644 --- a/src/client/theme-default/composables/outline.ts +++ b/src/client/theme-default/composables/outline.ts @@ -100,7 +100,6 @@ export function useActiveAnchor( onUnmounted(() => { window.removeEventListener('scroll', onScroll) - container.value.removeEventListener('click', onClick) }) function onClick(e: MouseEvent) { From 078786a1b3e0793f55cb14d819df93900041ccb0 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:05:18 +0530 Subject: [PATCH 074/187] refactor(markdown)!: rename image option `lazyLoading` to `lazyLoad` BREAKING CHANGE: The `markdown.image.lazyLoading` option has been renamed to `markdown.image.lazyLoad`. Co-Authored-By: Claude Fable 5 --- __tests__/e2e/.vitepress/config.ts | 4 +--- __tests__/unit/node/markdown/plugins/image.test.ts | 4 ++-- docs/en/guide/markdown.md | 4 ++-- docs/es/guide/markdown.md | 4 ++-- docs/fa/guide/markdown.md | 4 ++-- docs/ja/guide/markdown.md | 4 ++-- docs/ko/guide/markdown.md | 4 ++-- docs/pt/guide/markdown.md | 4 ++-- docs/ru/guide/markdown.md | 4 ++-- docs/zh/guide/markdown.md | 4 ++-- src/node/markdown/plugins/image.ts | 6 +++--- 11 files changed, 22 insertions(+), 24 deletions(-) diff --git a/__tests__/e2e/.vitepress/config.ts b/__tests__/e2e/.vitepress/config.ts index 441eda1c..7ec72c30 100644 --- a/__tests__/e2e/.vitepress/config.ts +++ b/__tests__/e2e/.vitepress/config.ts @@ -155,9 +155,7 @@ export default defineConfig({ title: 'Example', description: 'An example app using VitePress.', markdown: { - image: { - lazyLoading: true - } + image: { lazyLoad: true } }, themeConfig: { nav, diff --git a/__tests__/unit/node/markdown/plugins/image.test.ts b/__tests__/unit/node/markdown/plugins/image.test.ts index c2b56059..1745819d 100644 --- a/__tests__/unit/node/markdown/plugins/image.test.ts +++ b/__tests__/unit/node/markdown/plugins/image.test.ts @@ -123,9 +123,9 @@ describe('node/markdown/plugins/image', () => { }) describe('lazy loading', () => { - const mdLazy = createRenderer({ lazyLoading: true }) + const mdLazy = createRenderer({ lazyLoad: true }) - test('adds loading="lazy" when lazyLoading is enabled', async () => { + test('adds loading="lazy" when lazy loading is enabled', async () => { const html = await mdLazy.renderAsync('![logo](foo.png)') expect(html).toContain('loading="lazy"') diff --git a/docs/en/guide/markdown.md b/docs/en/guide/markdown.md index 5bdee9fa..5202c7cb 100644 --- a/docs/en/guide/markdown.md +++ b/docs/en/guide/markdown.md @@ -1024,14 +1024,14 @@ $$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ ## Image Lazy Loading -You can enable lazy loading for each image added via markdown by setting `lazyLoading` to `true` in your config file: +You can enable lazy loading for each image added via markdown by setting `lazyLoad` to `true` in your config file: ```js export default { markdown: { image: { // image lazy loading is disabled by default - lazyLoading: true + lazyLoad: true } } } diff --git a/docs/es/guide/markdown.md b/docs/es/guide/markdown.md index 3bb1131d..7e1fc0aa 100644 --- a/docs/es/guide/markdown.md +++ b/docs/es/guide/markdown.md @@ -888,14 +888,14 @@ $$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ ## _Lazy Loading_ de Imagenes {#image-lazy-loading} -Puede activar la "carga perezosa" para cada imagen adicionada via markdown definiendo `lazyLoading` como `true` en su archivo de configuración: +Puede activar la "carga perezosa" para cada imagen adicionada via markdown definiendo `lazyLoad` como `true` en su archivo de configuración: ```js export default { markdown: { image: { // la carga perezosa de imagenes está desactivada por defecto - lazyLoading: true + lazyLoad: true } } } diff --git a/docs/fa/guide/markdown.md b/docs/fa/guide/markdown.md index 05072193..ecce9f2e 100644 --- a/docs/fa/guide/markdown.md +++ b/docs/fa/guide/markdown.md @@ -880,14 +880,14 @@ $$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ ## بارگذاری lazy تصویر {#image-lazy-loading} -می‌توانید بارگذاری تنبلی را برای هر تصویر اضافه شده از طریق Markdown با تنظیم `lazyLoading` به `true` در فایل پیکربندی فعال کنید: +می‌توانید بارگذاری تنبلی را برای هر تصویر اضافه شده از طریق Markdown با تنظیم `lazyLoad` به `true` در فایل پیکربندی فعال کنید: ```js export default { markdown: { image: { // بارگذاری تنبلی تصویر به طور پیش‌فرض غیرفعال است - lazyLoading: true + lazyLoad: true } } } diff --git a/docs/ja/guide/markdown.md b/docs/ja/guide/markdown.md index e2a7e91d..13dae321 100644 --- a/docs/ja/guide/markdown.md +++ b/docs/ja/guide/markdown.md @@ -996,14 +996,14 @@ $$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ ## 画像の遅延読み込み {#image-lazy-loading} -Markdown で追加した各画像に対して遅延読み込みを有効化するには、設定ファイルで `lazyLoading` を `true` にします: +Markdown で追加した各画像に対して遅延読み込みを有効化するには、設定ファイルで `lazyLoad` を `true` にします: ```js export default { markdown: { image: { // 既定では画像の遅延読み込みは無効 - lazyLoading: true + lazyLoad: true } } } diff --git a/docs/ko/guide/markdown.md b/docs/ko/guide/markdown.md index 504ec6b1..c756d05e 100644 --- a/docs/ko/guide/markdown.md +++ b/docs/ko/guide/markdown.md @@ -925,14 +925,14 @@ $$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ ## 이미지 지연 로딩 {#image-lazy-loading} -마크다운을 통해 추가된 각 이미지에 대해 지연 로딩을 활성화하려면 구성 파일에서 `lazyLoading`을 `true`로 설정하세요: +마크다운을 통해 추가된 각 이미지에 대해 지연 로딩을 활성화하려면 구성 파일에서 `lazyLoad`을 `true`로 설정하세요: ```js export default { markdown: { image: { // 이미지 지연 로딩은 기본적으로 비활성화 되어 있습니다 - lazyLoading: true + lazyLoad: true } } } diff --git a/docs/pt/guide/markdown.md b/docs/pt/guide/markdown.md index f8b410ec..1eef2c72 100644 --- a/docs/pt/guide/markdown.md +++ b/docs/pt/guide/markdown.md @@ -887,14 +887,14 @@ $$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ ## _Lazy Loading_ de Imagens {#image-lazy-loading} -Você pode ativar o "carregamento folgado" para cada imagem adicionada via markdown definindo `lazyLoading` como `true` no seu arquivo de configuração: +Você pode ativar o "carregamento folgado" para cada imagem adicionada via markdown definindo `lazyLoad` como `true` no seu arquivo de configuração: ```js export default { markdown: { image: { // o carregamento folgado de imagens está desativado por padrão - lazyLoading: true + lazyLoad: true } } } diff --git a/docs/ru/guide/markdown.md b/docs/ru/guide/markdown.md index ea26b486..104f8790 100644 --- a/docs/ru/guide/markdown.md +++ b/docs/ru/guide/markdown.md @@ -996,14 +996,14 @@ $$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ ## Ленивая загрузка изображений {#image-lazy-loading} -Вы можете включить ленивую загрузку для каждого изображения, добавленного через markdown, установив значение `true` для опции `lazyLoading` в вашем файле конфигурации: +Вы можете включить ленивую загрузку для каждого изображения, добавленного через markdown, установив значение `true` для опции `lazyLoad` в вашем файле конфигурации: ```js export default { markdown: { image: { // ленивая загрузка изображений отключена по умолчанию - lazyLoading: true + lazyLoad: true } } } diff --git a/docs/zh/guide/markdown.md b/docs/zh/guide/markdown.md index 6abc4d43..ba920391 100644 --- a/docs/zh/guide/markdown.md +++ b/docs/zh/guide/markdown.md @@ -888,14 +888,14 @@ $$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ ## 图片懒加载 {#image-lazy-loading} -通过在配置文件中将 `lazyLoading` 设置为 `true`,可以为通过 markdown 添加的每张图片启用懒加载。 +通过在配置文件中将 `lazyLoad` 设置为 `true`,可以为通过 markdown 添加的每张图片启用懒加载。 ```js export default { markdown: { image: { // 默认禁用;设置为 true 可为所有图片启用懒加载。 - lazyLoading: true + lazyLoad: true } } } diff --git a/src/node/markdown/plugins/image.ts b/src/node/markdown/plugins/image.ts index 7d5f437b..13929275 100644 --- a/src/node/markdown/plugins/image.ts +++ b/src/node/markdown/plugins/image.ts @@ -13,13 +13,13 @@ export interface Options { * Support native lazy loading for the `` tag. * @default false */ - lazyLoading?: boolean + lazyLoad?: boolean } export const imagePlugin = ( md: MarkdownItAsync, publicDir: string, - { lazyLoading }: Options = {} + { lazyLoad }: Options = {} ) => { const imageRule = md.renderer.rules.image! md.renderer.rules.image = (tokens, idx, options, env: MarkdownEnv, self) => { @@ -40,7 +40,7 @@ export const imagePlugin = ( addImageDimensions(token, url, publicDir, env) } - if (lazyLoading && !token.attrGet('loading')) { + if (lazyLoad && !token.attrGet('loading')) { token.attrSet('loading', 'lazy') } From 27762eac86aa5c5d998de128734c2a8c10f78e23 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:05:26 +0530 Subject: [PATCH 075/187] refactor(markdown)!: remove deprecated `cjkFriendly` option BREAKING CHANGE: The deprecated `markdown.cjkFriendly` option has been removed. Use `markdown.cjkFriendlyEmphasis` instead. Co-Authored-By: Claude Fable 5 --- src/node/markdown/markdown.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/node/markdown/markdown.ts b/src/node/markdown/markdown.ts index 356acbbc..189fe424 100644 --- a/src/node/markdown/markdown.ts +++ b/src/node/markdown/markdown.ts @@ -223,11 +223,6 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { * @see https://github.com/tats-u/markdown-cjk-friendly */ cjkFriendlyEmphasis?: boolean - /** - * @see cjkFriendlyEmphasis - * @deprecated use `cjkFriendly` instead - */ - cjkFriendly?: boolean } export type MarkdownRenderer = MarkdownItAsync @@ -398,7 +393,7 @@ export async function createMarkdownRenderer( } } - if (options.cjkFriendlyEmphasis !== false && options.cjkFriendly !== false) { + if (options.cjkFriendlyEmphasis !== false) { mditCjkFriendly(md) } From 95c042039c62a9235e223f8da05a2075aa2234d7 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:07:38 +0530 Subject: [PATCH 076/187] refactor(theme)!: remove deprecated `outlineTitle` option BREAKING CHANGE: The deprecated `themeConfig.outlineTitle` option has been removed. Use `themeConfig.outline.label` instead. Co-Authored-By: Claude Fable 5 --- src/client/theme-default/composables/outline.ts | 1 - types/default-theme.d.ts | 7 ------- 2 files changed, 8 deletions(-) diff --git a/src/client/theme-default/composables/outline.ts b/src/client/theme-default/composables/outline.ts index e17a005c..067b2b1a 100644 --- a/src/client/theme-default/composables/outline.ts +++ b/src/client/theme-default/composables/outline.ts @@ -13,7 +13,6 @@ export function resolveTitle(theme: DefaultTheme.Config): string { (typeof theme.outline === 'object' && !Array.isArray(theme.outline) && theme.outline.label) || - theme.outlineTitle || 'On this page' ) } diff --git a/types/default-theme.d.ts b/types/default-theme.d.ts index 0b87539b..fa6985ac 100644 --- a/types/default-theme.d.ts +++ b/types/default-theme.d.ts @@ -30,13 +30,6 @@ export namespace DefaultTheme { */ outline?: Outline | Outline['level'] | false - /** - * @deprecated Use `outline.label` instead. - * - * @default 'On this page' - */ - outlineTitle?: string - /** * The nav items. */ From 18d1b4713c6634cc60e6b4a95430e05d51ec4812 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:08:05 +0530 Subject: [PATCH 077/187] refactor(theme)!: remove deprecated `lastUpdatedText` option Also point docs at `themeConfig.lastUpdated.text` instead of the removed option. BREAKING CHANGE: The deprecated `themeConfig.lastUpdatedText` option has been removed. Use `themeConfig.lastUpdated.text` instead. Co-Authored-By: Claude Fable 5 --- docs/en/guide/migration-from-vitepress-0.md | 2 +- docs/en/reference/site-config.md | 2 +- docs/es/reference/site-config.md | 2 +- docs/fa/guide/migration-from-vitepress-0.md | 2 +- docs/fa/reference/site-config.md | 2 +- docs/ja/reference/site-config.md | 2 +- docs/ko/guide/migration-from-vitepress-0.md | 2 +- docs/ko/reference/site-config.md | 2 +- docs/pt/reference/site-config.md | 2 +- docs/ru/guide/migration-from-vitepress-0.md | 2 +- docs/ru/reference/site-config.md | 2 +- docs/zh/guide/migration-from-vitepress-0.md | 2 +- docs/zh/reference/site-config.md | 2 +- .../theme-default/components/VPDocFooterLastUpdated.vue | 2 +- types/default-theme.d.ts | 9 --------- 15 files changed, 14 insertions(+), 23 deletions(-) diff --git a/docs/en/guide/migration-from-vitepress-0.md b/docs/en/guide/migration-from-vitepress-0.md index 29ab9a2a..342ab1ea 100644 --- a/docs/en/guide/migration-from-vitepress-0.md +++ b/docs/en/guide/migration-from-vitepress-0.md @@ -14,7 +14,7 @@ If you're coming from VitePress 0.x version, there're several breaking changes d - `repo`, `repoLabel`, `docsDir`, `docsBranch`, `editLinks`, `editLinkText` are removed in favor of more flexible api. - For adding GitHub link with icon to the nav, use [Social Links](../reference/default-theme-nav#navigation-links) feature. - For adding "Edit this page" feature, use [Edit Link](../reference/default-theme-edit-link) feature. -- `lastUpdated` option is now split into `config.lastUpdated` and `themeConfig.lastUpdatedText`. +- `lastUpdated` option is now split into `config.lastUpdated` and `themeConfig.lastUpdated.text`. - `carbonAds.carbon` is changed to `carbonAds.code`. ## Frontmatter Config diff --git a/docs/en/reference/site-config.md b/docs/en/reference/site-config.md index 8ddae74a..a9d9c4f1 100644 --- a/docs/en/reference/site-config.md +++ b/docs/en/reference/site-config.md @@ -536,7 +536,7 @@ This option injects an inline script that restores users settings from local sto Whether to get the last updated timestamp for each page using Git. The timestamp will be included in each page's page data, accessible via [`useData`](./runtime-api#usedata). -When using the default theme, enabling this option will display each page's last updated time. You can customize the text via [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext) option. +When using the default theme, enabling this option will display each page's last updated time. You can customize the text via [`themeConfig.lastUpdated.text`](./default-theme-config#lastupdated) option. ## Customization diff --git a/docs/es/reference/site-config.md b/docs/es/reference/site-config.md index 3884b45d..7bc0c751 100644 --- a/docs/es/reference/site-config.md +++ b/docs/es/reference/site-config.md @@ -503,7 +503,7 @@ Esta opción inyecta un script en línea que restaura la configuración de los u Para obtener la marca de tiempo de la última actualización para cada página usando Git. El sello de fecha se incluirá en los datos de cada página, accesible a través de [`useData`](./runtime-api#usedata). -Cuando se utiliza el tema predeterminado, al habilitar esta opción se mostrará la última hora de actualización de cada página. Puedes personalizar el texto mediante la opción [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext). +Cuando se utiliza el tema predeterminado, al habilitar esta opción se mostrará la última hora de actualización de cada página. Puedes personalizar el texto mediante la opción [`themeConfig.lastUpdated.text`](./default-theme-config#lastupdated). ## Personalización {#customization} diff --git a/docs/fa/guide/migration-from-vitepress-0.md b/docs/fa/guide/migration-from-vitepress-0.md index 211bb0f9..131e0d2b 100644 --- a/docs/fa/guide/migration-from-vitepress-0.md +++ b/docs/fa/guide/migration-from-vitepress-0.md @@ -14,7 +14,7 @@ - `repo`، `repoLabel`، `docsDir`، `docsBranch`، `editLinks`، `editLinkText` به منظور API انعطاف‌پذیرتر حذف شده‌اند. - برای اضافه کردن لینک GitHub با آیکون به نوار ناوبری، از ویژگی [پیوندهای اجتماعی](../reference/default-theme-nav#navigation-links) استفاده کنید. - برای اضافه کردن ویژگی "ویرایش این صفحه"، از ویژگی [پیوند ویرایش](../reference/default-theme-edit-link) استفاده کنید. -- گزینه `lastUpdated` حالا به `config.lastUpdated` و `themeConfig.lastUpdatedText` تقسیم شده است. +- گزینه `lastUpdated` حالا به `config.lastUpdated` و `themeConfig.lastUpdated.text` تقسیم شده است. - `carbonAds.carbon` به `carbonAds.code` تغییر کرده است. ## پیکربندی Frontmatter diff --git a/docs/fa/reference/site-config.md b/docs/fa/reference/site-config.md index 82a3c55b..072cfa08 100644 --- a/docs/fa/reference/site-config.md +++ b/docs/fa/reference/site-config.md @@ -507,7 +507,7 @@ export default { آیا زمان آخرین به‌روزرسانی برای هر صفحه با استفاده از Git دریافت شود. این زمان در داده‌های هر صفحه گنجانده خواهد شد و از طریق [`useData`](./runtime-api#usedata) قابل دسترسی خواهد بود. -وقتی از تم پیش‌فرض استفاده می‌کنید، فعال کردن این گزینه زمان آخرین به‌روزرسانی هر صفحه را نمایش می‌دهد. می‌توانید متن را از طریق گزینه [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext) سفارشی کنید. +وقتی از تم پیش‌فرض استفاده می‌کنید، فعال کردن این گزینه زمان آخرین به‌روزرسانی هر صفحه را نمایش می‌دهد. می‌توانید متن را از طریق گزینه [`themeConfig.lastUpdated.text`](./default-theme-config#lastupdated) سفارشی کنید. ## سفارشی‌سازی {#customization} diff --git a/docs/ja/reference/site-config.md b/docs/ja/reference/site-config.md index a8e7f04b..6d7c3130 100644 --- a/docs/ja/reference/site-config.md +++ b/docs/ja/reference/site-config.md @@ -505,7 +505,7 @@ export default { Git を使って各ページの最終更新時刻を取得します。タイムスタンプは各ページのデータに含まれ、[`useData`](./runtime-api#usedata) から参照できます。 -デフォルトテーマ使用時にこのオプションを有効にすると、各ページの最終更新時刻が表示されます。テキストは [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext) でカスタマイズ可能です。 +デフォルトテーマ使用時にこのオプションを有効にすると、各ページの最終更新時刻が表示されます。テキストは [`themeConfig.lastUpdated.text`](./default-theme-config#lastupdated) でカスタマイズ可能です。 ## カスタマイズ {#customization} diff --git a/docs/ko/guide/migration-from-vitepress-0.md b/docs/ko/guide/migration-from-vitepress-0.md index f3ba5293..d1dad78c 100644 --- a/docs/ko/guide/migration-from-vitepress-0.md +++ b/docs/ko/guide/migration-from-vitepress-0.md @@ -14,7 +14,7 @@ If you're coming from VitePress 0.x version, there're several breaking changes d - `repo`, `repoLabel`, `docsDir`, `docsBranch`, `editLinks`, `editLinkText` are removed in favor of more flexible api. - For adding GitHub link with icon to the nav, use [Social Links](../reference/default-theme-nav#navigation-links) feature. - For adding "Edit this page" feature, use [Edit Link](../reference/default-theme-edit-link) feature. -- `lastUpdated` option is now split into `config.lastUpdated` and `themeConfig.lastUpdatedText`. +- `lastUpdated` option is now split into `config.lastUpdated` and `themeConfig.lastUpdated.text`. - `carbonAds.carbon` is changed to `carbonAds.code`. ## Frontmatter Config {#frontmatter-config} diff --git a/docs/ko/reference/site-config.md b/docs/ko/reference/site-config.md index 53e94d52..074cf43f 100644 --- a/docs/ko/reference/site-config.md +++ b/docs/ko/reference/site-config.md @@ -505,7 +505,7 @@ export default { 각 페이지의 마지막 업데이트 타임스탬프를 Git을 사용하여 가져올지 여부를 설정합니다. 타임스탬프는 각 페이지의 페이지 데이터에 포함되며, [`useData`](./runtime-api#usedata)를 통해 접근할 수 있습니다. -기본 테마를 사용할 때, 이 옵션을 활성화하면 각 페이지의 마지막 업데이트 시간이 표시됩니다. [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext) 옵션을 통해 텍스트를 커스터마이징할 수 있습니다. +기본 테마를 사용할 때, 이 옵션을 활성화하면 각 페이지의 마지막 업데이트 시간이 표시됩니다. [`themeConfig.lastUpdated.text`](./default-theme-config#lastupdated) 옵션을 통해 텍스트를 커스터마이징할 수 있습니다. ## 커스터마이징 {#customization} diff --git a/docs/pt/reference/site-config.md b/docs/pt/reference/site-config.md index d1125d1d..068fb43f 100644 --- a/docs/pt/reference/site-config.md +++ b/docs/pt/reference/site-config.md @@ -503,7 +503,7 @@ Esta opção injeta um script em linha que restaura as configurações dos usuá Para obter o selo de tempo da última atualização para cada página usando o Git. O selo de data será incluído nos dados de cada página, acessíveis via [`useData`](./runtime-api#usedata). -Ao usar o tema padrão, habilitar esta opção exibirá o horário da última atualização de cada página. Você pode personalizar o texto via opção [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext). +Ao usar o tema padrão, habilitar esta opção exibirá o horário da última atualização de cada página. Você pode personalizar o texto via opção [`themeConfig.lastUpdated.text`](./default-theme-config#lastupdated). ## Personalização {#customization} diff --git a/docs/ru/guide/migration-from-vitepress-0.md b/docs/ru/guide/migration-from-vitepress-0.md index 4d5c7426..5c339a57 100644 --- a/docs/ru/guide/migration-from-vitepress-0.md +++ b/docs/ru/guide/migration-from-vitepress-0.md @@ -14,7 +14,7 @@ - `repo`, `repoLabel`, `docsDir`, `docsBranch`, `editLinks`, `editLinkText` удалены в пользу более гибкого api. - Для добавления ссылки GitHub с иконкой в навигацию используйте функцию [Социальные ссылки](../reference/default-theme-nav#navigation-links). - Для добавления ссылки «Редактировать эту страницу» используйте функцию [Ссылка для редактирования](../reference/default-theme-edit-link). -- Опция `lastUpdated` теперь разделена на `config.lastUpdated` и `themeConfig.lastUpdatedText`. +- Опция `lastUpdated` теперь разделена на `config.lastUpdated` и `themeConfig.lastUpdated.text`. - Опция `carbonAds.carbon` заменена на `carbonAds.code`. ## Конфигурация метаданных diff --git a/docs/ru/reference/site-config.md b/docs/ru/reference/site-config.md index bc54a368..a82e907f 100644 --- a/docs/ru/reference/site-config.md +++ b/docs/ru/reference/site-config.md @@ -536,7 +536,7 @@ export default { Получать ли временную метку последнего обновления для каждой страницы с помощью Git. Временная метка будет включена в данные каждой страницы, доступные через [`useData`](./runtime-api#usedata). -При использовании темы по умолчанию включение этой опции приведёт к отображению времени последнего обновления каждой страницы. Вы можете настроить текст с помощью опции [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext). +При использовании темы по умолчанию включение этой опции приведёт к отображению времени последнего обновления каждой страницы. Вы можете настроить текст с помощью опции [`themeConfig.lastUpdated.text`](./default-theme-config#lastupdated). ## Кастомизация {#customization} diff --git a/docs/zh/guide/migration-from-vitepress-0.md b/docs/zh/guide/migration-from-vitepress-0.md index 64f9460e..34656f00 100644 --- a/docs/zh/guide/migration-from-vitepress-0.md +++ b/docs/zh/guide/migration-from-vitepress-0.md @@ -14,7 +14,7 @@ - 删除了 `repo`、`repoLabel`、`docsDir`、`docsBranch`、`editLinks`、`editLinkText`,以支持更灵活的 API。 - 要将带有图标的 GitHub 链接添加到导航,请使用 [社交链接](../reference/default-theme-config#nav) 功能。 - 要添加“编辑此页面”功能,请使用 [编辑链接](../reference/default-theme-edit-link) 功能。 -- `lastUpdated` 选项现在分为 `config.lastUpdated` 和 `themeConfig.lastUpdatedText`。 +- `lastUpdated` 选项现在分为 `config.lastUpdated` 和 `themeConfig.lastUpdated.text`。 - `carbonAds.carbon` 更改为 `carbonAds.code`。 ## frontmatter 配置 {#frontmatter-config} diff --git a/docs/zh/reference/site-config.md b/docs/zh/reference/site-config.md index e47cb364..2f3571a2 100644 --- a/docs/zh/reference/site-config.md +++ b/docs/zh/reference/site-config.md @@ -503,7 +503,7 @@ export default { 是否使用 Git 获取每个页面的最后更新时间戳。时间戳将包含在每个页面的页面数据中,可通过 [`useData`](./runtime-api#usedata) 访问。 -使用默认主题时,启用此选项将显示每个页面的最后更新时间。可以通过 [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext) 选项自定义文本。 +使用默认主题时,启用此选项将显示每个页面的最后更新时间。可以通过 [`themeConfig.lastUpdated.text`](./default-theme-config#lastupdated) 选项自定义文本。 ## 自定义 {#customization} diff --git a/src/client/theme-default/components/VPDocFooterLastUpdated.vue b/src/client/theme-default/components/VPDocFooterLastUpdated.vue index 576a87d4..6f15479e 100644 --- a/src/client/theme-default/components/VPDocFooterLastUpdated.vue +++ b/src/client/theme-default/components/VPDocFooterLastUpdated.vue @@ -39,7 +39,7 @@ onMounted(() => { diff --git a/types/default-theme.d.ts b/types/default-theme.d.ts index fa6985ac..52c79de6 100644 --- a/types/default-theme.d.ts +++ b/types/default-theme.d.ts @@ -55,15 +55,6 @@ export namespace DefaultTheme { */ editLink?: EditLink - /** - * @deprecated Use `lastUpdated.text` instead. - * - * Set custom last updated text. - * - * @default 'Last updated' - */ - lastUpdatedText?: string - lastUpdated?: LastUpdatedOptions /** From cec499869f02313337993a7f2ad381f0f9d9dafd Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:08:22 +0530 Subject: [PATCH 078/187] refactor(theme)!: remove deprecated `disableDetailedView` local search option BREAKING CHANGE: The deprecated `disableDetailedView` option of local search has been removed. Use `detailedView: false` instead. Co-Authored-By: Claude Fable 5 --- src/client/theme-default/components/VPLocalSearchBox.vue | 3 +-- types/default-theme.d.ts | 6 ------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/client/theme-default/components/VPLocalSearchBox.vue b/src/client/theme-default/components/VPLocalSearchBox.vue index 28a46a2f..fa6af65e 100644 --- a/src/client/theme-default/components/VPLocalSearchBox.vue +++ b/src/client/theme-default/components/VPLocalSearchBox.vue @@ -117,8 +117,7 @@ const showDetailedList = useLocalStorage( const disableDetailedView = computed(() => { return ( theme.value.search?.provider === 'local' && - (theme.value.search.options?.disableDetailedView === true || - theme.value.search.options?.detailedView === false) + theme.value.search.options?.detailedView === false ) }) diff --git a/types/default-theme.d.ts b/types/default-theme.d.ts index 52c79de6..a8266bd3 100644 --- a/types/default-theme.d.ts +++ b/types/default-theme.d.ts @@ -343,12 +343,6 @@ export namespace DefaultTheme { // local search -------------------------------------------------------------- export interface LocalSearchOptions { - /** - * @default false - * @deprecated Use `detailedView: false` instead. - */ - disableDetailedView?: boolean - /** * If `true`, the detailed view will be enabled by default. * If `false`, the detailed view will be disabled. From e6ba9d8caa3866215095f63b62290f3110e523fd Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:43:31 +0530 Subject: [PATCH 079/187] fix(build): don't rely on checkout directory name when externalizing types The `typesExternal` regex matched the absolute build path against `/vitepress/`, so repo-root `.d.ts` files (types/*) were only kept external when the repo was checked out in a directory named "vitepress". When built elsewhere, `DefaultTheme` got inlined into `dist/node/index.d.ts`, orphaning the `declare module` augmentations from `defaultTheme.ts` and breaking node-only options like `search.options._render` (regressed in v2.0.0-alpha.18). Compare paths resolved against this config's directory instead, normalized for separators and drive-letter casing so it also works on windows. Co-Authored-By: Claude Fable 5 --- rollup.config.ts | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/rollup.config.ts b/rollup.config.ts index 23c9d41f..7f040f6f 100644 --- a/rollup.config.ts +++ b/rollup.config.ts @@ -5,6 +5,7 @@ import { nodeResolve } from '@rollup/plugin-node-resolve' import replace from '@rollup/plugin-replace' import { rm } from 'node:fs/promises' import { builtinModules, createRequire } from 'node:module' +import { fileURLToPath } from 'node:url' import { type RollupOptions, defineConfig } from 'rollup' import dts from 'rollup-plugin-dts' import esbuild from 'rollup-plugin-esbuild' @@ -53,11 +54,27 @@ const esmBuild: RollupOptions = { } } -const typesExternal = [ - ...external, - /\/vitepress\/(?!(dist|node_modules|vitepress)\/).*\.d\.ts$/, - /^markdown-it(?:\/|$)/ -] +// keep .d.ts files under the repo root (e.g. types/*) external so module +// augmentations in the bundle still target the same files users reference. +// compared on normalized resolved paths so this works regardless of the +// checkout location, path separators, or drive-letter casing. +const normalizePath = (id: string): string => { + const normalized = id.replaceAll('\\', '/') + return process.platform === 'win32' ? normalized.toLowerCase() : normalized +} + +const root = normalizePath(fileURLToPath(new URL('.', import.meta.url))) + +const typesExternal = (id: string): boolean => { + if (external.includes(id) || /^markdown-it(?:\/|$)/.test(id)) return true + const normalized = normalizePath(id) + return ( + normalized.endsWith('.d.ts') && + normalized.startsWith(root) && + !normalized.startsWith(`${root}dist/`) && + !normalized.startsWith(`${root}node_modules/`) + ) +} const dtsNode = dts({ respectExternal: true, From 572bc63bd8f2a89318b7ce64eb344114d1235891 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:43:38 +0530 Subject: [PATCH 080/187] docs: remove unsupported `threadDepthExceededMessage` translation The key only exists in DocSearch v5 - @docsearch/js 4.6.3 ignores it. Co-Authored-By: Claude Fable 5 --- docs/es/config.ts | 2 -- docs/fa/config.ts | 2 -- docs/ja/config.ts | 2 -- docs/ko/config.ts | 2 -- docs/pt/config.ts | 2 -- docs/ru/config.ts | 2 -- docs/snippets/algolia-i18n.ts | 1 - docs/zh/config.ts | 1 - 8 files changed, 14 deletions(-) diff --git a/docs/es/config.ts b/docs/es/config.ts index 382ad71b..bb31ca42 100644 --- a/docs/es/config.ts +++ b/docs/es/config.ts @@ -267,8 +267,6 @@ function searchOptions(): Partial { afterToolCallText: 'Buscado', stoppedStreamingText: 'Has detenido esta respuesta', errorTitleText: 'Error de chat', - threadDepthExceededMessage: - 'Esta conversación se ha cerrado para mantener respuestas precisas.', startNewConversationButtonText: 'Iniciar una nueva conversación' } } diff --git a/docs/fa/config.ts b/docs/fa/config.ts index c3b34727..c8deee05 100644 --- a/docs/fa/config.ts +++ b/docs/fa/config.ts @@ -264,8 +264,6 @@ function searchOptions(): Partial { afterToolCallText: 'جستجو برای', stoppedStreamingText: 'شما این پاسخ را متوقف کردید', errorTitleText: 'خطای گفتگو', - threadDepthExceededMessage: - 'برای حفظ دقت پاسخ ها، این گفت وگو بسته شد.', startNewConversationButtonText: 'شروع گفت وگوی جدید' } } diff --git a/docs/ja/config.ts b/docs/ja/config.ts index bc92b006..c2119b10 100644 --- a/docs/ja/config.ts +++ b/docs/ja/config.ts @@ -231,8 +231,6 @@ function searchOptions(): Partial { afterToolCallText: '検索しました', stoppedStreamingText: 'この応答を停止しました', errorTitleText: 'チャットエラー', - threadDepthExceededMessage: - '回答の正確性を保つため、この会話は終了しました。', startNewConversationButtonText: '新しい会話を開始' } } diff --git a/docs/ko/config.ts b/docs/ko/config.ts index 7a275cd3..22a96ed8 100644 --- a/docs/ko/config.ts +++ b/docs/ko/config.ts @@ -303,8 +303,6 @@ function searchOptions(): Partial { afterToolCallText: '검색함', stoppedStreamingText: '이 응답을 중지했습니다', errorTitleText: '채팅 오류', - threadDepthExceededMessage: - '정확성을 유지하기 위해 이 대화는 종료되었습니다.', startNewConversationButtonText: '새 대화 시작' } } diff --git a/docs/pt/config.ts b/docs/pt/config.ts index 193eb2f4..5431fc36 100644 --- a/docs/pt/config.ts +++ b/docs/pt/config.ts @@ -264,8 +264,6 @@ function searchOptions(): Partial { afterToolCallText: 'Pesquisado', stoppedStreamingText: 'Você interrompeu esta resposta', errorTitleText: 'Erro no chat', - threadDepthExceededMessage: - 'Esta conversa foi encerrada para manter respostas precisas.', startNewConversationButtonText: 'Iniciar uma nova conversa' } } diff --git a/docs/ru/config.ts b/docs/ru/config.ts index 86f8452a..129a5db3 100644 --- a/docs/ru/config.ts +++ b/docs/ru/config.ts @@ -262,8 +262,6 @@ function searchOptions(): Partial { afterToolCallText: 'Искал', stoppedStreamingText: 'Вы остановили этот ответ', errorTitleText: 'Ошибка чата', - threadDepthExceededMessage: - 'Этот разговор закрыт, чтобы сохранить точность ответов.', startNewConversationButtonText: 'Начать новый разговор' } } diff --git a/docs/snippets/algolia-i18n.ts b/docs/snippets/algolia-i18n.ts index c57816c3..0dfa5107 100644 --- a/docs/snippets/algolia-i18n.ts +++ b/docs/snippets/algolia-i18n.ts @@ -89,7 +89,6 @@ export default defineConfig({ afterToolCallText: '已搜索', stoppedStreamingText: '你已停止此回复', errorTitleText: '聊天错误', - threadDepthExceededMessage: '为保持回答准确,此对话已关闭。', startNewConversationButtonText: '开始新的对话' } } diff --git a/docs/zh/config.ts b/docs/zh/config.ts index 9769c1a9..99fbdf86 100644 --- a/docs/zh/config.ts +++ b/docs/zh/config.ts @@ -250,7 +250,6 @@ function searchOptions(): Partial { afterToolCallText: '已搜索', stoppedStreamingText: '你已停止此回复', errorTitleText: '聊天错误', - threadDepthExceededMessage: '为保持回答准确,此对话已关闭。', startNewConversationButtonText: '开始新的对话' } } From 6bbd04e0bfa6576f8e433efeca2ba32222f635f4 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:43:46 +0530 Subject: [PATCH 081/187] test: type-check tests and docs - split __tests__/tsconfig.json into per-suite projects so unit tests check against src (via path aliases) while e2e/init check against the built package, avoiding mixing both type universes in one program - explicitly include the .vitepress dir in the e2e project - dotted directories are skipped by default, so it was never type-checked - add a `*.vue` shim for the e2e custom theme (named env.d.ts because a shims.d.ts would be dropped in favor of the adjacent shims.ts) - add a tsconfig for docs, checked with vue-tsc - wire everything into `pnpm test` as `test:types` Co-Authored-By: Claude Fable 5 --- __tests__/e2e/env.d.ts | 5 +++++ __tests__/e2e/tsconfig.json | 4 ++++ __tests__/init/tsconfig.json | 3 +++ __tests__/tsconfig.json | 8 ++------ __tests__/unit/tsconfig.json | 18 ++++++++++++++++++ docs/tsconfig.json | 8 ++++++++ package.json | 3 ++- 7 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 __tests__/e2e/env.d.ts create mode 100644 __tests__/e2e/tsconfig.json create mode 100644 __tests__/init/tsconfig.json create mode 100644 __tests__/unit/tsconfig.json create mode 100644 docs/tsconfig.json diff --git a/__tests__/e2e/env.d.ts b/__tests__/e2e/env.d.ts new file mode 100644 index 00000000..a99cf76c --- /dev/null +++ b/__tests__/e2e/env.d.ts @@ -0,0 +1,5 @@ +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent + export default component +} diff --git a/__tests__/e2e/tsconfig.json b/__tests__/e2e/tsconfig.json new file mode 100644 index 00000000..44878152 --- /dev/null +++ b/__tests__/e2e/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["**/*", ".vitepress/**/*"] +} diff --git a/__tests__/init/tsconfig.json b/__tests__/init/tsconfig.json new file mode 100644 index 00000000..3c43903c --- /dev/null +++ b/__tests__/init/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../tsconfig.json" +} diff --git a/__tests__/tsconfig.json b/__tests__/tsconfig.json index 9cce3a1e..366c4ab8 100644 --- a/__tests__/tsconfig.json +++ b/__tests__/tsconfig.json @@ -1,12 +1,8 @@ { "extends": "../tsconfig.json", "compilerOptions": { + "noEmit": true, "isolatedModules": false, - "types": ["node", "vitest/globals"], - "paths": { - "client/*": ["../src/client/*"], - "node/*": ["../src/node/*"], - "shared/*": ["../src/shared/*"] - } + "types": ["node", "vitest/globals"] } } diff --git a/__tests__/unit/tsconfig.json b/__tests__/unit/tsconfig.json new file mode 100644 index 00000000..f7ff2329 --- /dev/null +++ b/__tests__/unit/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": [ + "node", + "vitest/globals", + "vite/client", + "../../src/client/shims.d.ts" + ], + "paths": { + "client/*": ["../../src/client/*"], + "node/*": ["../../src/node/*"], + "shared/*": ["../../src/shared/*"], + "vitepress": ["../../src/client/index.ts"], + "vitepress/theme": ["../../theme.d.ts"] + } + } +} diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 00000000..c3617830 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "noEmit": true, + "types": ["node"] + }, + "include": ["**/*", ".vitepress/**/*"] +} diff --git a/package.json b/package.json index 53245c46..44fd3a7f 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,8 @@ "build:prepare": "pnpm clean && node scripts/copyShared.ts", "build:client": "vue-tsc --noEmit -p src/client && tsc -p src/client && node scripts/copyClient.ts", "build:node": "tsc -p src/node --noEmit && rollup --config rollup.config.ts --configPlugin esbuild", - "test": "pnpm --aggregate-output --reporter=append-only '/^test:(unit|e2e|init)$/'", + "test": "pnpm --aggregate-output --reporter=append-only '/^test:(types|unit|e2e|init)$/'", + "test:types": "tsc -p __tests__/unit && tsc -p __tests__/e2e && tsc -p __tests__/init && vue-tsc -p docs", "test:unit": "vitest run -r __tests__/unit", "test:unit:watch": "vitest -r __tests__/unit", "test:e2e": "pnpm test:e2e-dev && pnpm test:e2e-build", From bffe1e14125220d465a94cc629260e19bff48e0c Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 24 Jul 2026 00:16:44 +0530 Subject: [PATCH 082/187] feat(markdown): allow disabling table `tabindex` attribute Moves the inline table_open rule into its own plugin file and adds a `markdown.tableTabIndex` option (default true) to disable it. Co-Authored-By: Claude Fable 5 --- src/node/markdown/markdown.ts | 15 ++++++++------- src/node/markdown/plugins/table.ts | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 src/node/markdown/plugins/table.ts diff --git a/src/node/markdown/markdown.ts b/src/node/markdown/markdown.ts index 189fe424..fb6638dc 100644 --- a/src/node/markdown/markdown.ts +++ b/src/node/markdown/markdown.ts @@ -38,6 +38,7 @@ import { linkPlugin } from './plugins/link' import { preWrapperPlugin } from './plugins/preWrapper' import { restoreEntities } from './plugins/restoreEntities' import { snippetPlugin } from './plugins/snippet' +import { tablePlugin } from './plugins/table' export type { Header } from '../shared' @@ -216,6 +217,11 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { * @see https://vitepress.dev/guide/markdown#github-flavored-alerts */ gfmAlerts?: boolean + /** + * Add `tabindex="0"` to tables so keyboard users can focus and scroll them. + * @default true + */ + tableTabIndex?: boolean /** * Allows disabling the CJK-friendly plugin. * This plugin adds support for emphasis marks (**bold**) in Japanese, Chinese, and Korean text. @@ -291,13 +297,8 @@ export async function createMarkdownRenderer( ) lineNumberPlugin(md, options.lineNumbers) - const tableOpen = md.renderer.rules.table_open - md.renderer.rules.table_open = function (tokens, idx, options, env, self) { - const token = tokens[idx] - if (token.attrIndex('tabindex') < 0) token.attrPush(['tabindex', '0']) - return tableOpen - ? tableOpen(tokens, idx, options, env, self) - : self.renderToken(tokens, idx, options) + if (options.tableTabIndex !== false) { + tablePlugin(md) } if (options.gfmAlerts !== false) { diff --git a/src/node/markdown/plugins/table.ts b/src/node/markdown/plugins/table.ts new file mode 100644 index 00000000..edc06339 --- /dev/null +++ b/src/node/markdown/plugins/table.ts @@ -0,0 +1,14 @@ +import type { MarkdownItAsync } from 'markdown-it-async' + +// adds tabindex="0" to tables so they are focusable and can be +// scrolled with the keyboard when they overflow horizontally +export const tablePlugin = (md: MarkdownItAsync) => { + const tableOpen = md.renderer.rules.table_open + md.renderer.rules.table_open = function (tokens, idx, options, env, self) { + const token = tokens[idx] + if (token.attrIndex('tabindex') < 0) token.attrPush(['tabindex', '0']) + return tableOpen + ? tableOpen(tokens, idx, options, env, self) + : self.renderToken(tokens, idx, options) + } +} From e235dbeb8aef1213d0de9efafe0ccb758acd267a Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 24 Jul 2026 00:17:03 +0530 Subject: [PATCH 083/187] feat(markdown)!: support `attrs: false` for disabling attrs plugin BREAKING CHANGE: The `markdown.attrs.disable` option has been removed. Set `markdown.attrs` to `false` instead. Co-Authored-By: Claude Fable 5 --- src/node/markdown/markdown.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/node/markdown/markdown.ts b/src/node/markdown/markdown.ts index fb6638dc..299350c6 100644 --- a/src/node/markdown/markdown.ts +++ b/src/node/markdown/markdown.ts @@ -158,10 +158,10 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { */ anchor?: anchorPlugin.AnchorOptions /** - * Options for `markdown-it-attrs` + * Options for `markdown-it-attrs`. Set to `false` to disable. * @see https://github.com/arve0/markdown-it-attrs */ - attrs?: MarkdownItAttrsOptions & { disable?: boolean } + attrs?: MarkdownItAttrsOptions | false /** * Options for `markdown-it-emoji` * @see https://github.com/markdown-it/markdown-it-emoji @@ -306,7 +306,7 @@ export async function createMarkdownRenderer( } // third party plugins - if (!options.attrs?.disable) { + if (options.attrs !== false) { attrsPlugin(md, options.attrs) } emojiPlugin(md, options.emoji) From b8d9c8f9a92ec4e8c877d6c28fee26b3c379876c Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 24 Jul 2026 00:20:18 +0530 Subject: [PATCH 084/187] feat(markdown): support disabling built-in markdown plugins Allows custom themes to opt out of markup and behavior added on top of vanilla markdown rendering: - `anchor`, `emoji`, `toc`, `component`, `image` now also accept `false` - new `preWrapper` and `snippet` boolean options (default true) - `lineNumbers` is a no-op when `preWrapper` is disabled, as its markup depends on the wrapper close #4484 close #4556 Co-Authored-By: Claude Fable 5 --- __tests__/unit/node/markdown/markdown.test.ts | 105 +++++++++++ src/node/markdown/markdown.ts | 175 +++++++++++------- 2 files changed, 213 insertions(+), 67 deletions(-) create mode 100644 __tests__/unit/node/markdown/markdown.test.ts diff --git a/__tests__/unit/node/markdown/markdown.test.ts b/__tests__/unit/node/markdown/markdown.test.ts new file mode 100644 index 00000000..e8219a54 --- /dev/null +++ b/__tests__/unit/node/markdown/markdown.test.ts @@ -0,0 +1,105 @@ +import { + createMarkdownRenderer, + disposeMdItInstance, + type MarkdownOptions +} from 'node/markdown/markdown' + +async function render(src: string, options: MarkdownOptions = {}) { + disposeMdItInstance() + const md = await createMarkdownRenderer('.', { + highlight: (code) => code, + ...options + }) + return md.renderAsync(src) +} + +describe('node/markdown/markdown', () => { + describe('disabling built-in plugins', () => { + test('anchor', async () => { + const enabled = await render('# Hello World') + expect(enabled).toContain('id="hello-world"') + expect(enabled).toContain('header-anchor') + + const disabled = await render('# Hello World', { anchor: false }) + expect(disabled).not.toContain('id=') + expect(disabled).not.toContain('header-anchor') + }) + + test('attrs', async () => { + const enabled = await render('## Title {#custom-id}') + expect(enabled).toContain('id="custom-id"') + + const disabled = await render('## Title {#custom-id}', { attrs: false }) + expect(disabled).not.toContain('id="custom-id"') + expect(disabled).toContain('{#custom-id}') + }) + + test('emoji', async () => { + expect(await render(':tada:')).toContain('🎉') + expect(await render(':tada:', { emoji: false })).toContain(':tada:') + }) + + test('toc', async () => { + const src = '# Title\n\n[[toc]]' + expect(await render(src)).toContain('table-of-contents') + + const disabled = await render(src, { toc: false }) + expect(disabled).not.toContain('table-of-contents') + expect(disabled).toContain('[[toc]]') + }) + + test('preWrapper', async () => { + const src = '```js\nconst a = 1\n```' + const enabled = await render(src) + expect(enabled).toContain('
') + expect(enabled).toContain('class="copy"') + + const disabled = await render(src, { preWrapper: false }) + expect(disabled).not.toContain('
') + expect(disabled).not.toContain('class="copy"') + }) + + test('preWrapper disables line numbers with it', async () => { + const src = '```js\nconst a = 1\n```' + const enabled = await render(src, { lineNumbers: true }) + expect(enabled).toContain('line-numbers-wrapper') + + const disabled = await render(src, { + preWrapper: false, + lineNumbers: true + }) + expect(disabled).not.toContain('line-numbers-wrapper') + }) + + test('snippet', async () => { + const disabled = await render('<<< ./foo.js', { snippet: false }) + expect(disabled).toContain('<<< ./foo.js') + }) + + test('image', async () => { + const src = '![img](/foo.png)' + const enabled = await render(src, { image: { lazyLoad: true } }) + expect(enabled).toContain('loading="lazy"') + + const disabled = await render(src, { image: false }) + expect(disabled).not.toContain('loading="lazy"') + }) + + test('component', async () => { + const src = 'text\n\nmore' + const enabled = await render(src) + expect(enabled).toContain('

\n

') + + const disabled = await render(src, { component: false }) + expect(disabled).toContain('

text\n\nmore

') + }) + + test('tableTabIndex', async () => { + const src = '| a |\n| --- |\n| b |' + expect(await render(src)).toContain('tabindex="0"') + expect(await render(src, { tableTabIndex: false })).not.toContain( + 'tabindex' + ) + }) + }) +}) diff --git a/src/node/markdown/markdown.ts b/src/node/markdown/markdown.ts index 299350c6..6293b7bc 100644 --- a/src/node/markdown/markdown.ts +++ b/src/node/markdown/markdown.ts @@ -121,10 +121,17 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { */ languageLabel?: Record /** - * Show line numbers in code blocks + * Show line numbers in code blocks. Requires the `preWrapper` plugin. * @default false */ lineNumbers?: boolean + /** + * Wrap code blocks in a container carrying the language label and the + * copy button. The default theme's code block styling relies on this + * markup. Disabling it also disables `lineNumbers`. + * @default true + */ + preWrapper?: boolean /** * Fallback language when the specified language is not available. */ @@ -153,24 +160,28 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { /* ==================== Markdown It Plugins ==================== */ /** - * Options for `markdown-it-anchor` + * Options for `markdown-it-anchor`. Set to `false` to disable adding ids + * and anchor links to headings. Note that the default theme's outline and + * heading hash links rely on these ids. * @see https://github.com/valeriangalliat/markdown-it-anchor */ - anchor?: anchorPlugin.AnchorOptions + anchor?: anchorPlugin.AnchorOptions | false /** * Options for `markdown-it-attrs`. Set to `false` to disable. * @see https://github.com/arve0/markdown-it-attrs */ attrs?: MarkdownItAttrsOptions | false /** - * Options for `markdown-it-emoji` + * Options for `markdown-it-emoji`. Set to `false` to disable. * @see https://github.com/markdown-it/markdown-it-emoji */ - emoji?: { - defs?: Record - enabled?: string[] - shortcuts?: Record - } + emoji?: + | { + defs?: Record + enabled?: string[] + shortcuts?: Record + } + | false /** * Options for `@mdit-vue/plugin-frontmatter` * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-frontmatter @@ -187,15 +198,22 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { */ sfc?: SfcPluginOptions /** - * Options for `@mdit-vue/plugin-toc` + * Options for `@mdit-vue/plugin-toc`. Set to `false` to disable the + * `[[toc]]` syntax. * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-toc */ - toc?: TocPluginOptions + toc?: TocPluginOptions | false /** - * Options for `@mdit-vue/plugin-component` + * Options for `@mdit-vue/plugin-component`. Set to `false` to disable. * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-component */ - component?: ComponentPluginOptions + component?: ComponentPluginOptions | false + /** + * Enables importing code snippets from files with `<<<`. + * @default true + * @see https://vitepress.dev/guide/markdown#import-code-snippets + */ + snippet?: boolean /** * Options for `markdown-it-container` * @see https://github.com/markdown-it/markdown-it-container @@ -210,7 +228,13 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { * @see https://vitepress.dev/guide/markdown#math-equations */ math?: boolean | any - image?: ImageOptions + /** + * Options for the image plugin (resolves image sources against the public + * directory, adds dimensions, and supports lazy loading). Set to `false` + * to disable. + * @see https://vitepress.dev/guide/markdown#image-lazy-loading + */ + image?: ImageOptions | false /** * Allows disabling the github alerts plugin * @default true @@ -278,24 +302,33 @@ export async function createMarkdownRenderer( await options.preConfig(md) } - const slugify = options.anchor?.slugify ?? defaultSlugify + const slugify = + (options.anchor ? options.anchor.slugify : undefined) ?? defaultSlugify // custom plugins - componentPlugin(md, options.component) - preWrapperPlugin(md, { - codeCopyButtonTitle, - languageLabel: options.languageLabel - }) - snippetPlugin(md, srcDir) + if (options.component !== false) { + componentPlugin(md, options.component) + } + if (options.preWrapper !== false) { + preWrapperPlugin(md, { + codeCopyButtonTitle, + languageLabel: options.languageLabel + }) + lineNumberPlugin(md, options.lineNumbers) + } + if (options.snippet !== false) { + snippetPlugin(md, srcDir) + } containerPlugin(md, options.container) - imagePlugin(md, publicDir, options.image) + if (options.image !== false) { + imagePlugin(md, publicDir, options.image) + } linkPlugin( md, { target: '_blank', rel: 'noreferrer', ...options.externalLinks }, base, slugify ) - lineNumberPlugin(md, options.lineNumbers) if (options.tableTabIndex !== false) { tablePlugin(md) @@ -309,44 +342,48 @@ export async function createMarkdownRenderer( if (options.attrs !== false) { attrsPlugin(md, options.attrs) } - emojiPlugin(md, options.emoji) + if (options.emoji !== false) { + emojiPlugin(md, options.emoji) + } // mdit-vue plugins - anchorPlugin(md, { - slugify, - getTokensText: (tokens) => { - return tokens - .filter((t) => !['html_inline', 'emoji'].includes(t.type)) - .map((t) => t.content) - .join('') - }, - permalink: (slug, _, state, idx) => { - const title = - state.tokens[idx + 1]?.children - ?.filter((token) => ['text', 'code_inline'].includes(token.type)) - .reduce((acc, t) => acc + t.content, '') - .trim() || '' - - const linkTokens = [ - Object.assign(new state.Token('text', '', 0), { content: ' ' }), - Object.assign(new state.Token('link_open', 'a', 1), { - attrs: [ - ['class', 'header-anchor'], - ['href', `#${slug}`], - ['aria-label', `Permalink to “${title}”`] - ] - }), - Object.assign(new state.Token('html_inline', '', 0), { - content: '​', - meta: { isPermalinkSymbol: true } - }), - new state.Token('link_close', 'a', -1) - ] - - state.tokens[idx + 1].children?.push(...linkTokens) - }, - ...options.anchor - }) + if (options.anchor !== false) { + anchorPlugin(md, { + slugify, + getTokensText: (tokens) => { + return tokens + .filter((t) => !['html_inline', 'emoji'].includes(t.type)) + .map((t) => t.content) + .join('') + }, + permalink: (slug, _, state, idx) => { + const title = + state.tokens[idx + 1]?.children + ?.filter((token) => ['text', 'code_inline'].includes(token.type)) + .reduce((acc, t) => acc + t.content, '') + .trim() || '' + + const linkTokens = [ + Object.assign(new state.Token('text', '', 0), { content: ' ' }), + Object.assign(new state.Token('link_open', 'a', 1), { + attrs: [ + ['class', 'header-anchor'], + ['href', `#${slug}`], + ['aria-label', `Permalink to “${title}”`] + ] + }), + Object.assign(new state.Token('html_inline', '', 0), { + content: '​', + meta: { isPermalinkSymbol: true } + }), + new state.Token('link_close', 'a', -1) + ] + + state.tokens[idx + 1].children?.push(...linkTokens) + }, + ...options.anchor + }) + } frontmatterPlugin(md, options.frontmatter) @@ -360,14 +397,18 @@ export async function createMarkdownRenderer( sfcPlugin(md, options.sfc) titlePlugin(md) - tocPlugin(md, { - slugify, - ...options.toc, - format: (s) => { - const title = s.replaceAll('&', '&') // encoded twice because of restoreEntities - return options.toc?.format?.(title) ?? title - } - }) + + const tocOptions = options.toc + if (tocOptions !== false) { + tocPlugin(md, { + slugify, + ...tocOptions, + format: (s) => { + const title = s.replaceAll('&', '&') // encoded twice because of restoreEntities + return tocOptions?.format?.(title) ?? title + } + }) + } if (options.math) { try { From 3514d82617817941358bf946ab7c87a3e4209d8a Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 24 Jul 2026 00:47:47 +0530 Subject: [PATCH 085/187] refactor(markdown): restructure options and plugin registration - group `MarkdownOptions` into sections by concern (general, syntax highlighting, code blocks, markdown extensions, vue integration) and rewrite the jsdocs with a consistent voice, documenting the previously undocumented `externalLinks` default and correcting the `container` description (label customization, not plugin pass-through) - register plugins in accurately-labeled groups (vitepress customizations, community plugins, mdit-vue plugins) and note the order-sensitive couplings inline (lineNumbers after preWrapper, anchor after attrs) - add a test for the `cjkFriendlyEmphasis` toggle Co-Authored-By: Claude Fable 5 --- __tests__/unit/node/markdown/markdown.test.ts | 8 + src/node/markdown/markdown.ts | 241 +++++++++--------- 2 files changed, 134 insertions(+), 115 deletions(-) diff --git a/__tests__/unit/node/markdown/markdown.test.ts b/__tests__/unit/node/markdown/markdown.test.ts index e8219a54..c042d6ba 100644 --- a/__tests__/unit/node/markdown/markdown.test.ts +++ b/__tests__/unit/node/markdown/markdown.test.ts @@ -101,5 +101,13 @@ describe('node/markdown/markdown', () => { 'tabindex' ) }) + + test('cjkFriendlyEmphasis', async () => { + const src = 'これは**「テスト」**です' + expect(await render(src)).toContain('「テスト」') + expect(await render(src, { cjkFriendlyEmphasis: false })).not.toContain( + '' + ) + }) }) }) diff --git a/src/node/markdown/markdown.ts b/src/node/markdown/markdown.ts index 6293b7bc..ee5c3954 100644 --- a/src/node/markdown/markdown.ts +++ b/src/node/markdown/markdown.ts @@ -54,17 +54,21 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { /* ==================== General Options ==================== */ /** - * Setup markdown-it instance before applying plugins + * Configure the markdown-it instance before any plugins are applied. */ preConfig?: (md: MarkdownItAsync) => Awaitable /** - * Setup markdown-it instance + * Configure the markdown-it instance after all built-in plugins are applied. */ config?: (md: MarkdownItAsync) => Awaitable /** * Disable cache (experimental) */ cache?: boolean + /** + * HTML attributes applied to external links. + * @default { target: '_blank', rel: 'noreferrer' } + */ externalLinks?: Record /* ==================== Syntax Highlighting ==================== */ @@ -72,7 +76,8 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { /** * Custom theme for syntax highlighting. * - * You can also pass an object with `light` and `dark` themes to support dual themes. + * You can also pass an object with `light` and `dark` themes to support + * dual themes. * * @example { theme: 'github-dark' } * @example { theme: { light: 'github-light', dark: 'github-dark' } } @@ -91,7 +96,8 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { /** * Custom language aliases for syntax highlighting. * Maps custom language names to existing languages. - * Alias lookup is case-insensitive and underscores in language names are displayed as spaces. + * Alias lookup is case-insensitive and underscores in language names are + * displayed as spaces. * * @example * @@ -113,31 +119,11 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { */ languageAlias?: Record /** - * Custom language labels for display. - * Overrides the default language label shown in code blocks. - * Keys are case-insensitive. - * - * @example { 'vue': 'Vue SFC' } - */ - languageLabel?: Record - /** - * Show line numbers in code blocks. Requires the `preWrapper` plugin. - * @default false - */ - lineNumbers?: boolean - /** - * Wrap code blocks in a container carrying the language label and the - * copy button. The default theme's code block styling relies on this - * markup. Disabling it also disables `lineNumbers`. - * @default true - */ - preWrapper?: boolean - /** - * Fallback language when the specified language is not available. + * Fallback language used when the specified language is not available. */ defaultHighlightLang?: string /** - * Transformers applied to code blocks + * Transformers applied to code blocks. * @see https://shiki.style/guide/transformers */ codeTransformers?: ShikiTransformer[] @@ -148,24 +134,46 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { */ colorReplacements?: CodeToHastOptions['colorReplacements'] /** - * Setup Shiki instance + * Configure the Shiki instance. */ shikiSetup?: (shiki: Highlighter) => void | Promise + + /* ==================== Code Blocks ==================== */ + + /** + * Wrap code blocks in a container carrying the language label and the + * copy button. The default theme's code block styling relies on this + * markup. Disabling it also disables `lineNumbers`. + * @default true + */ + preWrapper?: boolean /** - * The tooltip text for the copy button in code blocks + * The tooltip text for the copy button in code blocks. * @default 'Copy Code' */ codeCopyButtonTitle?: string - - /* ==================== Markdown It Plugins ==================== */ - /** - * Options for `markdown-it-anchor`. Set to `false` to disable adding ids - * and anchor links to headings. Note that the default theme's outline and - * heading hash links rely on these ids. - * @see https://github.com/valeriangalliat/markdown-it-anchor + * Custom language labels for display. + * Overrides the default language label shown in code blocks. + * Keys are case-insensitive. + * + * @example { 'vue': 'Vue SFC' } */ - anchor?: anchorPlugin.AnchorOptions | false + languageLabel?: Record + /** + * Show line numbers in code blocks. Requires the `preWrapper` plugin. + * @default false + */ + lineNumbers?: boolean + /** + * Enables importing code snippets from files with `<<<`. + * @default true + * @see https://vitepress.dev/guide/markdown#import-code-snippets + */ + snippet?: boolean + + /* ==================== Markdown Extensions ==================== */ + /** * Options for `markdown-it-attrs`. Set to `false` to disable. * @see https://github.com/arve0/markdown-it-attrs @@ -183,20 +191,26 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { } | false /** - * Options for `@mdit-vue/plugin-frontmatter` - * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-frontmatter + * Improves emphasis (`**bold**`) handling in Japanese, Chinese, and + * Korean text. + * @default true + * @see https://github.com/tats-u/markdown-cjk-friendly */ - frontmatter?: FrontmatterPluginOptions + cjkFriendlyEmphasis?: boolean /** - * Options for `@mdit-vue/plugin-headers` - * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-headers + * Options for `markdown-it-anchor`. Set to `false` to disable adding ids + * and anchor links to headings. Note that the default theme's outline and + * heading hash links rely on these ids. + * @see https://github.com/valeriangalliat/markdown-it-anchor */ - headers?: HeadersPluginOptions | boolean + anchor?: anchorPlugin.AnchorOptions | false /** - * Options for `@mdit-vue/plugin-sfc` - * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-sfc + * Options for `@mdit-vue/plugin-headers`. Set to `true` or pass options + * to collect page headers into page data. + * @default false + * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-headers */ - sfc?: SfcPluginOptions + headers?: HeadersPluginOptions | boolean /** * Options for `@mdit-vue/plugin-toc`. Set to `false` to disable the * `[[toc]]` syntax. @@ -204,30 +218,32 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { */ toc?: TocPluginOptions | false /** - * Options for `@mdit-vue/plugin-component`. Set to `false` to disable. - * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-component + * Math support. + * + * You need to install `markdown-it-mathjax3` and set `math` to `true` to + * enable it. You can also pass options to `markdown-it-mathjax3` here. + * @default false + * @see https://vitepress.dev/guide/markdown#math-equations */ - component?: ComponentPluginOptions | false + math?: boolean | any /** - * Enables importing code snippets from files with `<<<`. - * @default true - * @see https://vitepress.dev/guide/markdown#import-code-snippets + * Custom labels for the built-in containers (`::: tip` etc.). Also used + * as the default titles of GitHub-flavored alerts. + * @see https://vitepress.dev/guide/markdown#custom-containers */ - snippet?: boolean + container?: ContainerOptions /** - * Options for `markdown-it-container` - * @see https://github.com/markdown-it/markdown-it-container + * Whether to enable GitHub-flavored alerts (`> [!NOTE]`). + * @default true + * @see https://vitepress.dev/guide/markdown#github-flavored-alerts */ - container?: ContainerOptions + gfmAlerts?: boolean /** - * Math support - * - * You need to install `markdown-it-mathjax3` and set `math` to `true` to enable it. - * You can also pass options to `markdown-it-mathjax3` here. - * @default false - * @see https://vitepress.dev/guide/markdown#math-equations + * Add `tabindex="0"` to tables so keyboard users can focus and scroll + * them. + * @default true */ - math?: boolean | any + tableTabIndex?: boolean /** * Options for the image plugin (resolves image sources against the public * directory, adds dimensions, and supports lazy loading). Set to `false` @@ -235,24 +251,24 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { * @see https://vitepress.dev/guide/markdown#image-lazy-loading */ image?: ImageOptions | false + + /* ==================== Vue Integration ==================== */ + /** - * Allows disabling the github alerts plugin - * @default true - * @see https://vitepress.dev/guide/markdown#github-flavored-alerts + * Options for `@mdit-vue/plugin-component`. Set to `false` to disable. + * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-component */ - gfmAlerts?: boolean + component?: ComponentPluginOptions | false /** - * Add `tabindex="0"` to tables so keyboard users can focus and scroll them. - * @default true + * Options for `@mdit-vue/plugin-frontmatter`. + * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-frontmatter */ - tableTabIndex?: boolean + frontmatter?: FrontmatterPluginOptions /** - * Allows disabling the CJK-friendly plugin. - * This plugin adds support for emphasis marks (**bold**) in Japanese, Chinese, and Korean text. - * @default true - * @see https://github.com/tats-u/markdown-cjk-friendly + * Options for `@mdit-vue/plugin-sfc`. + * @see https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-sfc */ - cjkFriendlyEmphasis?: boolean + sfc?: SfcPluginOptions } export type MarkdownRenderer = MarkdownItAsync @@ -287,7 +303,7 @@ export async function createMarkdownRenderer( const theme = options.theme ?? { light: 'github-light', dark: 'github-dark' } const codeCopyButtonTitle = options.codeCopyButtonTitle || 'Copy Code' - let [highlight, dispose] = options.highlight + const [highlight, dispose] = options.highlight ? [options.highlight, () => {}] : await createHighlighter(theme, options, logger) @@ -305,21 +321,22 @@ export async function createMarkdownRenderer( const slugify = (options.anchor ? options.anchor.slugify : undefined) ?? defaultSlugify - // custom plugins - if (options.component !== false) { - componentPlugin(md, options.component) - } + // VitePress customizations if (options.preWrapper !== false) { preWrapperPlugin(md, { codeCopyButtonTitle, languageLabel: options.languageLabel }) + // must be applied after preWrapper as it augments its output lineNumberPlugin(md, options.lineNumbers) } if (options.snippet !== false) { snippetPlugin(md, srcDir) } containerPlugin(md, options.container) + if (options.gfmAlerts !== false) { + gitHubAlertsPlugin(md, options.container) + } if (options.image !== false) { imagePlugin(md, publicDir, options.image) } @@ -329,25 +346,23 @@ export async function createMarkdownRenderer( base, slugify ) - if (options.tableTabIndex !== false) { tablePlugin(md) } - if (options.gfmAlerts !== false) { - gitHubAlertsPlugin(md, options.container) - } - - // third party plugins + // community plugins if (options.attrs !== false) { attrsPlugin(md, options.attrs) } if (options.emoji !== false) { emojiPlugin(md, options.emoji) } - - // mdit-vue plugins + if (options.cjkFriendlyEmphasis !== false) { + mditCjkFriendly(md) + } if (options.anchor !== false) { + // must be applied after attrs so that user-defined ids from curly + // attributes take precedence over slugified ones anchorPlugin(md, { slugify, getTokensText: (tokens) => { @@ -384,32 +399,6 @@ export async function createMarkdownRenderer( ...options.anchor }) } - - frontmatterPlugin(md, options.frontmatter) - - if (options.headers) { - headersPlugin(md, { - level: [2, 3, 4, 5, 6], - slugify, - ...(typeof options.headers === 'boolean' ? undefined : options.headers) - }) - } - - sfcPlugin(md, options.sfc) - titlePlugin(md) - - const tocOptions = options.toc - if (tocOptions !== false) { - tocPlugin(md, { - slugify, - ...tocOptions, - format: (s) => { - const title = s.replaceAll('&', '&') // encoded twice because of restoreEntities - return tocOptions?.format?.(title) ?? title - } - }) - } - if (options.math) { try { const mathPlugin = await import('markdown-it-mathjax3') @@ -435,8 +424,30 @@ export async function createMarkdownRenderer( } } - if (options.cjkFriendlyEmphasis !== false) { - mditCjkFriendly(md) + // mdit-vue plugins + if (options.component !== false) { + componentPlugin(md, options.component) + } + frontmatterPlugin(md, options.frontmatter) + if (options.headers) { + headersPlugin(md, { + level: [2, 3, 4, 5, 6], + slugify, + ...(typeof options.headers === 'boolean' ? undefined : options.headers) + }) + } + sfcPlugin(md, options.sfc) + titlePlugin(md) + const tocOptions = options.toc + if (tocOptions !== false) { + tocPlugin(md, { + slugify, + ...tocOptions, + format: (s) => { + const title = s.replaceAll('&', '&') // encoded twice because of restoreEntities + return tocOptions?.format?.(title) ?? title + } + }) } // apply user config From 75505179160bf16a88cd5648719615e982c08e41 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 24 Jul 2026 00:57:40 +0530 Subject: [PATCH 086/187] feat(markdown)!: replace markdown-it-anchor with @mdit/plugin-anchor Drop-in for our usage: identical defaults (min-level semantics, tabindex, unique slug handling) and the same permalink/getTokensText signatures, with proper ESM types - removing the type patch we carried for markdown-it-anchor. BREAKING CHANGE: `markdown.anchor` options are now typed by `@mdit/plugin-anchor`. Common options (`level`, `slugify`, `permalink`, `getTokensText`, `tabIndex`, etc.) are unchanged, but the deprecated markdown-it-anchor permalink options (`permalinkSymbol`, `renderPermalink`, ...) are no longer accepted. Permalink builders like `headerLink` are named exports of `@mdit/plugin-anchor` instead of properties of the plugin. Co-Authored-By: Claude Fable 5 --- docs/en/guide/markdown.md | 8 +++---- docs/es/guide/markdown.md | 8 +++---- docs/fa/guide/markdown.md | 8 +++---- docs/ja/guide/markdown.md | 8 +++---- docs/ko/guide/markdown.md | 8 +++---- docs/pt/guide/markdown.md | 8 +++---- docs/ru/guide/markdown.md | 8 +++---- docs/zh/guide/markdown.md | 8 +++---- package.json | 2 +- patches/markdown-it-anchor@9.2.0.patch | 17 --------------- pnpm-lock.yaml | 30 +++++++++++--------------- pnpm-workspace.yaml | 1 - src/node/markdown/markdown.ts | 8 +++---- 13 files changed, 50 insertions(+), 72 deletions(-) delete mode 100644 patches/markdown-it-anchor@9.2.0.patch diff --git a/docs/en/guide/markdown.md b/docs/en/guide/markdown.md index 5202c7cb..54baf549 100644 --- a/docs/en/guide/markdown.md +++ b/docs/en/guide/markdown.md @@ -1043,15 +1043,15 @@ VitePress uses [markdown-it](https://github.com/markdown-it/markdown-it) as the ```js import { defineConfig } from 'vitepress' -import markdownItAnchor from 'markdown-it-anchor' +import { headerLink } from '@mdit/plugin-anchor' import markdownItFoo from 'markdown-it-foo' export default defineConfig({ markdown: { - // options for markdown-it-anchor - // https://github.com/valeriangalliat/markdown-it-anchor#usage + // options for @mdit/plugin-anchor + // https://mdit-plugins.github.io/anchor.html anchor: { - permalink: markdownItAnchor.permalink.headerLink() + permalink: headerLink() }, // options for @mdit-vue/plugin-toc diff --git a/docs/es/guide/markdown.md b/docs/es/guide/markdown.md index 7e1fc0aa..bd9e5e58 100644 --- a/docs/es/guide/markdown.md +++ b/docs/es/guide/markdown.md @@ -907,15 +907,15 @@ VitePress usa [markdown-it](https://github.com/markdown-it/markdown-it) como int ```js import { defineConfig } from 'vitepress' -import markdownItAnchor from 'markdown-it-anchor' +import { headerLink } from '@mdit/plugin-anchor' import markdownItFoo from 'markdown-it-foo' export default defineConfig({ markdown: { - // opciones para markdown-it-anchor - // https://github.com/valeriangalliat/markdown-it-anchor#usage + // opciones para @mdit/plugin-anchor + // https://mdit-plugins.github.io/anchor.html anchor: { - permalink: markdownItAnchor.permalink.headerLink() + permalink: headerLink() }, // opciones para @mdit-vue/plugin-toc diff --git a/docs/fa/guide/markdown.md b/docs/fa/guide/markdown.md index ecce9f2e..dc1aacfa 100644 --- a/docs/fa/guide/markdown.md +++ b/docs/fa/guide/markdown.md @@ -899,15 +899,15 @@ export default { ```js import { defineConfig } from 'vitepress' -import markdownItAnchor from 'markdown-it-anchor' +import { headerLink } from '@mdit/plugin-anchor' import markdownItFoo from 'markdown-it-foo' export default defineConfig({ markdown: { - // گزینه‌های markdown-it-anchor - // https://github.com/valeriangalliat/markdown-it-anchor#usage + // گزینه‌های @mdit/plugin-anchor + // https://mdit-plugins.github.io/anchor.html anchor: { - permalink: markdownItAnchor.permalink.headerLink() + permalink: headerLink() }, // گزینه‌های @mdit-vue/plugin-toc diff --git a/docs/ja/guide/markdown.md b/docs/ja/guide/markdown.md index 13dae321..9f530692 100644 --- a/docs/ja/guide/markdown.md +++ b/docs/ja/guide/markdown.md @@ -1015,15 +1015,15 @@ VitePress は Markdown レンダラーとして [markdown-it](https://github.com ```js import { defineConfig } from 'vitepress' -import markdownItAnchor from 'markdown-it-anchor' +import { headerLink } from '@mdit/plugin-anchor' import markdownItFoo from 'markdown-it-foo' export default defineConfig({ markdown: { - // markdown-it-anchor のオプション - // https://github.com/valeriangalliat/markdown-it-anchor#usage + // @mdit/plugin-anchor のオプション + // https://mdit-plugins.github.io/anchor.html anchor: { - permalink: markdownItAnchor.permalink.headerLink() + permalink: headerLink() }, // @mdit-vue/plugin-toc のオプション diff --git a/docs/ko/guide/markdown.md b/docs/ko/guide/markdown.md index c756d05e..157f9a9d 100644 --- a/docs/ko/guide/markdown.md +++ b/docs/ko/guide/markdown.md @@ -944,15 +944,15 @@ VitePress는 마크다운 렌더러로 [markdown-it](https://github.com/markdown ```js import { defineConfig } from 'vitepress' -import markdownItAnchor from 'markdown-it-anchor' +import { headerLink } from '@mdit/plugin-anchor' import markdownItFoo from 'markdown-it-foo' export default defineConfig({ markdown: { - // markdown-it-anchor의 옵션 - // https://github.com/valeriangalliat/markdown-it-anchor#usage + // @mdit/plugin-anchor의 옵션 + // https://mdit-plugins.github.io/anchor.html anchor: { - permalink: markdownItAnchor.permalink.headerLink() + permalink: headerLink() }, // @mdit-vue/plugin-toc의 옵션 diff --git a/docs/pt/guide/markdown.md b/docs/pt/guide/markdown.md index 1eef2c72..1ad50dff 100644 --- a/docs/pt/guide/markdown.md +++ b/docs/pt/guide/markdown.md @@ -906,15 +906,15 @@ VitePress usa [markdown-it](https://github.com/markdown-it/markdown-it) como int ```js import { defineConfig } from 'vitepress' -import markdownItAnchor from 'markdown-it-anchor' +import { headerLink } from '@mdit/plugin-anchor' import markdownItFoo from 'markdown-it-foo' export default defineConfig({ markdown: { - // opções para markdown-it-anchor - // https://github.com/valeriangalliat/markdown-it-anchor#usage + // opções para @mdit/plugin-anchor + // https://mdit-plugins.github.io/anchor.html anchor: { - permalink: markdownItAnchor.permalink.headerLink() + permalink: headerLink() }, // opções para @mdit-vue/plugin-toc diff --git a/docs/ru/guide/markdown.md b/docs/ru/guide/markdown.md index 104f8790..f33dfb51 100644 --- a/docs/ru/guide/markdown.md +++ b/docs/ru/guide/markdown.md @@ -1015,15 +1015,15 @@ VitePress использует [markdown-it](https://github.com/markdown-it/mark ```js import { defineConfig } from 'vitepress' -import markdownItAnchor from 'markdown-it-anchor' +import { headerLink } from '@mdit/plugin-anchor' import markdownItFoo from 'markdown-it-foo' export default defineConfig({ markdown: { - // опции для markdown-it-anchor - // https://github.com/valeriangalliat/markdown-it-anchor#usage + // опции для @mdit/plugin-anchor + // https://mdit-plugins.github.io/anchor.html anchor: { - permalink: markdownItAnchor.permalink.headerLink() + permalink: headerLink() }, // опции для @mdit-vue/plugin-toc diff --git a/docs/zh/guide/markdown.md b/docs/zh/guide/markdown.md index ba920391..59faec33 100644 --- a/docs/zh/guide/markdown.md +++ b/docs/zh/guide/markdown.md @@ -907,15 +907,15 @@ VitePress 使用 [markdown-it](https://github.com/markdown-it/markdown-it) 作 ```js import { defineConfig } from 'vitepress' -import markdownItAnchor from 'markdown-it-anchor' +import { headerLink } from '@mdit/plugin-anchor' import markdownItFoo from 'markdown-it-foo' export default defineConfig({ markdown: { - // markdown-it-anchor 的选项 - // https://github.com/valeriangalliat/markdown-it-anchor#usage + // @mdit/plugin-anchor 的选项 + // https://mdit-plugins.github.io/anchor.html anchor: { - permalink: markdownItAnchor.permalink.headerLink() + permalink: headerLink() }, // @mdit-vue/plugin-toc 的选项 // https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-toc#options diff --git a/package.json b/package.json index 44fd3a7f..fe552acd 100644 --- a/package.json +++ b/package.json @@ -129,6 +129,7 @@ "@mdit-vue/plugin-title": "^3.0.2", "@mdit-vue/plugin-toc": "^3.0.2", "@mdit-vue/shared": "^3.0.2", + "@mdit/plugin-anchor": "^1.1.1", "@polka/compression": "^1.0.0-next.28", "@rollup/plugin-alias": "^6.0.0", "@rollup/plugin-commonjs": "^29.0.3", @@ -157,7 +158,6 @@ "lodash.template": "^4.18.1", "lru-cache": "^11.5.1", "markdown-it": "^14.2.0", - "markdown-it-anchor": "^9.2.0", "markdown-it-async": "^2.2.0", "markdown-it-attrs": "4.3.1", "markdown-it-cjk-friendly": "^2.0.2", diff --git a/patches/markdown-it-anchor@9.2.0.patch b/patches/markdown-it-anchor@9.2.0.patch deleted file mode 100644 index ac4498e4..00000000 --- a/patches/markdown-it-anchor@9.2.0.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/types/index.d.ts b/types/index.d.ts -index 40c25c0be1add8b0fc2c51489c25a423dbc49d2c..807bc1b0e434d660c6a298b1dee1c87935bfac86 100644 ---- a/types/index.d.ts -+++ b/types/index.d.ts -@@ -1,10 +1,8 @@ - import MarkdownIt from 'markdown-it'; --import { default as MarkdownItToken } from 'markdown-it/lib/token.mjs'; --import { default as MarkdownItState} from 'markdown-it/lib/rules_core/state_core.mjs'; -+import { default as Token } from 'markdown-it/lib/token.mjs'; -+import { default as State } from 'markdown-it/lib/rules_core/state_core.mjs'; - - declare namespace anchor { -- export type Token = MarkdownItToken -- export type State = MarkdownItState - export type RenderHref = (slug: string, state: State) => string; - export type RenderAttrs = (slug: string, state: State) => Record; - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1cb266da..4af48f06 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ patchedDependencies: '@types/mdurl@2.0.0': hash: 3460e7d18ce390685cf4b8d8237fb20df9ad952c1336f479995a508a6395bfa4 path: patches/@types__mdurl@2.0.0.patch - markdown-it-anchor@9.2.0: - hash: cdc28e7c329be30688ad192126ba505446611fbe526ad51483e4b1287aa35cf9 - path: patches/markdown-it-anchor@9.2.0.patch markdown-it-attrs@4.3.1: hash: 12883b753541724964b5246a739df34c4b76db10415bbb63c35dce408cfe977e path: patches/markdown-it-attrs@4.3.1.patch @@ -116,6 +113,9 @@ importers: '@mdit-vue/shared': specifier: ^3.0.2 version: 3.0.2 + '@mdit/plugin-anchor': + specifier: ^1.1.1 + version: 1.1.1(markdown-it@14.2.0) '@polka/compression': specifier: ^1.0.0-next.28 version: 1.0.0-next.28 @@ -200,9 +200,6 @@ importers: markdown-it: specifier: ^14.2.0 version: 14.2.0 - markdown-it-anchor: - specifier: ^9.2.0 - version: 9.2.0(patch_hash=cdc28e7c329be30688ad192126ba505446611fbe526ad51483e4b1287aa35cf9)(@types/markdown-it@14.1.2)(markdown-it@14.2.0) markdown-it-async: specifier: ^2.2.0 version: 2.2.0 @@ -643,6 +640,11 @@ packages: resolution: {integrity: sha512-00aAZ0F0NLik6I6Yba2emGbHLxv+QYrPH00qQ5dFKXlAo1Ll2RHDXwY7nN2WAfrx2pP+WrvSRFTGFCNGdzBDHw==} engines: {node: '>=20.0.0'} + '@mdit/plugin-anchor@1.1.1': + resolution: {integrity: sha512-42m7dxzvfLbo3YnteMB70aXFQ1TtnalyNLyPUDj5rr1FqTNf8pnHjQbgmf6FCjshg6BrfLVx7zpHJ7UUehQ/fA==} + peerDependencies: + markdown-it: ^14.2.0 + '@napi-rs/wasm-runtime@1.1.6': resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: @@ -2035,12 +2037,6 @@ packages: mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - markdown-it-anchor@9.2.0: - resolution: {integrity: sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==} - peerDependencies: - '@types/markdown-it': '*' - markdown-it: '*' - markdown-it-async@2.2.0: resolution: {integrity: sha512-sITME+kf799vMeO/ww/CjH6q+c05f6TLpn6VOmmWCGNqPJzSh+uFgZoMB9s0plNtW6afy63qglNAC3MhrhP/gg==} @@ -3239,6 +3235,11 @@ snapshots: '@mdit-vue/types@3.0.2': {} + '@mdit/plugin-anchor@1.1.1(markdown-it@14.2.0)': + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.2.0 + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 @@ -4502,11 +4503,6 @@ snapshots: mark.js@8.11.1: {} - markdown-it-anchor@9.2.0(patch_hash=cdc28e7c329be30688ad192126ba505446611fbe526ad51483e4b1287aa35cf9)(@types/markdown-it@14.1.2)(markdown-it@14.2.0): - dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.2.0 - markdown-it-async@2.2.0: dependencies: '@types/markdown-it': 14.1.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index aefb59fe..4a7f5533 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,7 +17,6 @@ overrides: patchedDependencies: '@types/markdown-it-attrs': patches/@types__markdown-it-attrs@4.1.3.patch '@types/mdurl@2.0.0': patches/@types__mdurl@2.0.0.patch - markdown-it-anchor@9.2.0: patches/markdown-it-anchor@9.2.0.patch markdown-it-attrs@4.3.1: patches/markdown-it-attrs@4.3.1.patch shellEmulator: true diff --git a/src/node/markdown/markdown.ts b/src/node/markdown/markdown.ts index ee5c3954..ecab0bc9 100644 --- a/src/node/markdown/markdown.ts +++ b/src/node/markdown/markdown.ts @@ -14,13 +14,13 @@ import { sfcPlugin, type SfcPluginOptions } from '@mdit-vue/plugin-sfc' import { titlePlugin } from '@mdit-vue/plugin-title' import { tocPlugin, type TocPluginOptions } from '@mdit-vue/plugin-toc' import { slugify as defaultSlugify } from '@mdit-vue/shared' +import { anchor as anchorPlugin, type AnchorOptions } from '@mdit/plugin-anchor' import type { CodeToHastOptions, LanguageInput, ShikiTransformer, ThemeRegistrationAny } from '@shikijs/types' -import anchorPlugin from 'markdown-it-anchor' import { MarkdownItAsync, type MarkdownItAsyncOptions } from 'markdown-it-async' import attrsPlugin, { type MarkdownItAttrsOptions } from 'markdown-it-attrs' import mditCjkFriendly from 'markdown-it-cjk-friendly' @@ -198,12 +198,12 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { */ cjkFriendlyEmphasis?: boolean /** - * Options for `markdown-it-anchor`. Set to `false` to disable adding ids + * Options for `@mdit/plugin-anchor`. Set to `false` to disable adding ids * and anchor links to headings. Note that the default theme's outline and * heading hash links rely on these ids. - * @see https://github.com/valeriangalliat/markdown-it-anchor + * @see https://mdit-plugins.github.io/anchor.html */ - anchor?: anchorPlugin.AnchorOptions | false + anchor?: AnchorOptions | false /** * Options for `@mdit-vue/plugin-headers`. Set to `true` or pass options * to collect page headers into page data. From 85ede55fdb0623cf2b8003165602d81ead38b860 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 24 Jul 2026 01:01:12 +0530 Subject: [PATCH 087/187] test(markdown): cover attrs/anchor plugin order independence attrs registers its core rule at a fixed position (before linkify) while anchor pushes to the end of the chain, so user-defined ids from curly attributes win regardless of registration order. Remove the comment that claimed the order matters. Co-Authored-By: Claude Fable 5 --- __tests__/unit/node/markdown/markdown.test.ts | 19 +++++++++++++++++++ src/node/markdown/markdown.ts | 2 -- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/__tests__/unit/node/markdown/markdown.test.ts b/__tests__/unit/node/markdown/markdown.test.ts index c042d6ba..0c8e554d 100644 --- a/__tests__/unit/node/markdown/markdown.test.ts +++ b/__tests__/unit/node/markdown/markdown.test.ts @@ -1,3 +1,6 @@ +import { anchor as anchorPlugin } from '@mdit/plugin-anchor' +import attrsPlugin from 'markdown-it-attrs' +import { MarkdownItAsync } from 'markdown-it-async' import { createMarkdownRenderer, disposeMdItInstance, @@ -110,4 +113,20 @@ describe('node/markdown/markdown', () => { ) }) }) + + // attrs applies at a fixed position in the core chain (before linkify), + // while anchor pushes to its end, so anchor always sees user-defined ids + // no matter which plugin is registered first + test('anchor respects ids from attrs regardless of plugin order', async () => { + for (const plugins of [ + [attrsPlugin, anchorPlugin], + [anchorPlugin, attrsPlugin] + ] as const) { + const md = new MarkdownItAsync() + for (const plugin of plugins) md.use(plugin) + expect(await md.renderAsync('## Title {#custom-id}')).toContain( + 'id="custom-id"' + ) + } + }) }) diff --git a/src/node/markdown/markdown.ts b/src/node/markdown/markdown.ts index ecab0bc9..8cb826d1 100644 --- a/src/node/markdown/markdown.ts +++ b/src/node/markdown/markdown.ts @@ -361,8 +361,6 @@ export async function createMarkdownRenderer( mditCjkFriendly(md) } if (options.anchor !== false) { - // must be applied after attrs so that user-defined ids from curly - // attributes take precedence over slugified ones anchorPlugin(md, { slugify, getTokensText: (tokens) => { From 018887fa1d03031e9c6cc96606be22df51581e35 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 24 Jul 2026 01:09:51 +0530 Subject: [PATCH 088/187] feat(markdown)!: replace markdown-it-emoji with @mdit/plugin-emoji Same emoji token type, shortcuts, and set-replacement semantics, with fresher emoji data and native types (drops `@types/markdown-it-emoji`). BREAKING CHANGE: The `defs` property of `markdown.emoji` has been renamed to `definitions`. Co-Authored-By: Claude Fable 5 --- docs/en/guide/markdown.md | 2 +- docs/es/guide/markdown.md | 2 +- docs/fa/guide/markdown.md | 2 +- docs/ja/guide/markdown.md | 2 +- docs/ko/guide/markdown.md | 2 +- docs/pt/guide/markdown.md | 2 +- docs/ru/guide/markdown.md | 2 +- docs/zh/guide/markdown.md | 2 +- package.json | 3 +-- pnpm-lock.yaml | 36 +++++++++++++++++------------------ src/node/markdown/markdown.ts | 17 +++++++---------- 11 files changed, 34 insertions(+), 38 deletions(-) diff --git a/docs/en/guide/markdown.md b/docs/en/guide/markdown.md index 54baf549..38966226 100644 --- a/docs/en/guide/markdown.md +++ b/docs/en/guide/markdown.md @@ -112,7 +112,7 @@ For more details, see [Frontmatter](../reference/frontmatter-config). :tada: :100: -A [list of all emojis](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs) is available. +A [list of all emojis](https://github.com/mdit-plugins/mdit-plugins/blob/main/packages/emoji/src/data/full.ts) is available. ## Table of Contents diff --git a/docs/es/guide/markdown.md b/docs/es/guide/markdown.md index bd9e5e58..f1f3ce72 100644 --- a/docs/es/guide/markdown.md +++ b/docs/es/guide/markdown.md @@ -112,7 +112,7 @@ Para más detalles, vea [Frontmatter](../reference/frontmatter-config). :tada: :100: -Una [lista de todos los emojis](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs) está disponible. +Una [lista de todos los emojis](https://github.com/mdit-plugins/mdit-plugins/blob/main/packages/emoji/src/data/full.ts) está disponible. ## Tabla de Contenido (TOC) diff --git a/docs/fa/guide/markdown.md b/docs/fa/guide/markdown.md index dc1aacfa..1c10e7ab 100644 --- a/docs/fa/guide/markdown.md +++ b/docs/fa/guide/markdown.md @@ -112,7 +112,7 @@ lang: fa-IR :tada: :100: -یک [لیست از همه اموجی ها](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs) در دسترس است. +یک [لیست از همه اموجی ها](https://github.com/mdit-plugins/mdit-plugins/blob/main/packages/emoji/src/data/full.ts) در دسترس است. ## فهرست مطالب {#table-of-contents} diff --git a/docs/ja/guide/markdown.md b/docs/ja/guide/markdown.md index 9f530692..7feb36b2 100644 --- a/docs/ja/guide/markdown.md +++ b/docs/ja/guide/markdown.md @@ -110,7 +110,7 @@ lang: ja-JP :tada: :100: -すべての絵文字の [一覧はこちら](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs)。 +すべての絵文字の [一覧はこちら](https://github.com/mdit-plugins/mdit-plugins/blob/main/packages/emoji/src/data/full.ts)。 ## 目次 {#table-of-contents} diff --git a/docs/ko/guide/markdown.md b/docs/ko/guide/markdown.md index 157f9a9d..4baccb2e 100644 --- a/docs/ko/guide/markdown.md +++ b/docs/ko/guide/markdown.md @@ -112,7 +112,7 @@ lang: en-US :tada: :100: -[모든 이모지의 목록](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs)이 제공됩니다. +[모든 이모지의 목록](https://github.com/mdit-plugins/mdit-plugins/blob/main/packages/emoji/src/data/full.ts)이 제공됩니다. ## 목차 {#table-of-contents} diff --git a/docs/pt/guide/markdown.md b/docs/pt/guide/markdown.md index 1ad50dff..03402ff4 100644 --- a/docs/pt/guide/markdown.md +++ b/docs/pt/guide/markdown.md @@ -112,7 +112,7 @@ Para mais detalhes, veja [Frontmatter](../reference/frontmatter-config). :tada: :100: -Uma [lista de todos os emojis](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs) está disponível. +Uma [lista de todos os emojis](https://github.com/mdit-plugins/mdit-plugins/blob/main/packages/emoji/src/data/full.ts) está disponível. ## Tabela de Conteúdo (TOC) diff --git a/docs/ru/guide/markdown.md b/docs/ru/guide/markdown.md index f33dfb51..9ad328d3 100644 --- a/docs/ru/guide/markdown.md +++ b/docs/ru/guide/markdown.md @@ -112,7 +112,7 @@ lang: ru-RU :tada: :100: -[Список всех эмодзи](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs). +[Список всех эмодзи](https://github.com/mdit-plugins/mdit-plugins/blob/main/packages/emoji/src/data/full.ts). ## Оглавление {#table-of-contents} diff --git a/docs/zh/guide/markdown.md b/docs/zh/guide/markdown.md index 59faec33..25b9b542 100644 --- a/docs/zh/guide/markdown.md +++ b/docs/zh/guide/markdown.md @@ -112,7 +112,7 @@ lang: en-US :tada: :100: -这里可以找到[所有支持的 emoji 列表](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs)。 +这里可以找到[所有支持的 emoji 列表](https://github.com/mdit-plugins/mdit-plugins/blob/main/packages/emoji/src/data/full.ts)。 ## 目录表 (TOC) {#table-of-contents} diff --git a/package.json b/package.json index fe552acd..8f8839af 100644 --- a/package.json +++ b/package.json @@ -130,6 +130,7 @@ "@mdit-vue/plugin-toc": "^3.0.2", "@mdit-vue/shared": "^3.0.2", "@mdit/plugin-anchor": "^1.1.1", + "@mdit/plugin-emoji": "^1.1.0", "@polka/compression": "^1.0.0-next.28", "@rollup/plugin-alias": "^6.0.0", "@rollup/plugin-commonjs": "^29.0.3", @@ -141,7 +142,6 @@ "@types/mark.js": "^8.11.12", "@types/markdown-it-attrs": "^4.1.3", "@types/markdown-it-container": "^4.0.0", - "@types/markdown-it-emoji": "^3.0.1", "@types/minimist": "^1.2.5", "@types/node": "^25.9.4", "@types/picomatch": "^4.0.3", @@ -162,7 +162,6 @@ "markdown-it-attrs": "4.3.1", "markdown-it-cjk-friendly": "^2.0.2", "markdown-it-container": "^4.0.0", - "markdown-it-emoji": "^3.0.0", "markdown-it-mathjax3": "^4.3.2", "minimist": "^1.2.8", "nanoid": "^5.1.16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4af48f06..6bd80091 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,6 +116,9 @@ importers: '@mdit/plugin-anchor': specifier: ^1.1.1 version: 1.1.1(markdown-it@14.2.0) + '@mdit/plugin-emoji': + specifier: ^1.1.0 + version: 1.1.0(markdown-it@14.2.0) '@polka/compression': specifier: ^1.0.0-next.28 version: 1.0.0-next.28 @@ -149,9 +152,6 @@ importers: '@types/markdown-it-container': specifier: ^4.0.0 version: 4.0.0 - '@types/markdown-it-emoji': - specifier: ^3.0.1 - version: 3.0.1 '@types/minimist': specifier: ^1.2.5 version: 1.2.5 @@ -212,9 +212,6 @@ importers: markdown-it-container: specifier: ^4.0.0 version: 4.0.0 - markdown-it-emoji: - specifier: ^3.0.0 - version: 3.0.0 markdown-it-mathjax3: specifier: ^4.3.2 version: 4.3.2 @@ -645,6 +642,15 @@ packages: peerDependencies: markdown-it: ^14.2.0 + '@mdit/plugin-emoji@1.1.0': + resolution: {integrity: sha512-rdGhZ0OVhK0EhiVpw8v22BdTq7XZ6Adrcbq3hR2Cx/YwGnL+kSXFtcGOeJXphiSics7oNgpIKdNyl974z7Cj1A==} + engines: {node: '>=22'} + peerDependencies: + markdown-it: ^14.2.0 + peerDependenciesMeta: + markdown-it: + optional: true + '@napi-rs/wasm-runtime@1.1.6': resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: @@ -1064,9 +1070,6 @@ packages: '@types/markdown-it-container@4.0.0': resolution: {integrity: sha512-GmD8OECLfzPHv8VyvFRzslqdwXoDBJ2H40fxXFjrarbqvJZSB/BJKZXN5e3k7Mx7GQanSNzTYhzeS3H9o0gAOw==} - '@types/markdown-it-emoji@3.0.1': - resolution: {integrity: sha512-cz1j8R35XivBqq9mwnsrP2fsz2yicLhB8+PDtuVkKOExwEdsVBNI+ROL3sbhtR5occRZ66vT0QnwFZCqdjf3pA==} - '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} @@ -2059,9 +2062,6 @@ packages: markdown-it-container@4.0.0: resolution: {integrity: sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==} - markdown-it-emoji@3.0.0: - resolution: {integrity: sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==} - markdown-it-mathjax3@4.3.2: resolution: {integrity: sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w==} @@ -3240,6 +3240,12 @@ snapshots: '@types/markdown-it': 14.1.2 markdown-it: 14.2.0 + '@mdit/plugin-emoji@1.1.0(markdown-it@14.2.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.2.0 + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 @@ -3549,10 +3555,6 @@ snapshots: dependencies: '@types/markdown-it': 14.1.2 - '@types/markdown-it-emoji@3.0.1': - dependencies: - '@types/markdown-it': 14.1.2 - '@types/markdown-it@14.1.2': dependencies: '@types/linkify-it': 5.0.0 @@ -4521,8 +4523,6 @@ snapshots: markdown-it-container@4.0.0: {} - markdown-it-emoji@3.0.0: {} - markdown-it-mathjax3@4.3.2: dependencies: juice: 8.1.0 diff --git a/src/node/markdown/markdown.ts b/src/node/markdown/markdown.ts index 8cb826d1..0dc61d98 100644 --- a/src/node/markdown/markdown.ts +++ b/src/node/markdown/markdown.ts @@ -15,6 +15,7 @@ import { titlePlugin } from '@mdit-vue/plugin-title' import { tocPlugin, type TocPluginOptions } from '@mdit-vue/plugin-toc' import { slugify as defaultSlugify } from '@mdit-vue/shared' import { anchor as anchorPlugin, type AnchorOptions } from '@mdit/plugin-anchor' +import { fullEmoji as emojiPlugin } from '@mdit/plugin-emoji' import type { CodeToHastOptions, LanguageInput, @@ -24,7 +25,6 @@ import type { import { MarkdownItAsync, type MarkdownItAsyncOptions } from 'markdown-it-async' import attrsPlugin, { type MarkdownItAttrsOptions } from 'markdown-it-attrs' import mditCjkFriendly from 'markdown-it-cjk-friendly' -import { full as emojiPlugin } from 'markdown-it-emoji' import path from 'node:path' import type { BuiltinLanguage, BuiltinTheme, Highlighter } from 'shiki' import type { Logger } from 'vite' @@ -42,6 +42,9 @@ import { tablePlugin } from './plugins/table' export type { Header } from '../shared' +// not exported from @mdit/plugin-emoji, so derive it from the plugin signature +type EmojiPluginOptions = NonNullable[1]> + export type ThemeOptions = | ThemeRegistrationAny | BuiltinTheme @@ -180,16 +183,10 @@ export interface MarkdownOptions extends MarkdownItAsyncOptions { */ attrs?: MarkdownItAttrsOptions | false /** - * Options for `markdown-it-emoji`. Set to `false` to disable. - * @see https://github.com/markdown-it/markdown-it-emoji + * Options for `@mdit/plugin-emoji`. Set to `false` to disable. + * @see https://mdit-plugins.github.io/emoji.html */ - emoji?: - | { - defs?: Record - enabled?: string[] - shortcuts?: Record - } - | false + emoji?: EmojiPluginOptions | false /** * Improves emphasis (`**bold**`) handling in Japanese, Chinese, and * Korean text. From 7c09583eaa5ebdc87787c3f1cbbdaa3f44e9d47b Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 24 Jul 2026 01:28:24 +0530 Subject: [PATCH 089/187] test(markdown): cover attrs behavior before plugin migration Captures what the markdown-it-attrs patch enforces (curly attributes never consume fence info, preserving line-highlight syntax) plus the supported attribute placements, as a regression baseline. Co-Authored-By: Claude Fable 5 --- __tests__/unit/node/markdown/markdown.test.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/__tests__/unit/node/markdown/markdown.test.ts b/__tests__/unit/node/markdown/markdown.test.ts index 0c8e554d..d46c5aad 100644 --- a/__tests__/unit/node/markdown/markdown.test.ts +++ b/__tests__/unit/node/markdown/markdown.test.ts @@ -114,6 +114,31 @@ describe('node/markdown/markdown', () => { }) }) + describe('attrs', () => { + test('does not consume fence info', async () => { + // line-highlight / meta syntax must reach the highlighter untouched + const meta = await render('```js{4}\nconst a = 1\n```') + expect(meta).toContain('language-js') + expect(meta).not.toContain('4=""') + + // curly attributes have no effect on fenced code blocks + const backtick = await render('```js {.foo}\nconst a = 1\n```') + expect(backtick).not.toContain('class="foo"') + const tilde = await render('~~~js {.foo}\nconst a = 1\n~~~') + expect(tilde).not.toContain('class="foo"') + }) + + test('applies to inline elements and blocks', async () => { + expect(await render('*hi*{.cls}')).toContain('') + expect(await render('`code`{.cls}')).toContain('class="cls"') + expect(await render('text {.cls}')).toContain('

') + expect(await render('- item\n{.cls}')).toContain('