diff --git a/.github/contributing.md b/.github/contributing.md index c2f14f4ae..d0780384b 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -23,7 +23,7 @@ Hi! We're really excited that you are interested in contributing to VitePress. B ## Development Setup -You will need [Node.js](https://nodejs.org) v20 or higher and [pnpm](https://pnpm.io). +You will need [Node.js](https://nodejs.org) v22.22.1 or higher and [pnpm](https://pnpm.io). After cloning the repo, run: diff --git a/CHANGELOG.md b/CHANGELOG.md index f150ae780..dc6adb3fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,47 @@ +## [2.0.0-alpha.20](https://github.com/vuejs/vitepress/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2026-09-04) + +### Bug Fixes + +- harden eager frontmatter interpolation ([#5413](https://github.com/vuejs/vitepress/issues/5413)) ([09f9672](https://github.com/vuejs/vitepress/commit/09f9672ee108578808f793bb57e306bc92dff7bc)) +- key head entries by id and ignore meta content when deduping ([b18f306](https://github.com/vuejs/vitepress/commit/b18f30680b9bced83abd6eacb9417701298cb309)), closes [#5362](https://github.com/vuejs/vitepress/issues/5362) [#5363](https://github.com/vuejs/vitepress/issues/5363) [#5379](https://github.com/vuejs/vitepress/issues/5379) +- **search:** respect per-locale markdown options ([#5351](https://github.com/vuejs/vitepress/issues/5351)) ([27c4a1a](https://github.com/vuejs/vitepress/commit/27c4a1a2a3a098a00e332a5db26f3d2d79aa319a)) +- serialize config functions as code, not strings revived via new Function (close [#3685](https://github.com/vuejs/vitepress/issues/3685)) ([d3b2957](https://github.com/vuejs/vitepress/commit/d3b2957db000772a408943d01382650821ce0950)) +- **theme/regression:** fix misaligned external link icon ([2be52f0](https://github.com/vuejs/vitepress/commit/2be52f0657efb6e7e061cf29261158bd99f7ff86)) +- **theme:** adjust z-index for VPNavBar and simplify VPNavScreen styles ([#5374](https://github.com/vuejs/vitepress/issues/5374)) ([35cf647](https://github.com/vuejs/vitepress/commit/35cf6470d36bfea5f7c53de251382a19275f72a9)) +- **theme:** cover the external link icon's paint box with its mask ([39b8f9f](https://github.com/vuejs/vitepress/commit/39b8f9f00140cc3f4a60c9e1ffb0c142de5ea089)) +- **theme:** drop the -webkit-backdrop-filter fallbacks ([a2a0a92](https://github.com/vuejs/vitepress/commit/a2a0a923e5f468af1bb81023347c61513d6c408a)) +- **theme:** fix menu dropdown group dividers ([#5365](https://github.com/vuejs/vitepress/issues/5365)) ([49c84f5](https://github.com/vuejs/vitepress/commit/49c84f570a933a2b5a95411bfd419b7369ab02a7)) +- **theme:** fix nav screen and divider appearance ([#5369](https://github.com/vuejs/vitepress/issues/5369)) ([a0401ee](https://github.com/vuejs/vitepress/commit/a0401eed4b6aa70fcab7c2c9a2d2aeaa674f59bd)) +- **theme:** fix social links spacing in dropdown ([#5370](https://github.com/vuejs/vitepress/issues/5370)) ([cb636b2](https://github.com/vuejs/vitepress/commit/cb636b241075296910237d6c067cba8a9052683e)) +- **theme:** handle outline bottom overscroll ([#5375](https://github.com/vuejs/vitepress/issues/5375)) ([3fe901d](https://github.com/vuejs/vitepress/commit/3fe901dea973ce3b24c1f3d38f313ab40466357e)) +- **theme:** keep search beside the title without a nav menu ([14f4f09](https://github.com/vuejs/vitepress/commit/14f4f09d32a5325a33629b5911c714d44882a726)) +- **theme:** keep the search keycap glyphs out of the DOM text ([60f656b](https://github.com/vuejs/vitepress/commit/60f656b0ec46a4bbe61f877036385ec3af64a9ff)), closes [#5401](https://github.com/vuejs/vitepress/issues/5401) +- **theme:** mark current navigation links ([#5395](https://github.com/vuejs/vitepress/issues/5395)) ([0f0fe13](https://github.com/vuejs/vitepress/commit/0f0fe135762489f1a6c73348bd8b0a86db969248)) +- **theme:** paint the navbar divider on its own layer ([9bebd09](https://github.com/vuejs/vitepress/commit/9bebd092ebad1818e31cac8e86e5b03704554995)), closes [#5399](https://github.com/vuejs/vitepress/issues/5399) +- **theme:** prevent layout shifts when locking page scroll ([310679a](https://github.com/vuejs/vitepress/commit/310679a76c43b429dbe8b7127dc7e6bb3ec50569)), closes [#5386](https://github.com/vuejs/vitepress/issues/5386) +- **theme:** prevent scroll chaining in local nav outline dropdown ([#5367](https://github.com/vuejs/vitepress/issues/5367)) ([0a96bae](https://github.com/vuejs/vitepress/commit/0a96bae50b907b70a3cd712f98514ce77086496a)) +- **theme:** remove extra margins from first and last paragraph inside a list element ([8dbd782](https://github.com/vuejs/vitepress/commit/8dbd782c752ed510a11c04527bed974c122e8133)), closes [#5353](https://github.com/vuejs/vitepress/issues/5353) +- **theme:** render sidebar active state during ssr ([005aa5c](https://github.com/vuejs/vitepress/commit/005aa5c3e88d5d6a455bcc20b4c4e6f2c3a1abe9)) +- **theme:** render sidebar group toggles as native buttons ([ed2bfb2](https://github.com/vuejs/vitepress/commit/ed2bfb266ef788e86d1a73fe3cd7708a4cd5e260)), closes [#5366](https://github.com/vuejs/vitepress/issues/5366) [#5371](https://github.com/vuejs/vitepress/issues/5371) +- **theme:** rendering of sponsor and team components inside vp-doc containers ([#4493](https://github.com/vuejs/vitepress/issues/4493)) ([b7602df](https://github.com/vuejs/vitepress/commit/b7602df1cdee75d0814cf3f131b4906a31841851)) +- **theme:** treat negative scrollY as top ([#5368](https://github.com/vuejs/vitepress/issues/5368)) ([9d521db](https://github.com/vuejs/vitepress/commit/9d521db8671a53d5a5f23baf5226879ce2d25960)) +- **theme:** use a getter as VPSidebar's open watch source ([9aeeb4f](https://github.com/vuejs/vitepress/commit/9aeeb4fa31396040b6014af2b45111a05751547d)) +- **theme:** use relative length units to auto-close nav screen menu ([#5387](https://github.com/vuejs/vitepress/issues/5387)) ([c197979](https://github.com/vuejs/vitepress/commit/c1979799936f68443f150122d427fb26ff30e9ae)) + +### Features + +- **cli:** make shortcuts case-insensitive ([#5378](https://github.com/vuejs/vitepress/issues/5378)) ([4ffcdae](https://github.com/vuejs/vitepress/commit/4ffcdae825b7534c24bc9ab4473849c0b8d72669)) +- hashed icon styles, offline dev icons, arbitrary iconify collections ([#5407](https://github.com/vuejs/vitepress/issues/5407)) ([d00a5e0](https://github.com/vuejs/vitepress/commit/d00a5e0f8778923d7ef6adf97b5671e9d0f86be6)) +- relative base (`./`) and `assetsBase` (CDN prefix) ([#5406](https://github.com/vuejs/vitepress/issues/5406)) ([feadd9f](https://github.com/vuejs/vitepress/commit/feadd9fcc1519d52a74940f8cd15a71ffcc25fe8)) +- resolve `$frontmatter` expressions while rendering markdown ([#5412](https://github.com/vuejs/vitepress/issues/5412)) ([a1eb284](https://github.com/vuejs/vitepress/commit/a1eb28496e67f881fc50da776c11aa45a73c4f40)) +- **ssr:** enable `throwUnhandledErrorInProduction` ([#5419](https://github.com/vuejs/vitepress/issues/5419)) ([a6573ff](https://github.com/vuejs/vitepress/commit/a6573ff60c4b85d5473ea3903b223f8f1ee9f412)) +- **theme:** add --vp-local-nav-divider-color ([110209d](https://github.com/vuejs/vitepress/commit/110209dd32bd7b828abccfb773ae2207f36c1147)) +- **theme:** add opt-in severity-based colors for containers, alerts, and badges ([#5373](https://github.com/vuejs/vitepress/issues/5373)) ([45cb85e](https://github.com/vuejs/vitepress/commit/45cb85e5104346422e82f9cae96b0ce0afc690d8)) +- **theme:** redesign the navbar ([#5397](https://github.com/vuejs/vitepress/issues/5397)) ([26b76d6](https://github.com/vuejs/vitepress/commit/26b76d6d9e8fd3ae368c7a1e8ad6698cdeb73e7a)) +- **theme:** scroll toc if active item is out of view ([#5377](https://github.com/vuejs/vitepress/issues/5377)) ([72534af](https://github.com/vuejs/vitepress/commit/72534af30ebe25cfedf7c3ca6d7f9fbfbbaa487f)) +- **theme:** un-deprecate Theme.setup and compose it across extends ([#5404](https://github.com/vuejs/vitepress/issues/5404)) ([ebbd48c](https://github.com/vuejs/vitepress/commit/ebbd48c8c76a1f794ed52d8d4d9917f1bd52bea0)) +- **theme:** use relative length units ([#5323](https://github.com/vuejs/vitepress/issues/5323)) ([2a91caa](https://github.com/vuejs/vitepress/commit/2a91caa78e62227764e8714574b8367e0610e8ee)) + ## [2.0.0-alpha.19](https://github.com/vuejs/vitepress/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2026-08-02) ### Bug Fixes diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index b5d9863b7..a866f86da 100644 --- a/THIRD-PARTY-NOTICES.md +++ b/THIRD-PARTY-NOTICES.md @@ -6,7 +6,7 @@ VitePress is published under the MIT license (see LICENSE). The published vitepr License: MIT By: Anthony Fu -Repository: https://github.com/antfu/install-pkg +Repository: https://github.com/antfu-collective/install-pkg > MIT License > diff --git a/__tests__/base/fixture/.vitepress/config.ts b/__tests__/base/fixture/.vitepress/config.ts index f135dd338..88b911af9 100644 --- a/__tests__/base/fixture/.vitepress/config.ts +++ b/__tests__/base/fixture/.vitepress/config.ts @@ -5,10 +5,11 @@ const mode = process.env.VP_TEST_MODE || 'relative' export default defineConfig({ title: 'Base Fixture', description: 'Fixture site for base/assetsBase behavior', - base: mode === 'plain' || mode === 'cdn' ? '/' : './', + base: ['plain', 'cdn', 'sharded'].includes(mode) ? '/' : './', assetsBase: mode === 'cdn' ? `http://localhost:${process.env.VP_CDN_PORT}/` : undefined, mpa: mode === 'mpa', + assetsShards: mode === 'sharded' ? 3 : undefined, outDir: `.vitepress/dist-${mode}`, cleanUrls: false, rewrites: { 'src-moved.md': 'moved/target.md' }, diff --git a/__tests__/base/sharded.test.ts b/__tests__/base/sharded.test.ts new file mode 100644 index 000000000..056cea95c --- /dev/null +++ b/__tests__/base/sharded.test.ts @@ -0,0 +1,119 @@ +import { readFileSync, readdirSync } from 'node:fs' +import { join, resolve, sep } from 'node:path' +import { fileURLToPath } from 'node:url' + +import { newPage, realErrors, waitForHydration, type TestPage } from './helpers' + +const dir = resolve(fileURLToPath(import.meta.url), '..') +const dist = (...p: string[]) => + join(dir, 'fixture/.vitepress/dist-sharded', ...p) +const origin = () => `http://localhost:${process.env['SHARDED_PORT']}` + +// output-relative paths of everything under assets/ +const files = () => + readdirSync(dist('assets'), { recursive: true, withFileTypes: true }) + .filter((e) => e.isFile()) + .map((e) => + join(e.parentPath, e.name) + .slice(dist('assets').length + 1) + .split(sep) + .join('/') + ) + +const isShardedPath = (f: string) => /^[0-2]\/[^/]+$/.test(f) + +describe('assetsShards emit', () => { + test('page chunks land in numbered subdirectories', () => { + const pages = files().filter((f) => /\.md\.[\w-]+(\.lean)?\.js$/.test(f)) + expect(pages.length).toBeGreaterThan(0) + expect(pages.every(isShardedPath)).toBe(true) + }) + + test('imported assets are sharded too, shared chunks and the app are not', () => { + const all = files() + const assets = all.filter( + (f) => /\.(png|woff2|css)$/.test(f) && !/^vp-icons\./.test(f) + ) + expect(assets.length).toBeGreaterThan(0) + expect(assets.every(isShardedPath)).toBe(true) + expect(all.some((f) => /^chunks\/framework\.[\w-]+\.js$/.test(f))).toBe( + true + ) + expect(all.some((f) => /^app\.[\w-]+\.js$/.test(f))).toBe(true) + }) + + test('hash map entries carry the shard and resolve to real files', () => { + const map: Record = JSON.parse( + readFileSync(dist('hashmap.json'), 'utf-8') + ) + // hash map keys are lowercased page names, file names keep their case + const lower = new Set(files().map((f) => f.toLowerCase())) + expect(Object.keys(map).length).toBeGreaterThan(0) + for (const [page, entry] of Object.entries(map)) { + expect(entry).toMatch(/^[0-2]\/[\w-]+$/) + const [shard, hash] = entry.split('/') + const chunk = `${shard}/${page}.${hash}`.toLowerCase() + expect(lower.has(`${chunk}.js`)).toBe(true) + expect(lower.has(`${chunk}.lean.js`)).toBe(true) + } + }) + + test('preload links point at files that exist', () => { + const existing = new Set(files().map((f) => `assets/${f}`)) + for (const page of [ + 'index', + 'sub/page', + 'sub/deep/page2', + 'moved/target' + ]) { + const links = [ + ...readFileSync(dist(`${page}.html`), 'utf-8').matchAll( + //g + ) + ].map((m) => m[1]!) + expect(links.some((l) => l.includes('.md.'))).toBe(true) + for (const link of links) expect(existing.has(link)).toBe(true) + } + }) +}) + +describe('assetsShards in the browser', () => { + let t: TestPage + + beforeAll(async () => { + t = await newPage() + }) + + afterAll(async () => { + await t.page.close() + await t.browser.close() + }) + + test('pages hydrate with sharded chunks', async () => { + await t.page.goto(`${origin()}/`) + await waitForHydration(t.page) + expect(await t.page.textContent('h1')).toContain('Home') + }) + + test('client-side navigation loads page chunks from their shard', async () => { + await t.page.evaluate(() => ((window as any).__spa_marker = 1)) + await t.page.click('.vp-doc a[href="/sub/page.html"]') + await t.page.waitForFunction(() => + document.querySelector('h1')?.textContent?.includes('Sub page') + ) + expect( + await t.page.evaluate(() => (window as any).__spa_marker === 1) + ).toBe(true) + const chunk = await t.page.evaluate(() => + performance + .getEntriesByType('resource') + .map((r) => r.name) + .find((n) => /\/assets\/\d+\/sub_page\.md\.[\w-]+\.js$/.test(n)) + ) + expect(chunk).toBeDefined() + }) + + test('no console or page errors across the whole flow', () => { + expect(realErrors(t.errors)).toEqual([]) + }) +}) diff --git a/__tests__/base/vitestGlobalSetup.ts b/__tests__/base/vitestGlobalSetup.ts index 62953c6d6..8c566c66f 100644 --- a/__tests__/base/vitestGlobalSetup.ts +++ b/__tests__/base/vitestGlobalSetup.ts @@ -64,7 +64,7 @@ export async function setup() { // one process per flavor: the markdown renderer is a module-level // singleton, so in-process builds would leak the first base into the rest - for (const mode of ['plain', 'relative', 'cdn', 'mpa']) { + for (const mode of ['plain', 'relative', 'cdn', 'mpa', 'sharded']) { // mpa builds never empty outDir, so stale assets would survive reruns await rm(dist(mode), { recursive: true, force: true }) const res = spawnSync(process.execPath, [bin, 'build', 'fixture'], { @@ -91,7 +91,8 @@ export async function setup() { false ), await serveStatic([['/', dist('cdn')]], false), - cdnServer + cdnServer, + await serveStatic([['/', dist('sharded')]], false) ] browserServer = await chromium.launchServer({ @@ -105,6 +106,7 @@ export async function setup() { process.env['SUB_PORT'] = String(portOf(servers[0]!)) process.env['PAGES_PORT'] = String(portOf(servers[1]!)) process.env['VP_CDN_PORT'] = String(cdnPort) + process.env['SHARDED_PORT'] = String(portOf(servers[3]!)) } export async function teardown() { diff --git a/__tests__/e2e/external-data/files.data.ts b/__tests__/e2e/external-data/files.data.ts new file mode 100644 index 000000000..8bd57ee9b --- /dev/null +++ b/__tests__/e2e/external-data/files.data.ts @@ -0,0 +1,10 @@ +import { readFile } from 'node:fs/promises' + +export default { + watch: '../../fixtures/external-data/**/*.json', + async load(files: string[]) { + return Promise.all( + files.map(async (file) => JSON.parse(await readFile(file, 'utf-8'))) + ) + } +} diff --git a/__tests__/e2e/external-data/index.md b/__tests__/e2e/external-data/index.md new file mode 100644 index 000000000..f67a1d8d0 --- /dev/null +++ b/__tests__/e2e/external-data/index.md @@ -0,0 +1,7 @@ + + +# External data + +
{{ JSON.stringify(data) }}
diff --git a/__tests__/e2e/external-data/index.test.ts b/__tests__/e2e/external-data/index.test.ts new file mode 100644 index 000000000..ccd9ba6bd --- /dev/null +++ b/__tests__/e2e/external-data/index.test.ts @@ -0,0 +1,45 @@ +import { mkdir, readFile, rm, writeFile } from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +test('loads data outside the site root', async () => { + await goto('/external-data/') + expect(await page.textContent('pre#external-data')).toBe('[{"a":true}]') +}) + +test.runIf(!process.env.VITE_TEST_BUILD)( + 'updates external data when files change, are added, or are deleted', + async () => { + await goto('/external-data/') + const a = fileURLToPath( + new URL('../../fixtures/external-data/a.json', import.meta.url) + ) + const nested = fileURLToPath( + new URL('../../fixtures/external-data/nested/', import.meta.url) + ) + const original = await readFile(a, 'utf-8') + + async function expectData(data: unknown) { + await page.waitForFunction( + (expected) => + document.querySelector('pre#external-data')?.textContent === expected, + JSON.stringify(data) + ) + } + + try { + await writeFile(a, '{"a":false}\n') + await expectData([{ a: false }]) + + await mkdir(nested) + await writeFile(path.join(nested, 'b.json'), '{"b":true}\n') + await expectData([{ a: false }, { b: true }]) + + await rm(nested, { recursive: true }) + await expectData([{ a: false }]) + } finally { + await rm(nested, { recursive: true, force: true }) + await writeFile(a, original) + } + } +) diff --git a/__tests__/e2e/navbar/navbar.test.ts b/__tests__/e2e/navbar/navbar.test.ts new file mode 100644 index 000000000..5cad88fc8 --- /dev/null +++ b/__tests__/e2e/navbar/navbar.test.ts @@ -0,0 +1,30 @@ +describe('navbar layout', () => { + test.each([959, 960, 1440])( + 'reserves space beside the title only for a visible sidebar at %ipx', + async (width) => { + await page.setViewportSize({ width, height: 720 }) + + const searchOffset = async (path: string) => { + await goto(path) + await page.evaluate(() => document.fonts.ready) + + const title = await page.locator('.VPNavBarTitle').boundingBox() + const search = await page.locator('.VPNavBarSearch').boundingBox() + return search!.x - title!.x + } + + const homeOffset = await searchOffset('/') + + for (const path of ['/navbar/no-sidebar', '/missing-page']) { + expect(await searchOffset(path)).toBeCloseTo(homeOffset, 0) + } + + const sidebarOffset = await searchOffset('/home') + if (width >= 960) { + expect(sidebarOffset).toBeGreaterThan(homeOffset) + } else { + expect(sidebarOffset).toBeCloseTo(homeOffset, 0) + } + } + ) +}) diff --git a/__tests__/e2e/navbar/no-sidebar.md b/__tests__/e2e/navbar/no-sidebar.md new file mode 100644 index 000000000..bb2727373 --- /dev/null +++ b/__tests__/e2e/navbar/no-sidebar.md @@ -0,0 +1,7 @@ +--- +sidebar: false +--- + +# Page without a sidebar + +The navigation title should keep its natural width when the sidebar is hidden. diff --git a/__tests__/e2e/package.json b/__tests__/e2e/package.json index db6f261de..ba7c7cb34 100644 --- a/__tests__/e2e/package.json +++ b/__tests__/e2e/package.json @@ -10,7 +10,7 @@ "site:preview": "vitepress preview" }, "devDependencies": { - "@iconify-json/lucide": "^1.2.126", + "@iconify-json/lucide": "^1.2.131", "vitepress": "workspace:*" } } diff --git a/__tests__/e2e/prefetch/html.md b/__tests__/e2e/prefetch/html.md new file mode 100644 index 000000000..6a41c3bb2 --- /dev/null +++ b/__tests__/e2e/prefetch/html.md @@ -0,0 +1 @@ +# HTML link destination diff --git a/__tests__/e2e/prefetch/index.md b/__tests__/e2e/prefetch/index.md new file mode 100644 index 000000000..31582a370 --- /dev/null +++ b/__tests__/e2e/prefetch/index.md @@ -0,0 +1,15 @@ +--- +sidebar: false +outline: false +--- + +# Link prefetching + + + SVG link + Same page, another hash + SVG xlink + New tab + + +[HTML link](./html.md) diff --git a/__tests__/e2e/prefetch/new-tab.md b/__tests__/e2e/prefetch/new-tab.md new file mode 100644 index 000000000..6a35f9657 --- /dev/null +++ b/__tests__/e2e/prefetch/new-tab.md @@ -0,0 +1 @@ +# New tab destination diff --git a/__tests__/e2e/prefetch/prefetch.test.ts b/__tests__/e2e/prefetch/prefetch.test.ts new file mode 100644 index 000000000..1a6e7ec9e --- /dev/null +++ b/__tests__/e2e/prefetch/prefetch.test.ts @@ -0,0 +1,43 @@ +test.runIf(process.env.VITE_TEST_BUILD)( + 'prefetches SVG links without errors and respects new-tab targets', + async () => { + const errors: string[] = [] + const onPageError = (error: Error) => errors.push(error.message) + page.on('pageerror', onPageError) + + try { + await goto('/prefetch/') + + await expect + .poll( + async () => ({ + errors, + pages: await page + .locator('link[rel="prefetch"]') + .evaluateAll((links) => + links + .map( + (link) => + link + .getAttribute('href') + ?.match(/prefetch_(.*?)\.md\./)?.[1] + ) + .filter(Boolean) + .sort() + ) + }), + { timeout: 10_000 } + ) + .toEqual({ errors: [], pages: ['html', 'svg', 'xlink'] }) + + await page.locator('svg a[href="./svg.html"]').click() + await page.waitForSelector('h1', { state: 'visible' }) + await expect + .poll(() => page.locator('h1').textContent()) + .toContain('SVG link destination') + expect(errors).toEqual([]) + } finally { + page.off('pageerror', onPageError) + } + } +) diff --git a/__tests__/e2e/prefetch/svg.md b/__tests__/e2e/prefetch/svg.md new file mode 100644 index 000000000..c3eeda434 --- /dev/null +++ b/__tests__/e2e/prefetch/svg.md @@ -0,0 +1,3 @@ +# SVG link destination + +## Section diff --git a/__tests__/e2e/prefetch/xlink.md b/__tests__/e2e/prefetch/xlink.md new file mode 100644 index 000000000..86a76f59c --- /dev/null +++ b/__tests__/e2e/prefetch/xlink.md @@ -0,0 +1 @@ +# SVG xlink destination diff --git a/__tests__/e2e/rtl/index.md b/__tests__/e2e/rtl/index.md new file mode 100644 index 000000000..6b6cdfe68 --- /dev/null +++ b/__tests__/e2e/rtl/index.md @@ -0,0 +1,53 @@ +--- +dir: rtl +--- + +# RTL Page + +با `--flag` اجرا کنید و `useData()` را بخوانید. این یک [پیوند بیرونی](https://vitepress.dev/) است. + +## Section One + +```js:line-numbers +const a = 1 +``` + +> A blockquote keeps its bar on the reading side. + +| Column | Value | +| ------ | ----- | +| a | 1 | + +Filler paragraph one. Filler paragraph one. Filler paragraph one. Filler paragraph one. + +Filler paragraph two. Filler paragraph two. Filler paragraph two. Filler paragraph two. + +Filler paragraph three. Filler paragraph three. Filler paragraph three. Filler paragraph three. + +Filler paragraph four. Filler paragraph four. Filler paragraph four. Filler paragraph four. + +Filler paragraph five. Filler paragraph five. Filler paragraph five. Filler paragraph five. + +Filler paragraph six. Filler paragraph six. Filler paragraph six. Filler paragraph six. + +Filler paragraph seven. Filler paragraph seven. Filler paragraph seven. Filler paragraph seven. + +Filler paragraph eight. Filler paragraph eight. Filler paragraph eight. Filler paragraph eight. + +## Section Two + +Filler paragraph nine. Filler paragraph nine. Filler paragraph nine. Filler paragraph nine. + +Filler paragraph ten. Filler paragraph ten. Filler paragraph ten. Filler paragraph ten. + +Filler paragraph eleven. Filler paragraph eleven. Filler paragraph eleven. Filler paragraph eleven. + +Filler paragraph twelve. Filler paragraph twelve. Filler paragraph twelve. Filler paragraph twelve. + +Filler paragraph thirteen. Filler paragraph thirteen. Filler paragraph thirteen. Filler paragraph thirteen. + +Filler paragraph fourteen. Filler paragraph fourteen. Filler paragraph fourteen. Filler paragraph fourteen. + +Filler paragraph fifteen. Filler paragraph fifteen. Filler paragraph fifteen. Filler paragraph fifteen. + +Filler paragraph sixteen. Filler paragraph sixteen. Filler paragraph sixteen. Filler paragraph sixteen. diff --git a/__tests__/e2e/rtl/index.test.ts b/__tests__/e2e/rtl/index.test.ts new file mode 100644 index 000000000..6f30a8896 --- /dev/null +++ b/__tests__/e2e/rtl/index.test.ts @@ -0,0 +1,154 @@ +const box = (selector: string) => + page + .locator(selector) + .first() + .evaluate((el) => { + const { x, y, width, height } = el.getBoundingClientRect() + return { x, y, width, height, right: x + width, bottom: y + height } + }) + +// screen positions of the first and last characters of an element's text, +// which is how the bidi algorithm's reordering shows up +const glyphEnds = (selector: string) => + page + .locator(selector) + .first() + .evaluate((el) => { + const node = el.firstChild as Text + const range = document.createRange() + range.setStart(node, 0) + range.setEnd(node, 1) + const first = range.getBoundingClientRect().x + range.setStart(node, node.length - 1) + range.setEnd(node, node.length) + const last = range.getBoundingClientRect().x + return { first, last } + }) + +// scrolls a heading into view until the outline marks it active. The scroll +// is re-issued on every check, so a lost scroll event or a dev-server reload +// triggered by another spec cannot leave the wait hanging (seen on Windows CI) +const activateHeading = (id: string) => + page.waitForFunction((id) => { + if (document.querySelector(`.outline-link.active[href="#${id}"]`)) { + return true + } + document.getElementById(id)?.scrollIntoView() + return false + }, id) + +describe('rtl', () => { + beforeAll(async () => { + await goto('/rtl/') + }) + + afterAll(async () => { + await page.setViewportSize({ width: 1280, height: 720 }) + }) + + test('sets the direction on the html element', async () => { + expect(await page.getAttribute('html', 'dir')).toBe('rtl') + if (process.env['VITE_TEST_BUILD']) { + const html = await (await page.request.get(page.url())).text() + expect(html).toContain('') + } + }) + + test('lays the page out from the right', async () => { + const width = await page.evaluate(() => innerWidth) + const sidebar = await box('.VPSidebar') + expect(sidebar.right).toBeGreaterThan(width - 1) + expect(sidebar.x).toBeGreaterThan(width / 2) + + const heading = await box('.vp-doc h1') + const title = await glyphEnds('.vp-doc h1') + expect(title.last).toBeGreaterThan(heading.x + heading.width / 2) + + const anchor = await box('.vp-doc h2 .header-anchor') + const h2 = await box('.vp-doc h2') + expect(anchor.x).toBeGreaterThan(h2.x + h2.width / 2) + }) + + test('keeps the outline marker on the reading side and moving', async () => { + const outline = await box('.VPDocAsideOutline .content') + await activateHeading('section-one') + const before = await box('.outline-marker') + expect(before.x).toBeGreaterThan(outline.x + outline.width / 2) + + await activateHeading('section-two') + const after = await box('.outline-marker') + expect(after.y).toBeGreaterThan(before.y) + expect(Math.abs(after.x - before.x)).toBeLessThan(1) + }) + + test('mirrors the sidebar caret when a group collapses', async () => { + const group = page.locator('.VPSidebarItem.level-0.collapsible').first() + await group.locator('.caret').first().click() + expect( + await group.evaluate((el) => el.classList.contains('collapsed')) + ).toBe(true) + expect( + await group + .locator('.caret-icon') + .first() + .evaluate((el) => getComputedStyle(el).scale) + ).toBe('-1 1') + await group.locator('.caret').first().click() + }) + + test('keeps code left-to-right', async () => { + const wrapper = page.locator('.vp-doc div[class*="language-"]').first() + expect(await wrapper.getAttribute('dir')).toBe('ltr') + expect( + await wrapper + .locator('pre') + .evaluate((el) => getComputedStyle(el).direction) + ).toBe('ltr') + + const block = await box('.vp-doc div[class*="language-"]') + const copy = await box('.vp-doc div[class*="language-"] > button.copy') + const gutter = await box( + '.vp-doc div[class*="language-"] > .line-numbers-wrapper' + ) + expect(copy.x).toBeGreaterThan(block.x + block.width / 2) + expect(gutter.right).toBeLessThan(block.x + block.width / 2) + + const flag = await glyphEnds('.vp-doc p code') + expect(flag.first).toBeLessThan(flag.last) + }) + + test('mirrors the external link icon', async () => { + const mask = await page + .locator('.vp-doc a[href^="https://"]') + .first() + .evaluate((el) => { + const style = getComputedStyle(el, '::after') + return style.maskImage || style.webkitMaskImage + }) + expect(mask).toContain('matrix(-1 0 0 1 24 0)') + }) + + test('slides the mobile sidebar in from the right', async () => { + await page.setViewportSize({ width: 375, height: 812 }) + await goto('/rtl/') + const viewport = await page.evaluate( + () => document.documentElement.clientWidth + ) + const closed = await box('.VPSidebar') + expect(closed.x).toBeGreaterThanOrEqual(viewport - 1) + + // open the sidebar and wait for its slide-in to settle against the right + // edge, reopening it if a reload closed it meanwhile (see activateHeading) + await page.waitForFunction(() => { + const sidebar = document.querySelector('.VPSidebar')! + if (!sidebar.classList.contains('open')) { + document.querySelector('.VPLocalNav .menu')?.click() + return false + } + const { right } = sidebar.getBoundingClientRect() + return Math.abs(right - document.documentElement.clientWidth) < 1 + }) + const open = await box('.VPSidebar') + expect(open.x).toBeLessThan(viewport) + }) +}) diff --git a/__tests__/fixtures/external-data/a.json b/__tests__/fixtures/external-data/a.json new file mode 100644 index 000000000..ee2441f69 --- /dev/null +++ b/__tests__/fixtures/external-data/a.json @@ -0,0 +1 @@ +{ "a": true } diff --git a/__tests__/unit/client/theme-default/logical-properties.test.ts b/__tests__/unit/client/theme-default/logical-properties.test.ts new file mode 100644 index 000000000..cfdd3aac0 --- /dev/null +++ b/__tests__/unit/client/theme-default/logical-properties.test.ts @@ -0,0 +1,84 @@ +import { readdirSync, readFileSync } from 'node:fs' +import { fileURLToPath } from 'node:url' + +// the default theme is laid out with logical properties so that `dir: 'rtl'` +// mirrors it without a build step; this keeps physical inline-axis +// declarations from creeping back in + +const root = fileURLToPath( + new URL('../../../../src/client/theme-default/', import.meta.url) +) + +// declarations that must stay physical: centering paired with +// translate(-50%), which anchoring the inline-start edge would push +// off-centre in rtl +const physicalByDesign: Record = { + 'components/VPHero.vue': ['left: 50%', 'left: 50%'] +} + +// a declaration starts a block, follows another declaration, or sits on its +// own line, so one-line rules are scanned like any other +const physicalInlineAxis = + /(?<=^|[{;])\s*(?:(?:margin|padding|border|inset|scroll-margin|scroll-padding)-(?:left|right)(?:-[a-z]+)?|left|right|border-(?:top|bottom)-(?:left|right)-radius)\s*:[^;}]*|(?<=^|[{;])\s*(?:text-align|float|clear)\s*:\s*(?:left|right)\b|(?<=^|[{;])\s*(?:background-position(?:-x)?|(?:-webkit-)?mask-position|object-position|transform-origin|perspective-origin)\s*:[^;}]*\b(?:left|right)\b/gm + +// shorthands set the two inline sides independently; they are physical +// whenever those values differ (values with function calls are skipped) +const shorthand = + /(?<=^|[{;])\s*(?:(margin|padding|inset)[ \t]*:(?![^;}]*\()[ \t]*([^\s;{}!]+)[ \t]+([^\s;{}!]+)[ \t]+([^\s;{}!]+)[ \t]+([^\s;{}!]+)|(border-radius)[ \t]*:(?![^;}]*\()[ \t]*([^\s;{}!]+)[ \t]+([^\s;{}!]+)(?:[ \t]+([^\s;{}!]+))?(?:[ \t]+([^\s;{}!]+))?)[ \t]*(?:!important)?[ \t]*(?=[;}])/gm + +function styles(file: string): string { + const source = readFileSync(root + file, 'utf8') + if (file.endsWith('.css')) return source + return Array.from( + source.matchAll(/]*>([\s\S]*?)<\/style>/g), + (m) => m[1] + ).join('\n') +} + +function physicalDeclarations(css: string): string[] { + const found = Array.from(css.matchAll(physicalInlineAxis), (m) => m[0].trim()) + for (const m of css.matchAll(shorthand)) { + const decl = m[0].trim() + if (m[1]) { + // top right bottom left + if (m[3] !== m[5]) found.push(decl) + } else { + // top-left top-right bottom-right bottom-left, expanded from the + // two- and three-value forms + const [tl, tr, br, bl] = + m[10] !== undefined + ? [m[7], m[8], m[9], m[10]] + : m[9] !== undefined + ? [m[7], m[8], m[9], m[8]] + : [m[7], m[8], m[7], m[8]] + if (tl !== tr || br !== bl) found.push(decl) + } + } + return found +} + +describe('client/theme-default/logical-properties', () => { + const files = readdirSync(root, { recursive: true, encoding: 'utf8' }) + .map((file) => file.replaceAll('\\', '/')) + .filter((file) => /\.(vue|css)$/.test(file)) + .sort() + + test('every allowlisted file still exists', () => { + expect( + Object.keys(physicalByDesign).filter((file) => !files.includes(file)) + ).toEqual([]) + }) + + test.each(files)('%s uses no physical inline-axis properties', (file) => { + const found = physicalDeclarations(styles(file)) + const allowed = [...(physicalByDesign[file] ?? [])] + const unexpected = found.filter((decl) => { + const i = allowed.indexOf(decl) + if (i === -1) return true + allowed.splice(i, 1) + return false + }) + expect(unexpected).toEqual([]) + expect(allowed).toEqual([]) + }) +}) diff --git a/__tests__/unit/node/contentLoader.test.ts b/__tests__/unit/node/contentLoader.test.ts index 387a58c83..d82982a5b 100644 --- a/__tests__/unit/node/contentLoader.test.ts +++ b/__tests__/unit/node/contentLoader.test.ts @@ -1,13 +1,18 @@ -import { mkdtemp, rm, writeFile } from 'node:fs/promises' +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 { createContentLoader } from 'node/contentLoader' +import { disposeMdItInstance } from 'node/markdown/markdown' describe('node/contentLoader', () => { let root: string | undefined + beforeEach(() => { + disposeMdItInstance() + }) + afterEach(async () => { if (root) { await rm(root, { recursive: true, force: true }) @@ -29,6 +34,18 @@ describe('node/contentLoader', () => { ;(global as any).VITEPRESS_CONFIG = siteConfig } + test('excludes drafts with a string globOptions.ignore pattern', async () => { + await setup(false) + await mkdir(path.join(root!, 'drafts')) + await writeFile(path.join(root!, 'drafts/post.md'), '# Unpublished') + + const data = await createContentLoader('**/*.md', { + globOptions: { cwd: root, ignore: 'drafts/**' } + }).load() + + expect(data.map((page) => page.url)).toEqual(['/', '/other.html']) + }) + test('rendered internal links get .html when cleanUrls is false', async () => { await setup(false) @@ -64,4 +81,52 @@ describe('node/contentLoader', () => { expect(data[0].excerpt).toContain('Intro says My Post.') }) + + test.each([false, true])( + 'uses the rewritten locale for rendered content and excerpts (render: %s)', + async (render) => { + await setup(false) + await mkdir(path.join(root!, '.vitepress')) + await writeFile( + path.join(root!, '.vitepress/config.mjs'), + `export default { + rewrites: { 'translated.md': 'fr/post.md' }, + locales: { + root: { label: 'English', lang: 'en' }, + fr: { + label: 'French', lang: 'fr', + markdown: { container: { tipLabel: 'Conseil' } } + } + } + }` + ) + const content = '# Post\n\n::: tip\nSome advice.\n:::\n\n---\n\nBody.\n' + await writeFile(path.join(root!, 'translated.md'), content) + await writeFile(path.join(root!, 'original.md'), content) + await mkdir(path.join(root!, 'fr')) + await writeFile(path.join(root!, 'fr/native.md'), content) + ;(global as any).VITEPRESS_CONFIG = await resolveConfig( + root!, + 'build', + 'production' + ) + + const data = await createContentLoader( + ['translated.md', 'original.md', 'fr/native.md'], + { render, excerpt: true } + ).load() + const translated = data.find((page) => page.url === '/fr/post.html')! + const native = data.find((page) => page.url === '/fr/native.html')! + const original = data.find((page) => page.url === '/original.html')! + + expect(translated.excerpt).toContain('Conseil') + expect(native.excerpt).toContain('Conseil') + expect(original.excerpt).toContain('TIP') + if (render) { + expect(translated.html).toContain('Conseil') + expect(native.html).toContain('Conseil') + expect(original.html).toContain('TIP') + } + } + ) }) diff --git a/__tests__/unit/node/markdown/markdown.test.ts b/__tests__/unit/node/markdown/markdown.test.ts index af5d2fef6..9d7e2bc47 100644 --- a/__tests__/unit/node/markdown/markdown.test.ts +++ b/__tests__/unit/node/markdown/markdown.test.ts @@ -73,11 +73,11 @@ describe('node/markdown/markdown', () => { test('preWrapper', async () => { const src = '```js\nconst a = 1\n```' const enabled = await render(src) - expect(enabled).toContain('
') + expect(enabled).toContain('
') expect(enabled).toContain('class="copy"') const disabled = await render(src, { preWrapper: false }) - expect(disabled).not.toContain('
') + expect(disabled).not.toContain('
') expect(disabled).not.toContain('class="copy"') }) diff --git a/__tests__/unit/node/markdown/plugins/containers.test.ts b/__tests__/unit/node/markdown/plugins/containers.test.ts index 18e69025d..bd48c5814 100644 --- a/__tests__/unit/node/markdown/plugins/containers.test.ts +++ b/__tests__/unit/node/markdown/plugins/containers.test.ts @@ -91,7 +91,7 @@ describe('node/markdown/plugins/containers', () => {

content

Click me to toggle the code -
js
console.log('hi')
+      
js
console.log('hi')
       
" @@ -288,9 +288,9 @@ describe('node/markdown/plugins/containers', () => { ].join('\n') expect(await render(src)).toMatchInlineSnapshot(` "
-
js
const a = 1
+      
js
const a = 1
       
-
ts
const a: number = 1
+      
ts
const a: number = 1
       
" @@ -450,7 +450,7 @@ describe('node/markdown/plugins/containers (github alerts)', () => {
  • list item
-
js
const a = 1
+      
js
const a = 1
       
" diff --git a/__tests__/unit/node/markdown/plugins/image-url.test.ts b/__tests__/unit/node/markdown/plugins/image-url.test.ts new file mode 100644 index 000000000..f6a104863 --- /dev/null +++ b/__tests__/unit/node/markdown/plugins/image-url.test.ts @@ -0,0 +1,73 @@ +import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' + +import { + createMarkdownRenderer, + disposeMdItInstance, + type MarkdownRenderer +} from 'node/markdown/markdown' + +describe('image dimensions with URL suffixes', () => { + let root: string + let md: MarkdownRenderer + + beforeAll(async () => { + root = await mkdtemp(path.join(tmpdir(), 'vitepress-image-url-')) + await mkdir(path.join(root, 'public')) + for (const file of [ + 'diagram.svg', + 'diagram space.svg', + 'diagram#hash.svg', + 'public/diagram.svg' + ]) { + await writeFile( + path.join(root, file), + '' + ) + } + disposeMdItInstance() + md = await createMarkdownRenderer(root, { highlight: (code) => code }) + }) + + afterAll(async () => { + disposeMdItInstance() + await rm(root, { recursive: true, force: true }) + }) + + describe.each([ + './diagram.svg', + '/diagram.svg', + './diagram%20space.svg', + './diagram%23hash.svg' + ])('%s', (pathname) => { + test.each(['?v=1', '#layer', '?v=1#layer'])( + 'reads dimensions while preserving %s', + async (suffix) => { + const src = pathname + suffix + const html = await md.renderAsync(`![Diagram](${src})`, { + path: path.join(root, 'index.md') + }) + + expect(html).toContain(`src="${decodeURIComponent(src)}"`) + expect(html).toContain('width="120"') + expect(html).toContain('height="80"') + } + ) + }) + + test.each([ + ['width=240', '240', '160'], + ['height=40', '60', '40'], + ['width=240 height=90', '240', '90'] + ])('respects explicit dimensions: %s', async (attrs, width, height) => { + const html = await md.renderAsync( + `![Diagram](/diagram.svg?v=1#layer){${attrs}}`, + { path: path.join(root, 'index.md') } + ) + + expect(html).toContain('src="/diagram.svg?v=1#layer"') + expect(html).toContain(`width="${width}"`) + expect(html).toContain(`height="${height}"`) + }) +}) diff --git a/__tests__/unit/node/markdown/plugins/link.test.ts b/__tests__/unit/node/markdown/plugins/link.test.ts index 119132c34..83c15da08 100644 --- a/__tests__/unit/node/markdown/plugins/link.test.ts +++ b/__tests__/unit/node/markdown/plugins/link.test.ts @@ -61,6 +61,42 @@ describe('node/markdown/plugins/link', () => { expect(env.links).toEqual(['./missing']) expect(env.linkLines).toEqual([3]) }) + + test.each([false, true])( + 'preserves index page queries (cleanUrls: %s)', + async (cleanUrls) => { + for (const [source, expected] of [ + ['/guide/index.md?lang=fr', '/guide/?lang=fr'], + [ + './index.md?lang=fr&mode=full#Hello%20World', + './?lang=fr&mode=full#hello-world' + ], + [ + '/guide/index.md?next=/other/index.md#Hello%20World', + '/guide/?next=/other/index.md#hello-world' + ], + [ + '/guide/index.md?lang=fr#:~:text=Hello%20World', + '/guide/?lang=fr#:~:text=Hello%20World' + ] + ]) { + expect( + await md.renderAsync(`[link](${source})`, { cleanUrls }) + ).toContain(`href="${expected}"`) + } + } + ) + + test.each([false, true])( + 'only removes the exact index.md filename (cleanUrls: %s)', + async (cleanUrls) => { + for (const file of ['indexAmd', 'index.md-extra']) { + expect( + await md.renderAsync(`[link](/guide/${file})`, { cleanUrls }) + ).toContain(`href="/guide/${file}${cleanUrls ? '' : '.html'}"`) + } + } + ) }) describe('node/markdown/plugins/link with a relative base', () => { @@ -114,6 +150,19 @@ describe('node/markdown/plugins/link with a relative base', () => { ) }) + test.each([false, true])( + 'preserves index page queries with a relative base (cleanUrls: %s)', + async (cleanUrls) => { + expect( + await render('[link](/guide/index.md?lang=fr#Hello%20World)', { + cleanUrls + }) + ).toContain( + `href="../guide/${cleanUrls ? '' : 'index.html'}?lang=fr#hello-world"` + ) + } + ) + test('content-loader renders keep absolute links site-absolute', async () => { // content loaders set relativePath but not relativizeUrls — their html // is embedded in other pages, so the source's depth must not apply diff --git a/__tests__/unit/node/markdownToVue-pageData.test.ts b/__tests__/unit/node/markdownToVue-pageData.test.ts new file mode 100644 index 000000000..8dcf09a31 --- /dev/null +++ b/__tests__/unit/node/markdownToVue-pageData.test.ts @@ -0,0 +1,73 @@ +import { mkdtemp, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' + +import { resolveConfig } from 'node/config' +import { disposeMdItInstance } from 'node/markdown/markdown' +import { createMarkdownToVueRenderFn } from 'node/markdownToVue' +import { compileScript, parse } from 'vue/compiler-sfc' + +describe('page data script serialization', () => { + let root: string + let file: string + let render: Awaited> + + beforeAll(async () => { + root = await mkdtemp(path.join(tmpdir(), 'vitepress-page-data-')) + file = path.join(root, 'index.md') + await writeFile(file, '# Page\n') + const siteConfig = await resolveConfig(root, 'build', 'production') + disposeMdItInstance() + render = await createMarkdownToVueRenderFn( + root, + { cache: false }, + '/', + false, + false, + siteConfig + ) + }) + + afterAll(async () => { + disposeMdItInstance() + await rm(root, { recursive: true, force: true }) + }) + + describe.each([ + ['no script', ''], + ['named export', ''], + [ + 'default export', + '' + ], + ['script setup', ''] + ])('%s', (_, script) => { + test.each([ + 'Document tags literally', + "Regular-expression substitutions: $&, $`, $' and $$" + ])('preserves %j', async (description) => { + const src = [ + '---', + `description: ${JSON.stringify(description)}`, + '---', + '', + '# Page', + '', + script + ].join('\n') + + const result = await render(src, file) + const { descriptor, errors } = parse(result.vueSrc, { filename: file }) + + expect(errors).toEqual([]) + expect(() => compileScript(descriptor, { id: 'page-data' })).not.toThrow() + const module = await import( + 'data:text/javascript;base64,' + + Buffer.from(descriptor.script!.content).toString('base64') + ) + expect(module.__pageData).toEqual(result.pageData) + expect(module.__pageData.description).toBe(description) + expect(module.__pageData.frontmatter.description).toBe(description) + }) + }) +}) diff --git a/__tests__/unit/node/utils/glob.test.ts b/__tests__/unit/node/utils/glob.test.ts new file mode 100644 index 000000000..a53514643 --- /dev/null +++ b/__tests__/unit/node/utils/glob.test.ts @@ -0,0 +1,38 @@ +import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' + +import { glob } from 'node/utils/glob' + +describe('node/utils/glob', () => { + let root: string + + beforeEach(async () => { + root = await mkdtemp(path.join(tmpdir(), 'vitepress-glob-')) + for (const dir of ['drafts', 'dist', 'node_modules']) { + await mkdir(path.join(root, dir)) + await writeFile(path.join(root, dir, 'post.md'), '# Post') + } + await writeFile(path.join(root, 'published.md'), '# Published') + }) + + afterEach(async () => { + await rm(root, { recursive: true, force: true }) + }) + + test.each([{ ignore: 'drafts/**' }, { ignore: ['drafts/**'] }])( + 'accepts an ignore pattern as $ignore', + async ({ ignore }) => { + expect(await glob(['**/*.md'], { cwd: root, ignore })).toEqual([ + 'published.md' + ]) + } + ) + + test('keeps the default exclusions without a custom ignore pattern', async () => { + expect(await glob(['**/*.md'], { cwd: root })).toEqual([ + 'drafts/post.md', + 'published.md' + ]) + }) +}) diff --git a/__tests__/unit/shared/shared.test.ts b/__tests__/unit/shared/shared.test.ts index 16b971ae9..4758ba3df 100644 --- a/__tests__/unit/shared/shared.test.ts +++ b/__tests__/unit/shared/shared.test.ts @@ -2,11 +2,29 @@ import { isRelativeBase, joinPath, mergeHead, + pageChunkPath, relativePathToRoot, type HeadConfig } from 'shared/shared' describe('shared/shared', () => { + describe('pageChunkPath', () => { + test('keeps flat chunks directly in assetsDir', () => { + expect(pageChunkPath('guide_foo.md', 'Ab-12xyz')).toBe( + 'guide_foo.md.Ab-12xyz.js' + ) + }) + + test('prefixes the shard recorded in the hash map entry', () => { + expect(pageChunkPath('guide_foo.md', '3/Ab-12xyz')).toBe( + '3/guide_foo.md.Ab-12xyz.js' + ) + expect(pageChunkPath('guide_foo.md', '3/Ab-12xyz', '.lean.js')).toBe( + '3/guide_foo.md.Ab-12xyz.lean.js' + ) + }) + }) + describe('mergeHead', () => { test('replaces meta tags with the same key in place', () => { expect( diff --git a/docs/.postcssrc.json b/docs/.postcssrc.json deleted file mode 100644 index edc6a490f..000000000 --- a/docs/.postcssrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "plugins": { - "postcss-rtlcss": { - "ltrPrefix": ":where([dir=\"ltr\"])", - "rtlPrefix": ":where([dir=\"rtl\"])" - } - } -} diff --git a/docs/components/ModalDemo.vue b/docs/components/ModalDemo.vue index e5ba2e394..385d37dd1 100644 --- a/docs/components/ModalDemo.vue +++ b/docs/components/ModalDemo.vue @@ -26,10 +26,7 @@ const showModal = ref(false) .modal-mask { position: fixed; z-index: 200; - top: 0; - left: 0; - width: 100%; - height: 100%; + inset: 0; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; diff --git a/docs/config.ts b/docs/config.ts index aa7519830..1989a8e64 100644 --- a/docs/config.ts +++ b/docs/config.ts @@ -1,5 +1,5 @@ import { defineAdditionalConfig, type DefaultTheme } from 'vitepress' -import { version } from 'vitepress/package.json' with { type: 'json' } +import pkg from 'vitepress/package.json' with { type: 'json' } export default defineAdditionalConfig({ description: 'Vite & Vue powered static site generator.', @@ -37,7 +37,7 @@ function nav(): DefaultTheme.NavItem[] { activeMatch: '/reference/' }, { - text: version, + text: pkg.version, items: [ { text: '1.6.4', diff --git a/docs/en/guide/deploy.md b/docs/en/guide/deploy.md index d72abc251..d3d05cec4 100644 --- a/docs/en/guide/deploy.md +++ b/docs/en/guide/deploy.md @@ -316,6 +316,20 @@ You can deploy your VitePress project with [CloudRay](https://cloudray.io/) by f You can deploy your VitePress project with [Hostinger](https://www.hostinger.com/web-apps-hosting) by following these [instructions](https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/). While configuring build settings, choose VitePress as the framework and adjust the root directory to `./docs`. +### Lizard + +[Lizard (lizard.build)](https://lizard.build) builds VitePress sites from source and serves the generated HTML. For the layout used in this guide, it detects `docs:build` and serves `docs/.vitepress/dist` on port `80`. + +Install the [Lizard CLI](https://lizard.build/docs/cli) and sign in with `lizard login`. To deploy a local source directory, run these commands from the project root containing `package.json`: + +```sh +lizard init --name vitepress-docs +lizard add --service web +lizard up --service web --port 80 +``` + +Leave build and start command overrides unset to use automatic detection. For GitHub deployments or other layouts, see the [Lizard VitePress guide](https://lizard.build/docs/framework-guides/vitepress). + ### Stormkit You can deploy your VitePress project to [Stormkit](https://www.stormkit.io) by following these [instructions](https://stormkit.io/blog/how-to-deploy-vitepress). diff --git a/docs/en/guide/i18n.md b/docs/en/guide/i18n.md index 5fee9fc7a..e166804ef 100644 --- a/docs/en/guide/i18n.md +++ b/docs/en/guide/i18n.md @@ -44,7 +44,7 @@ The following properties can be overridden for each locale (including root): ```ts interface LocaleSpecificConfig { lang?: string - dir?: string | false + dir?: 'ltr' | 'rtl' | 'auto' | false title?: string titleTemplate?: string | boolean description?: string @@ -143,6 +143,23 @@ watchEffect(() => { ``` -## RTL Support (Experimental) +## RTL Support -For RTL support, specify `dir: 'rtl'` in config and use some RTLCSS PostCSS plugin like , or . You'll need to configure your PostCSS plugin to use `:where([dir="ltr"])` and `:where([dir="rtl"])` as prefixes to prevent CSS specificity issues. If users can switch direction at runtime, set `dir: false` and update `document.documentElement.dir` in your application code. +For right-to-left languages, set `dir: 'rtl'` in the config. The default theme is laid out with [CSS logical properties](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_logical_properties_and_values), so the layout, the navigation and directional icons follow the document direction on their own. No PostCSS plugin is needed; an RTLCSS plugin left in place would flip the mirrored styles a second time, so remove it. + +```ts [docs/.vitepress/config.ts] +export default { + lang: 'fa-IR', + dir: 'rtl' +} +``` + +For a multilingual site, set `dir` per locale in `locales`. It can also be overridden for a single page with the [`dir`](../reference/frontmatter-config#dir) frontmatter option. Code blocks always stay left-to-right. + +When adding your own styles, prefer logical properties such as `margin-inline-start` over `margin-left`, and mirror your own directional icons in right-to-left layouts: + +```css +[dir='rtl'] .my-arrow-icon { + scale: -1 1; +} +``` diff --git a/docs/en/reference/default-theme-config.md b/docs/en/reference/default-theme-config.md index 337603754..53d74d4ec 100644 --- a/docs/en/reference/default-theme-config.md +++ b/docs/en/reference/default-theme-config.md @@ -208,7 +208,8 @@ export type SidebarItem = { Setting this value to `false` prevents rendering of aside container.\ Setting this value to `true` renders the aside to the right.\ -Setting this value to `left` renders the aside to the left. +Setting this value to `left` renders the aside to the left.\ +In right-to-left layouts, both sides are mirrored. If you want to disable it for all viewports, you should use `outline: false` instead. diff --git a/docs/en/reference/frontmatter-config.md b/docs/en/reference/frontmatter-config.md index 42f57f4a4..f36b57df9 100644 --- a/docs/en/reference/frontmatter-config.md +++ b/docs/en/reference/frontmatter-config.md @@ -83,6 +83,18 @@ type HeadConfig = | [string, Record, string] ``` +## dir + +- Type: `'ltr' | 'rtl' | 'auto'` + +Overrides the [text direction](./site-config#dir) of the site for the current page. + +```yaml +--- +dir: rtl +--- +``` + ## Default Theme Only The following frontmatter options are only applicable when using the default theme. diff --git a/docs/en/reference/runtime-api.md b/docs/en/reference/runtime-api.md index a9af45bb6..151ca19f3 100644 --- a/docs/en/reference/runtime-api.md +++ b/docs/en/reference/runtime-api.md @@ -40,7 +40,7 @@ interface VitePressData { description: Ref lang: Ref isDark: Ref - dir: Ref + dir: Ref<'ltr' | 'rtl' | 'auto' | false> localeIndex: Ref /** * Current location hash diff --git a/docs/en/reference/site-config.md b/docs/en/reference/site-config.md index 7f2141272..063baaccc 100644 --- a/docs/en/reference/site-config.md +++ b/docs/en/reference/site-config.md @@ -367,6 +367,20 @@ export default { } ``` +### dir + +- Type: `'ltr' | 'rtl' | 'auto'` +- Default: `ltr` +- Can be overridden at the [directory level](#directory-level-overrides) + +The text direction of the site. This will render as a `` tag in the page HTML, and the default theme mirrors its layout for right-to-left languages. It can also be overridden per page via [frontmatter](./frontmatter-config#dir). Set it to `false` to let application code manage the attribute. See [RTL Support](../guide/i18n#rtl-support). + +```ts +export default { + dir: 'rtl' +} +``` + ### base - Type: `string` @@ -489,6 +503,21 @@ When `assetsBase` points at another origin, VitePress adds `crossorigin` to the Only production builds are affected. `vitepress preview` serves a root-absolute `assetsBase` (like `/cdn/`) from the local dist; an external one is requested from the real URL. Can also be set per build with `vitepress build --assetsBase https://cdn.example.com/`. +### assetsShards + +- Type: `number` +- Default: `undefined` + +Spreads the generated assets over this many subdirectories of [`assetsDir`](#assetsdir), `assets/0/` through `assets/N-1/`, instead of one flat directory. Use it when the host caps the number of files per directory; Netlify, for example, allows 54,000. Each page emits two JavaScript files, so a site with 60,000 pages needs at least three shards, plus some headroom because files are distributed by a hash of their name. + +```ts +export default { + assetsShards: 4 +} +``` + +Shared chunks stay in `assets/chunks/`. A file's shard depends only on its name, so unchanged files keep their URL between builds. Only production builds are affected. + ### icons - Type: `{ include?: string[] }` diff --git a/docs/es/config.ts b/docs/es/config.ts index 43b2dfb79..547182e07 100644 --- a/docs/es/config.ts +++ b/docs/es/config.ts @@ -3,7 +3,7 @@ import { type DefaultTheme, type MarkdownLocaleOptions } from 'vitepress' -import { version } from 'vitepress/package.json' with { type: 'json' } +import pkg from 'vitepress/package.json' with { type: 'json' } export const markdown: MarkdownLocaleOptions = { container: { @@ -89,7 +89,7 @@ function nav(): DefaultTheme.NavItem[] { activeMatch: '/es/reference/' }, { - text: version, + text: pkg.version, items: [ { text: '1.6.4', diff --git a/docs/fa/config.ts b/docs/fa/config.ts index 2b7dcc1ce..773571a9d 100644 --- a/docs/fa/config.ts +++ b/docs/fa/config.ts @@ -3,7 +3,7 @@ import { type DefaultTheme, type MarkdownLocaleOptions } from 'vitepress' -import { version } from 'vitepress/package.json' with { type: 'json' } +import pkg from 'vitepress/package.json' with { type: 'json' } export const markdown: MarkdownLocaleOptions = { container: { @@ -97,7 +97,7 @@ function nav(): DefaultTheme.NavItem[] { activeMatch: '/reference/' }, { - text: version, + text: pkg.version, items: [ { text: '1.6.4', diff --git a/docs/ja/config.ts b/docs/ja/config.ts index 3930ab7ce..97a5deb22 100644 --- a/docs/ja/config.ts +++ b/docs/ja/config.ts @@ -3,7 +3,7 @@ import { type DefaultTheme, type MarkdownLocaleOptions } from 'vitepress' -import { version } from 'vitepress/package.json' with { type: 'json' } +import pkg from 'vitepress/package.json' with { type: 'json' } export const markdown: MarkdownLocaleOptions = { container: { @@ -60,7 +60,7 @@ function nav(): DefaultTheme.NavItem[] { activeMatch: '/reference/' }, { - text: version, + text: pkg.version, items: [ { text: '1.6.4', diff --git a/docs/ko/config.ts b/docs/ko/config.ts index 2226254d4..ef8f941bb 100644 --- a/docs/ko/config.ts +++ b/docs/ko/config.ts @@ -3,7 +3,7 @@ import { type DefaultTheme, type MarkdownLocaleOptions } from 'vitepress' -import { version } from 'vitepress/package.json' with { type: 'json' } +import pkg from 'vitepress/package.json' with { type: 'json' } export const markdown: MarkdownLocaleOptions = { container: { @@ -89,7 +89,7 @@ function nav(): DefaultTheme.NavItem[] { activeMatch: '/ko/reference/' }, { - text: version, + text: pkg.version, items: [ { text: '1.6.4', diff --git a/docs/package.json b/docs/package.json index 9c2be9c1e..e11aba76a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -13,9 +13,8 @@ "@lunariajs/core": "^0.1.1", "markdown-it-mathjax3": "^4.3.2", "open-cli": "^9.0.0", - "postcss-rtlcss": "^6.0.0", "vitepress": "workspace:*", "vitepress-plugin-group-icons": "^1.7.6", - "vitepress-plugin-llms": "^1.13.4" + "vitepress-plugin-llms": "^1.13.5" } } diff --git a/docs/pt/config.ts b/docs/pt/config.ts index 9b99bef35..f52eb4848 100644 --- a/docs/pt/config.ts +++ b/docs/pt/config.ts @@ -3,7 +3,7 @@ import { type DefaultTheme, type MarkdownLocaleOptions } from 'vitepress' -import { version } from 'vitepress/package.json' with { type: 'json' } +import pkg from 'vitepress/package.json' with { type: 'json' } export const markdown: MarkdownLocaleOptions = { container: { @@ -89,7 +89,7 @@ function nav(): DefaultTheme.NavItem[] { activeMatch: '/pt/reference/' }, { - text: version, + text: pkg.version, items: [ { text: '1.6.4', diff --git a/docs/ru/components/ModalDemo.vue b/docs/ru/components/ModalDemo.vue index ea9f7848c..b2a0484ed 100644 --- a/docs/ru/components/ModalDemo.vue +++ b/docs/ru/components/ModalDemo.vue @@ -28,10 +28,7 @@ const showModal = ref(false) .modal-mask { position: fixed; z-index: 200; - top: 0; - left: 0; - width: 100%; - height: 100%; + inset: 0; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; diff --git a/docs/ru/config.ts b/docs/ru/config.ts index 4a4fa3d7f..ef6955444 100644 --- a/docs/ru/config.ts +++ b/docs/ru/config.ts @@ -3,7 +3,7 @@ import { type DefaultTheme, type MarkdownLocaleOptions } from 'vitepress' -import { version } from 'vitepress/package.json' with { type: 'json' } +import pkg from 'vitepress/package.json' with { type: 'json' } export const markdown: MarkdownLocaleOptions = { container: { @@ -87,7 +87,7 @@ function nav(): DefaultTheme.NavItem[] { activeMatch: '/ru/reference/' }, { - text: version, + text: pkg.version, items: [ { text: '1.6.4', diff --git a/docs/ru/guide/asset-handling.md b/docs/ru/guide/asset-handling.md index b2f267193..4cb0c0d4a 100644 --- a/docs/ru/guide/asset-handling.md +++ b/docs/ru/guide/asset-handling.md @@ -36,23 +36,15 @@ PDF-файлы или другие документы, на которые ес ## Базовый URL {#base-url} -Если ваш сайт развёрнут на URL-адресе, не являющемся корневым, вам нужно установить параметр `base` в файле `.vitepress/config.js`. Например, если вы планируете развернуть свой сайт на `https://foo.github.io/bar/`, то параметр `base` следует установить на `'/bar/'` (он всегда должен начинаться и заканчиваться слэшем). +Если ваш сайт развёрнут не в корне URL, задайте параметр [`base`](../reference/site-config#base). Например, если вы планируете разместить сайт по адресу `https://foo.github.io/bar/`, то `base` должен быть установлен в `'/bar/'`. -Все пути к статическим ресурсам автоматически обрабатываются с учётом различных значений конфигурации `base`. Например, если в вашей разметке есть абсолютная ссылка на ресурс в директории `public`: +Ссылки на статические ресурсы автоматически корректируются под `base`, поэтому абсолютная ссылка на файл в `public` работает с любым `base` и никогда не требует обновления: ```md ![Изображение](/image-inside-public.png) ``` -В этом случае вам **не** нужно обновлять его при изменении значения конфигурации `base`. - -Однако если вы создаете компонент темы, который динамически ссылается на активы, например, изображение, атрибут `src` которого основан на значении конфигурации темы: - -```vue - -``` - -В этом случае рекомендуется обернуть путь с помощью [хелпера `withBase`](../reference/runtime-api#withbase), предоставляемого VitePress: +Внимания требуют только динамически формируемые пути — например, изображение, `src` которого основан на значении конфигурации темы. Оборачивайте такие пути хелпером [`withBase`](../reference/runtime-api#withbase), чтобы `base` подставлялся во время выполнения: ```vue + +``` + +Передайте шаблонную ссылку элемента, несущего класс, чтобы dev-режим мог разрешить на нём иконку. Элементу нужны правила `mask`, которые поставляются с темой по умолчанию; в кастомной теме без них dev применяет встроенный эквивалент, а сгенерированная таблица стилей включает базовые правила с нулевой специфичностью для продакшена. + +При использовании темы по умолчанию компонент `VPIcon` из `vitepress/theme` оборачивает этот композабл (а также принимает сырую строку `{ svg }`): + +```vue-html + +``` + +Иконки, отрисовываемые только на клиенте (например, внутри ``), не могут быть собраны во время сборки — вместо этого перечислите их в [`icons.include`](./site-config#icons). + ## `withBase` {#withbase} - **Тип**: `(path: string) => string` diff --git a/docs/ru/reference/site-config.md b/docs/ru/reference/site-config.md index 6c593eda7..50aae646d 100644 --- a/docs/ru/reference/site-config.md +++ b/docs/ru/reference/site-config.md @@ -248,6 +248,13 @@ type HeadConfig = | [string, Record, string] ``` +Записи head из конфигурации сайта, [конфигурации локали](../guide/i18n), [конфигурации на уровне директории](#directory-level-overrides), [метаданные](./frontmatter-config#head) и [`transformHead`](#transformhead) объединяются в этом порядке. Более поздняя запись заменяет более раннюю с тем же ключом вместо того, чтобы добавляться к ней: + +- Любой элемент с атрибутом `id` идентифицируется по своему `id`. +- Элемент `meta` без `id` идентифицируется по своему первому атрибуту, отличному от `content` (например, `name`, `property`, `http-equiv`), и значению этого атрибута. + +Остальные элементы никогда не считаются повторяющимися и не заменяют друг друга. Чтобы отрисовать несколько тегов `meta`, которые имели бы одинаковый ключ, например несколько ``, задайте каждому из них уникальный `id` + #### Пример: Добавление значка сайта {#example-adding-a-favicon} ```ts @@ -367,6 +374,8 @@ export default { Базовый URL-адрес, по которому будет развёрнут сайт. Этот параметр необходимо задать, если вы планируете развернуть свой сайт по подпути, например, для страниц GitHub. Если вы планируете развернуть свой сайт на `https://foo.github.io/bar/`, то вам следует установить base на `'/bar/'`. Он всегда должен начинаться и заканчиваться косой чертой. +Единственное исключение — `'./'`, которое создаёт [переносимую сборку](../guide/deploy#relocatable-builds-relative-base): страницы ссылаются на всё относительно своего собственного расположения, поэтому один и тот же результат сборки работает из любого подпути (шлюзы IPFS, архивы) без пересборки и остаётся просматриваемым при открытии напрямую из файловой системы. + Параметр `base` автоматически добавляется ко всем URL, которые начинаются с `/` в других опциях, поэтому вам нужно указать его только один раз. ```ts @@ -375,6 +384,8 @@ export default { } ``` +Также может быть задан для отдельной сборки с помощью `vitepress build --base /base/`. + ## Маршрутизация {#routing} ### cleanUrls {#cleanurls} @@ -456,6 +467,44 @@ export default { } ``` +### assetsBase + +- Тип: `string` +- По умолчанию: `undefined` + +Префикс URL, с которого раздаются сгенерированные ресурсы (всё, что находится под [`assetsDir`](#assetsdir)) — обычно CDN. Должен быть абсолютным URL, URL без указания протокола (начинающимся с `//`) или абсолютным путём от корня сайта (начинающимся с `/`); при отсутствии завершающего слэша он добавляется автоматически. + +```ts +export default { + base: '/', + assetsBase: 'https://cdn.example.com/' + // скрипты, стили, шрифты и импортированные изображения разрешаются в + // https://cdn.example.com/assets/* +} +``` + +Итоговый URL ресурса — это `assetsBase`, объединённый с относительным путём файла в выводе, поэтому CDN должен зеркалировать структуру `outDir` (загрузите `outDir/assets`, чтобы он был доступен по адресу `/assets/*`). HTML-страницы, ссылки Markdown, файлы [`public`](../guide/asset-handling#the-public-directory) и `hashmap.json` остаются на [`base`](#base). + +Когда `assetsBase` указывает на другой домен, VitePress добавляет `crossorigin` к сгенерированным тегам script и preload — CDN должен отправлять `Access-Control-Allow-Origin` для домена вашего сайта (модульные скрипты всегда загружаются в режиме CORS). + +Это влияет только на продакшен-сборки. Команда `vitepress preview` раздаёт значение `assetsBase`, заданное как путь от корня сайта (например, `/cdn/`), из локальной папки dist, а внешний адрес — запрашивает напрямую по настоящему URL. Значение также можно задать для отдельной сборки с помощью `vitepress build --assetsBase https://cdn.example.com/`. + +### icons + +- Тип: `{ include?: string[] }` + +Опции для сгенерированных стилей иконок. Сборка собирает каждую иконку iconify, отрисованную во время SSR. Имена указываются полностью в формате `collection:name`, разрешаясь относительно пакетов `@iconify-json/*`, объявленных в зависимостях вашего проекта. + +Иконки, отрисовываемые только на клиенте — внутри `` или после гидратации — невидимы для сбора во время SSR. Перечислите их в `include`, чтобы принудительно добавить в таблицу стилей: + +```ts +export default { + icons: { + include: ['mdi:home', 'simple-icons:discord'] + } +} +``` + ### cacheDir {#cachedir} - Тип: `string` @@ -625,6 +674,7 @@ export default { interface SSGContext { content: string teleports?: Record + vpIcons: Set [key: string]: any } ``` @@ -639,6 +689,10 @@ interface SSGContext { Не мутируйте ничего внутри `context`. ::: +::: note +Ссылка на таблицу стилей иконок на этом этапе всё ещё содержит заглушку `vp-icons.__VP_ICONS_HASH__.css` — хеш содержимого появляется только после того, как отрендерены все страницы, и подставляется сразу после этого. Хуки, которые встраивают или проставляют отпечаток ресурсам в head, должны пропускать этот тег. +::: + ```ts export default { async transformHead(context) { diff --git a/docs/zh/config.ts b/docs/zh/config.ts index 41a557a54..376736c4c 100644 --- a/docs/zh/config.ts +++ b/docs/zh/config.ts @@ -3,7 +3,7 @@ import { type DefaultTheme, type MarkdownLocaleOptions } from 'vitepress' -import { version } from 'vitepress/package.json' with { type: 'json' } +import pkg from 'vitepress/package.json' with { type: 'json' } export const markdown: MarkdownLocaleOptions = { container: { @@ -89,7 +89,7 @@ function nav(): DefaultTheme.NavItem[] { activeMatch: '/zh/reference/' }, { - text: version, + text: pkg.version, items: [ { text: '1.6.4', diff --git a/package.json b/package.json index 0942027ef..c11ff853c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vitepress", - "version": "2.0.0-alpha.19", + "version": "2.0.0-alpha.20", "description": "Vite & Vue powered static site generator", "keywords": [ "vite", @@ -96,86 +96,86 @@ "@docsearch/css": "^4.7.0", "@docsearch/js": "^4.7.0", "@docsearch/sidepanel-js": "^4.7.0", - "@iconify-json/simple-icons": "^1.2.93", + "@iconify-json/simple-icons": "^1.2.95", "@shikijs/transformers": "^4.4.3", - "@types/markdown-it": "^14.1.2", + "@types/markdown-it": "^14.2.0", "@vitejs/plugin-vue": "^6.0.8", "@vue/devtools-api": "^8.2.1", - "@vue/shared": "^3.5.41", + "@vue/shared": "^3.5.42", "@vueuse/core": "^14.4.0", "@vueuse/integrations": "^14.4.0", "focus-trap": "^8.2.2", "mark.js": "8.11.1", "minisearch": "^7.2.0", "shiki": "^4.4.3", - "vite": "^8.2.1", - "vue": "^3.5.41" + "vite": "^8.3.0", + "vue": "^3.5.42" }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.5", - "@clack/prompts": "^1.7.0", - "@iconify/utils": "^3.1.4", - "@mdit-vue/plugin-component": "^3.0.2", - "@mdit-vue/plugin-frontmatter": "^3.0.2", - "@mdit-vue/plugin-headers": "^3.0.2", - "@mdit-vue/plugin-sfc": "^3.0.2", - "@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.3", - "@mdit/plugin-attrs": "^1.1.1", - "@mdit/plugin-container": "^1.0.2", - "@mdit/plugin-emoji": "^1.1.1", - "@mdit/plugin-footnote": "^1.0.2", - "@mdit/plugin-tasklist": "^1.0.2", + "@clack/prompts": "1.7.0", + "@iconify/utils": "^3.1.7", + "@mdit-vue/plugin-component": "3.0.2", + "@mdit-vue/plugin-frontmatter": "3.0.2", + "@mdit-vue/plugin-headers": "3.0.2", + "@mdit-vue/plugin-sfc": "3.0.2", + "@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.3", + "@mdit/plugin-attrs": "1.1.1", + "@mdit/plugin-container": "1.0.2", + "@mdit/plugin-emoji": "1.1.1", + "@mdit/plugin-footnote": "1.0.2", + "@mdit/plugin-tasklist": "1.0.2", "@polka/compression": "^1.0.0-next.28", "@rolldown/pluginutils": "^1.0.1", "@types/cross-spawn": "^6.0.6", "@types/mark.js": "^8.11.12", "@types/minimist": "^1.2.5", - "@types/node": "^26.2.0", + "@types/node": "^26.5.1", "@types/picomatch": "^4.0.3", "@types/semver": "^7.8.0", "@volar/typescript": "^2.4.28", "@vue/language-core": "^3.3.11", - "conventional-changelog": "^8.1.1", - "conventional-changelog-angular": "^9.2.1", + "conventional-changelog": "^8.1.3", + "conventional-changelog-angular": "^9.4.0", "cross-spawn": "^7.0.6", "eta": "^4.6.0", "get-port": "^7.2.0", "gray-matter": "^4.0.3", "image-size": "^2.0.2", - "lint-staged": "^17.3.0", + "lint-staged": "^17.5.1", "lru-cache": "^11.5.2", - "markdown-it": "^14.3.0", + "markdown-it": "^14.3.1", "markdown-it-async": "^2.2.0", - "markdown-it-cjk-friendly": "^2.0.2", + "markdown-it-cjk-friendly": "^2.0.3", "markdown-it-mathjax3": "^4.3.2", "minimist": "^1.2.8", "nanoid": "^6.0.1", - "obug": "^2.1.4", + "obug": "^2.2.1", "ora": "^9.4.1", - "p-map": "^7.0.6", + "p-map": "^7.0.7", "package-directory": "^8.2.0", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", - "picomatch": "^4.0.5", - "playwright-chromium": "^1.62.1", + "picomatch": "^4.0.7", + "playwright-chromium": "^1.63.0", "polka": "^1.0.0-next.28", "postcss": "^8.5.6", - "postcss-selector-parser": "^7.1.5", + "postcss-selector-parser": "^7.1.6", "prettier": "^3.9.6", "publint": "^0.3.24", - "rolldown": "^1.2.5", + "rolldown": "^1.2.8", "semver": "^7.8.5", - "simple-git-hooks": "^2.13.1", + "simple-git-hooks": "^2.14.0", "sirv": "^3.0.2", "sitemap": "^9.0.1", "tinyglobby": "^0.2.17", - "tsdown": "^0.22.14", + "tsdown": "^0.23.0", "typescript": "^6.0.3", - "vitest": "^4.1.10", - "vue-sfc-transformer": "^0.2.5", + "vitest": "^5.0.0", + "vue-sfc-transformer": "^0.3.0", "vue-tsc": "^3.3.11", "wait-on": "^9.1.0" }, diff --git a/patches/vue-sfc-transformer.patch b/patches/vue-sfc-transformer.patch deleted file mode 100644 index c3b8091f7..000000000 --- a/patches/vue-sfc-transformer.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff --git a/dist/rolldown.mjs b/dist/rolldown.mjs -index 7e04d96c703656b81220193b1f01426778b6a42f..26e96378fc0ad985237302e673ed0ab07674bf41 100644 ---- a/dist/rolldown.mjs -+++ b/dist/rolldown.mjs -@@ -196,10 +196,11 @@ function resolveCache(options) { - async function transpileScript(code, filename = "__sfc.ts") { - const result = await transform(filename, code, { - lang: "ts", -- sourcemap: false -+ sourcemap: false, -+ typescript: { onlyRemoveTypeImports: true } - }); - if (result.errors.length) throw new AggregateError(result.errors, `[vue-sfc-transformer] failed to transpile script in ${filename}`); -- return result.code ?? code; -+ return (result.code ?? code).replace(/\n?export \{\};?[\s\n]*$/, ""); - } - function vueSfcPlugin(pluginOptions) { - const cwd = pluginOptions.cwd ?? process.cwd(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a714130af..2d45be79d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,9 +7,6 @@ settings: overrides: esbuild: '-' -patchedDependencies: - vue-sfc-transformer: 06dbce7d98fac77faf5e66a94aa6e04f34c0cc7ec0910ec10848e5f2e08b8b68 - importers: .: @@ -24,29 +21,29 @@ importers: specifier: ^4.7.0 version: 4.7.0 '@iconify-json/simple-icons': - specifier: ^1.2.93 - version: 1.2.93 + specifier: ^1.2.95 + version: 1.2.95 '@shikijs/transformers': specifier: ^4.4.3 version: 4.4.3 '@types/markdown-it': - specifier: ^14.1.2 - version: 14.1.2 + specifier: ^14.2.0 + version: 14.2.0 '@vitejs/plugin-vue': specifier: ^6.0.8 - version: 6.0.8(vite@8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0))(vue@3.5.41(typescript@6.0.3)) + version: 6.0.8(vite@8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0))(vue@3.5.42(typescript@6.0.3)) '@vue/devtools-api': specifier: ^8.2.1 version: 8.2.1 '@vue/shared': - specifier: ^3.5.41 - version: 3.5.41 + specifier: ^3.5.42 + version: 3.5.42 '@vueuse/core': specifier: ^14.4.0 - version: 14.4.0(vue@3.5.41(typescript@6.0.3)) + version: 14.4.0(vue@3.5.42(typescript@6.0.3)) '@vueuse/integrations': specifier: ^14.4.0 - version: 14.4.0(axios@1.19.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0))(focus-trap@8.2.2)(vue@3.5.41(typescript@6.0.3)) + version: 14.4.0(axios@1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0))(focus-trap@8.2.2)(vue@3.5.42(typescript@6.0.3)) focus-trap: specifier: ^8.2.2 version: 8.2.2 @@ -60,60 +57,60 @@ importers: specifier: ^4.4.3 version: 4.4.3 vite: - specifier: ^8.2.1 - version: 8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0) + specifier: ^8.3.0 + version: 8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0) vue: - specifier: ^3.5.41 - version: 3.5.41(typescript@6.0.3) + specifier: ^3.5.42 + version: 3.5.42(typescript@6.0.3) devDependencies: '@arethetypeswrong/cli': specifier: ^0.18.5 version: 0.18.5 '@clack/prompts': - specifier: ^1.7.0 + specifier: 1.7.0 version: 1.7.0 '@iconify/utils': - specifier: ^3.1.4 - version: 3.1.4 + specifier: ^3.1.7 + version: 3.1.7 '@mdit-vue/plugin-component': - specifier: ^3.0.2 + specifier: 3.0.2 version: 3.0.2 '@mdit-vue/plugin-frontmatter': - specifier: ^3.0.2 + specifier: 3.0.2 version: 3.0.2 '@mdit-vue/plugin-headers': - specifier: ^3.0.2 + specifier: 3.0.2 version: 3.0.2 '@mdit-vue/plugin-sfc': - specifier: ^3.0.2 + specifier: 3.0.2 version: 3.0.2 '@mdit-vue/plugin-title': - specifier: ^3.0.2 + specifier: 3.0.2 version: 3.0.2 '@mdit-vue/plugin-toc': - specifier: ^3.0.2 + specifier: 3.0.2 version: 3.0.2 '@mdit-vue/shared': - specifier: ^3.0.2 + specifier: 3.0.2 version: 3.0.2 '@mdit/plugin-anchor': - specifier: ^1.1.3 - version: 1.1.3(markdown-it@14.3.0) + specifier: 1.1.3 + version: 1.1.3(markdown-it@14.3.1) '@mdit/plugin-attrs': - specifier: ^1.1.1 - version: 1.1.1(markdown-it@14.3.0) + specifier: 1.1.1 + version: 1.1.1(markdown-it@14.3.1) '@mdit/plugin-container': - specifier: ^1.0.2 - version: 1.0.2(markdown-it@14.3.0) + specifier: 1.0.2 + version: 1.0.2(markdown-it@14.3.1) '@mdit/plugin-emoji': - specifier: ^1.1.1 - version: 1.1.1(markdown-it@14.3.0) + specifier: 1.1.1 + version: 1.1.1(markdown-it@14.3.1) '@mdit/plugin-footnote': - specifier: ^1.0.2 - version: 1.0.2(markdown-it@14.3.0) + specifier: 1.0.2 + version: 1.0.2(markdown-it@14.3.1) '@mdit/plugin-tasklist': - specifier: ^1.0.2 - version: 1.0.2(markdown-it@14.3.0) + specifier: 1.0.2 + version: 1.0.2(markdown-it@14.3.1) '@polka/compression': specifier: ^1.0.0-next.28 version: 1.0.0-next.28 @@ -130,8 +127,8 @@ importers: specifier: ^1.2.5 version: 1.2.5 '@types/node': - specifier: ^26.2.0 - version: 26.2.0 + specifier: ^26.5.1 + version: 26.5.1 '@types/picomatch': specifier: ^4.0.3 version: 4.0.3 @@ -145,11 +142,11 @@ importers: specifier: ^3.3.11 version: 3.3.11 conventional-changelog: - specifier: ^8.1.1 - version: 8.1.1(conventional-commits-filter@6.0.1) + specifier: ^8.1.3 + version: 8.1.3 conventional-changelog-angular: - specifier: ^9.2.1 - version: 9.2.1 + specifier: ^9.4.0 + version: 9.4.0 cross-spawn: specifier: ^7.0.6 version: 7.0.6 @@ -166,20 +163,20 @@ importers: specifier: ^2.0.2 version: 2.0.2 lint-staged: - specifier: ^17.3.0 - version: 17.3.0 + specifier: ^17.5.1 + version: 17.5.1 lru-cache: specifier: ^11.5.2 version: 11.5.2 markdown-it: - specifier: ^14.3.0 - version: 14.3.0 + specifier: ^14.3.1 + version: 14.3.1 markdown-it-async: specifier: ^2.2.0 version: 2.2.0 markdown-it-cjk-friendly: - specifier: ^2.0.2 - version: 2.0.2(@types/markdown-it@14.1.2)(markdown-it@14.3.0) + specifier: ^2.0.3 + version: 2.0.3(@types/markdown-it@14.2.0)(markdown-it@14.3.1) markdown-it-mathjax3: specifier: ^4.3.2 version: 4.3.2 @@ -190,14 +187,14 @@ importers: specifier: ^6.0.1 version: 6.0.1 obug: - specifier: ^2.1.4 - version: 2.1.4 + specifier: ^2.2.1 + version: 2.2.1 ora: specifier: ^9.4.1 version: 9.4.1 p-map: - specifier: ^7.0.6 - version: 7.0.6 + specifier: ^7.0.7 + version: 7.0.7 package-directory: specifier: ^8.2.0 version: 8.2.0 @@ -208,20 +205,20 @@ importers: specifier: ^1.1.1 version: 1.1.1 picomatch: - specifier: ^4.0.5 - version: 4.0.5 + specifier: ^4.0.7 + version: 4.0.7 playwright-chromium: - specifier: ^1.62.1 - version: 1.62.1 + specifier: ^1.63.0 + version: 1.63.0 polka: specifier: ^1.0.0-next.28 version: 1.0.0-next.28 postcss: specifier: ^8.5.6 - version: 8.5.26 + version: 8.5.28 postcss-selector-parser: - specifier: ^7.1.5 - version: 7.1.5 + specifier: ^7.1.6 + version: 7.1.6 prettier: specifier: ^3.9.6 version: 3.9.6 @@ -229,14 +226,14 @@ importers: specifier: ^0.3.24 version: 0.3.24 rolldown: - specifier: ^1.2.5 - version: 1.2.5 + specifier: ^1.2.8 + version: 1.2.8 semver: specifier: ^7.8.5 version: 7.8.5 simple-git-hooks: - specifier: ^2.13.1 - version: 2.13.1 + specifier: ^2.14.0 + version: 2.14.0 sirv: specifier: ^3.0.2 version: 3.0.2 @@ -247,17 +244,17 @@ importers: specifier: ^0.2.17 version: 0.2.17 tsdown: - specifier: ^0.22.14 - version: 0.22.14(@arethetypeswrong/core@0.18.5)(@volar/typescript@2.4.28(typescript@6.0.3))(publint@0.3.24)(typescript@6.0.3)(vue-tsc@3.3.11(typescript@6.0.3)) + specifier: ^0.23.0 + version: 0.23.0(@arethetypeswrong/core@0.18.5)(@volar/typescript@2.4.28(typescript@6.0.3))(publint@0.3.24)(typescript@6.0.3)(vue-tsc@3.3.11(typescript@6.0.3)) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: - specifier: ^4.1.10 - version: 4.1.10(@types/node@26.2.0)(vite@8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0)) + specifier: ^5.0.0 + version: 5.0.0(@types/node@26.5.1)(vite@8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0)) vue-sfc-transformer: - specifier: ^0.2.5 - version: 0.2.5(patch_hash=06dbce7d98fac77faf5e66a94aa6e04f34c0cc7ec0910ec10848e5f2e08b8b68)(@volar/typescript@2.4.28(typescript@6.0.3))(@vue/compiler-core@3.5.41)(@vue/language-core@3.3.11)(rolldown@1.2.5)(typescript@6.0.3)(vue@3.5.41(typescript@6.0.3)) + specifier: ^0.3.0 + version: 0.3.0(@volar/typescript@2.4.28(typescript@6.0.3))(@vue/compiler-core@3.5.42)(@vue/language-core@3.3.11)(rolldown@1.2.8)(typescript@6.0.3)(vue@3.5.42(typescript@6.0.3)) vue-tsc: specifier: ^3.3.11 version: 3.3.11(typescript@6.0.3) @@ -274,8 +271,8 @@ importers: __tests__/e2e: devDependencies: '@iconify-json/lucide': - specifier: ^1.2.126 - version: 1.2.126 + specifier: ^1.2.131 + version: 1.2.131 vitepress: specifier: workspace:* version: link:../.. @@ -297,18 +294,15 @@ importers: open-cli: specifier: ^9.0.0 version: 9.0.0(supports-color@7.2.0) - postcss-rtlcss: - specifier: ^6.0.0 - version: 6.0.0(postcss@8.5.26) vitepress: specifier: workspace:* version: link:.. vitepress-plugin-group-icons: specifier: ^1.7.6 - version: 1.7.6(vite@8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0)) + version: 1.7.6(vite@8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0)) vitepress-plugin-llms: - specifier: ^1.13.4 - version: 1.13.4(supports-color@7.2.0) + specifier: ^1.13.5 + version: 1.13.5(supports-color@7.2.0) packages: @@ -319,8 +313,8 @@ packages: '@andrewbranch/untar.js@1.0.4': resolution: {integrity: sha512-pVXSwPsLuw8IGLo2Di0EaOfsk+ntVvpkk942J/sHYIkwvtKUakEcPh7HBgZ6tuimgzKSEHgCvO4XgQ05DEbwDw==} - '@antfu/install-pkg@1.1.0': - resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@antfu/install-pkg@2.0.1': + resolution: {integrity: sha512-iCKVQcIC0e3oDxEfs3SHQGW+ovhBMZmS1TE+bTk50rVyMCBmCfClv7Qi3HQKlumYwvjb/iIMeWCW2i67q6kFfQ==} '@arethetypeswrong/cli@0.18.5': resolution: {integrity: sha512-gM+8vRsQOD/Uc7EnBedUhkG5OCsDWE4uoak5QvomGpMpaky0Eh41p04nIMgrWb8EOmqZUJGc6zz9hsP6E56R7g==} @@ -369,8 +363,8 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@conventional-changelog/git-client@3.1.1': - resolution: {integrity: sha512-w/q+UIVdWQMgXlziPIYfPlyDud+H8kcvSCzDQQoc/gid7yZzb6eNfAkNN4UlEcS2cVVh924jevsOIb36d0In2g==} + '@conventional-changelog/git-client@3.1.2': + resolution: {integrity: sha512-jZqwnJwf7nboIlAcw/mkOjVa6DexCcUOgT2oOQgkoi3z9vR8tGFkcMy2BFcYwjhL9sYcDDXkRQDayiDieCoW7A==} engines: {node: '>=22'} peerDependencies: conventional-commits-filter: ^6.0.1 @@ -381,8 +375,8 @@ packages: conventional-commits-parser: optional: true - '@conventional-changelog/template@1.2.1': - resolution: {integrity: sha512-TzlTVpKPjaqW6qOYjQcYUDuGsLCNsvFHVBXkYGTAnf5V37jCWrE5haKNXzz0WZUtVHjrpV76L1buANjwXMfT8w==} + '@conventional-changelog/template@1.4.0': + resolution: {integrity: sha512-aalGyl7dbB5PArRebDIX43ZvBlXrYm9uWzGJ26t+4SzJVPsOuvfILGGbw5X4yX7i50YEmJ8zvbiWnqH/AAnZqg==} engines: {node: '>=22'} '@docsearch/css@4.7.0': @@ -414,26 +408,33 @@ packages: '@hapi/topo@6.0.2': resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} - '@iconify-json/logos@1.2.12': - resolution: {integrity: sha512-zUi/AoezU2F3L65nPVd2smiU6Y+ZI7RjdVPlGfeAeYbPbZ9kWn7Ucxj+KshmyQRBYwLtKoqAlUyoGgMqWG1T8g==} + '@iconify-json/logos@1.2.14': + resolution: {integrity: sha512-O36DicXkgAMT6NAsH7MTWlOql8NktHz9fBCItTjz6L/9gyRXw4vQj6qTeVgww5UZWiVugUV1MhVFA/g9HWIkBw==} - '@iconify-json/lucide@1.2.126': - resolution: {integrity: sha512-Fl3OfR71yeWLrlTLp6C4W5W3rJJDWH9/e70mjtq9VAldYDxvHh149JMNPz7foTeLLTE2Paynnp2aYKVL9rgF5Q==} + '@iconify-json/lucide@1.2.131': + resolution: {integrity: sha512-2h0kGA4utt2OIqTdDHPs7+ft0lK8fRRNx1ItsvUaIlkTKaNc/ADT3F9j2F18Qevm9sWfKlAghOUmxmP32inTPg==} - '@iconify-json/simple-icons@1.2.93': - resolution: {integrity: sha512-/XhANjfGYOuqvSR3TmUnkQkINvQ4GVjVuukvymRbxtVFBvIq/yiXJqCDycKcQPT401OYT9H2vIY6ihAlz1QIAw==} + '@iconify-json/simple-icons@1.2.95': + resolution: {integrity: sha512-QwWgcoiL+eNCD38QM0OStFVFoOgDvzeHrcwMAvATvcFl0VvMEtED92qp3K3juS0H6RZ9BGUlgq9mODPwNWkjJg==} - '@iconify-json/vscode-icons@1.2.70': - resolution: {integrity: sha512-J5EnIWj9cCPvn0obl88giucgFtNalgBkhML3oHse5MBEU7H7fyezKHhVsfXOuxs7osSfTAoOcXtmbmWUD6rXqw==} + '@iconify-json/vscode-icons@1.2.77': + resolution: {integrity: sha512-yl8e3KlFfLLhiL9CH6YwX6syePeSLLwH2dL4cKGYC27SgdNHL3TRpheAyOjO3fw2+Ovp3tOSF5oj3AhSv4MQ8Q==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.4': - resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} + '@iconify/utils@3.1.7': + resolution: {integrity: sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -549,8 +550,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.146.0': - resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} + '@oxc-project/types@0.149.0': + resolution: {integrity: sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA==} '@polka/compression@1.0.0-next.28': resolution: {integrity: sha512-aDmrBhgHJtxE+jy145WfhW9WmTAFmES/dNnn1LAs8UnnkFgBUj4T8I4ScQ9+rOkpDZStvnVP5iqhN3tvt7O1NA==} @@ -566,98 +567,98 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} - '@rolldown/binding-android-arm-eabi@1.2.5': - resolution: {integrity: sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==} + '@rolldown/binding-android-arm-eabi@1.2.8': + resolution: {integrity: sha512-tN5aztYkKCte4i5SIrrz5yK/HMjEuCqCSCJa418jOV8tZ1cBY3YF2otxB1ktPxzsLA1BeTqwapK0bfjxNvHJVw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.5': - resolution: {integrity: sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==} + '@rolldown/binding-android-arm64@1.2.8': + resolution: {integrity: sha512-dIYTWl9XprMUiQFoc55KUyk/oS8SKYH3zFl0LTR7RT0Xj4hgSVyuJcroH8JUu8RcpF8fTB6E0aOwCkZoYPcDSQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.5': - resolution: {integrity: sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==} + '@rolldown/binding-darwin-arm64@1.2.8': + resolution: {integrity: sha512-PCSDQGXD2IyTEFrcgPyBM8jJuGmrbCMuoIOXdbEGVemruKACXoLQJrb+A45Z0L5t1RQkdfJprAYPkikbh7dzdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.5': - resolution: {integrity: sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==} + '@rolldown/binding-darwin-x64@1.2.8': + resolution: {integrity: sha512-Uk7lRsGhPFHVX/sAUC6D5H9Ol30dFHd6iquokll2th3LpdJ3F5CzQB+7DHn0Ri2mG+U7k2zXiPHDrwZenXhwSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.5': - resolution: {integrity: sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==} + '@rolldown/binding-freebsd-x64@1.2.8': + resolution: {integrity: sha512-DjszaTEVogPqA5bYzsEeqDCQxbcp2fexQwKcRspYji2yzR68fCf+e4fx6kBSRDwX5/brZaHw/hWS9+A/+/w9sQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.5': - resolution: {integrity: sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.8': + resolution: {integrity: sha512-zmwa7FTmdzB6aaEEuuls18H6Ap5JmJPSoPTuXixeJZV6tG40SyLkApQtz1g8ptZtiEKqj9OM0oNLPh1AgvE31Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.5': - resolution: {integrity: sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==} + '@rolldown/binding-linux-arm64-gnu@1.2.8': + resolution: {integrity: sha512-KdYQDPHwJVnbFwdTGMgxsI9SqblBlz6STGM+w1We/d5B8OWWidYH0MwkU/uA1wM5fIpO2MkOVxXrNzzuZhw9ew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.5': - resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} + '@rolldown/binding-linux-arm64-musl@1.2.8': + resolution: {integrity: sha512-jFJTifHnNPY+yzOoNZQfSIysrVyXzEQPhPnOUjmD1bcQGHH6s7c8cViKWar8YplQImE5N9JRqMCLrM2CdxOrZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.5': - resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} + '@rolldown/binding-linux-ppc64-gnu@1.2.8': + resolution: {integrity: sha512-FhiOziBDWPBjbcmRzfLyIJnaP7AVMFXT7YCXPjXxj7wKU3vx24RjrCNN/zjvVa+N2vVoHJwCoUBvsrN/DG3zIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.5': - resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} + '@rolldown/binding-linux-s390x-gnu@1.2.8': + resolution: {integrity: sha512-WnHfADMzOV2Y55wlx1hzzQnar/wDt/VdvWSD99r18Mz9ylNieIGOkRx3UV21h7m/eJvjySYJkO26VvGNFkwsIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.5': - resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} + '@rolldown/binding-linux-x64-gnu@1.2.8': + resolution: {integrity: sha512-H9tRr5ibfXFVLxbPOseVewewFpl28zcEdjRDt2FTUZU7odxP0gEv1ki4/kGmcGOh78oRwZuuQllGLZ9zTJp84g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.5': - resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} + '@rolldown/binding-linux-x64-musl@1.2.8': + resolution: {integrity: sha512-UefiqfM3D6IVNlZ8tSGs9+Ejjud2T+oxO0IHADU45Y+lyEjD2dVFyZHbkfX0LUb5Zugo/oIv1eCO/KVYhgYJYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.5': - resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} + '@rolldown/binding-openharmony-arm64@1.2.8': + resolution: {integrity: sha512-637Ke4kWSy6rp9cxQ9gMOXlxPgIw/c1beASV4M//3+9I4uwBVOOl74G+e3zyU3u19U7RkRl/HuewixZ/Z6+Rjg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.5': - resolution: {integrity: sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==} + '@rolldown/binding-win32-arm64-msvc@1.2.8': + resolution: {integrity: sha512-xWBkPOF1Q9k/Gv1nQXnVdLxKu74jXppuOM4Z3mnypVUJJJwLsMl7hNJGRAUJoG8A5MgOI1ACKM+wBFxSJzKy4A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.5': - resolution: {integrity: sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==} + '@rolldown/binding-win32-x64-msvc@1.2.8': + resolution: {integrity: sha512-uz2ZvfgXbxqNwijjjbxrnvALwpyODDcgc1T1N8N3rf/DXKQmaFwmB4LX4yyjggpwN2obdQLb2rgirX5ffCWYng==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -763,8 +764,8 @@ packages: '@types/mark.js@8.11.12': resolution: {integrity: sha512-244ZnaIBpz4c6xutliAnYVZp6xJlmC569jZqnR3ElO1Y01ooYASSVQEqpd2x0A2UfrgVMs5V9/9tUAdZaDMytQ==} - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/markdown-it@14.2.0': + resolution: {integrity: sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -778,11 +779,11 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@24.13.3': - resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} + '@types/node@24.13.4': + resolution: {integrity: sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==} - '@types/node@26.2.0': - resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} + '@types/node@26.5.1': + resolution: {integrity: sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g==} '@types/picomatch@4.0.3': resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} @@ -799,8 +800,8 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@ungap/structured-clone@1.3.3': - resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} '@vitejs/plugin-vue@6.0.8': resolution: {integrity: sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==} @@ -809,11 +810,8 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.2.25 - '@vitest/expect@4.1.10': - resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - - '@vitest/mocker@4.1.10': - resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} + '@vitest/mocker@5.0.0': + resolution: {integrity: sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -823,20 +821,8 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.10': - resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - - '@vitest/runner@4.1.10': - resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - - '@vitest/snapshot@4.1.10': - resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - - '@vitest/spy@4.1.10': - resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - - '@vitest/utils@4.1.10': - resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} + '@vitest/spy@5.0.0': + resolution: {integrity: sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==} '@volar/language-core@2.4.28': resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} @@ -852,17 +838,17 @@ packages: typescript: optional: true - '@vue/compiler-core@3.5.41': - resolution: {integrity: sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==} + '@vue/compiler-core@3.5.42': + resolution: {integrity: sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==} - '@vue/compiler-dom@3.5.41': - resolution: {integrity: sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==} + '@vue/compiler-dom@3.5.42': + resolution: {integrity: sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==} - '@vue/compiler-sfc@3.5.41': - resolution: {integrity: sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==} + '@vue/compiler-sfc@3.5.42': + resolution: {integrity: sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==} - '@vue/compiler-ssr@3.5.41': - resolution: {integrity: sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==} + '@vue/compiler-ssr@3.5.42': + resolution: {integrity: sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==} '@vue/devtools-api@8.2.1': resolution: {integrity: sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==} @@ -876,20 +862,20 @@ packages: '@vue/language-core@3.3.11': resolution: {integrity: sha512-QJmpliwAVpC/OxubIByPAhNzsQPRc8/gxlN2qnVzVfIMjMDz/9RnXRFoetjz5yEgXVXyp4LqhXq3V53PjmNzFw==} - '@vue/reactivity@3.5.41': - resolution: {integrity: sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==} + '@vue/reactivity@3.5.42': + resolution: {integrity: sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==} - '@vue/runtime-core@3.5.41': - resolution: {integrity: sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==} + '@vue/runtime-core@3.5.42': + resolution: {integrity: sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==} - '@vue/runtime-dom@3.5.41': - resolution: {integrity: sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==} + '@vue/runtime-dom@3.5.42': + resolution: {integrity: sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==} - '@vue/server-renderer@3.5.41': - resolution: {integrity: sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==} + '@vue/server-renderer@3.5.42': + resolution: {integrity: sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==} - '@vue/shared@3.5.41': - resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==} + '@vue/shared@3.5.42': + resolution: {integrity: sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==} '@vueuse/core@14.4.0': resolution: {integrity: sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==} @@ -951,140 +937,140 @@ packages: engines: {node: '>=14.6'} deprecated: this version has critical issues, please update to the latest version - '@yuku-codegen/binding-android-arm64@0.8.7': - resolution: {integrity: sha512-C/0zV5IhgVdYhGJTwrY0v8dknxlhiKwtVJkMUaexu9/QvRmzlV4vfU3hZlUSgqc2BxQHntL1mCVbDq8j0FRFDw==} + '@yuku-codegen/binding-android-arm64@0.9.5': + resolution: {integrity: sha512-jrOY5WM+AaAqkv51fHP1x28ifto4WgcZVzodLUyMU1jMWn5Sq+VciRdk/n8E0Ey5w4p4cWWE+m5GfXWOYh7Kzw==} cpu: [arm64] os: [android] - '@yuku-codegen/binding-darwin-arm64@0.8.7': - resolution: {integrity: sha512-/u+REDMI4a0/lsJXTM4c53/w31OGZLOReZIyg62uhgLs0kc8NHsj/nOcxTdlQjq5gi0zhdkccD9LaLTXcdzPvw==} + '@yuku-codegen/binding-darwin-arm64@0.9.5': + resolution: {integrity: sha512-4O4lkCQIzPZGjiNB1GORSI6hBECbiiSBS/APZXPvNKYH+nhY4uuqv03LNXA+SET3hoBjvr95P5rIhY8KQaQUBA==} cpu: [arm64] os: [darwin] - '@yuku-codegen/binding-darwin-x64@0.8.7': - resolution: {integrity: sha512-sMMzFOwCo4WXR+/6zIBThOocSC50iIIZZdfiIDbaLvj0Ax/rWt/iavyfEAqajyvzydLyCqR/ZItdLWSRlu1umw==} + '@yuku-codegen/binding-darwin-x64@0.9.5': + resolution: {integrity: sha512-9EvoUO0SEhD6/d8VHdWuPerepPMSR1y84+UEgz8Un1Ope14Oe7xMvePpEQLTLovoIFZ8Zg3iZ8z8E11pZMqC3g==} cpu: [x64] os: [darwin] - '@yuku-codegen/binding-freebsd-x64@0.8.7': - resolution: {integrity: sha512-MpdpKXix9P+Y1rKgjvcNeNtGjXeL1CmttNhYINrWls8kRpm4xM/oBGTmn6w7to8lAlwj5jm8q03dQPl5mRv4Qw==} + '@yuku-codegen/binding-freebsd-x64@0.9.5': + resolution: {integrity: sha512-HqT78WwgHTmp8lwujoUa9CrIortX4DdpuiVC18ZPSGvuuJf4ylpIEI6QrQEM78Zwz3muhAWAOXZ5irdiYY+AyA==} cpu: [x64] os: [freebsd] - '@yuku-codegen/binding-linux-arm-gnu@0.8.7': - resolution: {integrity: sha512-rr1srFLlPAmC1vtxfc9C1YLDe3iH09YjfSeeIidBqKhzx1MATjOAq4mjlRUOnhr/L27MotWIYOFKwVsd5JZFOg==} + '@yuku-codegen/binding-linux-arm-gnu@0.9.5': + resolution: {integrity: sha512-QJXwIW6Ms3QIawbcBIedmrmXnfdpuAOjZJ/eAABq5XTzWvSxZ7lutu9W5yIHahlaTaFnBo7ikrVMD1szLTpPUw==} cpu: [arm] os: [linux] libc: [glibc] - '@yuku-codegen/binding-linux-arm-musl@0.8.7': - resolution: {integrity: sha512-eAufXh8qBRpiSO6ueaMDL+yyoXIGLhpUce72YbcACtZU2qhExwBIJyEtQf5kH2Ki0X2aqkSjSfog4OPtKXan3Q==} + '@yuku-codegen/binding-linux-arm-musl@0.9.5': + resolution: {integrity: sha512-eHbFy3IHGb+IYarrYwAo0yWSEQV3eAmEn6VrsKA6I1Wy1YPJxWqSJlV69JhqsHtJuJlljUIF3ex0y46yaKIu9w==} cpu: [arm] os: [linux] libc: [musl] - '@yuku-codegen/binding-linux-arm64-gnu@0.8.7': - resolution: {integrity: sha512-gw4w6wPoHObBrdIC4duVWLmJOvpdE25j5D7yrM5mACNlK4klRz/lv8hK+ssQk9EJHBgZjSaqZIJVFgqNYbfv7A==} + '@yuku-codegen/binding-linux-arm64-gnu@0.9.5': + resolution: {integrity: sha512-ByoJMbySTaDhjAXSu8q6Lh7HKg3YoesXpcT72aYk0Aiw4PCznmY4ybpLTq0RCvp0RIPhFm/6yECFiGBwyCC1nw==} cpu: [arm64] os: [linux] libc: [glibc] - '@yuku-codegen/binding-linux-arm64-musl@0.8.7': - resolution: {integrity: sha512-L68N6Y4XkqcIaKo3Ra88JEvBEH4AHff44A4INcrxeVWZ8CZtu2tCpfVxe3hR8qQQMcvBSQlDn24KpkCKEhVvfA==} + '@yuku-codegen/binding-linux-arm64-musl@0.9.5': + resolution: {integrity: sha512-gD9vfXIoBw1toSxhO9rgmSu/FEfy3PMznJAxVjIuH8DrWEiDKXmJO0pJKfj1Ltbe/TmtWVZR+TjISqeSIGQzMg==} cpu: [arm64] os: [linux] libc: [musl] - '@yuku-codegen/binding-linux-x64-gnu@0.8.7': - resolution: {integrity: sha512-dzyAbltJmf3Cqlb8HcFuYIf5Yn0fl1vTr3XJ9HiVNNvOlhqPSArOqtw9vI1p6/VTXTjrMLXlU+s+/kNHiIy/Cw==} + '@yuku-codegen/binding-linux-x64-gnu@0.9.5': + resolution: {integrity: sha512-BARvdnvqMGjOr5Iel2JH+9H5vAIE0R6H0Z2fsT02xrvmI/1ZXNB8lkuX+ZGevPhZb3zJ9WeC/R8JZstrsUOK5g==} cpu: [x64] os: [linux] libc: [glibc] - '@yuku-codegen/binding-linux-x64-musl@0.8.7': - resolution: {integrity: sha512-Otw4MH3404q0Bbvl+YTdW9aoUV5vXmUw8260bWvt1XlaoIX/ceSgI4ygheRDMfBPoHt6FDayQaO9OLVUZAgkFA==} + '@yuku-codegen/binding-linux-x64-musl@0.9.5': + resolution: {integrity: sha512-x8flcevS1fbb7ESrmpOY/pON4eInSaE/7Ktjqx2udOE2W33BNSZmJuwpyUgo54AoHNqrcaM7szqydyJn5fNvew==} cpu: [x64] os: [linux] libc: [musl] - '@yuku-codegen/binding-win32-arm64@0.8.7': - resolution: {integrity: sha512-qo/jyrzryiBuKEsFiuWaBCBe3tRMynQ0qFWFgOEjcCMQeZfBm+wKiVEUEFXXLc7bh8YezguAWp0Mtnhq4ARNyA==} + '@yuku-codegen/binding-win32-arm64@0.9.5': + resolution: {integrity: sha512-KOL/rBatWqH4ZpCNoF8ZtSNdOJbAxBJLmk/VeRciepGROPTbPum1A9t67GpFgOU7qrkUWlPJdJ+KHKbvbmOt+w==} cpu: [arm64] os: [win32] - '@yuku-codegen/binding-win32-x64@0.8.7': - resolution: {integrity: sha512-D5lDsVDx6m00E6bWySlWdH72Ca4TPSaphDqB6QjU6MpuNLIJqoGoatYyq2rOmBE8Zv/kunot/o58KGL03P3eiA==} + '@yuku-codegen/binding-win32-x64@0.9.5': + resolution: {integrity: sha512-FxENahEjWSan59Syh/us/Kf4wNq8qrJLFJ3R2N4Oiwtb6yNdz/rWLNTIoNSssnsp7IoWJdUP6o/Z8ppg7lXMcg==} cpu: [x64] os: [win32] - '@yuku-parser/binding-android-arm64@0.8.7': - resolution: {integrity: sha512-eGKYiUDX7Y0V7tDTmg+JTVnXnjMqfXXsorZ+EDf5kxwchQ3Or1HS14MzI2fw+jFhHR85fCWt+mtX33Yao73hIQ==} + '@yuku-parser/binding-android-arm64@0.9.5': + resolution: {integrity: sha512-A2JCFCSHfnficqYEw4Iujpx7XrkMM3UfFcgJFmYpZSo9zM4nyhmdIIE0FogSduuU60lhM0/UcfuUBXIVNBMlGQ==} cpu: [arm64] os: [android] - '@yuku-parser/binding-darwin-arm64@0.8.7': - resolution: {integrity: sha512-Re0RHelKLnjEURulY2/KxW+Ngb8zuNA4BRZuMwgGQNzVumT6u4U2N2hc01oeYVNVof0i7GrXE4UCNBgbpRRnjQ==} + '@yuku-parser/binding-darwin-arm64@0.9.5': + resolution: {integrity: sha512-3PiyU+Eare4YuKaQ22N98/yAiROPY5o/NQJHraICzDvk4pgS+m+bgLKOvkGBRn33OnV95Vdv1Mn38b+MQHpULQ==} cpu: [arm64] os: [darwin] - '@yuku-parser/binding-darwin-x64@0.8.7': - resolution: {integrity: sha512-Hn8DROtQkjlA1ACbPgj4a7eP9IuVOI504oiTwpkWPbpaDWD9KdmnVYCqW+1LfenNK/g7O9NhWGpXEdaCNX7lIA==} + '@yuku-parser/binding-darwin-x64@0.9.5': + resolution: {integrity: sha512-blFMAFI7AInI83XaiOF8cIeiRM46Nz9EfpZtZPRLbKxSA9aAr5v8aHYpmfN6NoyXxAv/10pwS4gsAuc1W6fy5Q==} cpu: [x64] os: [darwin] - '@yuku-parser/binding-freebsd-x64@0.8.7': - resolution: {integrity: sha512-bAP2OV8wRuzplX/jYxv9+vvqQT8JxyNphI8fLfXGL054Xs+4/J5u33cIm3y4rxY8rdoLmmdiJs2Tq7r7lrDRfA==} + '@yuku-parser/binding-freebsd-x64@0.9.5': + resolution: {integrity: sha512-TsNuL4qsZdO0tHp5GW43Y5fHeLPpPHA675wdcPNTcdq2ZO5AvsQWFFoiDg8CH4oBktfsQ9tdvKhjLnLYwKvp4g==} cpu: [x64] os: [freebsd] - '@yuku-parser/binding-linux-arm-gnu@0.8.7': - resolution: {integrity: sha512-kTYwJQQgmZeAWdDIWabiReIZMpmfLueIj1tCmjStUtFGhR1Z0qwxonKVfUC4N7h/VhGGzLZ//7O1kgt1QKqgCg==} + '@yuku-parser/binding-linux-arm-gnu@0.9.5': + resolution: {integrity: sha512-b0afYK5gHeV8RdmOcqAlgM8ONsye4cax4DMnIBaoJyPMd1UTGvTbpkqQcPVdhmHlcfcGVGMV1laeVovlr/dscw==} cpu: [arm] os: [linux] libc: [glibc] - '@yuku-parser/binding-linux-arm-musl@0.8.7': - resolution: {integrity: sha512-uL4jE8HPT2BLlxAXyD10LqgPuXa9eDa0BKpCdSANmzIJghq/2eZo3/gQNtaxPZMupWoxjYzSad9IXrwu7aYPXQ==} + '@yuku-parser/binding-linux-arm-musl@0.9.5': + resolution: {integrity: sha512-fD3lKzl+r6j6n8DwiMY53qnh5DLqD8KJjCp+NbVud54Nnh3Q9Wprqss3YzyMHP3NSJk663Wlg1E1X5qOuFVFig==} cpu: [arm] os: [linux] libc: [musl] - '@yuku-parser/binding-linux-arm64-gnu@0.8.7': - resolution: {integrity: sha512-3gVN4pWSKZmXiNX7cU164dR9MPvesCHnlH6nPfpK+yQsCuYphjKKplcb4SnZBrhiqmXbgb2HR0c2TS0IZUPhgA==} + '@yuku-parser/binding-linux-arm64-gnu@0.9.5': + resolution: {integrity: sha512-aRU/aCphV1MWCl/lvI6NX8LgucHQ68Fx+vz7NBb/5MEr2EuzCxiPOQqeFcMdWh+2AED/p0AvAREch0c+cSnlhA==} cpu: [arm64] os: [linux] libc: [glibc] - '@yuku-parser/binding-linux-arm64-musl@0.8.7': - resolution: {integrity: sha512-S0mwfEjoLpxzXeZw802Wa4RaELsQiPtWqG6INcy8j4GtvNFtl4LCX3eGO1XLn9pyLAISLzTRyU3zUCBUPin8lg==} + '@yuku-parser/binding-linux-arm64-musl@0.9.5': + resolution: {integrity: sha512-5+Guro0l8H473YXlEjVNBRLN/IbPbJdnQh1zo0OLt49xxnON+XMJRRaEyTOTfkn9QSRg0+BhEKGR4W9Gu2uZJQ==} cpu: [arm64] os: [linux] libc: [musl] - '@yuku-parser/binding-linux-x64-gnu@0.8.7': - resolution: {integrity: sha512-lnbWdPmerE5D1uH1G4IEZKnPzCrWCStRGrtgpSIe1RibAo5bZIjDbbbPYXmMHCEh4F+x/JaJpElh26a3r+BPbg==} + '@yuku-parser/binding-linux-x64-gnu@0.9.5': + resolution: {integrity: sha512-pwwSyV9q+GlvzSXlsMZBMlgk22L5bud714/vqZCdeUTivzeUVltQzUaf3IQXOGXdpc59JYTeuMCtbGquaAUoCA==} cpu: [x64] os: [linux] libc: [glibc] - '@yuku-parser/binding-linux-x64-musl@0.8.7': - resolution: {integrity: sha512-769uwndMvMzUvATWbAcEvyLHKA+DzhHSCl/obBUrRdYfRo26yxui6S8y3z7uJ+Naup7UKrDxrpK7OnQkxkl9KQ==} + '@yuku-parser/binding-linux-x64-musl@0.9.5': + resolution: {integrity: sha512-z18j6JN3lBHH8vzN7gG1M8fI0nlgItSfnC9PfbmUbt97iHViKfw2iA2G9fGwRMe5LyPRZBrejIlapbygPbpdaw==} cpu: [x64] os: [linux] libc: [musl] - '@yuku-parser/binding-win32-arm64@0.8.7': - resolution: {integrity: sha512-mEB/9PlaAkisJ6KWGz0zvywXoU6+80dTlR2LwS7s/jcXXoU6fm2+sitBZXtqu3+Q4DcDgPxM45uWMCzPs0TSRw==} + '@yuku-parser/binding-win32-arm64@0.9.5': + resolution: {integrity: sha512-s6Gwttb1dQvtPX6Bgkw+UPC9IO3UBDXc6Zezog8MMgvu3UfJBBB9TQqKBX/2quu0Eyh+lLSAyNlIyyecaagUPg==} cpu: [arm64] os: [win32] - '@yuku-parser/binding-win32-x64@0.8.7': - resolution: {integrity: sha512-8vNB2DP0ou61nGb8tc/qfi41gfyDXz1MHr2zqL3nR+cJ6CEbiuWV/l/a/vv151gCgiZLLAyGkQGENpozdg716w==} + '@yuku-parser/binding-win32-x64@0.9.5': + resolution: {integrity: sha512-FrERt9YWatY3bJfSUdi4YWY+6iQcyo3MzCC821BxlWM5TFZEHijnpz/bknR79VHlXY/9CvXz8ZlaAGPsTtN3nw==} cpu: [x64] os: [win32] - '@yuku-toolchain/types@0.8.7': - resolution: {integrity: sha512-2Z53dNxAJL6UvFoIrDZvYf3zlO8s4VJK4O2hhaB4mXVwwpX/7ajtss3cmfqKvamlNLWyt9FSWs4eoYdlbxpnHA==} + '@yuku-toolchain/types@0.9.5': + resolution: {integrity: sha512-KiuLNNgX9uNealaWAR+G3/cMXnRk9x4TY2EkYe/KIag+UPdwiA0RRf1hr1WAxzTP8KGzCTkqUdLPvqh32sEO3w==} agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -1105,18 +1091,14 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} engines: {node: '>=12'} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansis@4.3.1: - resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} - engines: {node: '>=14'} - any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -1129,8 +1111,8 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - argue-cli@3.1.0: - resolution: {integrity: sha512-DhBpBfXL4SS2uC0N922MMajKR3CdrTG0u2or1PNYgXMsrSzViJrbtvT0nCLlLGUI0plam/ZZCs7aAauHtW9thw==} + argue-cli@3.2.0: + resolution: {integrity: sha512-VipTB0gXgGIFO2Rg9yEVN5wLt2AurJcZqDbgmYSwPwsykhLrQhs240/bfceev4w68lI8JshoOJIk9uW7tFzROw==} engines: {node: '>=22'} assertion-error@2.0.1: @@ -1140,8 +1122,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.19.0: - resolution: {integrity: sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==} + axios@1.20.0: + resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1264,21 +1246,21 @@ packages: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} - conventional-changelog-angular@9.2.1: - resolution: {integrity: sha512-oWSL6ZhnXbYraOFTK3PgRAQJ8fADDAEv5K6AdeyQPLvjFmhG8+ejL0jZZp/R7vTmGJaBvZEE+sE7dB4bCv7sAw==} + conventional-changelog-angular@9.4.0: + resolution: {integrity: sha512-HdxRxuS8bBXVIuo4V82gvSwAXT0vYQUizrjs/izmPg5JdDstr8v8I5hduGL3iQbG+o310dUDxC4+LetuS5hu9w==} engines: {node: '>=22'} conventional-changelog-preset-loader@6.0.1: resolution: {integrity: sha512-GZ8E3RQzXQb3JFy0pKl8oeSf7ENIhvAMvJr+PlWkavZOesLHHdhkfNJ4SvW35eo1Fu2+EyVxWQ1tVvtzAG2iWg==} engines: {node: '>=22'} - conventional-changelog-writer@9.2.0: - resolution: {integrity: sha512-eACD5BaAQCYjeI3RExkCZopNaaIuXzCP4kaAb2lEFXcGa/KOuxJfj8v/SnjhvF6377pYn0A2Gji+6GhwUK8rEA==} + conventional-changelog-writer@9.2.1: + resolution: {integrity: sha512-StlYSmW3wLedRaqohJMpP3YuWiAqtgD0/cpsai9frdDkXv7rxj0hRbpJrubPYvJxJsjplONsOobEQnPuS9UgCg==} engines: {node: '>=22'} hasBin: true - conventional-changelog@8.1.1: - resolution: {integrity: sha512-my0arqBpzr8mg+7RKDGnw8OiDvBr8/QVJIxazYJlIDeKx/2GCBYxZELaDYpbRhM5gNKfZB8h9SHuetrUFxd5HQ==} + conventional-changelog@8.1.3: + resolution: {integrity: sha512-fOMwLCxm46znJKPB08jLxl1FD8SOZOQHktlzCVhvhhVUfq0KgQSryoYXsRRHs1aRlZPR1/QK5wztnY8sBNC2AA==} engines: {node: '>=22'} hasBin: true @@ -1291,9 +1273,6 @@ packages: engines: {node: '>=22'} hasBin: true - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1333,8 +1312,8 @@ packages: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} - default-browser@5.5.0: - resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + default-browser@5.5.1: + resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} engines: {node: '>=18'} define-lazy-prop@3.0.0: @@ -1422,8 +1401,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@2.3.1: - resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} es-object-atoms@1.1.2: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} @@ -1488,8 +1467,8 @@ packages: fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -1569,8 +1548,8 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-tsconfig@5.0.0-beta.5: - resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} engines: {node: '>=20.20.0'} glob-parent@5.1.2: @@ -1705,16 +1684,16 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - joi@18.2.3: - resolution: {integrity: sha512-N5A3KTWQpPWT4ExxxPlUx7WmykGXRzhNidWhV41d6Abu9YfI2NyWCJuxdPnslJCPWtbRpSVOWSnSS6GakLM/Rg==} + joi@18.2.8: + resolution: {integrity: sha512-G2TX62h58ZHuwqetJgP2F4ualakqAmZtBYe3jWen7gxQRw5xApX6crnFtuB91WC0c3ESBnva+kGSnb3+6pIQDQ==} engines: {node: '>= 20'} - js-yaml@3.15.1: - resolution: {integrity: sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==} + js-yaml@3.15.2: + resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} hasBin: true - js-yaml@4.3.1: - resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true juice@8.1.0: @@ -1803,8 +1782,8 @@ packages: linkify-it@5.0.2: resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} - lint-staged@17.3.0: - resolution: {integrity: sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw==} + lint-staged@17.5.1: + resolution: {integrity: sha512-7EDuco1xnBMeVpvAbeMq1U5KXwJGLmY8q6l+Ye78r36C4mPc+Vg1Z2SK8gHyRTyvPro90A0q5/FAZ+Au23d6QQ==} engines: {node: '>=22.22.1'} hasBin: true @@ -1825,14 +1804,17 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.3.1: + resolution: {integrity: sha512-rm91zr2Ou+XueDTohjQQjdQEcYM6zVi8KVUCG8Ec3vHwUEKrhSdCNyfuIywkA6hcCAteIn0ZOtAHA6eGpiX+Pg==} + mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} markdown-it-async@2.2.0: resolution: {integrity: sha512-sITME+kf799vMeO/ww/CjH6q+c05f6TLpn6VOmmWCGNqPJzSh+uFgZoMB9s0plNtW6afy63qglNAC3MhrhP/gg==} - markdown-it-cjk-friendly@2.0.2: - resolution: {integrity: sha512-KXCl6sd129UqkAiRDb+NcAHrxC9xRa2WsGIsMMvtp2y1YlbeIaNYzArX2zfDoGhOjsyNMfJrGO7xGBss27YQSA==} + markdown-it-cjk-friendly@2.0.3: + resolution: {integrity: sha512-dBAhqp7GZ6he15ug2t5JSfwTw2KvZX9tt0y7Up0reR1cZOBUogSq5V859hcIGwge7hjW1SkUaWkNr++0HszyZg==} engines: {node: '>=18'} peerDependencies: '@types/markdown-it': '*' @@ -1844,8 +1826,8 @@ packages: markdown-it-mathjax3@4.3.2: resolution: {integrity: sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w==} - markdown-it@14.3.0: - resolution: {integrity: sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==} + markdown-it@14.3.1: + resolution: {integrity: sha512-4Ej49aYTDFIQ+uBkfX8GBvJGccoARxxPep+7aWTs55ozbjQJpW9M26Fe53vnGgvLeVzva/amzjQQaQu9w0vMhA==} hasBin: true markdown-title@1.0.2: @@ -2027,8 +2009,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.18: - resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2057,8 +2039,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - obug@2.1.4: - resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} engines: {node: '>=12.20.0'} onetime@7.0.0: @@ -2076,16 +2058,16 @@ packages: engines: {node: '>=22'} hasBin: true - open@11.0.0: - resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + open@11.0.2: + resolution: {integrity: sha512-RWqF+pBSkqecEvCKOn8QYhaNdRMJDZRIrlS/7rTDdLHaPcfXGCZ/h8zb413NfvdeAV0MR7T1yJcA34/q+CSm1Q==} engines: {node: '>=20'} ora@9.4.1: resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} engines: {node: '>=20'} - p-map@7.0.6: - resolution: {integrity: sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==} + p-map@7.0.7: + resolution: {integrity: sha512-VaWRu2i4FJNRtiRWCuuQRgfQ1B7a6+gMSrO+3j0EQi/k0ULfS9kosRxGoiqwzIjZTDI02tGfk5mXXltLg6QtfQ==} engines: {node: '>=18'} package-directory@8.2.0: @@ -2114,9 +2096,6 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} @@ -2127,17 +2106,17 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - playwright-chromium@1.62.1: - resolution: {integrity: sha512-yRMzeViD44qD1ZVMNupp82NJQNjumZ02W5r7+DmtD5+7aP9+v66a0PsAk63ewpVDH1GxMf/J/mO+TS1sTaK29w==} + playwright-chromium@1.63.0: + resolution: {integrity: sha512-Bb0ZqhnFFcY8KTFl4XphnqEpZv/BU1flx9apJ4l/UfOBsNppWg6AEue51uuvsrOEZnsPQXf0+C53uzLjhA4Q6w==} engines: {node: '>=20'} hasBin: true - playwright-core@1.62.1: - resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + playwright-core@1.63.0: + resolution: {integrity: sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==} engines: {node: '>=20'} hasBin: true @@ -2145,31 +2124,29 @@ packages: resolution: {integrity: sha512-ryc8D/B5E/YnlWHkNMnRvNntPc4GwU1/+iDBjiXVz1SUjDRqlxYX5Ic0IaDLA/cQ+g7/x+jUzEjv2K16u1J+wA==} engines: {node: '>=8'} - postcss-rtlcss@6.0.0: - resolution: {integrity: sha512-iJMOT4vM6EOnvNUm+uZycpqqTeHCTMGPsyxIHloVUioECgKIrvtWtPIczc5NMc14x5ZJGadwUs0L1o6iZDCldg==} - engines: {node: '>=18.0.0'} - peerDependencies: - postcss: ^8.4.21 - - postcss-selector-parser@7.1.5: - resolution: {integrity: sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==} + postcss-selector-parser@7.1.6: + resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==} engines: {node: '>=4'} - postcss@8.5.26: - resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + powershell-utils@0.2.1: + resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==} + engines: {node: '>=20'} + prettier@3.9.6: resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true - pretty-bytes@7.1.1: - resolution: {integrity: sha512-X+vn9z8nOFZQlxOLmfJ0iKDdMD7jYTsTW12OAlCpdoE3Igik6L37pugIZi+N3usuyp5McfgKPWi12q3zvHLeGQ==} + pretty-bytes@7.1.3: + resolution: {integrity: sha512-U2KZ675nqba6XSBppSjU2pRgc9Ffx9+uUtd/RTWYmOawVkZuUbBYuwdtFZQmLv+yMgQ2TQxWWuOpyNje67J9tg==} engines: {node: '>=20'} property-information@7.2.0: @@ -2234,13 +2211,13 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown-plugin-dts@0.27.14: - resolution: {integrity: sha512-ZvuDDwoIpRK9RPxDXratCpklFO9QZZWndf/sd0VBFb4LEj0jj07UcHK9OCh7V4XiFz2Z89ziyBC2K6tJiDjrbw==} - engines: {node: ^22.18.0 || >=24.11.0} + rolldown-plugin-dts@0.28.5: + resolution: {integrity: sha512-yYd3C9CeJwqjOc9X23m0Tyxcqic491uLZlfg51szT287S8zCCqLR2uoySoElgqy2CLn7PdXcEo1dlkBs4n1WHg==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} peerDependencies: '@typescript/native-preview': '*' '@volar/typescript': ~2.4.0 - rolldown: ^1.0.0 + rolldown: ^1.2.0 typescript: ^5.0.0 || ^6.0.0 || ~7.0.0 vue-tsc: ~3.2.0 || ~3.3.0 peerDependenciesMeta: @@ -2253,16 +2230,11 @@ packages: vue-tsc: optional: true - rolldown@1.2.5: - resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==} + rolldown@1.2.8: + resolution: {integrity: sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rtlcss@4.3.0: - resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==} - engines: {node: '>=12.0.0'} - hasBin: true - run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} @@ -2309,8 +2281,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-git-hooks@2.13.1: - resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==} + simple-git-hooks@2.14.0: + resolution: {integrity: sha512-kkTORPAuxQz2g1QUuN0J8yGWT28tjGBfPOdJ4xT7Vbeu30veKUZQIoID2qGgCDAakaQn59UeZJJ4cFGB8PVP2A==} hasBin: true simple-git@3.36.0: @@ -2386,10 +2358,6 @@ packages: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - strtok3@10.3.5: resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} engines: {node: '>=18'} @@ -2420,21 +2388,22 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinybench@6.1.4: + resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==} + engines: {node: '>=20.0.0'} tinyexec@1.3.0: resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinyrainbow@3.1.1: - resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} - engines: {node: '>=14.0.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2467,19 +2436,19 @@ packages: resolution: {integrity: sha512-bwwr76BThfiVwAFZqks5cJ+VoKNM3/2Yg1ZwJslkdmAUQ6S0UNoCoGYFDxdw+u1skfexggdmD2p35kW5Td4Cug==} engines: {node: '>=6'} - tsdown@0.22.14: - resolution: {integrity: sha512-ule7Y+fsAN2iZbLDoo7C4KYljFJNJJ+fLshyn+9gozeTspVersWHxwdGB+Dm2hzA38s6muFnUTl0jK3vJm9ifQ==} - engines: {node: ^22.18.0 || >=24.11.0} + tsdown@0.23.0: + resolution: {integrity: sha512-BaT+ep1xnj5hdyICLd5r5SYYE+TXnI1ATePLykv9vcKpHpFTWUWRH+x1AF/E2qcu3YB6+vI8IdyxIIIffEqw5Q==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@tsdown/css': 0.22.14 - '@tsdown/exe': 0.22.14 + '@tsdown/css': 0.23.0 + '@tsdown/exe': 0.23.0 '@vitejs/devtools': '*' publint: ^0.3.8 tsx: '*' typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 - unplugin-unused: ^0.5.0 + unplugin-unused: '>=0.5.0' unrun: '*' peerDependenciesMeta: '@arethetypeswrong/core': @@ -2538,8 +2507,8 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici-types@8.3.0: - resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} @@ -2581,8 +2550,8 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - verkit@0.3.2: - resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} + verkit@0.4.0: + resolution: {integrity: sha512-sXMwN6DMHeouPfCxkxWkKAmxphWKEenHYY5H1nIBzU3PmDsmJp6kBXJdshjVdpMZuWCmL9SH7KFRx29AylpP6g==} engines: {node: '>=18.12.0'} vfile-message@4.0.3: @@ -2591,13 +2560,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.2.2: - resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} + vite@8.3.0: + resolution: {integrity: sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.4.0 || ^0.5.0 + '@vitejs/devtools': ^0.7.1 esbuild: '*' jiti: '>=1.21.0' less: ^4.0.0 @@ -2642,27 +2611,27 @@ packages: vite: optional: true - vitepress-plugin-llms@1.13.4: - resolution: {integrity: sha512-3/L1ceexjpJirWWGlfvqx2hmaDTFGSkSHrn3y2C7RZm6lNa/vmvU49Ayr4GxLYQfOFfo9CP6rsWdD+6rEbnIxA==} + vitepress-plugin-llms@1.13.5: + resolution: {integrity: sha512-CTiDkKRs0h64J5rdiICdHmXH4pM1gBu2S/MJ+OxSAm+vM72srBkHr86ZubzfMJbGJh4AMVKff4R3oCu8etI1ww==} engines: {node: '>=18'} - vitest@4.1.10: - resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + vitest@5.0.0: + resolution: {integrity: sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.10 - '@vitest/browser-preview': 4.1.10 - '@vitest/browser-webdriverio': 4.1.10 - '@vitest/coverage-istanbul': 4.1.10 - '@vitest/coverage-v8': 4.1.10 - '@vitest/ui': 4.1.10 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.0 + '@vitest/browser-preview': 5.0.0 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.0 + '@vitest/coverage-v8': 5.0.0 + '@vitest/ui': 5.0.0 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -2687,16 +2656,17 @@ packages: jsdom: optional: true - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + vscode-uri@3.2.0: + resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} - vue-sfc-transformer@0.2.5: - resolution: {integrity: sha512-e+yWjXmWH/088bFrgpvVZ4x/4TkgRKM3L9yreSVlzphEy03auX7zgycyHFLEyCizMDmUh+Q2aXYRb3tjETtCyQ==} + vue-sfc-transformer@0.3.0: + resolution: {integrity: sha512-WdpctRqmwbePyfHFK/vZgyiUWkDDdN/0V7s5KFCX8DAEwCQI+XKudNgoJbGfDvVxLrWtvV9D6H7kvMkZeYGAhg==} engines: {node: '>=18.0.0'} peerDependencies: '@volar/typescript': ^2.4.0 '@vue/compiler-core': ^3.5.13 '@vue/language-core': ^3.0.0 + esbuild: '*' rolldown: '>=1.0.0-beta.0' typescript: '>=5.0.0' vue: ^3.5.13 @@ -2705,6 +2675,8 @@ packages: optional: true '@vue/language-core': optional: true + esbuild: + optional: true rolldown: optional: true typescript: @@ -2716,8 +2688,8 @@ packages: peerDependencies: typescript: '>=5.0.0' - vue@3.5.41: - resolution: {integrity: sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==} + vue@3.5.42: + resolution: {integrity: sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -2760,8 +2732,8 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wsl-utils@0.3.1: - resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + wsl-utils@1.0.0: + resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==} engines: {node: '>=20'} y18n@5.0.8: @@ -2793,14 +2765,14 @@ packages: resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} - yuku-ast@0.8.7: - resolution: {integrity: sha512-h6+4bDfyootiMB9vckk5uKo5r5j0GHrkr17FQTDNfEsFT3DWlN9uu1HJwQwc64pgmLCI945fWM3lbTIqxjT3GQ==} + yuku-ast@0.9.5: + resolution: {integrity: sha512-Q8qW8WwQnN5Cm0ZZivdRIfv0sRLTjUq0YumXJkw8CYN1aCdICH9rk4C47/4n6kA5EqDtlj+F608twoTSV2MwdQ==} - yuku-codegen@0.8.7: - resolution: {integrity: sha512-adwDZSh8oVDzhE6Du9PwVWxcOxeV0e2EVhUuMKWfhSY4wkrDq9eqixlxFF3l/XGUV1E7UFzhpz9393MUumkyNw==} + yuku-codegen@0.9.5: + resolution: {integrity: sha512-zGUVyDpSK4b6c9B0yyxi2P0wujn1XZTbG9dCb7d6gyAoP63EMgyLzUwPUvwxPG5jgYqhlI7w+S3oCyapqGr4PA==} - yuku-parser@0.8.7: - resolution: {integrity: sha512-vRD9nwt4L3aYpxNqeSC4WqLv58xrXef0Ong1Mc45CTXTIpvLafx7JO05sczmQZwdLEZvywrLOGdNC5+Rp5N1BQ==} + yuku-parser@0.9.5: + resolution: {integrity: sha512-IBnAdNVMswWbJcM7woPluOudectJzFjJ1N8jVRxP9Uq4CIv5hZdBIcdmtRbFDYF/Ph2j2gVup4YJ4N9mh0jYFA==} zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -2812,15 +2784,15 @@ snapshots: '@11ty/gray-matter@2.1.0': dependencies: - js-yaml: 4.3.1 + js-yaml: 4.3.2 section-matter: 1.0.0 '@andrewbranch/untar.js@1.0.4': {} - '@antfu/install-pkg@1.1.0': + '@antfu/install-pkg@2.0.1': dependencies: package-manager-detector: 1.8.0 - tinyexec: 1.3.0 + tinyexec: 1.3.1 '@arethetypeswrong/cli@0.18.5': dependencies: @@ -2880,7 +2852,7 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@conventional-changelog/git-client@3.1.1(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)': + '@conventional-changelog/git-client@3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)': dependencies: '@simple-libs/child-process-utils': 2.0.0 '@simple-libs/stream-utils': 2.0.0 @@ -2889,7 +2861,7 @@ snapshots: conventional-commits-filter: 6.0.1 conventional-commits-parser: 7.1.2 - '@conventional-changelog/template@1.2.1': {} + '@conventional-changelog/template@1.4.0': {} '@docsearch/css@4.7.0': {} @@ -2913,31 +2885,38 @@ snapshots: dependencies: '@hapi/hoek': 11.0.7 - '@iconify-json/logos@1.2.12': + '@iconify-json/logos@1.2.14': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/lucide@1.2.126': + '@iconify-json/lucide@1.2.131': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.93': + '@iconify-json/simple-icons@1.2.95': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/vscode-icons@1.2.70': + '@iconify-json/vscode-icons@1.2.77': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.4': + '@iconify/utils@3.1.7': dependencies: - '@antfu/install-pkg': 1.1.0 + '@antfu/install-pkg': 2.0.1 '@iconify/types': 2.0.0 import-meta-resolve: 4.2.0 - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 '@kwsites/file-exists@1.1.1(supports-color@7.2.0)': dependencies: @@ -2968,91 +2947,91 @@ snapshots: '@mdit-vue/plugin-component@3.0.2': dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 + '@types/markdown-it': 14.2.0 + markdown-it: 14.3.1 '@mdit-vue/plugin-frontmatter@3.0.2': dependencies: '@mdit-vue/types': 3.0.2 - '@types/markdown-it': 14.1.2 + '@types/markdown-it': 14.2.0 gray-matter: 4.0.3 - markdown-it: 14.3.0 + markdown-it: 14.3.1 '@mdit-vue/plugin-headers@3.0.2': dependencies: '@mdit-vue/shared': 3.0.2 '@mdit-vue/types': 3.0.2 - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 + '@types/markdown-it': 14.2.0 + markdown-it: 14.3.1 '@mdit-vue/plugin-sfc@3.0.2': dependencies: '@mdit-vue/types': 3.0.2 - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 + '@types/markdown-it': 14.2.0 + markdown-it: 14.3.1 '@mdit-vue/plugin-title@3.0.2': dependencies: '@mdit-vue/shared': 3.0.2 '@mdit-vue/types': 3.0.2 - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 + '@types/markdown-it': 14.2.0 + markdown-it: 14.3.1 '@mdit-vue/plugin-toc@3.0.2': dependencies: '@mdit-vue/shared': 3.0.2 '@mdit-vue/types': 3.0.2 - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 + '@types/markdown-it': 14.2.0 + markdown-it: 14.3.1 '@mdit-vue/shared@3.0.2': dependencies: '@mdit-vue/types': 3.0.2 - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 + '@types/markdown-it': 14.2.0 + markdown-it: 14.3.1 '@mdit-vue/types@3.0.2': {} - '@mdit/helper@1.0.1(markdown-it@14.3.0)': + '@mdit/helper@1.0.1(markdown-it@14.3.1)': dependencies: - '@types/markdown-it': 14.1.2 + '@types/markdown-it': 14.2.0 optionalDependencies: - markdown-it: 14.3.0 + markdown-it: 14.3.1 - '@mdit/plugin-anchor@1.1.3(markdown-it@14.3.0)': + '@mdit/plugin-anchor@1.1.3(markdown-it@14.3.1)': dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 + '@types/markdown-it': 14.2.0 + markdown-it: 14.3.1 - '@mdit/plugin-attrs@1.1.1(markdown-it@14.3.0)': + '@mdit/plugin-attrs@1.1.1(markdown-it@14.3.1)': dependencies: - '@mdit/helper': 1.0.1(markdown-it@14.3.0) - '@types/markdown-it': 14.1.2 + '@mdit/helper': 1.0.1(markdown-it@14.3.1) + '@types/markdown-it': 14.2.0 optionalDependencies: - markdown-it: 14.3.0 + markdown-it: 14.3.1 - '@mdit/plugin-container@1.0.2(markdown-it@14.3.0)': + '@mdit/plugin-container@1.0.2(markdown-it@14.3.1)': dependencies: - '@types/markdown-it': 14.1.2 + '@types/markdown-it': 14.2.0 optionalDependencies: - markdown-it: 14.3.0 + markdown-it: 14.3.1 - '@mdit/plugin-emoji@1.1.1(markdown-it@14.3.0)': + '@mdit/plugin-emoji@1.1.1(markdown-it@14.3.1)': dependencies: - '@types/markdown-it': 14.1.2 + '@types/markdown-it': 14.2.0 optionalDependencies: - markdown-it: 14.3.0 + markdown-it: 14.3.1 - '@mdit/plugin-footnote@1.0.2(markdown-it@14.3.0)': + '@mdit/plugin-footnote@1.0.2(markdown-it@14.3.1)': dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 + '@types/markdown-it': 14.2.0 + markdown-it: 14.3.1 - '@mdit/plugin-tasklist@1.0.2(markdown-it@14.3.0)': + '@mdit/plugin-tasklist@1.0.2(markdown-it@14.3.1)': dependencies: - '@types/markdown-it': 14.1.2 + '@types/markdown-it': 14.2.0 optionalDependencies: - markdown-it: 14.3.0 + markdown-it: 14.3.1 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -3064,9 +3043,9 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 + fastq: 1.20.3 - '@oxc-project/types@0.146.0': {} + '@oxc-project/types@0.149.0': {} '@polka/compression@1.0.0-next.28': {} @@ -3074,55 +3053,55 @@ snapshots: '@publint/pack@0.1.7': dependencies: - tinyexec: 1.3.0 + tinyexec: 1.3.1 '@quansync/fs@1.0.0': dependencies: quansync: 1.0.0 - '@rolldown/binding-android-arm-eabi@1.2.5': + '@rolldown/binding-android-arm-eabi@1.2.8': optional: true - '@rolldown/binding-android-arm64@1.2.5': + '@rolldown/binding-android-arm64@1.2.8': optional: true - '@rolldown/binding-darwin-arm64@1.2.5': + '@rolldown/binding-darwin-arm64@1.2.8': optional: true - '@rolldown/binding-darwin-x64@1.2.5': + '@rolldown/binding-darwin-x64@1.2.8': optional: true - '@rolldown/binding-freebsd-x64@1.2.5': + '@rolldown/binding-freebsd-x64@1.2.8': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.5': + '@rolldown/binding-linux-arm-gnueabihf@1.2.8': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.5': + '@rolldown/binding-linux-arm64-gnu@1.2.8': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.5': + '@rolldown/binding-linux-arm64-musl@1.2.8': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.5': + '@rolldown/binding-linux-ppc64-gnu@1.2.8': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.5': + '@rolldown/binding-linux-s390x-gnu@1.2.8': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.5': + '@rolldown/binding-linux-x64-gnu@1.2.8': optional: true - '@rolldown/binding-linux-x64-musl@1.2.5': + '@rolldown/binding-linux-x64-musl@1.2.8': optional: true - '@rolldown/binding-openharmony-arm64@1.2.5': + '@rolldown/binding-openharmony-arm64@1.2.8': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.5': + '@rolldown/binding-win32-arm64-msvc@1.2.8': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.5': + '@rolldown/binding-win32-x64-msvc@1.2.8': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -3211,7 +3190,7 @@ snapshots: '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 26.2.0 + '@types/node': 26.5.1 '@types/debug@4.1.13': dependencies: @@ -3233,7 +3212,7 @@ snapshots: dependencies: '@types/jquery': 4.0.1 - '@types/markdown-it@14.1.2': + '@types/markdown-it@14.2.0': dependencies: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 @@ -3248,19 +3227,19 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@24.13.3': + '@types/node@24.13.4': dependencies: undici-types: 7.18.2 - '@types/node@26.2.0': + '@types/node@26.5.1': dependencies: - undici-types: 8.3.0 + undici-types: 8.9.0 '@types/picomatch@4.0.3': {} '@types/sax@1.2.7': dependencies: - '@types/node': 26.2.0 + '@types/node': 26.5.1 '@types/semver@7.8.0': {} @@ -3268,54 +3247,24 @@ snapshots: '@types/web-bluetooth@0.0.21': {} - '@ungap/structured-clone@1.3.3': {} + '@ungap/structured-clone@1.4.0': {} - '@vitejs/plugin-vue@6.0.8(vite@8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0))(vue@3.5.41(typescript@6.0.3))': + '@vitejs/plugin-vue@6.0.8(vite@8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0))(vue@3.5.42(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0) - vue: 3.5.41(typescript@6.0.3) + vite: 8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0) + vue: 3.5.42(typescript@6.0.3) - '@vitest/expect@4.1.10': + '@vitest/mocker@5.0.0(vite@8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0))': dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - chai: 6.2.2 - tinyrainbow: 3.1.1 - - '@vitest/mocker@4.1.10(vite@8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 4.1.10 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.0 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 1.3.1 optionalDependencies: - vite: 8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0) - - '@vitest/pretty-format@4.1.10': - dependencies: - tinyrainbow: 3.1.1 - - '@vitest/runner@4.1.10': - dependencies: - '@vitest/utils': 4.1.10 - pathe: 2.0.3 + vite: 8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0) - '@vitest/snapshot@4.1.10': - dependencies: - '@vitest/pretty-format': 4.1.10 - '@vitest/utils': 4.1.10 - magic-string: 0.30.21 - pathe: 2.0.3 - - '@vitest/spy@4.1.10': {} - - '@vitest/utils@4.1.10': - dependencies: - '@vitest/pretty-format': 4.1.10 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.1 + '@vitest/spy@5.0.0': {} '@volar/language-core@2.4.28': dependencies: @@ -3327,39 +3276,39 @@ snapshots: dependencies: '@volar/language-core': 2.4.28 path-browserify: 1.0.1 - vscode-uri: 3.1.0 + vscode-uri: 3.2.0 optionalDependencies: typescript: 6.0.3 - '@vue/compiler-core@3.5.41': + '@vue/compiler-core@3.5.42': dependencies: '@babel/parser': 7.29.8 - '@vue/shared': 3.5.41 + '@vue/shared': 3.5.42 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.41': + '@vue/compiler-dom@3.5.42': dependencies: - '@vue/compiler-core': 3.5.41 - '@vue/shared': 3.5.41 + '@vue/compiler-core': 3.5.42 + '@vue/shared': 3.5.42 - '@vue/compiler-sfc@3.5.41': + '@vue/compiler-sfc@3.5.42': dependencies: '@babel/parser': 7.29.8 - '@vue/compiler-core': 3.5.41 - '@vue/compiler-dom': 3.5.41 - '@vue/compiler-ssr': 3.5.41 - '@vue/shared': 3.5.41 + '@vue/compiler-core': 3.5.42 + '@vue/compiler-dom': 3.5.42 + '@vue/compiler-ssr': 3.5.42 + '@vue/shared': 3.5.42 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.26 + postcss: 8.5.28 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.41': + '@vue/compiler-ssr@3.5.42': dependencies: - '@vue/compiler-dom': 3.5.41 - '@vue/shared': 3.5.41 + '@vue/compiler-dom': 3.5.42 + '@vue/shared': 3.5.42 '@vue/devtools-api@8.2.1': dependencies: @@ -3377,134 +3326,134 @@ snapshots: '@vue/language-core@3.3.11': dependencies: '@volar/language-core': 2.4.28 - '@vue/compiler-dom': 3.5.41 - '@vue/shared': 3.5.41 + '@vue/compiler-dom': 3.5.42 + '@vue/shared': 3.5.42 alien-signals: 3.2.1 muggle-string: 0.4.1 path-browserify: 1.0.1 - picomatch: 4.0.5 + picomatch: 4.0.7 - '@vue/reactivity@3.5.41': + '@vue/reactivity@3.5.42': dependencies: - '@vue/shared': 3.5.41 + '@vue/shared': 3.5.42 - '@vue/runtime-core@3.5.41': + '@vue/runtime-core@3.5.42': dependencies: - '@vue/reactivity': 3.5.41 - '@vue/shared': 3.5.41 + '@vue/reactivity': 3.5.42 + '@vue/shared': 3.5.42 - '@vue/runtime-dom@3.5.41': + '@vue/runtime-dom@3.5.42': dependencies: - '@vue/reactivity': 3.5.41 - '@vue/runtime-core': 3.5.41 - '@vue/shared': 3.5.41 + '@vue/reactivity': 3.5.42 + '@vue/runtime-core': 3.5.42 + '@vue/shared': 3.5.42 csstype: 3.2.3 - '@vue/server-renderer@3.5.41': + '@vue/server-renderer@3.5.42': dependencies: - '@vue/compiler-ssr': 3.5.41 - '@vue/runtime-dom': 3.5.41 - '@vue/shared': 3.5.41 + '@vue/compiler-ssr': 3.5.42 + '@vue/runtime-dom': 3.5.42 + '@vue/shared': 3.5.42 - '@vue/shared@3.5.41': {} + '@vue/shared@3.5.42': {} - '@vueuse/core@14.4.0(vue@3.5.41(typescript@6.0.3))': + '@vueuse/core@14.4.0(vue@3.5.42(typescript@6.0.3))': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 14.4.0 - '@vueuse/shared': 14.4.0(vue@3.5.41(typescript@6.0.3)) - vue: 3.5.41(typescript@6.0.3) + '@vueuse/shared': 14.4.0(vue@3.5.42(typescript@6.0.3)) + vue: 3.5.42(typescript@6.0.3) - '@vueuse/integrations@14.4.0(axios@1.19.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0))(focus-trap@8.2.2)(vue@3.5.41(typescript@6.0.3))': + '@vueuse/integrations@14.4.0(axios@1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0))(focus-trap@8.2.2)(vue@3.5.42(typescript@6.0.3))': dependencies: - '@vueuse/core': 14.4.0(vue@3.5.41(typescript@6.0.3)) - '@vueuse/shared': 14.4.0(vue@3.5.41(typescript@6.0.3)) - vue: 3.5.41(typescript@6.0.3) + '@vueuse/core': 14.4.0(vue@3.5.42(typescript@6.0.3)) + '@vueuse/shared': 14.4.0(vue@3.5.42(typescript@6.0.3)) + vue: 3.5.42(typescript@6.0.3) optionalDependencies: - axios: 1.19.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + axios: 1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) focus-trap: 8.2.2 '@vueuse/metadata@14.4.0': {} - '@vueuse/shared@14.4.0(vue@3.5.41(typescript@6.0.3))': + '@vueuse/shared@14.4.0(vue@3.5.42(typescript@6.0.3))': dependencies: - vue: 3.5.41(typescript@6.0.3) + vue: 3.5.42(typescript@6.0.3) '@xmldom/xmldom@0.9.10': {} - '@yuku-codegen/binding-android-arm64@0.8.7': + '@yuku-codegen/binding-android-arm64@0.9.5': optional: true - '@yuku-codegen/binding-darwin-arm64@0.8.7': + '@yuku-codegen/binding-darwin-arm64@0.9.5': optional: true - '@yuku-codegen/binding-darwin-x64@0.8.7': + '@yuku-codegen/binding-darwin-x64@0.9.5': optional: true - '@yuku-codegen/binding-freebsd-x64@0.8.7': + '@yuku-codegen/binding-freebsd-x64@0.9.5': optional: true - '@yuku-codegen/binding-linux-arm-gnu@0.8.7': + '@yuku-codegen/binding-linux-arm-gnu@0.9.5': optional: true - '@yuku-codegen/binding-linux-arm-musl@0.8.7': + '@yuku-codegen/binding-linux-arm-musl@0.9.5': optional: true - '@yuku-codegen/binding-linux-arm64-gnu@0.8.7': + '@yuku-codegen/binding-linux-arm64-gnu@0.9.5': optional: true - '@yuku-codegen/binding-linux-arm64-musl@0.8.7': + '@yuku-codegen/binding-linux-arm64-musl@0.9.5': optional: true - '@yuku-codegen/binding-linux-x64-gnu@0.8.7': + '@yuku-codegen/binding-linux-x64-gnu@0.9.5': optional: true - '@yuku-codegen/binding-linux-x64-musl@0.8.7': + '@yuku-codegen/binding-linux-x64-musl@0.9.5': optional: true - '@yuku-codegen/binding-win32-arm64@0.8.7': + '@yuku-codegen/binding-win32-arm64@0.9.5': optional: true - '@yuku-codegen/binding-win32-x64@0.8.7': + '@yuku-codegen/binding-win32-x64@0.9.5': optional: true - '@yuku-parser/binding-android-arm64@0.8.7': + '@yuku-parser/binding-android-arm64@0.9.5': optional: true - '@yuku-parser/binding-darwin-arm64@0.8.7': + '@yuku-parser/binding-darwin-arm64@0.9.5': optional: true - '@yuku-parser/binding-darwin-x64@0.8.7': + '@yuku-parser/binding-darwin-x64@0.9.5': optional: true - '@yuku-parser/binding-freebsd-x64@0.8.7': + '@yuku-parser/binding-freebsd-x64@0.9.5': optional: true - '@yuku-parser/binding-linux-arm-gnu@0.8.7': + '@yuku-parser/binding-linux-arm-gnu@0.9.5': optional: true - '@yuku-parser/binding-linux-arm-musl@0.8.7': + '@yuku-parser/binding-linux-arm-musl@0.9.5': optional: true - '@yuku-parser/binding-linux-arm64-gnu@0.8.7': + '@yuku-parser/binding-linux-arm64-gnu@0.9.5': optional: true - '@yuku-parser/binding-linux-arm64-musl@0.8.7': + '@yuku-parser/binding-linux-arm64-musl@0.9.5': optional: true - '@yuku-parser/binding-linux-x64-gnu@0.8.7': + '@yuku-parser/binding-linux-x64-gnu@0.9.5': optional: true - '@yuku-parser/binding-linux-x64-musl@0.8.7': + '@yuku-parser/binding-linux-x64-musl@0.9.5': optional: true - '@yuku-parser/binding-win32-arm64@0.8.7': + '@yuku-parser/binding-win32-arm64@0.9.5': optional: true - '@yuku-parser/binding-win32-x64@0.8.7': + '@yuku-parser/binding-win32-x64@0.9.5': optional: true - '@yuku-toolchain/types@0.8.7': {} + '@yuku-toolchain/types@0.9.5': {} agent-base@6.0.2(supports-color@7.2.0): dependencies: @@ -3522,14 +3471,12 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} + ansi-regex@6.3.0: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansis@4.3.1: {} - any-promise@1.3.0: {} arg@5.0.2: {} @@ -3540,13 +3487,13 @@ snapshots: argparse@2.0.1: {} - argue-cli@3.1.0: {} + argue-cli@3.2.0: {} assertion-error@2.0.1: {} asynckit@0.4.0: {} - axios@1.19.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): + axios@1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): dependencies: follow-redirects: 1.16.0(debug@4.4.3(supports-color@7.2.0)) form-data: 4.0.6 @@ -3673,41 +3620,38 @@ snapshots: commander@6.2.1: {} - conventional-changelog-angular@9.2.1: + conventional-changelog-angular@9.4.0: dependencies: - '@conventional-changelog/template': 1.2.1 + '@conventional-changelog/template': 1.4.0 conventional-changelog-preset-loader@6.0.1: {} - conventional-changelog-writer@9.2.0: + conventional-changelog-writer@9.2.1: dependencies: - '@conventional-changelog/template': 1.2.1 + '@conventional-changelog/template': 1.4.0 '@simple-libs/stream-utils': 2.0.0 - argue-cli: 3.1.0 + argue-cli: 3.2.0 conventional-commits-filter: 6.0.1 semver: 7.8.5 - conventional-changelog@8.1.1(conventional-commits-filter@6.0.1): + conventional-changelog@8.1.3: dependencies: - '@conventional-changelog/git-client': 3.1.1(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2) + '@conventional-changelog/git-client': 3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2) '@simple-libs/hosted-git-info': 2.0.0 '@simple-libs/normalize-package-data': 1.0.0 - argue-cli: 3.1.0 + argue-cli: 3.2.0 conventional-changelog-preset-loader: 6.0.1 - conventional-changelog-writer: 9.2.0 + conventional-changelog-writer: 9.2.1 + conventional-commits-filter: 6.0.1 conventional-commits-parser: 7.1.2 fd-package-json: 2.0.0 - transitivePeerDependencies: - - conventional-commits-filter conventional-commits-filter@6.0.1: {} conventional-commits-parser@7.1.2: dependencies: '@simple-libs/stream-utils': 2.0.0 - argue-cli: 3.1.0 - - convert-source-map@2.0.0: {} + argue-cli: 3.2.0 cross-spawn@7.0.6: dependencies: @@ -3745,7 +3689,7 @@ snapshots: default-browser-id@5.0.1: {} - default-browser@5.5.0: + default-browser@5.5.1: dependencies: bundle-name: 4.1.0 default-browser-id: 5.0.1 @@ -3812,7 +3756,7 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@2.3.1: {} + es-module-lexer@2.3.2: {} es-object-atoms@1.1.2: dependencies: @@ -3869,7 +3813,7 @@ snapshots: dependencies: fast-string-width: 3.0.2 - fastq@1.20.1: + fastq@1.20.3: dependencies: reusify: 1.1.0 @@ -3881,9 +3825,9 @@ snapshots: dependencies: walk-up-path: 4.0.0 - fdir@6.5.0(picomatch@4.0.5): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.5 + picomatch: 4.0.7 fflate@0.8.3: {} @@ -3949,7 +3893,7 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 - get-tsconfig@5.0.0-beta.5: + get-tsconfig@5.0.0-beta.6: dependencies: resolve-pkg-maps: 1.0.0 @@ -3961,7 +3905,7 @@ snapshots: gray-matter@4.0.3: dependencies: - js-yaml: 3.15.1 + js-yaml: 3.15.2 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 @@ -4069,7 +4013,7 @@ snapshots: jiti@1.21.7: {} - joi@18.2.3: + joi@18.2.8: dependencies: '@hapi/address': 5.1.1 '@hapi/formula': 3.0.2 @@ -4079,12 +4023,12 @@ snapshots: '@hapi/topo': 6.0.2 '@standard-schema/spec': 1.1.0 - js-yaml@3.15.1: + js-yaml@3.15.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.3.1: + js-yaml@4.3.2: dependencies: argparse: 2.0.1 @@ -4153,11 +4097,11 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@17.3.0: + lint-staged@17.5.1: dependencies: - picomatch: 4.0.5 + picomatch: 4.0.7 string-argv: 0.3.2 - tinyexec: 1.3.0 + tinyexec: 1.3.1 optionalDependencies: yaml: 2.9.0 @@ -4174,21 +4118,25 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 + + magic-string@1.3.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 mark.js@8.11.1: {} markdown-it-async@2.2.0: dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 + '@types/markdown-it': 14.2.0 + markdown-it: 14.3.1 - markdown-it-cjk-friendly@2.0.2(@types/markdown-it@14.1.2)(markdown-it@14.3.0): + markdown-it-cjk-friendly@2.0.3(@types/markdown-it@14.2.0)(markdown-it@14.3.1): dependencies: get-east-asian-width: 1.6.0 - markdown-it: 14.3.0 + markdown-it: 14.3.1 optionalDependencies: - '@types/markdown-it': 14.1.2 + '@types/markdown-it': 14.2.0 markdown-it-mathjax3@4.3.2: dependencies: @@ -4197,7 +4145,7 @@ snapshots: transitivePeerDependencies: - encoding - markdown-it@14.3.0: + markdown-it@14.3.1: dependencies: argparse: 2.0.1 entities: 4.5.0 @@ -4211,7 +4159,7 @@ snapshots: marked-terminal@7.3.0(marked@9.1.6): dependencies: ansi-escapes: 7.3.0 - ansi-regex: 6.2.2 + ansi-regex: 6.3.0 chalk: 5.6.2 cli-highlight: 2.1.11 cli-table3: 0.6.5 @@ -4267,7 +4215,7 @@ snapshots: dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.3 + '@ungap/structured-clone': 1.4.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -4484,7 +4432,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.18: {} + nanoid@3.3.19: {} nanoid@6.0.1: {} @@ -4505,7 +4453,7 @@ snapshots: object-assign@4.1.1: {} - obug@2.1.4: {} + obug@2.2.1: {} onetime@7.0.0: dependencies: @@ -4523,19 +4471,19 @@ snapshots: dependencies: file-type: 21.3.4(supports-color@7.2.0) meow: 14.1.0 - open: 11.0.0 + open: 11.0.2 tempy: 3.2.0 transitivePeerDependencies: - supports-color - open@11.0.0: + open@11.0.2: dependencies: - default-browser: 5.5.0 + default-browser: 5.5.1 define-lazy-prop: 3.0.0 is-in-ssh: 1.0.0 is-inside-container: 1.0.0 - powershell-utils: 0.1.0 - wsl-utils: 0.3.1 + powershell-utils: 0.2.1 + wsl-utils: 1.0.0 ora@9.4.1: dependencies: @@ -4548,7 +4496,7 @@ snapshots: stdin-discarder: 0.3.2 string-width: 8.2.2 - p-map@7.0.6: {} + p-map@7.0.7: {} package-directory@8.2.0: dependencies: @@ -4570,48 +4518,43 @@ snapshots: path-to-regexp@6.3.0: {} - pathe@2.0.3: {} - perfect-debounce@2.1.0: {} picocolors@1.1.1: {} picomatch@2.3.2: {} - picomatch@4.0.5: {} + picomatch@4.0.7: {} - playwright-chromium@1.62.1: + playwright-chromium@1.63.0: dependencies: - playwright-core: 1.62.1 + playwright-core: 1.63.0 - playwright-core@1.62.1: {} + playwright-core@1.63.0: {} polka@1.0.0-next.28: dependencies: '@polka/url': 1.0.0-next.29 trouter: 4.0.0 - postcss-rtlcss@6.0.0(postcss@8.5.26): - dependencies: - postcss: 8.5.26 - rtlcss: 4.3.0 - - postcss-selector-parser@7.1.5: + postcss-selector-parser@7.1.6: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.26: + postcss@8.5.28: dependencies: - nanoid: 3.3.18 + nanoid: 3.3.19 picocolors: 1.1.1 source-map-js: 1.2.1 powershell-utils@0.1.0: {} + powershell-utils@0.2.1: {} + prettier@3.9.6: {} - pretty-bytes@7.1.1: {} + pretty-bytes@7.1.3: {} property-information@7.2.0: {} @@ -4686,15 +4629,15 @@ snapshots: reusify@1.1.0: {} - rolldown-plugin-dts@0.27.14(@volar/typescript@2.4.28(typescript@6.0.3))(rolldown@1.2.5)(typescript@6.0.3)(vue-tsc@3.3.11(typescript@6.0.3)): + rolldown-plugin-dts@0.28.5(@volar/typescript@2.4.28(typescript@6.0.3))(rolldown@1.2.8)(typescript@6.0.3)(vue-tsc@3.3.11(typescript@6.0.3)): dependencies: dts-resolver: 3.0.0 - get-tsconfig: 5.0.0-beta.5 - obug: 2.1.4 - rolldown: 1.2.5 - yuku-ast: 0.8.7 - yuku-codegen: 0.8.7 - yuku-parser: 0.8.7 + get-tsconfig: 5.0.0-beta.6 + obug: 2.2.1 + rolldown: 1.2.8 + yuku-ast: 0.9.5 + yuku-codegen: 0.9.5 + yuku-parser: 0.9.5 optionalDependencies: '@volar/typescript': 2.4.28(typescript@6.0.3) typescript: 6.0.3 @@ -4702,33 +4645,26 @@ snapshots: transitivePeerDependencies: - oxc-resolver - rolldown@1.2.5: + rolldown@1.2.8: dependencies: - '@oxc-project/types': 0.146.0 + '@oxc-project/types': 0.149.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.5 - '@rolldown/binding-android-arm64': 1.2.5 - '@rolldown/binding-darwin-arm64': 1.2.5 - '@rolldown/binding-darwin-x64': 1.2.5 - '@rolldown/binding-freebsd-x64': 1.2.5 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.5 - '@rolldown/binding-linux-arm64-gnu': 1.2.5 - '@rolldown/binding-linux-arm64-musl': 1.2.5 - '@rolldown/binding-linux-ppc64-gnu': 1.2.5 - '@rolldown/binding-linux-s390x-gnu': 1.2.5 - '@rolldown/binding-linux-x64-gnu': 1.2.5 - '@rolldown/binding-linux-x64-musl': 1.2.5 - '@rolldown/binding-openharmony-arm64': 1.2.5 - '@rolldown/binding-win32-arm64-msvc': 1.2.5 - '@rolldown/binding-win32-x64-msvc': 1.2.5 - - rtlcss@4.3.0: - dependencies: - escalade: 3.2.0 - picocolors: 1.1.1 - postcss: 8.5.26 - strip-json-comments: 3.1.1 + '@rolldown/binding-android-arm-eabi': 1.2.8 + '@rolldown/binding-android-arm64': 1.2.8 + '@rolldown/binding-darwin-arm64': 1.2.8 + '@rolldown/binding-darwin-x64': 1.2.8 + '@rolldown/binding-freebsd-x64': 1.2.8 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.8 + '@rolldown/binding-linux-arm64-gnu': 1.2.8 + '@rolldown/binding-linux-arm64-musl': 1.2.8 + '@rolldown/binding-linux-ppc64-gnu': 1.2.8 + '@rolldown/binding-linux-s390x-gnu': 1.2.8 + '@rolldown/binding-linux-x64-gnu': 1.2.8 + '@rolldown/binding-linux-x64-musl': 1.2.8 + '@rolldown/binding-openharmony-arm64': 1.2.8 + '@rolldown/binding-win32-arm64-msvc': 1.2.8 + '@rolldown/binding-win32-x64-msvc': 1.2.8 run-applescript@7.1.0: {} @@ -4774,7 +4710,7 @@ snapshots: signal-exit@4.1.0: {} - simple-git-hooks@2.13.1: {} + simple-git-hooks@2.14.0: {} simple-git@3.36.0(supports-color@7.2.0): dependencies: @@ -4796,7 +4732,7 @@ snapshots: sitemap@9.0.1: dependencies: - '@types/node': 24.13.3 + '@types/node': 24.13.4 '@types/sax': 1.2.7 arg: 5.0.2 sax: 1.6.1 @@ -4849,12 +4785,10 @@ snapshots: strip-ansi@7.2.0: dependencies: - ansi-regex: 6.2.2 + ansi-regex: 6.3.0 strip-bom-string@1.0.0: {} - strip-json-comments@3.1.1: {} - strtok3@10.3.5: dependencies: '@tokenizer/token': 0.3.0 @@ -4887,16 +4821,16 @@ snapshots: dependencies: any-promise: 1.3.0 - tinybench@2.9.0: {} + tinybench@6.1.4: {} tinyexec@1.3.0: {} + tinyexec@1.3.1: {} + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 - - tinyrainbow@3.1.1: {} + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 to-regex-range@5.0.1: dependencies: @@ -4924,23 +4858,22 @@ snapshots: dependencies: regexparam: 3.0.0 - tsdown@0.22.14(@arethetypeswrong/core@0.18.5)(@volar/typescript@2.4.28(typescript@6.0.3))(publint@0.3.24)(typescript@6.0.3)(vue-tsc@3.3.11(typescript@6.0.3)): + tsdown@0.23.0(@arethetypeswrong/core@0.18.5)(@volar/typescript@2.4.28(typescript@6.0.3))(publint@0.3.24)(typescript@6.0.3)(vue-tsc@3.3.11(typescript@6.0.3)): dependencies: - ansis: 4.3.1 cac: 7.0.0 defu: 6.1.7 empathic: 2.0.1 hookable: 6.1.1 import-without-cache: 0.4.0 - obug: 2.1.4 - picomatch: 4.0.5 - rolldown: 1.2.5 - rolldown-plugin-dts: 0.27.14(@volar/typescript@2.4.28(typescript@6.0.3))(rolldown@1.2.5)(typescript@6.0.3)(vue-tsc@3.3.11(typescript@6.0.3)) - tinyexec: 1.3.0 + obug: 2.2.1 + picomatch: 4.0.7 + rolldown: 1.2.8 + rolldown-plugin-dts: 0.28.5(@volar/typescript@2.4.28(typescript@6.0.3))(rolldown@1.2.8)(typescript@6.0.3)(vue-tsc@3.3.11(typescript@6.0.3)) + tinyexec: 1.3.1 tinyglobby: 0.2.17 tree-kill: 1.2.2 unconfig-core: 7.5.0 - verkit: 0.3.2 + verkit: 0.4.0 optionalDependencies: '@arethetypeswrong/core': 0.18.5 publint: 0.3.24 @@ -4974,7 +4907,7 @@ snapshots: undici-types@7.18.2: {} - undici-types@8.3.0: {} + undici-types@8.9.0: {} unicode-emoji-modifier-base@1.0.0: {} @@ -5027,7 +4960,7 @@ snapshots: validate-npm-package-name@5.0.1: {} - verkit@0.3.2: {} + verkit@0.4.0: {} vfile-message@4.0.3: dependencies: @@ -5039,38 +4972,38 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0): + vite@8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.5 - postcss: 8.5.26 - rolldown: 1.2.5 + picomatch: 4.0.7 + postcss: 8.5.28 + rolldown: 1.2.8 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.2.0 + '@types/node': 26.5.1 fsevents: 2.3.3 jiti: 1.21.7 yaml: 2.9.0 - vitepress-plugin-group-icons@1.7.6(vite@8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0)): + vitepress-plugin-group-icons@1.7.6(vite@8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0)): dependencies: - '@iconify-json/logos': 1.2.12 - '@iconify-json/vscode-icons': 1.2.70 - '@iconify/utils': 3.1.4 + '@iconify-json/logos': 1.2.14 + '@iconify-json/vscode-icons': 1.2.77 + '@iconify/utils': 3.1.7 optionalDependencies: - vite: 8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0) + vite: 8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0) - vitepress-plugin-llms@1.13.4(supports-color@7.2.0): + vitepress-plugin-llms@1.13.5(supports-color@7.2.0): dependencies: '@11ty/gray-matter': 2.1.0 - markdown-it: 14.3.0 + markdown-it: 14.3.1 markdown-title: 1.0.2 mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) millify: 6.1.0 minimatch: 10.2.6 path-to-regexp: 6.3.0 picocolors: 1.1.1 - pretty-bytes: 7.1.1 + pretty-bytes: 7.1.3 remark: 15.0.1(supports-color@7.2.0) remark-frontmatter: 5.0.0(supports-color@7.2.0) tokenx: 1.6.0 @@ -5079,46 +5012,38 @@ snapshots: transitivePeerDependencies: - supports-color - vitest@4.1.10(@types/node@26.2.0)(vite@8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0)): + vitest@5.0.0(@types/node@26.5.1)(vite@8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - es-module-lexer: 2.3.1 + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.0(vite@8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0)) + chai: 6.2.2 + es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 0.30.21 - obug: 2.1.4 - pathe: 2.0.3 - picomatch: 4.0.5 + magic-string: 1.3.1 + obug: 2.2.1 + picomatch: 4.0.7 std-env: 4.2.0 - tinybench: 2.9.0 + tinybench: 6.1.4 tinyexec: 1.3.0 tinyglobby: 0.2.17 - tinyrainbow: 3.1.1 - vite: 8.2.2(@types/node@26.2.0)(jiti@1.21.7)(yaml@2.9.0) + vite: 8.3.0(@types/node@26.5.1)(jiti@1.21.7)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 26.2.0 + '@types/node': 26.5.1 transitivePeerDependencies: - msw - vscode-uri@3.1.0: {} + vscode-uri@3.2.0: {} - vue-sfc-transformer@0.2.5(patch_hash=06dbce7d98fac77faf5e66a94aa6e04f34c0cc7ec0910ec10848e5f2e08b8b68)(@volar/typescript@2.4.28(typescript@6.0.3))(@vue/compiler-core@3.5.41)(@vue/language-core@3.3.11)(rolldown@1.2.5)(typescript@6.0.3)(vue@3.5.41(typescript@6.0.3)): + vue-sfc-transformer@0.3.0(@volar/typescript@2.4.28(typescript@6.0.3))(@vue/compiler-core@3.5.42)(@vue/language-core@3.3.11)(rolldown@1.2.8)(typescript@6.0.3)(vue@3.5.42(typescript@6.0.3)): dependencies: - '@babel/parser': 7.29.8 - '@vue/compiler-core': 3.5.41 - pathe: 2.0.3 + '@vue/compiler-core': 3.5.42 tinyglobby: 0.2.17 - vue: 3.5.41(typescript@6.0.3) + vue: 3.5.42(typescript@6.0.3) optionalDependencies: '@volar/typescript': 2.4.28(typescript@6.0.3) '@vue/language-core': 3.3.11 - rolldown: 1.2.5 + rolldown: 1.2.8 typescript: 6.0.3 vue-tsc@3.3.11(typescript@6.0.3): @@ -5127,20 +5052,20 @@ snapshots: '@vue/language-core': 3.3.11 typescript: 6.0.3 - vue@3.5.41(typescript@6.0.3): + vue@3.5.42(typescript@6.0.3): dependencies: - '@vue/compiler-dom': 3.5.41 - '@vue/compiler-sfc': 3.5.41 - '@vue/runtime-dom': 3.5.41 - '@vue/server-renderer': 3.5.41 - '@vue/shared': 3.5.41 + '@vue/compiler-dom': 3.5.42 + '@vue/compiler-sfc': 3.5.42 + '@vue/runtime-dom': 3.5.42 + '@vue/server-renderer': 3.5.42 + '@vue/shared': 3.5.42 optionalDependencies: typescript: 6.0.3 wait-on@9.1.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - axios: 1.19.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) - joi: 18.2.3 + axios: 1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + joi: 18.2.8 lodash: 4.18.1 minimist: 1.2.8 rxjs: 7.8.2 @@ -5185,7 +5110,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wsl-utils@0.3.1: + wsl-utils@1.0.0: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 @@ -5221,44 +5146,44 @@ snapshots: yoctocolors@2.2.0: {} - yuku-ast@0.8.7: + yuku-ast@0.9.5: dependencies: - '@yuku-toolchain/types': 0.8.7 + '@yuku-toolchain/types': 0.9.5 - yuku-codegen@0.8.7: + yuku-codegen@0.9.5: dependencies: - '@yuku-toolchain/types': 0.8.7 + '@yuku-toolchain/types': 0.9.5 optionalDependencies: - '@yuku-codegen/binding-android-arm64': 0.8.7 - '@yuku-codegen/binding-darwin-arm64': 0.8.7 - '@yuku-codegen/binding-darwin-x64': 0.8.7 - '@yuku-codegen/binding-freebsd-x64': 0.8.7 - '@yuku-codegen/binding-linux-arm-gnu': 0.8.7 - '@yuku-codegen/binding-linux-arm-musl': 0.8.7 - '@yuku-codegen/binding-linux-arm64-gnu': 0.8.7 - '@yuku-codegen/binding-linux-arm64-musl': 0.8.7 - '@yuku-codegen/binding-linux-x64-gnu': 0.8.7 - '@yuku-codegen/binding-linux-x64-musl': 0.8.7 - '@yuku-codegen/binding-win32-arm64': 0.8.7 - '@yuku-codegen/binding-win32-x64': 0.8.7 - - yuku-parser@0.8.7: - dependencies: - '@yuku-toolchain/types': 0.8.7 - yuku-ast: 0.8.7 + '@yuku-codegen/binding-android-arm64': 0.9.5 + '@yuku-codegen/binding-darwin-arm64': 0.9.5 + '@yuku-codegen/binding-darwin-x64': 0.9.5 + '@yuku-codegen/binding-freebsd-x64': 0.9.5 + '@yuku-codegen/binding-linux-arm-gnu': 0.9.5 + '@yuku-codegen/binding-linux-arm-musl': 0.9.5 + '@yuku-codegen/binding-linux-arm64-gnu': 0.9.5 + '@yuku-codegen/binding-linux-arm64-musl': 0.9.5 + '@yuku-codegen/binding-linux-x64-gnu': 0.9.5 + '@yuku-codegen/binding-linux-x64-musl': 0.9.5 + '@yuku-codegen/binding-win32-arm64': 0.9.5 + '@yuku-codegen/binding-win32-x64': 0.9.5 + + yuku-parser@0.9.5: + dependencies: + '@yuku-toolchain/types': 0.9.5 + yuku-ast: 0.9.5 optionalDependencies: - '@yuku-parser/binding-android-arm64': 0.8.7 - '@yuku-parser/binding-darwin-arm64': 0.8.7 - '@yuku-parser/binding-darwin-x64': 0.8.7 - '@yuku-parser/binding-freebsd-x64': 0.8.7 - '@yuku-parser/binding-linux-arm-gnu': 0.8.7 - '@yuku-parser/binding-linux-arm-musl': 0.8.7 - '@yuku-parser/binding-linux-arm64-gnu': 0.8.7 - '@yuku-parser/binding-linux-arm64-musl': 0.8.7 - '@yuku-parser/binding-linux-x64-gnu': 0.8.7 - '@yuku-parser/binding-linux-x64-musl': 0.8.7 - '@yuku-parser/binding-win32-arm64': 0.8.7 - '@yuku-parser/binding-win32-x64': 0.8.7 + '@yuku-parser/binding-android-arm64': 0.9.5 + '@yuku-parser/binding-darwin-arm64': 0.9.5 + '@yuku-parser/binding-darwin-x64': 0.9.5 + '@yuku-parser/binding-freebsd-x64': 0.9.5 + '@yuku-parser/binding-linux-arm-gnu': 0.9.5 + '@yuku-parser/binding-linux-arm-musl': 0.9.5 + '@yuku-parser/binding-linux-arm64-gnu': 0.9.5 + '@yuku-parser/binding-linux-arm64-musl': 0.9.5 + '@yuku-parser/binding-linux-x64-gnu': 0.9.5 + '@yuku-parser/binding-linux-x64-musl': 0.9.5 + '@yuku-parser/binding-win32-arm64': 0.9.5 + '@yuku-parser/binding-win32-x64': 0.9.5 zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7feb78ec5..208e7ce89 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -15,9 +15,6 @@ minimumReleaseAge: 1440 overrides: esbuild: '-' -patchedDependencies: - vue-sfc-transformer: patches/vue-sfc-transformer.patch - shellEmulator: true strictPeerDependencies: true diff --git a/scripts/release.ts b/scripts/release.ts index 3d861c1bb..f6da9f844 100644 --- a/scripts/release.ts +++ b/scripts/release.ts @@ -8,7 +8,7 @@ import * as prompts from '@clack/prompts' import { spawn } from 'cross-spawn' import semver from 'semver' -import { version as currentVersion } from '../package.json' with { type: 'json' } +import pkg from '../package.json' with { type: 'json' } const { inc: _inc, valid } = semver @@ -17,7 +17,7 @@ const versionIncrements = ['patch', 'minor', 'major'] as const const tags = ['latest', 'next'] as const const dir = fileURLToPath(new URL('.', import.meta.url)) -const inc = (i: semver.ReleaseType) => _inc(currentVersion, i) +const inc = (i: semver.ReleaseType) => _inc(pkg.version, i) const run = async (bin: string, args: string[], opts: SpawnOptions = {}) => { const child = spawn(bin, args, { stdio: 'inherit', ...opts }) const [code, signal] = (await once(child, 'close')) as [ @@ -50,7 +50,7 @@ async function main() { if (release === 3) { const customVersion = await prompts.text({ message: 'Input custom version', - initialValue: currentVersion + initialValue: pkg.version }) if (prompts.isCancel(customVersion)) return cancel() targetVersion = customVersion diff --git a/scripts/subsetFonts.py b/scripts/subsetFonts.py index e017558de..dbcf3d89c 100755 --- a/scripts/subsetFonts.py +++ b/scripts/subsetFonts.py @@ -57,11 +57,18 @@ BASE_VAR = """\ # got a chance to pick the right CJK font. The names below cover the defaults # of macOS / Windows / Linux (fonts-noto-cjk); families that are not installed # are simply skipped, and sites can splice a CJK webfont between 'Inter Core' -# and the system families. Bare zh means Hans per BCP 47 likely subtags, and -# with no Traditional Chinese rule it also covers zh-Hant/zh-TW/zh-HK/zh-MO -# pages. If Hant handling is ever requested, add after the zh rule (same -# specificity, so the later rule wins; the region tags must be enumerated -# because `:lang(zh-Hant)` cannot match e.g. `lang="zh-TW"`): +# and the system families. Unlike the base stack, these do not name +# -apple-system: WebKit expands it into the system font plus CoreText's whole +# cascade list and walks that list with each font's full character map, which +# on macOS 26 / iOS 26 hands the symbols missing from the reduced PingFang +# (U+FF5C, ①, ★, ※, ...) to Apple Symbols or the Japanese UI font at a +# single weight. The CJK_FALLBACK_ANCHOR faces route them through the +# language-aware system fallback instead. Bare zh means Hans per BCP 47 +# likely subtags, and with no Traditional Chinese rule it also covers +# zh-Hant/zh-TW/zh-HK/zh-MO pages. If Hant handling is ever requested, add +# after the zh rule (same specificity, so the later rule wins; the region +# tags must be enumerated because `:lang(zh-Hant)` cannot match e.g. +# `lang="zh-TW"`): # [lang]:where(:lang(zh-Hant), :lang(zh-TW), :lang(zh-HK), :lang(zh-MO)) { # --vp-font-family-base: # 'Inter Core', 'PingFang TC', 'Microsoft JhengHei', 'Noto Sans CJK TC', @@ -72,22 +79,55 @@ CJK_BASE_VAR = """\ [lang]:where(:lang(zh)) { --vp-font-family-base: 'Inter Core', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans CJK SC', - -apple-system, BlinkMacSystemFont, sans-serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + BlinkMacSystemFont, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; } [lang]:where(:lang(ja)) { --vp-font-family-base: 'Inter Core', 'Hiragino Sans', 'Meiryo', 'Yu Gothic', 'Noto Sans CJK JP', - -apple-system, BlinkMacSystemFont, sans-serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + BlinkMacSystemFont, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; } [lang]:where(:lang(ko)) { --vp-font-family-base: 'Inter Core', 'Apple SD Gothic Neo', 'Malgun Gothic', 'Noto Sans CJK KR', - -apple-system, BlinkMacSystemFont, sans-serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + BlinkMacSystemFont, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; +} +""" + +# macOS 26 / iOS 26 ship two copies of PingFang: the full one is an on-demand +# asset that CoreText flags as user-installed, which Safari keeps away from +# web content, so pages get the reduced one, from which some 1,400 glyphs - +# U+FF5C |, ①, ★, ※, kana, ... - moved to a hidden ".CJK Symbols Fallback" +# font. Only CoreText's language-aware system fallback knows about that font, +# and WebKit performs this fallback relative to the first face of the first +# family in the stack (FontCascadeFonts::findBestFallbackFont), i.e. relative +# to Inter, whose fallback chain reaches Hiragino, Helvetica and Lucida Grande +# first. The faces below make the system font that base instead: U+10FFFF is +# a noncharacter, so they never draw anything themselves and do not affect +# the primary font used for metrics (the face covering U+0020), and other +# engines never load them. WebKit orders the faces of a family last-declared- +# first, so these must remain the last 'Inter Core' rules. The result matches +# native apps: SF for the symbols it has, the CJK symbols font for the rest, +# both at the requested weight. +CJK_FALLBACK_ANCHOR = """\ +@font-face { + font-family: 'Inter Core'; + font-style: normal; + font-weight: 100 900; + src: local(-apple-system); + unicode-range: U+10FFFF; +} + +@font-face { + font-family: 'Inter Core'; + font-style: italic; + font-weight: 100 900; + src: local(-apple-system); + unicode-range: U+10FFFF; } """ @@ -103,25 +143,6 @@ WEBFONT_IMPORT = f"""\ /* webfont-marker-end */ """ -# The `cjkExclusions` key of the json lists characters that have both a -# Western (proportional) and an East Asian (em-square) form with no -# encoding-level distinction - mostly East Asian Ambiguous punctuation and -# symbols (UAX #11). The generated 'Inter Core' faces reuse the same font files -# but leave these out of their unicode-ranges so that CJK fonts render them -# in CJK documents. References: -# https://www.unicode.org/L2/L2014/14006-sv-western-vs-cjk.pdf -# https://www.unicode.org/L2/L2018/18013-svs-proposal.pdf -# https://www.unicode.org/L2/L2018/18073-svs-proposal.pdf -# https://www.unicode.org/L2/L2023/23212r-quotes-svs-proposal.pdf -# https://github.com/w3c/clreq/blob/gh-pages/local.css -# & U+2015 (used like U+2014 in Japanese), U+203B (Japanese reference mark), -# U+007E (zh's request; both forms are fine in ja because it is unused there) -CJK_COMMENT = """\ -/* 'Inter Core' reuses the files above, but leaves out characters that should - be rendered by CJK fonts in CJK documents - see scripts/subsetFonts.py */ -""" - - def parse_ranges(value: str) -> set[int]: cps: set[int] = set() for part in value.split(","): @@ -175,6 +196,27 @@ def check_coverage(release: Path, subsets: dict[str, str]) -> None: sys.exit("add the missing codepoints to a subset in scripts/fontSubsets.json") +# U+FE0E VARIATION SELECTOR-15 requests the text presentation of a character +# that also has an emoji form; markdown-it's footnote back-reference is one +# ("↩︎" is U+21A9 U+FE0E). WebKit shapes such a sequence only with a font that +# has a glyph for every code point in it, and Inter maps nothing to U+FE0E, so +# Safari passes over Inter and draws the arrow with -apple-system instead - on +# iOS a visibly thinner, smaller glyph (vuejs/vitepress#5428). Mapping the +# selector to Inter's empty, zero-advance ZERO WIDTH SPACE glyph in every face +# keeps the sequence in Inter without adding a glyph, so the variable-font +# tables stay untouched. U+FE0F, the emoji selector, is left unmapped on +# purpose: "↩️" should keep falling through to the emoji font. +ZERO_WIDTH_SPACE = 0x200B +TEXT_PRESENTATION_SELECTOR = 0xFE0E + + +def map_text_presentation_selector(font: TTFont) -> None: + zwsp = font.getBestCmap()[ZERO_WIDTH_SPACE] + for table in font["cmap"].tables: + if table.isUnicode(): + table.cmap[TEXT_PRESENTATION_SELECTOR] = zwsp + + def build_subsets(release: Path, subsets: dict[str, str]) -> None: for style, (file, _) in STYLES.items(): for name, value in subsets.items(): @@ -188,8 +230,9 @@ def build_subsets(release: Path, subsets: dict[str, str]) -> None: options.name_IDs = [*options.name_IDs, 13, 14] font = subset.load_font(release / file, options) subsetter = subset.Subsetter(options) - subsetter.populate(unicodes=parse_ranges(value)) + subsetter.populate(unicodes=parse_ranges(value) | {ZERO_WIDTH_SPACE}) subsetter.subset(font) + map_text_presentation_selector(font) buf = io.BytesIO() subset.save_font(font, buf, options) out = FONTS_DIR / f"inter-{style}-{name}.woff2" @@ -215,6 +258,19 @@ def face(family: str, css_style: str, file: str, ranges: str) -> str: ) +# The `cjkExclusions` key of the json lists characters that have both a +# Western (proportional) and an East Asian (em-square) form with no +# encoding-level distinction - mostly East Asian Ambiguous punctuation and +# symbols (UAX #11). The generated 'Inter Core' faces reuse the same font files +# but leave these out of their unicode-ranges so that CJK fonts render them +# in CJK documents. References: +# https://www.unicode.org/L2/L2014/14006-sv-western-vs-cjk.pdf +# https://www.unicode.org/L2/L2018/18013-svs-proposal.pdf +# https://www.unicode.org/L2/L2018/18073-svs-proposal.pdf +# https://www.unicode.org/L2/L2023/23212r-quotes-svs-proposal.pdf +# https://github.com/w3c/clreq/blob/gh-pages/local.css +# & U+2015 (used like U+2014 in Japanese), U+203B (Japanese reference mark), +# U+007E (zh's request; both forms are fine in ja because it is unused there) def write_css(subsets: dict[str, str], cjk_exclusions: set[int]) -> None: inter = [] cjk = [] @@ -232,8 +288,9 @@ def write_css(subsets: dict[str, str], cjk_exclusions: set[int]) -> None: f"{WEBFONT_IMPORT}\n" "/* Generated by scripts/subsetFonts.py from scripts/fontSubsets.json */\n\n" + "\n".join(inter) - + f"\n{CJK_COMMENT}\n" + + "\n" + "\n".join(cjk) + + f"\n{CJK_FALLBACK_ANCHOR}" + f"\n{BASE_VAR}\n{CJK_BASE_VAR}" ) diff --git a/src/client/app/composables/copyCode.ts b/src/client/app/composables/copyCode.ts index b686f0b90..d5f088482 100644 --- a/src/client/app/composables/copyCode.ts +++ b/src/client/app/composables/copyCode.ts @@ -61,7 +61,7 @@ async function copyToClipboard(text: string) { element.style.contain = 'strict' element.style.position = 'absolute' - element.style.left = '-9999px' + element.style.insetInlineStart = '-9999px' element.style.fontSize = '12pt' // Prevent zooming on iOS const selection = document.getSelection() diff --git a/src/client/app/composables/preFetch.ts b/src/client/app/composables/preFetch.ts index 35c23a810..f8085b63c 100644 --- a/src/client/app/composables/preFetch.ts +++ b/src/client/app/composables/preFetch.ts @@ -10,6 +10,12 @@ import { inBrowser, pathToFile } from '../utils' const hasFetched = new Set() const createLink = () => document.createElement('link') +const getLinkUrl = (link: HTMLAnchorElement | SVGAElement) => + new URL( + link.href instanceof SVGAnimatedString ? link.href.animVal : link.href, + link.baseURI + ) + const viaDOM = (url: string) => { const link = createLink() link.rel = `prefetch` @@ -64,9 +70,9 @@ export function usePrefetch() { observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { - const link = entry.target as HTMLAnchorElement + const link = entry.target as HTMLAnchorElement | SVGAElement observer!.unobserve(link) - const { pathname } = link + const { pathname } = getLinkUrl(link) if (!hasFetched.has(pathname)) { hasFetched.add(pathname) const pageChunkPath = pathToFile(pathname) @@ -80,12 +86,7 @@ export function usePrefetch() { document .querySelectorAll('#app a') .forEach((link) => { - const { hostname, pathname } = new URL( - link.href instanceof SVGAnimatedString - ? link.href.animVal - : link.href, - link.baseURI - ) + const { hostname, pathname } = getLinkUrl(link) const extMatch = pathname.match(/\.\w+$/) if (extMatch && extMatch[0] !== '.html') { return @@ -94,7 +95,7 @@ export function usePrefetch() { if ( // only prefetch same tab navigation, since a new tab will load // the lean js chunk instead. - link.target !== '_blank' && + link.getAttribute('target') !== '_blank' && // only prefetch inbound links hostname === location.hostname ) { diff --git a/src/client/app/index.ts b/src/client/app/index.ts index 652eb46da..401a3ba8a 100644 --- a/src/client/app/index.ts +++ b/src/client/app/index.ts @@ -4,7 +4,6 @@ import { createSSRApp, defineComponent, h, - onMounted, watchEffect, type App } from 'vue' @@ -45,15 +44,16 @@ const VitePressApp = defineComponent({ setup() { const { site, lang, dir } = useData() - // change the language on the HTML element based on the current lang - onMounted(() => { + // keep the html element's lang and dir in sync with the page, before + // the theme mounts so anything it measures already has the right direction + if (inBrowser) { watchEffect(() => { document.documentElement.lang = lang.value if (dir.value !== false) { document.documentElement.dir = dir.value } }) - }) + } if (import.meta.env.PROD && site.value.router.prefetchLinks) { // in prod mode, enable intersectionObserver based pre-fetch @@ -100,6 +100,12 @@ export async function createApp() { } }) + // set before enhanceApp so users can still disable it or take over with their own errorHandler; + // unhandled errors then fail the build instead of silently shipping broken pages + if (import.meta.env.SSR) { + app.config.throwUnhandledErrorInProduction = true + } + if (Theme.enhanceApp) { await Theme.enhanceApp({ app, diff --git a/src/client/app/utils.ts b/src/client/app/utils.ts index 9683b9152..63e4708a6 100644 --- a/src/client/app/utils.ts +++ b/src/client/app/utils.ts @@ -7,6 +7,7 @@ import { inBrowser, isRelativeBase, joinPath, + pageChunkPath, sanitizeFileName, type Awaitable } from '../shared' @@ -84,7 +85,7 @@ export function pathToFile(path: string) { pageHash = __VP_HASH_MAP__[pagePath.toLowerCase()] } if (!pageHash) return null - pagePath = `${__ASSETS_BASE__ || base}${__ASSETS_DIR__}/${pagePath}.${pageHash}.js` + pagePath = `${__ASSETS_BASE__ || base}${__ASSETS_DIR__}/${pageChunkPath(pagePath, pageHash)}` } else { // ssr build uses much simpler name mapping pagePath = `./${sanitizeFileName( diff --git a/src/client/theme-default/NotFound.vue b/src/client/theme-default/NotFound.vue index 5805ac80a..b6ecaba39 100644 --- a/src/client/theme-default/NotFound.vue +++ b/src/client/theme-default/NotFound.vue @@ -11,13 +11,15 @@ const { currentLang } = useLangs() @@ -67,7 +67,7 @@ defineOptions({ inheritAttrs: false }) font-size: 0.875rem; font-weight: 500; color: var(--vp-c-text-1); - text-align: left; + text-align: start; white-space: nowrap; transition: background-color 0.25s, color 0.25s; } @@ -89,7 +89,7 @@ defineOptions({ inheritAttrs: false }) .VPNavScreen .link { display: block; - margin-left: 0.75rem; + margin-inline-start: 0.75rem; border-radius: 0; padding: 0; font-weight: 400; diff --git a/src/client/theme-default/components/VPNav.vue b/src/client/theme-default/components/VPNav.vue index 051a30094..e70f3d744 100644 --- a/src/client/theme-default/components/VPNav.vue +++ b/src/client/theme-default/components/VPNav.vue @@ -42,8 +42,7 @@ watchEffect(() => { .VPNav { position: relative; top: var(--vp-layout-top-height, 0px); - /*rtl:ignore*/ - left: 0; + inset-inline-start: 0; z-index: var(--vp-z-index-nav); width: 100%; pointer-events: none; diff --git a/src/client/theme-default/components/VPNavAppearance.vue b/src/client/theme-default/components/VPNavAppearance.vue index 6873e4008..1f51667cd 100644 --- a/src/client/theme-default/components/VPNavAppearance.vue +++ b/src/client/theme-default/components/VPNavAppearance.vue @@ -65,7 +65,8 @@ const labelId = useId() justify-content: space-between; align-items: center; border-radius: 0.5rem; - padding: 0.75rem 0.875rem 0.75rem 1rem; + padding-block: 0.75rem; + padding-inline: 1rem 0.875rem; background-color: var(--vp-c-bg-soft); } diff --git a/src/client/theme-default/components/VPNavBar.vue b/src/client/theme-default/components/VPNavBar.vue index 81c84c1e7..30a5934ee 100644 --- a/src/client/theme-default/components/VPNavBar.vue +++ b/src/client/theme-default/components/VPNavBar.vue @@ -89,7 +89,7 @@ const overflow = provideNavOverflow({ height: var(--vp-nav-height); pointer-events: none; white-space: nowrap; - /* left edge of the background surface and divider — on doc pages the + /* inline-start edge of the background surface and divider — on doc pages the sidebar column paints its own surface up to this offset */ --vp-nav-col-offset: 0px; } @@ -100,9 +100,8 @@ const overflow = provideNavOverflow({ content: ""; position: absolute; top: 0; - right: 0; bottom: 0; - left: var(--vp-nav-col-offset); + inset-inline: var(--vp-nav-col-offset) 0; z-index: -1; background-color: var(--vp-nav-bg-color); backdrop-filter: var(--vp-nav-backdrop-filter); @@ -152,7 +151,8 @@ const overflow = provideNavOverflow({ } .wrapper { - padding: 0 0.5rem 0 1.5rem; + padding-block: 0; + padding-inline: 1.5rem 0.5rem; } @media (min-width: 48rem) { @@ -193,14 +193,10 @@ const overflow = provideNavOverflow({ } @media (min-width: 60rem) { - /* outside home the title column matches the sidebar column, so search and - menu sit at the same spot on every doc page; on home the title keeps its - natural width and search sits right next to it */ - .VPNavBar:not(.home) .title { - min-width: calc(var(--vp-sidebar-width) - 2rem); - } - + /* reserve the sidebar column only when it is present; otherwise the title + keeps its natural width and search sits right next to it */ .VPNavBar.has-sidebar .title { + min-width: calc(var(--vp-sidebar-width) - 2rem); max-width: calc(var(--vp-sidebar-width) - 2rem); } } @@ -232,7 +228,7 @@ const overflow = provideNavOverflow({ into the middle; with a menu present its flex-grow wins and this margin resolves to zero */ .content-body > .search { - margin-right: auto; + margin-inline-end: auto; } } @@ -242,15 +238,14 @@ const overflow = provideNavOverflow({ visibility: hidden; position: absolute; top: 0; - left: 0; + inset-inline-start: 0; max-width: 100%; overflow: hidden; } /* separators between whichever cluster units are currently in the bar */ .content-body > :where(.menu, .translations, .appearance, .social-links) + :where(.translations, .appearance, .social-links)::before { - margin-right: 0.5rem; - margin-left: 0.5rem; + margin-inline: 0.5rem; width: 1px; height: 1.5rem; background-color: var(--vp-c-divider); @@ -258,15 +253,15 @@ const overflow = provideNavOverflow({ } .content-body > :where(.menu, .translations) + .appearance::before { - margin-right: 1rem; + margin-inline-end: 1rem; } .content-body > .appearance + .social-links::before { - margin-left: 1rem; + margin-inline-start: 1rem; } .social-links { - margin-right: -0.5rem; + margin-inline-end: -0.5rem; } .divider { @@ -279,7 +274,7 @@ const overflow = provideNavOverflow({ transform: translateZ(0); width: 100%; height: 1px; - padding-left: var(--vp-nav-col-offset); + padding-inline-start: var(--vp-nav-col-offset); } /* the sidebar-column segment of the bottom rule — inset from the column @@ -288,7 +283,7 @@ const overflow = provideNavOverflow({ content: ""; position: absolute; top: 0; - left: calc(var(--vp-nav-col-offset) - var(--vp-sidebar-width) + 2rem); + inset-inline-start: calc(var(--vp-nav-col-offset) - var(--vp-sidebar-width) + 2rem); width: calc(var(--vp-sidebar-width) - 4rem); height: 1px; background-color: var(--vp-c-divider); diff --git a/src/client/theme-default/components/VPNavBarExtra.vue b/src/client/theme-default/components/VPNavBarExtra.vue index dfaa4f9d1..f7ac379fb 100644 --- a/src/client/theme-default/components/VPNavBarExtra.vue +++ b/src/client/theme-default/components/VPNavBarExtra.vue @@ -89,7 +89,7 @@ const hasContent = computed( diff --git a/src/client/theme-default/components/VPNavBarSearch.vue b/src/client/theme-default/components/VPNavBarSearch.vue index 1fe948916..5232e3e91 100644 --- a/src/client/theme-default/components/VPNavBarSearch.vue +++ b/src/client/theme-default/components/VPNavBarSearch.vue @@ -204,13 +204,13 @@ function isEditingContent(event: KeyboardEvent): boolean { @media (min-width: 48rem) { .VPNavBarSearch { gap: 0.5rem; - padding-left: 1.5rem; + padding-inline-start: 1.5rem; } } @media (min-width: 60rem) { .VPNavBarSearch { - padding-left: 2rem; + padding-inline-start: 2rem; } } diff --git a/src/client/theme-default/components/VPNavBarSearchButton.vue b/src/client/theme-default/components/VPNavBarSearchButton.vue index 106fbd558..e9830adcb 100644 --- a/src/client/theme-default/components/VPNavBarSearchButton.vue +++ b/src/client/theme-default/components/VPNavBarSearchButton.vue @@ -67,6 +67,8 @@ kbd { display: flex; align-items: center; gap: 0.25rem; + /* the shortcut reads the same way in every direction */ + direction: ltr; padding: 0.25rem 0.375rem; border: 1px solid var(--vp-c-divider); border-radius: 0.25rem; diff --git a/src/client/theme-default/components/VPNavBarTitle.vue b/src/client/theme-default/components/VPNavBarTitle.vue index 35ce10677..b3ccadfbd 100644 --- a/src/client/theme-default/components/VPNavBarTitle.vue +++ b/src/client/theme-default/components/VPNavBarTitle.vue @@ -49,7 +49,7 @@ const textTitle = computed(() => { >