From 23d3281ed6f1111ab15708ca1fd86202674f8ef7 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jan 2025 21:06:11 +0530 Subject: [PATCH 1/3] feat: support same page navigation in router.go (#4511) --- src/client/app/index.ts | 9 +- src/client/app/router.ts | 192 +++++++++++++++++++++------------------ 2 files changed, 107 insertions(+), 94 deletions(-) diff --git a/src/client/app/index.ts b/src/client/app/index.ts index 5acb3be5..1f1e8069 100644 --- a/src/client/app/index.ts +++ b/src/client/app/index.ts @@ -159,19 +159,14 @@ function newRouter(): Router { if (inBrowser) { createApp().then(({ app, router, data }) => { // wait until page component is fetched before mounting - router.go().then(() => { + router.go(location.href, { initialLoad: true }).then(() => { // dynamically update head tags useUpdateHead(router.route, data.site) app.mount('#app') // scroll to hash on new tab during dev if (import.meta.env.DEV && location.hash) { - const target = document.getElementById( - decodeURIComponent(location.hash).slice(1) - ) - if (target) { - scrollTo(target, location.hash) - } + scrollTo(location.hash) } }) }) diff --git a/src/client/app/router.ts b/src/client/app/router.ts index 0cffc700..8b09339d 100644 --- a/src/client/app/router.ts +++ b/src/client/app/router.ts @@ -7,6 +7,8 @@ import { getScrollOffset, inBrowser, withBase } from './utils' export interface Route { path: string + hash: string + query: string data: PageData component: Component | null } @@ -19,7 +21,15 @@ export interface Router { /** * Navigate to a new URL. */ - go: (to?: string) => Promise + go: ( + to: string, + options?: { + // @internal + initialLoad?: boolean + // Whether to smoothly scroll to the target position. + smoothScroll?: boolean + } + ) => Promise /** * Called before the route changes. Return `false` to cancel the navigation. */ @@ -37,10 +47,6 @@ export interface Router { * Called after the route changes. */ onAfterRouteChange?: (to: string) => Awaitable - /** - * @deprecated use `onAfterRouteChange` instead - */ - onAfterRouteChanged?: (to: string) => Awaitable } export const RouterSymbol: InjectionKey = Symbol() @@ -51,6 +57,8 @@ const fakeHost = 'http://a.com' const getDefaultRoute = (): Route => ({ path: '/', + hash: '', + query: '', component: null, data: notFoundPageData }) @@ -68,39 +76,32 @@ export function createRouter( const router: Router = { route, - go - } - - async function go(href: string = inBrowser ? location.href : '/') { - href = normalizeHref(href) - if ((await router.onBeforeRouteChange?.(href)) === false) return - if (inBrowser && href !== normalizeHref(location.href)) { - // save scroll position before changing url - history.replaceState({ scrollPosition: window.scrollY }, '') - history.pushState({}, '', href) + async go(href, options) { + href = normalizeHref(href) + if ((await router.onBeforeRouteChange?.(href)) === false) return + if (!inBrowser || (await changeRoute(href, options))) await loadPage(href) + syncRouteQueryAndHash() + await router.onAfterRouteChange?.(href) } - await loadPage(href) - await (router.onAfterRouteChange ?? router.onAfterRouteChanged)?.(href) } let latestPendingPath: string | null = null async function loadPage(href: string, scrollPosition = 0, isRetry = false) { if ((await router.onBeforePageLoad?.(href)) === false) return + const targetLoc = new URL(href, fakeHost) const pendingPath = (latestPendingPath = targetLoc.pathname) + try { let page = await loadPageModule(pendingPath) - if (!page) { - throw new Error(`Page not found: ${pendingPath}`) - } + if (!page) throw new Error(`Page not found: ${pendingPath}`) + if (latestPendingPath === pendingPath) { latestPendingPath = null const { default: comp, __pageData } = page - if (!comp) { - throw new Error(`Invalid route component: ${comp}`) - } + if (!comp) throw new Error(`Invalid route component: ${comp}`) await router.onAfterPageLoad?.(href) @@ -109,36 +110,25 @@ export function createRouter( route.data = import.meta.env.PROD ? markRaw(__pageData) : (readonly(__pageData) as PageData) + syncRouteQueryAndHash(targetLoc) if (inBrowser) { nextTick(() => { let actualPathname = siteDataRef.value.base + __pageData.relativePath.replace(/(?:(^|\/)index)?\.md$/, '$1') + if (!siteDataRef.value.cleanUrls && !actualPathname.endsWith('/')) { actualPathname += '.html' } + if (actualPathname !== targetLoc.pathname) { targetLoc.pathname = actualPathname href = actualPathname + targetLoc.search + targetLoc.hash history.replaceState({}, '', href) } - if (targetLoc.hash && !scrollPosition) { - let target: HTMLElement | null = null - try { - target = document.getElementById( - decodeURIComponent(targetLoc.hash).slice(1) - ) - } catch (e) { - console.warn(e) - } - if (target) { - scrollTo(target, targetLoc.hash) - return - } - } - window.scrollTo(0, scrollPosition) + return scrollTo(targetLoc.hash, false, scrollPosition) }) } } @@ -173,14 +163,22 @@ export function createRouter( .replace(/^\//, '') : '404.md' route.data = { ...notFoundPageData, relativePath } + syncRouteQueryAndHash(targetLoc) } } } + function syncRouteQueryAndHash( + loc: { search: string; hash: string } = inBrowser + ? location + : { search: '', hash: '' } + ) { + route.query = loc.search + route.hash = decodeURIComponent(loc.hash) + } + if (inBrowser) { - if (history.state === null) { - history.replaceState({}, '') - } + if (history.state === null) history.replaceState({}, '') window.addEventListener( 'click', (e) => { @@ -193,8 +191,9 @@ export function createRouter( e.shiftKey || e.altKey || e.metaKey - ) + ) { return + } const link = e.target.closest('a') if ( @@ -202,47 +201,24 @@ export function createRouter( link.closest('.vp-raw') || link.hasAttribute('download') || link.hasAttribute('target') - ) + ) { return + } const linkHref = link.getAttribute('href') ?? (link instanceof SVGAElement ? link.getAttribute('xlink:href') : null) if (linkHref == null) return - const { href, origin, pathname, hash, search } = new URL( - linkHref, - link.baseURI - ) - const currentUrl = new URL(location.href) // copy to keep old data + const { href, origin, pathname } = new URL(linkHref, link.baseURI) + const currentLoc = new URL(location.href) // copy to keep old data // only intercept inbound html links - if (origin === currentUrl.origin && treatAsHtml(pathname)) { + if (origin === currentLoc.origin && treatAsHtml(pathname)) { e.preventDefault() - if ( - pathname === currentUrl.pathname && - search === currentUrl.search - ) { - // scroll between hash anchors in the same page - // avoid duplicate history entries when the hash is same - if (hash !== currentUrl.hash) { - history.pushState({}, '', href) - // still emit the event so we can listen to it in themes - window.dispatchEvent( - new HashChangeEvent('hashchange', { - oldURL: currentUrl.href, - newURL: href - }) - ) - } - if (hash) { - // use smooth scroll when clicking on header anchor links - scrollTo(link, hash, link.classList.contains('header-anchor')) - } else { - window.scrollTo(0, 0) - } - } else { - go(href) - } + router.go(href, { + // use smooth scroll when clicking on header anchor links + smoothScroll: link.classList.contains('header-anchor') + }) } }, { capture: true } @@ -252,11 +228,13 @@ export function createRouter( if (e.state === null) return const href = normalizeHref(location.href) await loadPage(href, (e.state && e.state.scrollPosition) || 0) - await (router.onAfterRouteChange ?? router.onAfterRouteChanged)?.(href) + syncRouteQueryAndHash() + await router.onAfterRouteChange?.(href) }) window.addEventListener('hashchange', (e) => { e.preventDefault() + syncRouteQueryAndHash() }) } @@ -267,9 +245,7 @@ export function createRouter( export function useRouter(): Router { const router = inject(RouterSymbol) - if (!router) { - throw new Error('useRouter() is called without provider.') - } + if (!router) throw new Error('useRouter() is called without provider.') return router } @@ -277,13 +253,16 @@ export function useRoute(): Route { return useRouter().route } -export function scrollTo(el: Element, hash: string, smooth = false) { +export function scrollTo(hash: string, smooth = false, scrollPosition = 0) { + if (!hash || scrollPosition) { + window.scrollTo(0, scrollPosition) + return + } + let target: Element | null = null try { - target = el.classList.contains('header-anchor') - ? el - : document.getElementById(decodeURIComponent(hash).slice(1)) + target = document.getElementById(decodeURIComponent(hash).slice(1)) } catch (e) { console.warn(e) } @@ -293,17 +272,20 @@ export function scrollTo(el: Element, hash: string, smooth = false) { window.getComputedStyle(target).paddingTop, 10 ) + const targetTop = window.scrollY + target.getBoundingClientRect().top - getScrollOffset() + targetPadding + function scrollToTarget() { // only smooth scroll if distance is smaller than screen height. if (!smooth || Math.abs(targetTop - window.scrollY) > window.innerHeight) window.scrollTo(0, targetTop) else window.scrollTo({ left: 0, top: targetTop, behavior: 'smooth' }) } + requestAnimationFrame(scrollToTarget) } } @@ -313,9 +295,7 @@ function handleHMR(route: Route): void { if (import.meta.hot) { // hot reload pageData import.meta.hot.on('vitepress:pageData', (payload: PageDataPayload) => { - if (shouldHotReload(payload)) { - route.data = payload.pageData - } + if (shouldHotReload(payload)) route.data = payload.pageData }) } } @@ -332,9 +312,47 @@ function normalizeHref(href: string): string { const url = new URL(href, fakeHost) url.pathname = url.pathname.replace(/(^|\/)index(\.html)?$/, '$1') // ensure correct deep link so page refresh lands on correct files. - if (siteDataRef.value.cleanUrls) + if (siteDataRef.value.cleanUrls) { url.pathname = url.pathname.replace(/\.html$/, '') - else if (!url.pathname.endsWith('/') && !url.pathname.endsWith('.html')) + } else if (!url.pathname.endsWith('/') && !url.pathname.endsWith('.html')) { url.pathname += '.html' + } return url.pathname + url.search + url.hash } + +async function changeRoute( + href: string, + { smoothScroll = false, initialLoad = false } = {} +): Promise { + const loc = normalizeHref(location.href) + const { pathname, hash } = new URL(href, fakeHost) + const currentLoc = new URL(loc, fakeHost) + + if (href === loc) { + if (!initialLoad) { + scrollTo(hash, smoothScroll) + return false + } + } else { + // save scroll position before changing URL + history.replaceState({ scrollPosition: window.scrollY }, '') + history.pushState({}, '', href) + + if (pathname === currentLoc.pathname) { + // scroll between hash anchors on the same page, avoid duplicate entries + if (hash !== currentLoc.hash) { + window.dispatchEvent( + new HashChangeEvent('hashchange', { + oldURL: currentLoc.href, + newURL: href + }) + ) + scrollTo(hash, smoothScroll) + } + + return false + } + } + + return true +} From 34dcf01bcc69c3178cd58378876091aa30ef7205 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jan 2025 21:18:00 +0530 Subject: [PATCH 2/3] chore: bump deps --- package.json | 12 +- pnpm-lock.yaml | 456 +++++++++++++++++++++++++------------------------ 2 files changed, 236 insertions(+), 232 deletions(-) diff --git a/package.json b/package.json index 167ffb98..30e2d00b 100644 --- a/package.json +++ b/package.json @@ -105,8 +105,8 @@ "@vitejs/plugin-vue": "^5.2.1", "@vue/devtools-api": "^7.7.0", "@vue/shared": "^3.5.13", - "@vueuse/core": "^12.4.0", - "@vueuse/integrations": "^12.4.0", + "@vueuse/core": "^12.5.0", + "@vueuse/integrations": "^12.5.0", "focus-trap": "^7.6.4", "mark.js": "8.11.1", "minisearch": "^7.1.1", @@ -139,7 +139,7 @@ "@types/markdown-it-container": "^2.0.10", "@types/markdown-it-emoji": "^3.0.1", "@types/minimist": "^1.2.5", - "@types/node": "^22.10.7", + "@types/node": "^22.10.9", "@types/picomatch": "^3.0.2", "@types/postcss-prefix-selector": "^1.16.3", "@types/prompts": "^2.4.9", @@ -152,7 +152,7 @@ "fs-extra": "^11.3.0", "get-port": "^7.1.0", "gray-matter": "^4.0.3", - "lint-staged": "^15.4.1", + "lint-staged": "^15.4.2", "lodash.template": "^4.5.0", "lru-cache": "^11.0.2", "markdown-it": "^14.1.0", @@ -169,7 +169,7 @@ "picocolors": "^1.1.1", "picomatch": "^4.0.2", "pkg-dir": "^8.0.0", - "playwright-chromium": "^1.49.1", + "playwright-chromium": "^1.50.0", "polka": "^1.0.0-next.28", "postcss-prefix-selector": "^2.1.0", "prettier": "^3.4.2", @@ -186,7 +186,7 @@ "synckit": "^0.9.2", "tinyglobby": "^0.2.10", "typescript": "^5.7.3", - "vitest": "^3.0.3", + "vitest": "^3.0.4", "vue-tsc": "^2.2.0", "wait-on": "^8.0.2" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33fc3990..b25eca8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,7 +21,7 @@ importers: version: 3.8.3 '@docsearch/js': specifier: ^3.8.3 - version: 3.8.3(@algolia/client-search@5.19.0) + version: 3.8.3(@algolia/client-search@5.20.0) '@iconify-json/simple-icons': specifier: ^1.2.21 version: 1.2.21 @@ -39,7 +39,7 @@ importers: version: 14.1.2 '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.1(vite@6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1))(vue@3.5.13(typescript@5.7.3)) + version: 5.2.1(vite@6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) '@vue/devtools-api': specifier: ^7.7.0 version: 7.7.0 @@ -47,11 +47,11 @@ importers: specifier: ^3.5.13 version: 3.5.13 '@vueuse/core': - specifier: ^12.4.0 - version: 12.4.0(typescript@5.7.3) + specifier: ^12.5.0 + version: 12.5.0(typescript@5.7.3) '@vueuse/integrations': - specifier: ^12.4.0 - version: 12.4.0(axios@1.7.9(debug@4.4.0))(focus-trap@7.6.4)(typescript@5.7.3) + specifier: ^12.5.0 + version: 12.5.0(axios@1.7.9(debug@4.4.0))(focus-trap@7.6.4)(typescript@5.7.3) focus-trap: specifier: ^7.6.4 version: 7.6.4 @@ -66,7 +66,7 @@ importers: version: 2.1.0 vite: specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1) + version: 6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0) vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.3) @@ -144,8 +144,8 @@ importers: specifier: ^1.2.5 version: 1.2.5 '@types/node': - specifier: ^22.10.7 - version: 22.10.7 + specifier: ^22.10.9 + version: 22.10.9 '@types/picomatch': specifier: ^3.0.2 version: 3.0.2 @@ -183,8 +183,8 @@ importers: specifier: ^4.0.3 version: 4.0.3 lint-staged: - specifier: ^15.4.1 - version: 15.4.1 + specifier: ^15.4.2 + version: 15.4.2 lodash.template: specifier: ^4.5.0 version: 4.5.0 @@ -234,8 +234,8 @@ importers: specifier: ^8.0.0 version: 8.0.0 playwright-chromium: - specifier: ^1.49.1 - version: 1.49.1 + specifier: ^1.50.0 + version: 1.50.0 polka: specifier: ^1.0.0-next.28 version: 1.0.0-next.28 @@ -285,8 +285,8 @@ importers: specifier: ^5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0) vue-tsc: specifier: ^2.2.0 version: 2.2.0(typescript@5.7.3) @@ -349,56 +349,56 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.19.0': - resolution: {integrity: sha512-dMHwy2+nBL0SnIsC1iHvkBao64h4z+roGelOz11cxrDBrAdASxLxmfVMop8gmodQ2yZSacX0Rzevtxa+9SqxCw==} + '@algolia/client-abtesting@5.20.0': + resolution: {integrity: sha512-YaEoNc1Xf2Yk6oCfXXkZ4+dIPLulCx8Ivqj0OsdkHWnsI3aOJChY5qsfyHhDBNSOhqn2ilgHWxSfyZrjxBcAww==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.19.0': - resolution: {integrity: sha512-CDW4RwnCHzU10upPJqS6N6YwDpDHno7w6/qXT9KPbPbt8szIIzCHrva4O9KIfx1OhdsHzfGSI5hMAiOOYl4DEQ==} + '@algolia/client-analytics@5.20.0': + resolution: {integrity: sha512-CIT9ni0+5sYwqehw+t5cesjho3ugKQjPVy/iPiJvtJX4g8Cdb6je6SPt2uX72cf2ISiXCAX9U3cY0nN0efnRDw==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.19.0': - resolution: {integrity: sha512-2ERRbICHXvtj5kfFpY5r8qu9pJII/NAHsdgUXnUitQFwPdPL7wXiupcvZJC7DSntOnE8AE0lM7oDsPhrJfj5nQ==} + '@algolia/client-common@5.20.0': + resolution: {integrity: sha512-iSTFT3IU8KNpbAHcBUJw2HUrPnMXeXLyGajmCL7gIzWOsYM4GabZDHXOFx93WGiXMti1dymz8k8R+bfHv1YZmA==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.19.0': - resolution: {integrity: sha512-xPOiGjo6I9mfjdJO7Y+p035aWePcbsItizIp+qVyfkfZiGgD+TbNxM12g7QhFAHIkx/mlYaocxPY/TmwPzTe+A==} + '@algolia/client-insights@5.20.0': + resolution: {integrity: sha512-w9RIojD45z1csvW1vZmAko82fqE/Dm+Ovsy2ElTsjFDB0HMAiLh2FO86hMHbEXDPz6GhHKgGNmBRiRP8dDPgJg==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.19.0': - resolution: {integrity: sha512-B9eoce/fk8NLboGje+pMr72pw+PV7c5Z01On477heTZ7jkxoZ4X92dobeGuEQop61cJ93Gaevd1of4mBr4hu2A==} + '@algolia/client-personalization@5.20.0': + resolution: {integrity: sha512-p/hftHhrbiHaEcxubYOzqVV4gUqYWLpTwK+nl2xN3eTrSW9SNuFlAvUBFqPXSVBqc6J5XL9dNKn3y8OA1KElSQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.19.0': - resolution: {integrity: sha512-6fcP8d4S8XRDtVogrDvmSM6g5g6DndLc0pEm1GCKe9/ZkAzCmM3ZmW1wFYYPxdjMeifWy1vVEDMJK7sbE4W7MA==} + '@algolia/client-query-suggestions@5.20.0': + resolution: {integrity: sha512-m4aAuis5vZi7P4gTfiEs6YPrk/9hNTESj3gEmGFgfJw3hO2ubdS4jSId1URd6dGdt0ax2QuapXufcrN58hPUcw==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.19.0': - resolution: {integrity: sha512-Ctg3xXD/1VtcwmkulR5+cKGOMj4r0wC49Y/KZdGQcqpydKn+e86F6l3tb3utLJQVq4lpEJud6kdRykFgcNsp8Q==} + '@algolia/client-search@5.20.0': + resolution: {integrity: sha512-KL1zWTzrlN4MSiaK1ea560iCA/UewMbS4ZsLQRPoDTWyrbDKVbztkPwwv764LAqgXk0fvkNZvJ3IelcK7DqhjQ==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.19.0': - resolution: {integrity: sha512-LO7w1MDV+ZLESwfPmXkp+KLeYeFrYEgtbCZG6buWjddhYraPQ9MuQWLhLLiaMlKxZ/sZvFTcZYuyI6Jx4WBhcg==} + '@algolia/ingestion@1.20.0': + resolution: {integrity: sha512-shj2lTdzl9un4XJblrgqg54DoK6JeKFO8K8qInMu4XhE2JuB8De6PUuXAQwiRigZupbI0xq8aM0LKdc9+qiLQA==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.19.0': - resolution: {integrity: sha512-Mg4uoS0aIKeTpu6iv6O0Hj81s8UHagi5TLm9k2mLIib4vmMtX7WgIAHAcFIaqIZp5D6s5EVy1BaDOoZ7buuJHA==} + '@algolia/monitoring@1.20.0': + resolution: {integrity: sha512-aF9blPwOhKtWvkjyyXh9P5peqmhCA1XxLBRgItT+K6pbT0q4hBDQrCid+pQZJYy4HFUKjB/NDDwyzFhj/rwKhw==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.19.0': - resolution: {integrity: sha512-PbgrMTbUPlmwfJsxjFhal4XqZO2kpBNRjemLVTkUiti4w/+kzcYO4Hg5zaBgVqPwvFDNQ8JS4SS3TBBem88u+g==} + '@algolia/recommend@5.20.0': + resolution: {integrity: sha512-T6B/WPdZR3b89/F9Vvk6QCbt/wrLAtrGoL8z4qPXDFApQ8MuTFWbleN/4rHn6APWO3ps+BUePIEbue2rY5MlRw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.19.0': - resolution: {integrity: sha512-GfnhnQBT23mW/VMNs7m1qyEyZzhZz093aY2x8p0era96MMyNv8+FxGek5pjVX0b57tmSCZPf4EqNCpkGcGsmbw==} + '@algolia/requester-browser-xhr@5.20.0': + resolution: {integrity: sha512-t6//lXsq8E85JMenHrI6mhViipUT5riNhEfCcvtRsTV+KIBpC6Od18eK864dmBhoc5MubM0f+sGpKOqJIlBSCg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.19.0': - resolution: {integrity: sha512-oyTt8ZJ4T4fYvW5avAnuEc6Laedcme9fAFryMD9ndUTIUe/P0kn3BuGcCLFjN3FDmdrETHSFkgPPf1hGy3sLCw==} + '@algolia/requester-fetch@5.20.0': + resolution: {integrity: sha512-FHxYGqRY+6bgjKsK4aUsTAg6xMs2S21elPe4Y50GB0Y041ihvw41Vlwy2QS6K9ldoftX4JvXodbKTcmuQxywdQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.19.0': - resolution: {integrity: sha512-p6t8ue0XZNjcRiqNkb5QAM0qQRAKsCiebZ6n9JjWA+p8fWf8BvnhO55y2fO28g3GW0Imj7PrAuyBuxq8aDVQwQ==} + '@algolia/requester-node-http@5.20.0': + resolution: {integrity: sha512-kmtQClq/w3vtPteDSPvaW9SPZL/xrIgMrxZyAgsFwrJk0vJxqyC5/hwHmrCraDnStnGSADnLpBf4SpZnwnkwWw==} engines: {node: '>= 14.0.0'} '@antfu/install-pkg@0.4.1': @@ -964,8 +964,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@22.10.7': - resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==} + '@types/node@22.10.9': + resolution: {integrity: sha512-Ir6hwgsKyNESl/gLOcEz3krR4CBGgliDqBQ2ma4wIhEx0w+xnoeTq3tdrNw15kU3SxogDjOgv9sqdtLW8mIHaw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -997,8 +997,8 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - '@ungap/structured-clone@1.2.1': - resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@vitejs/plugin-vue@5.2.1': resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} @@ -1007,11 +1007,11 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vitest/expect@3.0.3': - resolution: {integrity: sha512-SbRCHU4qr91xguu+dH3RUdI5dC86zm8aZWydbp961aIR7G8OYNN6ZiayFuf9WAngRbFOfdrLHCGgXTj3GtoMRQ==} + '@vitest/expect@3.0.4': + resolution: {integrity: sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==} - '@vitest/mocker@3.0.3': - resolution: {integrity: sha512-XT2XBc4AN9UdaxJAeIlcSZ0ILi/GzmG5G8XSly4gaiqIvPV3HMTSIDZWJVX6QRJ0PX1m+W8Cy0K9ByXNb/bPIA==} + '@vitest/mocker@3.0.4': + resolution: {integrity: sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -1021,20 +1021,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.3': - resolution: {integrity: sha512-gCrM9F7STYdsDoNjGgYXKPq4SkSxwwIU5nkaQvdUxiQ0EcNlez+PdKOVIsUJvh9P9IeIFmjn4IIREWblOBpP2Q==} + '@vitest/pretty-format@3.0.4': + resolution: {integrity: sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==} - '@vitest/runner@3.0.3': - resolution: {integrity: sha512-Rgi2kOAk5ZxWZlwPguRJFOBmWs6uvvyAAR9k3MvjRvYrG7xYvKChZcmnnpJCS98311CBDMqsW9MzzRFsj2gX3g==} + '@vitest/runner@3.0.4': + resolution: {integrity: sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==} - '@vitest/snapshot@3.0.3': - resolution: {integrity: sha512-kNRcHlI4txBGztuJfPEJ68VezlPAXLRT1u5UCx219TU3kOG2DplNxhWLwDf2h6emwmTPogzLnGVwP6epDaJN6Q==} + '@vitest/snapshot@3.0.4': + resolution: {integrity: sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==} - '@vitest/spy@3.0.3': - resolution: {integrity: sha512-7/dgux8ZBbF7lEIKNnEqQlyRaER9nkAL9eTmdKJkDO3hS8p59ATGwKOCUDHcBLKr7h/oi/6hP+7djQk8049T2A==} + '@vitest/spy@3.0.4': + resolution: {integrity: sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==} - '@vitest/utils@3.0.3': - resolution: {integrity: sha512-f+s8CvyzPtMFY1eZKkIHGhPsQgYo5qCm6O8KZoim9qm1/jT64qBgGpO5tHscNH6BzRHM+edLNOP+3vO8+8pE/A==} + '@vitest/utils@3.0.4': + resolution: {integrity: sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==} '@volar/language-core@2.4.11': resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} @@ -1094,11 +1094,11 @@ packages: '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - '@vueuse/core@12.4.0': - resolution: {integrity: sha512-XnjQYcJwCsyXyIafyA6SvyN/OBtfPnjvJmbxNxQjCcyWD198urwm5TYvIUUyAxEAN0K7HJggOgT15cOlWFyLeA==} + '@vueuse/core@12.5.0': + resolution: {integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==} - '@vueuse/integrations@12.4.0': - resolution: {integrity: sha512-EZm+TLoZMeEwDnccnEqB54CvvcVKbVnJubOF380HqdyZAxWfQ8egnFCESdlXWEIbxFgjfhcGfZUvQx5Nqw9Ofw==} + '@vueuse/integrations@12.5.0': + resolution: {integrity: sha512-HYLt8M6mjUfcoUOzyBcX2RjpfapIwHPBmQJtTmXOQW845Y/Osu9VuTJ5kPvnmWJ6IUa05WpblfOwZ+P0G4iZsQ==} peerDependencies: async-validator: ^4 axios: ^1 @@ -1138,11 +1138,11 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@12.4.0': - resolution: {integrity: sha512-AhPuHs/qtYrKHUlEoNO6zCXufu8OgbR8S/n2oMw1OQuBQJ3+HOLQ+EpvXs+feOlZMa0p8QVvDWNlmcJJY8rW2g==} + '@vueuse/metadata@12.5.0': + resolution: {integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==} - '@vueuse/shared@12.4.0': - resolution: {integrity: sha512-9yLgbHVIF12OSCojnjTIoZL1+UA10+O4E1aD6Hpfo/DKVm5o3SZIwz6CupqGy3+IcKI8d6Jnl26EQj/YucnW0Q==} + '@vueuse/shared@12.5.0': + resolution: {integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==} acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} @@ -1152,8 +1152,8 @@ packages: add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - algoliasearch@5.19.0: - resolution: {integrity: sha512-zrLtGhC63z3sVLDDKGW+SlCRN9eJHFTgdEmoAOpsVh6wgGL1GgTTDou7tpCBjevzgIvi3AIyDAQO3Xjbg5eqZg==} + algoliasearch@5.20.0: + resolution: {integrity: sha512-groO71Fvi5SWpxjI9Ia+chy0QBwT61mg6yxJV27f5YFf+Mw+STT75K6SHySpP8Co5LsCrtsbCH5dJZSRtkSKaQ==} engines: {node: '>= 14.0.0'} alien-signals@0.4.14: @@ -1290,8 +1290,8 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} commander@6.2.1: @@ -1840,8 +1840,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@15.4.1: - resolution: {integrity: sha512-P8yJuVRyLrm5KxCtFx+gjI5Bil+wO7wnTl7C3bXhvtTaAFGirzeB24++D0wGoUwxrUKecNiehemgCob9YL39NA==} + lint-staged@15.4.2: + resolution: {integrity: sha512-gCqzB/Li281uZJgReNci+oXXqUEdrFAQAzTE/LwoxxiEuP41vozNe4BATS+4ehdqkWn+Z6bGc3EDcBja3npBVw==} engines: {node: '>=18.12.0'} hasBin: true @@ -2164,13 +2164,13 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-chromium@1.49.1: - resolution: {integrity: sha512-XAQDkZ1Eem1OONhfS8B2LM2mgHG/i5jIxooxjvqjbF/9GnLnRTJHdQamNjo1e4FZvt7J0BFD/15+qAcT0eKlfA==} + playwright-chromium@1.50.0: + resolution: {integrity: sha512-gyI1ATjSCn0kCHCV8lGS65h0tRSlJvdlwgvXwY5EyUHW+YLPnOtnMaCiNmHgrcVK8ofsXWq3alaUfnmirNzBlA==} engines: {node: '>=18'} hasBin: true - playwright-core@1.49.1: - resolution: {integrity: sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==} + playwright-core@1.50.0: + resolution: {integrity: sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ==} engines: {node: '>=18'} hasBin: true @@ -2629,8 +2629,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.0.3: - resolution: {integrity: sha512-0sQcwhwAEw/UJGojbhOrnq3HtiZ3tC7BzpAa0lx3QaTX0S3YX70iGcik25UBdB96pmdwjyY2uyKNYruxCDmiEg==} + vite-node@3.0.4: + resolution: {integrity: sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -2677,20 +2677,23 @@ packages: vitepress-plugin-group-icons@1.3.5: resolution: {integrity: sha512-1f1NP7osRYlNTR0yS5CAqcaasKHRSAzFKpeCUOfCPwYLAFxhCxsEbRtPBm0U1CfrDVa303MsjX18ngGpFGxIMA==} - vitest@3.0.3: - resolution: {integrity: sha512-dWdwTFUW9rcnL0LyF2F+IfvNQWB0w9DERySCk8VMG75F8k25C7LsZoh6XfCjPvcR8Nb+Lqi9JKr6vnzH7HSrpQ==} + vitest@3.0.4: + resolution: {integrity: sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.3 - '@vitest/ui': 3.0.3 + '@vitest/browser': 3.0.4 + '@vitest/ui': 3.0.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -2766,8 +2769,8 @@ packages: resolution: {integrity: sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==} engines: {node: '>=0.1'} - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} hasBin: true @@ -2783,109 +2786,109 @@ packages: snapshots: - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)': + '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)': + '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) - '@algolia/client-search': 5.19.0 - algoliasearch: 5.19.0 + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) + '@algolia/client-search': 5.20.0 + algoliasearch: 5.20.0 - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)': + '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': dependencies: - '@algolia/client-search': 5.19.0 - algoliasearch: 5.19.0 + '@algolia/client-search': 5.20.0 + algoliasearch: 5.20.0 - '@algolia/client-abtesting@5.19.0': + '@algolia/client-abtesting@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-analytics@5.19.0': + '@algolia/client-analytics@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-common@5.19.0': {} + '@algolia/client-common@5.20.0': {} - '@algolia/client-insights@5.19.0': + '@algolia/client-insights@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-personalization@5.19.0': + '@algolia/client-personalization@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-query-suggestions@5.19.0': + '@algolia/client-query-suggestions@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-search@5.19.0': + '@algolia/client-search@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/ingestion@1.19.0': + '@algolia/ingestion@1.20.0': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/monitoring@1.19.0': + '@algolia/monitoring@1.20.0': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/recommend@5.19.0': + '@algolia/recommend@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/requester-browser-xhr@5.19.0': + '@algolia/requester-browser-xhr@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 + '@algolia/client-common': 5.20.0 - '@algolia/requester-fetch@5.19.0': + '@algolia/requester-fetch@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 + '@algolia/client-common': 5.20.0 - '@algolia/requester-node-http@5.19.0': + '@algolia/requester-node-http@5.20.0': dependencies: - '@algolia/client-common': 5.19.0 + '@algolia/client-common': 5.20.0 '@antfu/install-pkg@0.4.1': dependencies: @@ -2939,9 +2942,9 @@ snapshots: '@docsearch/css@3.8.3': {} - '@docsearch/js@3.8.3(@algolia/client-search@5.19.0)': + '@docsearch/js@3.8.3(@algolia/client-search@5.20.0)': dependencies: - '@docsearch/react': 3.8.3(@algolia/client-search@5.19.0) + '@docsearch/react': 3.8.3(@algolia/client-search@5.20.0) preact: 10.25.4 transitivePeerDependencies: - '@algolia/client-search' @@ -2950,12 +2953,12 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.3(@algolia/client-search@5.19.0)': + '@docsearch/react@3.8.3(@algolia/client-search@5.20.0)': dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) + '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) + '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) '@docsearch/css': 3.8.3 - algoliasearch: 5.19.0 + algoliasearch: 5.20.0 transitivePeerDependencies: - '@algolia/client-search' @@ -3328,7 +3331,7 @@ snapshots: '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.9 '@types/debug@4.1.12': dependencies: @@ -3339,7 +3342,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.10.7 + '@types/node': 22.10.9 '@types/hast@3.0.4': dependencies: @@ -3351,7 +3354,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.9 '@types/linkify-it@5.0.0': {} @@ -3394,7 +3397,7 @@ snapshots: '@types/node@17.0.45': {} - '@types/node@22.10.7': + '@types/node@22.10.9': dependencies: undici-types: 6.20.0 @@ -3408,14 +3411,14 @@ snapshots: '@types/prompts@2.4.9': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.9 kleur: 3.0.3 '@types/resolve@1.20.2': {} '@types/sax@1.2.7': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.9 '@types/semver@7.5.8': {} @@ -3425,50 +3428,50 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@ungap/structured-clone@1.2.1': {} + '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@5.2.1(vite@6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1))(vue@3.5.13(typescript@5.7.3))': + '@vitejs/plugin-vue@5.2.1(vite@6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': dependencies: - vite: 6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1) + vite: 6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0) vue: 3.5.13(typescript@5.7.3) - '@vitest/expect@3.0.3': + '@vitest/expect@3.0.4': dependencies: - '@vitest/spy': 3.0.3 - '@vitest/utils': 3.0.3 + '@vitest/spy': 3.0.4 + '@vitest/utils': 3.0.4 chai: 5.1.2 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.3(vite@6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1))': + '@vitest/mocker@3.0.4(vite@6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0))': dependencies: - '@vitest/spy': 3.0.3 + '@vitest/spy': 3.0.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1) + vite: 6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0) - '@vitest/pretty-format@3.0.3': + '@vitest/pretty-format@3.0.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.3': + '@vitest/runner@3.0.4': dependencies: - '@vitest/utils': 3.0.3 + '@vitest/utils': 3.0.4 pathe: 2.0.2 - '@vitest/snapshot@3.0.3': + '@vitest/snapshot@3.0.4': dependencies: - '@vitest/pretty-format': 3.0.3 + '@vitest/pretty-format': 3.0.4 magic-string: 0.30.17 pathe: 2.0.2 - '@vitest/spy@3.0.3': + '@vitest/spy@3.0.4': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.0.3': + '@vitest/utils@3.0.4': dependencies: - '@vitest/pretty-format': 3.0.3 + '@vitest/pretty-format': 3.0.4 loupe: 3.1.2 tinyrainbow: 2.0.0 @@ -3574,19 +3577,19 @@ snapshots: '@vue/shared@3.5.13': {} - '@vueuse/core@12.4.0(typescript@5.7.3)': + '@vueuse/core@12.5.0(typescript@5.7.3)': dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 12.4.0 - '@vueuse/shared': 12.4.0(typescript@5.7.3) + '@vueuse/metadata': 12.5.0 + '@vueuse/shared': 12.5.0(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3) transitivePeerDependencies: - typescript - '@vueuse/integrations@12.4.0(axios@1.7.9(debug@4.4.0))(focus-trap@7.6.4)(typescript@5.7.3)': + '@vueuse/integrations@12.5.0(axios@1.7.9(debug@4.4.0))(focus-trap@7.6.4)(typescript@5.7.3)': dependencies: - '@vueuse/core': 12.4.0(typescript@5.7.3) - '@vueuse/shared': 12.4.0(typescript@5.7.3) + '@vueuse/core': 12.5.0(typescript@5.7.3) + '@vueuse/shared': 12.5.0(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3) optionalDependencies: axios: 1.7.9(debug@4.4.0) @@ -3594,9 +3597,9 @@ snapshots: transitivePeerDependencies: - typescript - '@vueuse/metadata@12.4.0': {} + '@vueuse/metadata@12.5.0': {} - '@vueuse/shared@12.4.0(typescript@5.7.3)': + '@vueuse/shared@12.5.0(typescript@5.7.3)': dependencies: vue: 3.5.13(typescript@5.7.3) transitivePeerDependencies: @@ -3606,21 +3609,21 @@ snapshots: add-stream@1.0.0: {} - algoliasearch@5.19.0: - dependencies: - '@algolia/client-abtesting': 5.19.0 - '@algolia/client-analytics': 5.19.0 - '@algolia/client-common': 5.19.0 - '@algolia/client-insights': 5.19.0 - '@algolia/client-personalization': 5.19.0 - '@algolia/client-query-suggestions': 5.19.0 - '@algolia/client-search': 5.19.0 - '@algolia/ingestion': 1.19.0 - '@algolia/monitoring': 1.19.0 - '@algolia/recommend': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + algoliasearch@5.20.0: + dependencies: + '@algolia/client-abtesting': 5.20.0 + '@algolia/client-analytics': 5.20.0 + '@algolia/client-common': 5.20.0 + '@algolia/client-insights': 5.20.0 + '@algolia/client-personalization': 5.20.0 + '@algolia/client-query-suggestions': 5.20.0 + '@algolia/client-search': 5.20.0 + '@algolia/ingestion': 1.20.0 + '@algolia/monitoring': 1.20.0 + '@algolia/recommend': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 alien-signals@0.4.14: {} @@ -3747,7 +3750,7 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@12.1.0: {} + commander@13.1.0: {} commander@6.2.1: {} @@ -4305,10 +4308,10 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@15.4.1: + lint-staged@15.4.2: dependencies: chalk: 5.4.1 - commander: 12.1.0 + commander: 13.1.0 debug: 4.4.0 execa: 8.0.1 lilconfig: 3.1.3 @@ -4316,7 +4319,7 @@ snapshots: micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.6.1 + yaml: 2.7.0 transitivePeerDependencies: - supports-color @@ -4412,7 +4415,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.1 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -4630,11 +4633,11 @@ snapshots: mlly: 1.7.4 pathe: 2.0.2 - playwright-chromium@1.49.1: + playwright-chromium@1.50.0: dependencies: - playwright-core: 1.49.1 + playwright-core: 1.50.0 - playwright-core@1.49.1: {} + playwright-core@1.50.0: {} polka@1.0.0-next.28: dependencies: @@ -5089,13 +5092,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.3(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1): + vite-node@3.0.4(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.2 - vite: 6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1) + vite: 6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -5110,16 +5113,16 @@ snapshots: - tsx - yaml - vite@6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1): + vite@6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0): dependencies: esbuild: 0.24.2 postcss: 8.5.1 rollup: 4.31.0 optionalDependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.9 fsevents: 2.3.3 jiti: 1.21.7 - yaml: 2.6.1 + yaml: 2.7.0 vitepress-plugin-group-icons@1.3.5: dependencies: @@ -5129,15 +5132,15 @@ snapshots: transitivePeerDependencies: - supports-color - vitest@3.0.3(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1): + vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0): dependencies: - '@vitest/expect': 3.0.3 - '@vitest/mocker': 3.0.3(vite@6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1)) - '@vitest/pretty-format': 3.0.3 - '@vitest/runner': 3.0.3 - '@vitest/snapshot': 3.0.3 - '@vitest/spy': 3.0.3 - '@vitest/utils': 3.0.3 + '@vitest/expect': 3.0.4 + '@vitest/mocker': 3.0.4(vite@6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0)) + '@vitest/pretty-format': 3.0.4 + '@vitest/runner': 3.0.4 + '@vitest/snapshot': 3.0.4 + '@vitest/spy': 3.0.4 + '@vitest/utils': 3.0.4 chai: 5.1.2 debug: 4.4.0 expect-type: 1.1.0 @@ -5148,11 +5151,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.0.11(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1) - vite-node: 3.0.3(@types/node@22.10.7)(jiti@1.21.7)(yaml@2.6.1) + vite: 6.0.11(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0) + vite-node: 3.0.4(@types/node@22.10.9)(jiti@1.21.7)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.10.7 + '@types/debug': 4.1.12 + '@types/node': 22.10.9 transitivePeerDependencies: - jiti - less @@ -5246,7 +5250,7 @@ snapshots: xmldom-sre@0.1.31: {} - yaml@2.6.1: {} + yaml@2.7.0: {} yoctocolors@2.1.1: {} From 74a0222f9a3d66f5942ed84a5cae4f0265a5160f Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 23 Jan 2025 21:22:30 +0530 Subject: [PATCH 3/3] release: v2.0.0-alpha.2 --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99edf822..7d630958 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## [2.0.0-alpha.2](https://github.com/vuejs/vitepress/compare/v2.0.0-alpha.1...v2.0.0-alpha.2) (2025-01-23) + +### Bug Fixes + +- fix docsearch navigation and rendering ([e035027](https://github.com/vuejs/vitepress/commit/e0350275b39258a61ee867840ce1c6f5b2cecf2a)) +- **types:** support preload built-in shiki languages as string ([#4513](https://github.com/vuejs/vitepress/issues/4513)) ([4f77b4f](https://github.com/vuejs/vitepress/commit/4f77b4fdfdbe945e482348a57731bff5fb4672fc)) + +### Features + +- allow `markdown.config` and `markdown.preConfig` to accept async function ([#4512](https://github.com/vuejs/vitepress/issues/4512)) ([b88ae8d](https://github.com/vuejs/vitepress/commit/b88ae8d4a11a20104b2007c2631eb7aeb123d965)) +- support same page navigation in `router.go` and expose decoded hash and query from the `route` object ([#4511](https://github.com/vuejs/vitepress/issues/4511)) ([23d3281](https://github.com/vuejs/vitepress/commit/23d3281ed6f1111ab15708ca1fd86202674f8ef7)) + ## [2.0.0-alpha.1](https://github.com/vuejs/vitepress/compare/v1.6.2...v2.0.0-alpha.1) (2025-01-22) ### Features diff --git a/package.json b/package.json index 30e2d00b..6f99adac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vitepress", - "version": "2.0.0-alpha.1", + "version": "2.0.0-alpha.2", "description": "Vite & Vue powered static site generator", "keywords": [ "vite",