diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6f5479647b..bc38751e0d 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -493,11 +493,16 @@ The cross-platform (xplat) documentation MDX source files live in this repositor If content originates from or must be synced with the upstream [`igniteui-xplat-docs`](https://github.com/IgniteUI/igniteui-xplat-docs) repository, use the merge scripts in `scripts/` (e.g. `merge-vnext-updates.mjs`, `migrate-vnext-new-files.mjs`) to pull in updates rather than editing generated files directly. -## These topics are generated into the Angular tree — don't edit or commit them there +## These topics are served to Angular from xplat — don't copy them into the Angular tree -For **Angular**, the xplat output is compiled and copied over the Angular content tree on every build by `docs/angular/scripts/sync-generated.mjs` (run via `sync:generated-from-xplat` before every `angular:dev`/`angular:build`). It overwrites everything under `docs/angular/src/content/{en,jp}/components/` **except** `grids/`, `changelog/`, and `toc.json`, which stay Angular-owned. +For **Angular**, the xplat output is compiled to `docs/xplat/generated/Angular/{en,jp}/components/` by `xplat:generate`, which runs before every `angular:dev`/`angular:build`. The Angular site then reads that directory **in place**, as a second content root overlaid on `docs/angular/src/content/{lang}/components/`. Nothing is copied between the two trees, so the tracked Angular content never accumulates build output. -As a result these Angular copies (charts, geo-map, gauges, spreadsheet, excel-library, `general-changelog-dv`, etc.) are **not committed** — editing them under `docs/angular/` has no effect, so edit the xplat source instead. They are kept out of git by the `xplat-generated topics` block at the bottom of `docs/angular/src/content/en/.gitignore` and `docs/angular/src/content/jp/.gitignore`. If you add a **new** cross-platform topic group under `docs/xplat/src/content/`, add a matching pattern to those two `.gitignore` blocks so the generated Angular copy is not accidentally committed. +Both roots share one slug namespace — `/charts/types/area-chart.mdx` is the page `/charts/types/area-chart` whichever root it came from — and **xplat always wins**: if a slug exists in both, the generated topic is served and the Angular file is ignored entirely. `grids/` and `changelog/` are excluded from the overlay and stay Angular-owned, as does `toc.json`, which drives the sidebar for both roots. + +Two consequences worth knowing: + +- Editing one of these topics under `docs/angular/` has no effect — edit `docs/xplat/src/content/` instead. Adding a new cross-platform topic needs no `.gitignore` change; it simply appears from the xplat root. +- A **committed** Angular topic that xplat also provides is dead weight: it is shadowed and never served, which almost always means the topic was moved to xplat without deleting the Angular copy. `node docs/angular/scripts/clean-synced.mjs` reports these (and deletes untracked leftovers from the old copy step with `--apply`). # Adding of images in the topic diff --git a/.github/workflows/check-relative-links.yml b/.github/workflows/check-relative-links.yml index a8779bf886..be77df6ddc 100644 --- a/.github/workflows/check-relative-links.yml +++ b/.github/workflows/check-relative-links.yml @@ -26,13 +26,15 @@ jobs: - run: npm ci - # Sync xplat-generated Angular content into docs/angular/src/content - # before scanning so the angular tree is complete (same as the angular build). - - name: Sync xplat → angular (en) - run: npm run sync:generated-from-xplat --prefix docs/angular + # Generate the xplat Angular overlay into docs/xplat/generated/Angular. + # The Angular site reads that tree in place (nothing is copied into + # docs/angular/src/content), and the link checker scans both roots, so + # the overlay has to exist before scanning — same as the angular build. + - name: Generate xplat Angular overlay (en) + run: npm run xplat:generate --prefix docs/angular - - name: Sync xplat → angular (jp) - run: npm run sync:generated-from-xplat:jp --prefix docs/angular + - name: Generate xplat Angular overlay (jp) + run: npm run xplat:generate:jp --prefix docs/angular - name: Generate angular content (en) run: npm run generate:en --prefix docs/angular diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5efe8d8f1..03334ac089 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,26 @@ on: branches: [ master, vnext ] jobs: + unit-tests: + + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Use Node.js 24.x + uses: actions/setup-node@v4 + with: + node-version: 24 + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run unit tests + run: npm test + build-and-verify: runs-on: ubuntu-latest diff --git a/API-LINK-WORKFLOW.md b/API-LINK-WORKFLOW.md index 66527e02f5..7616306ae2 100644 --- a/API-LINK-WORKFLOW.md +++ b/API-LINK-WORKFLOW.md @@ -145,11 +145,16 @@ Use `--no-sync` only for a quick local resolver check when generated content is Angular: ```text -npm run sync:generated-from-xplat --prefix docs/angular -npm run sync:generated-from-xplat:jp --prefix docs/angular -scan docs/angular/src/content +npm run xplat:generate --prefix docs/angular +npm run xplat:generate:jp --prefix docs/angular +scan docs/angular/src/content and docs/xplat/generated/Angular ``` +The Angular site serves both roots — its own authored topics plus the xplat +generator's Angular output, overlaid in place rather than copied in — so the +checker scans both. Files the site never serves are skipped: the overlay's +`grids/` and `changelog/`, and authored topics that xplat shadows. + React, Web Components, and Blazor: ```text diff --git a/README.md b/README.md index 0ffaf59cb1..572ab66eea 100644 --- a/README.md +++ b/README.md @@ -84,9 +84,9 @@ The `.mdx` extension enables editor Go-to-Definition (Ctrl+Click). The `remarkMd The Angular documentation is assembled from three sources before being checked: -1. **xplat sync** — `docs/xplat/src/content/` is generated into platform-specific output and then copied into `docs/angular/src/content/` by the sync scripts. +1. **xplat generation** — `docs/xplat/src/content/` is generated into platform-specific output under `docs/xplat/generated/Angular/`. The Angular site reads that directory in place as a second content root; it is never copied into `docs/angular/src/content/`. 2. **Grid generation** — `docs/angular/src/content/en/grids_templates/` and `jp/grids_templates/` are template files shared across all four grid types (Grid, TreeGrid, HierarchicalGrid, PivotGrid). `generate.mjs` expands them into the individual component pages under `docs/angular/src/content/en/components/grid/`, `treegrid/`, `hierarchicalgrid/`, and `pivotGrid/`. These template directories are excluded from link checking (same as xplat `_shared/`). -3. **Link check** — the checker scans the fully assembled `docs/angular/src/content/` tree. +3. **Link check** — the checker scans both Angular content roots (`docs/angular/src/content/` and `docs/xplat/generated/Angular/`) and resolves links across them, since a topic in one root may link to a topic served from the other. The check must run **after** both steps above, otherwise it scans stale or incomplete files and misses links that only exist in generated output. @@ -184,7 +184,7 @@ The check is read-only and reports the source file and line for missing or malfo - Angular content lives under `docs/angular/src/content//`. - Shared xplat content lives under `docs/xplat/src/content//`. -- Cross-platform topics are also generated into the Angular tree at build time (by `docs/angular/scripts/sync-generated.mjs`) and are therefore **not committed** under `docs/angular/` — they are gitignored, and editing those Angular copies has no effect. Edit the xplat source instead. See [.github/CONTRIBUTING.md](.github/CONTRIBUTING.md#updating-of-data-visualization-related-topics). +- Cross-platform topics are generated to `docs/xplat/generated/Angular/` and overlaid on the Angular content at build time — they are never copied into `docs/angular/`, and xplat wins wherever both provide the same slug. Edit the xplat source; editing an Angular copy has no effect. See [.github/CONTRIBUTING.md](.github/CONTRIBUTING.md#updating-of-data-visualization-related-topics). - Static images and assets are stored in the nearest product package when product-specific, or in the root `public/` directory when shared. ## Collaboration Docs diff --git a/docs/angular/astro.config.ts b/docs/angular/astro.config.ts index fcaef41806..70809007df 100644 --- a/docs/angular/astro.config.ts +++ b/docs/angular/astro.config.ts @@ -45,6 +45,20 @@ const site = mode === 'production' ? `${PROD_HOST}${base}` const docsDir = path.join(__dirname, 'src', 'content', docsLang); const componentsDocsDir = path.join(docsDir, 'components'); const templatesDir = path.join(docsDir, 'grids_templates'); +// Topics generated from the shared cross-platform source, read straight out of +// the xplat generator's output. They override the Angular tree for any slug +// they provide, and nothing is ever copied into src/content — so the tracked +// content tree never accumulates build output. Absent for languages the xplat +// generator does not emit (kr), in which case there is simply no overlay. +// +// changelog/ and grids/ stay Angular-owned: xplat emits them too, but the site +// never serves those copies. This is the single source of truth for the overlay +// — createDocsSite publishes it as DOCS_SOURCE_PATHS, and src/content.config.ts +// reads it back from there. +const xplatOverlay = { + dir: path.join(__dirname, '..', 'xplat', 'generated', 'Angular', docsLang, 'components'), + exclude: ['changelog/**', 'grids/**'], +}; const localizedDescription: Partial> = { jp: 'Ignite UI for Angular のコンポーネントと API リファレンス ドキュメントです。', kr: 'Ignite UI for Angular 컴포넌트 및 API 참조 문서입니다.', @@ -85,6 +99,7 @@ export default createDocsSite({ source: { tocPath: `${componentsDocsDir}/toc.json`, docsDir: componentsDocsDir, + overlayDirs: [xplatOverlay], }, head: [ { tag: 'link', attrs: { rel: 'icon', href: `${mode !== 'development' ? base : ''}/favicon.ico`, type: 'image/x-icon' } }, diff --git a/docs/angular/package.json b/docs/angular/package.json index cf3c70c8d6..3a3207aabc 100644 --- a/docs/angular/package.json +++ b/docs/angular/package.json @@ -7,23 +7,24 @@ "generate:en": "node scripts/generate.mjs --lang=en", "generate:jp": "node scripts/generate.mjs --lang=jp", "generate:kr": "node scripts/generate.mjs --lang=kr", - "sync:generated-from-xplat": "npm run generate:angular --prefix ../xplat && node scripts/sync-generated.mjs --lang=en", - "sync:generated-from-xplat:jp": "npm run generate:angular:jp --prefix ../xplat && node scripts/sync-generated.mjs --lang=jp", - "dev": "npm run sync:generated-from-xplat && npm run generate && cross-env PLATFORM=Angular astro dev --port 4321", - "dev:en": "npm run sync:generated-from-xplat && npm run generate:en && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=en astro dev --port 4321", - "dev:jp": "npm run sync:generated-from-xplat:jp && npm run generate:jp && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=jp astro dev --port 4321", + "xplat:generate": "npm run generate:angular --prefix ../xplat", + "clean:synced": "node scripts/clean-synced.mjs", + "xplat:generate:jp": "npm run generate:angular:jp --prefix ../xplat", + "dev": "npm run xplat:generate && npm run generate && cross-env PLATFORM=Angular astro dev --port 4321", + "dev:en": "npm run xplat:generate && npm run generate:en && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=en astro dev --port 4321", + "dev:jp": "npm run xplat:generate:jp && npm run generate:jp && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=jp astro dev --port 4321", "dev:kr": "npm run generate:kr && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=kr astro dev --port 4321", - "build": "npm run sync:generated-from-xplat && npm run generate && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 astro build --outDir=../../dist/angular", - "build:en": "npm run sync:generated-from-xplat && npm run generate:en && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=en astro build --outDir=../../dist/angular", - "build:jp": "npm run sync:generated-from-xplat:jp && npm run generate:jp && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=jp astro build --outDir=../../dist/angular-jp", + "build": "npm run xplat:generate && npm run generate && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 astro build --outDir=../../dist/angular", + "build:en": "npm run xplat:generate && npm run generate:en && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=en astro build --outDir=../../dist/angular", + "build:jp": "npm run xplat:generate:jp && npm run generate:jp && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=jp astro build --outDir=../../dist/angular-jp", "build:kr": "npm run generate:kr && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_LANG=kr astro build --outDir=../../dist/angular-kr", - "build-staging": "npm run sync:generated-from-xplat && npm run generate && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_ENV=staging NODE_ENV=production astro build --outDir=../../dist/angular", - "build-staging:en": "npm run sync:generated-from-xplat && npm run generate:en && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_ENV=staging NODE_ENV=production DOCS_LANG=en astro build --outDir=../../dist/angular", - "build-staging:jp": "npm run sync:generated-from-xplat:jp && npm run generate:jp && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_ENV=staging NODE_ENV=production DOCS_LANG=jp astro build --outDir=../../dist/angular-jp", + "build-staging": "npm run xplat:generate && npm run generate && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_ENV=staging NODE_ENV=production astro build --outDir=../../dist/angular", + "build-staging:en": "npm run xplat:generate && npm run generate:en && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_ENV=staging NODE_ENV=production DOCS_LANG=en astro build --outDir=../../dist/angular", + "build-staging:jp": "npm run xplat:generate:jp && npm run generate:jp && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_ENV=staging NODE_ENV=production DOCS_LANG=jp astro build --outDir=../../dist/angular-jp", "build-staging:kr": "npm run generate:kr && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 DOCS_ENV=staging NODE_ENV=production DOCS_LANG=kr astro build --outDir=../../dist/angular-kr", - "build-production": "npm run sync:generated-from-xplat && npm run generate && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 NODE_ENV=production astro build --outDir=../../dist/angular", - "build-production:en": "npm run sync:generated-from-xplat && npm run generate:en && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 NODE_ENV=production DOCS_LANG=en astro build --outDir=../../dist/angular", - "build-production:jp": "npm run sync:generated-from-xplat:jp && npm run generate:jp && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 NODE_ENV=production DOCS_LANG=jp astro build --outDir=../../dist/angular-jp", + "build-production": "npm run xplat:generate && npm run generate && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 NODE_ENV=production astro build --outDir=../../dist/angular", + "build-production:en": "npm run xplat:generate && npm run generate:en && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 NODE_ENV=production DOCS_LANG=en astro build --outDir=../../dist/angular", + "build-production:jp": "npm run xplat:generate:jp && npm run generate:jp && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 NODE_ENV=production DOCS_LANG=jp astro build --outDir=../../dist/angular-jp", "build-production:kr": "npm run generate:kr && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 NODE_ENV=production DOCS_LANG=kr astro build --outDir=../../dist/angular-kr", "preview": "cross-env PLATFORM=Angular astro preview --outDir=../../dist/angular", "preview:en": "cross-env PLATFORM=Angular DOCS_LANG=en astro preview --outDir=../../dist/angular --port 4321", diff --git a/docs/angular/scripts/clean-synced.mjs b/docs/angular/scripts/clean-synced.mjs new file mode 100644 index 0000000000..7e0363d9d5 --- /dev/null +++ b/docs/angular/scripts/clean-synced.mjs @@ -0,0 +1,166 @@ +#!/usr/bin/env node +/** + * One-shot cleanup for the old xplat → Angular copy step. + * + * The Angular site used to build by copying `docs/xplat/generated/Angular/{lang}` + * over `docs/angular/src/content/{lang}`, which left generated topics sitting in + * the tracked content tree. The site now overlays the generated tree in place, so + * those copies are dead weight: they are shadowed by the xplat originals and can + * only cause confusion (edits to them have no effect). + * + * This deletes, from the Angular tree, every file the generator also emits. + * + * Files that are *tracked* in git are never touched — a tracked file that xplat + * also provides is a topic that was moved upstream without deleting the Angular + * copy, and removing it is a reviewable change, not a cleanup side effect. Those + * are reported at the end so they can be handled deliberately. + * + * Usage: + * node scripts/clean-synced.mjs # report only + * node scripts/clean-synced.mjs --apply # actually delete + * node scripts/clean-synced.mjs --apply --lang=jp + */ + +import { existsSync, readdirSync, rmSync, statSync } from 'node:fs'; +import { join, dirname, relative } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { spawnSync } from 'node:child_process'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const repoRoot = join(__dirname, '../../..'); + +const args = process.argv.slice(2); +const apply = args.includes('--apply'); +const langArg = args.find(a => a.startsWith('--lang='))?.split('=')[1]; +const langs = langArg ? [langArg] : ['en', 'jp']; + +/** + * Paths the old copy step never wrote, so nothing under them can be a leftover. + * These stay Angular-owned, exactly as the overlay's excludes keep them. + */ +const NEVER_COPIED = /(^|\/)(grids|changelog)\/|(^|\/)toc\.(json|yml)$/; + +/** Relative paths of every file the generator emits for `lang`. */ +function generatedFiles(sourceDir) { + const out = []; + const visit = (dir) => { + for (const entry of readdirSync(dir)) { + const abs = join(dir, entry); + if (statSync(abs).isDirectory()) visit(abs); + else out.push(relative(sourceDir, abs).replace(/\\/g, '/')); + } + }; + visit(sourceDir); + return out; +} + +/** + * Aborts the run. Anything git cannot answer confidently has to stop the + * script *before* it deletes: a git that fails to run would otherwise make + * every file look untracked, and this script deletes untracked files. + */ +function abortOnGitFailure(result, what) { + if (result.error) { + console.error(`[clean-synced] Could not run git (${what}): ${result.error.message}`); + console.error('[clean-synced] Refusing to delete anything without a working git. Aborting.'); + process.exit(1); + } + const stderr = (result.stderr ?? '').toString().trim(); + console.error(`[clean-synced] git ${what} failed with exit code ${result.status}.`); + if (stderr) console.error(` ${stderr}`); + console.error('[clean-synced] Refusing to delete anything without a trustworthy git. Aborting.'); + process.exit(1); +} + +/** Verifies up front that git runs and that repoRoot really is a repository. */ +function assertGitAvailable() { + const r = spawnSync('git', ['rev-parse', '--is-inside-work-tree'], { + cwd: repoRoot, + encoding: 'utf8', + }); + if (r.error || r.status !== 0) abortOnGitFailure(r, 'rev-parse --is-inside-work-tree'); +} + +/** + * True when git has the path in the index — those are never deleted here. + * + * `git ls-files --error-unmatch` exits 0 for a tracked path and 1 for an + * untracked one. Every other outcome (git missing, fatal repo error, a signal) + * is a failure to answer, not a "no", so it aborts rather than green-lighting + * a delete. + */ +function isTracked(absPath) { + const r = spawnSync('git', ['ls-files', '--error-unmatch', '--', absPath], { + cwd: repoRoot, + encoding: 'utf8', + }); + if (r.error || r.status === null) abortOnGitFailure(r, `ls-files -- ${absPath}`); + if (r.status === 0) return true; + if (r.status === 1) return false; + return abortOnGitFailure(r, `ls-files -- ${absPath}`); +} + +/** Removes directories left empty by the deletions, bottom-up. */ +function pruneEmptyDirs(dir, stopAt) { + let current = dir; + while (current.startsWith(stopAt) && current !== stopAt) { + if (!existsSync(current) || readdirSync(current).length > 0) return; + rmSync(current, { recursive: true }); + current = dirname(current); + } +} + +// Fail fast: without git this script cannot tell a leftover copy from a +// tracked topic, and it must never delete the latter. +assertGitAvailable(); + +let totalRemoved = 0; +const trackedOverlaps = []; + +for (const lang of langs) { + const sourceDir = join(repoRoot, `docs/xplat/generated/Angular/${lang}`); + const targetDir = join(repoRoot, `docs/angular/src/content/${lang}`); + + if (!existsSync(sourceDir)) { + console.log(`[clean-synced] ${lang}: no generated output — run "npm run xplat:generate" first. Skipping.`); + continue; + } + if (!existsSync(targetDir)) continue; + + const stale = []; + for (const rel of generatedFiles(sourceDir)) { + if (NEVER_COPIED.test(rel)) continue; + const candidate = join(targetDir, rel); + if (!existsSync(candidate)) continue; + if (isTracked(candidate)) { + trackedOverlaps.push(`docs/angular/src/content/${lang}/${rel}`); + continue; + } + stale.push(candidate); + } + + console.log(`[clean-synced] ${lang}: ${stale.length} leftover generated file(s) in the Angular tree`); + for (const file of stale) { + console.log(` ${apply ? 'removed ' : 'would remove '}${relative(repoRoot, file).replace(/\\/g, '/')}`); + if (apply) { + rmSync(file); + pruneEmptyDirs(dirname(file), targetDir); + } + } + totalRemoved += stale.length; +} + +console.log( + apply + ? `\n[clean-synced] Removed ${totalRemoved} file(s).` + : `\n[clean-synced] ${totalRemoved} file(s) would be removed. Re-run with --apply.` +); + +if (trackedOverlaps.length) { + console.log( + `\n[clean-synced] ${trackedOverlaps.length} tracked Angular topic(s) are also provided by xplat.\n` + + ' xplat wins, so these are shadowed and never served. Delete them in a\n' + + ' reviewed commit, or move the change upstream into docs/xplat/src/content:' + ); + for (const file of trackedOverlaps) console.log(` ${file}`); +} diff --git a/docs/angular/scripts/sync-generated.mjs b/docs/angular/scripts/sync-generated.mjs deleted file mode 100644 index 35f09cea1e..0000000000 --- a/docs/angular/scripts/sync-generated.mjs +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env node -import { closeSync, cpSync, existsSync, ftruncateSync, openSync, readFileSync, readdirSync, statSync, writeSync } from 'fs'; -import { join, dirname, relative } from 'path'; -import { fileURLToPath } from 'url'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -const lang = process.argv.find(a => a.startsWith('--lang='))?.split('=')[1] ?? 'en'; - -const repoRoot = join(__dirname, '../../..'); -const sourceDir = join(repoRoot, `docs/xplat/generated/Angular/${lang}`); -const targetDir = join(repoRoot, `docs/angular/src/content/${lang}`); - -console.log(`Syncing generated Angular MDX content from xplat (lang: ${lang})...`); - -if (!existsSync(sourceDir)) { - console.error(`Source directory not found: ${sourceDir}`); - console.error('Run the xplat generation script first.'); - process.exit(1); -} - -function shouldCopy(src) { - // Skip grids folder (Angular has its own) - if (src.includes('/grids/') || src.includes('\\grids\\')) { - return false; - } - // Skip changelog folder (Angular has its own) - if (src.includes('/changelog/') || src.includes('\\changelog\\')) { - return false; - } - // Skip TOC files (Angular manages its own) - if (src.endsWith('toc.json') || src.endsWith('toc.yml')) { - return false; - } - return true; -} - -function normalizeMarkdownSpacing(content) { - const hasFinalNewline = /\r?\n$/.test(content); - const lines = content.replace(/\r\n/g, '\n').split('\n'); - const result = []; - let blankCount = 0; - let inFence = false; - - for (const line of lines) { - if (/^\s*(```|~~~)/.test(line)) { - inFence = !inFence; - blankCount = 0; - result.push(line); - continue; - } - - if (inFence) { - result.push(line); - continue; - } - - if (line.trim() === '') { - blankCount++; - if (blankCount <= 1) { - result.push(''); - } - continue; - } - - blankCount = 0; - result.push(line); - } - - let normalized = result.join('\n').replace(/\n+$/, ''); - if (hasFinalNewline) { - normalized += '\n'; - } - return normalized; -} - -function normalizeCopiedMarkdownFiles(srcDir, destDir) { - let normalizedCount = 0; - - function visit(srcPath) { - if (!shouldCopy(srcPath)) return; - - const stat = statSync(srcPath); - if (stat.isDirectory()) { - for (const entry of readdirSync(srcPath)) { - visit(join(srcPath, entry)); - } - return; - } - - if (!/\.(md|mdx)$/i.test(srcPath)) return; - - const destPath = join(destDir, relative(srcDir, srcPath)); - let fd; - - try { - fd = openSync(destPath, 'r+'); - const original = readFileSync(fd, 'utf8'); - const normalized = normalizeMarkdownSpacing(original); - - if (normalized !== original) { - ftruncateSync(fd, 0); - writeSync(fd, normalized, 0, 'utf8'); - normalizedCount++; - } - } catch (error) { - if (error?.code === 'ENOENT') return; - throw error; - } finally { - if (fd !== undefined) { - closeSync(fd); - } - } - } - - visit(srcDir); - return normalizedCount; -} - -// Copy all generated content files from source to target -console.log(`Copying from ${sourceDir} to ${targetDir}`); -cpSync(sourceDir, targetDir, { - recursive: true, - filter: shouldCopy, -}); - -const normalizedFiles = normalizeCopiedMarkdownFiles(sourceDir, targetDir); - -console.log(' Generated content synced successfully'); -console.log(' Excluded: grids/, changelog/, toc files'); -console.log(` Normalized markdown spacing in ${normalizedFiles} file(s)`); diff --git a/docs/angular/src/content.config.ts b/docs/angular/src/content.config.ts index 41c43926c0..6c432ff847 100644 --- a/docs/angular/src/content.config.ts +++ b/docs/angular/src/content.config.ts @@ -1,6 +1,6 @@ import { z } from 'astro/zod'; -import { createDocsCollection } from 'docs-template/content'; -import { readFileSync } from 'node:fs'; +import { createDocsCollection, docRootsFromEnv } from 'docs-template/content'; +import { existsSync, readFileSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -13,8 +13,30 @@ try { lang = cfg.lang ?? lang; } catch { /* use defaults */ } +// Angular's own, hand-authored topics. const docsDir = path.join(root, 'src', 'content', lang, 'components'); +// Topics generated from the shared cross-platform source. These are read in +// place — nothing is copied into src/content — and they take precedence over +// the Angular tree, so a topic that has moved to xplat is served from xplat +// even if a stale copy is still sitting in src/content. +// +// changelog/ and grids/ stay Angular-owned and are never taken from xplat. +const xplatDir = path.join(root, '..', 'xplat', 'generated', 'Angular', lang, 'components'); + +// astro.config.ts owns the root list: createDocsSite resolves `source.docsDir` +// plus `source.overlayDirs` (excludes and all) and publishes the result as +// DOCS_SOURCE_PATHS, so the collection is built from exactly the roots the rest +// of the site resolves against. The literal fallback below only applies when +// this config is loaded without that env var — `astro check`, a direct +// `getCollection()` in a script — and must stay in step with astro.config.ts. +const rootsFromEnv = docRootsFromEnv(); +const roots = rootsFromEnv.length + ? rootsFromEnv + : existsSync(xplatDir) + ? [{ dir: xplatDir, exclude: ['changelog/**', 'grids/**'] }, docsDir] + : [docsDir]; + const tableOfContentsSchema = z.object({ tableOfContents: z .union([ @@ -28,5 +50,5 @@ const tableOfContentsSchema = z.object({ }); export const collections = { - docs: createDocsCollection(docsDir, { exclude: ['**/*.md'], extendSchema: tableOfContentsSchema }), + docs: createDocsCollection(roots, { exclude: ['**/*.md'], extendSchema: tableOfContentsSchema }), }; diff --git a/docs/angular/src/content/en/.gitignore b/docs/angular/src/content/en/.gitignore index bc6cd82100..df23f835c0 100644 --- a/docs/angular/src/content/en/.gitignore +++ b/docs/angular/src/content/en/.gitignore @@ -60,19 +60,5 @@ components/pivotGrid/*.mdx !components/pivotGrid/pivot-grid-features.mdx !components/pivotGrid/pivot-grid-custom.mdx -# All xplat-generated topics that should be ignored: -/components/charts/ -/components/geo-map*.mdx -/components/spreadsheet-*.mdx -/components/excel-library*.mdx -/components/excel-utility.mdx -/components/bullet-graph.mdx -/components/dashboard-tile.mdx -/components/linear-gauge.mdx -/components/radial-gauge.mdx -/components/zoomslider-overview.mdx -/components/general-changelog-dv.mdx -/components/inputs/color-editor.mdx -/components/interactivity/accessibility-compliance.mdx -/components/maps/map-api.mdx -/components/menus/toolbar.mdx +# xplat-generated topics are no longer copied into this tree — the site reads +# them straight from docs/xplat/generated/Angular/. Nothing to ignore here. diff --git a/docs/angular/src/content/en/components/geo-map-binding-data-overview.mdx b/docs/angular/src/content/en/components/geo-map-binding-data-overview.mdx deleted file mode 100644 index 6de1ba59da..0000000000 --- a/docs/angular/src/content/en/components/geo-map-binding-data-overview.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Angular Map | Data Visualization Tools | Data Binding | Infragistics" -description: Use Infragistics' Angular map to display data that contains geographic locations from view models or geo-spatial data loaded from shape files on geographic imagery maps. View Ignite UI for Angular map demos! -keywords: "Angular map, geo-spatial data, Ignite UI for Angular, Infragistics, data binding" -license: commercial -mentionedTypes: ["GeographicMap", "Series"] -namespace: Infragistics.Controls.Maps -llms: - description: "The Ignite UI for Angular map component is designed to display geo-spatial data from shape files and/or geographic locations from data models on geographic imagery maps." ---- -import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; - -# Angular Data Binding - -The Ignite UI for Angular map component is designed to display geo-spatial data from shape files and/or geographic locations from data models on geographic imagery maps. The property of geographic series is used for the purpose of binding to data models. - -## Types of Data Sources -The following section list some of data source that you can bind in the geographic map component - -- [Binding Shape Files](./geo-map-binding-shp-file.mdx) -- [Binding JSON Files](./geo-map-binding-data-json-points.mdx) -- [Binding CSV Files](./geo-map-binding-data-csv.mdx) -- [Binding Data Models](./geo-map-binding-data-model.mdx) -- [Binding Multiple Sources](./geo-map-binding-multiple-sources.mdx) - -## API References - diff --git a/docs/angular/src/content/jp/.gitignore b/docs/angular/src/content/jp/.gitignore index 67c5e1e6f8..df23f835c0 100644 --- a/docs/angular/src/content/jp/.gitignore +++ b/docs/angular/src/content/jp/.gitignore @@ -60,21 +60,5 @@ components/pivotGrid/*.mdx !components/pivotGrid/pivot-grid-features.mdx !components/pivotGrid/pivot-grid-custom.mdx -# All xplat-generated topics that should be ignored: -/components/charts/ -/components/geo-map*.mdx -/components/spreadsheet-*.mdx -/components/excel-library*.mdx -/components/excel-utility.mdx -/components/bullet-graph.mdx -/components/dashboard-tile.mdx -/components/linear-gauge.mdx -/components/radial-gauge.mdx -/components/zoomslider-overview.mdx -/components/general-changelog-dv.mdx -/components/inputs/color-editor.mdx -/components/interactivity/accessibility-compliance.mdx -/components/maps/map-api.mdx -/components/menus/toolbar.mdx -/components/general-step-by-step-guide-using-cli.mdx -/components/localization.mdx +# xplat-generated topics are no longer copied into this tree — the site reads +# them straight from docs/xplat/generated/Angular/. Nothing to ignore here. diff --git a/package-lock.json b/package-lock.json index 2b5deaa105..68fab7a092 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,8 @@ "cspell": "^9.2.2", "markdownlint-cli": "^0.49.1", "sass-embedded": "^1.98.0", - "typescript": "^5.4.0" + "typescript": "^5.4.0", + "vitest": "^5.0.0" }, "engines": { "node": ">=22.12.0" @@ -100,8 +101,6 @@ }, "node_modules/@asamuzakjp/css-color": { "version": "5.1.11", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", - "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", "license": "MIT", "dependencies": { "@asamuzakjp/generational-cache": "^1.0.1", @@ -116,8 +115,6 @@ }, "node_modules/@asamuzakjp/dom-selector": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", - "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", "license": "MIT", "dependencies": { "@asamuzakjp/generational-cache": "^1.0.1", @@ -132,8 +129,6 @@ }, "node_modules/@asamuzakjp/generational-cache": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", - "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", "license": "MIT", "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" @@ -141,21 +136,15 @@ }, "node_modules/@asamuzakjp/nwsapi": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", - "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", "license": "MIT" }, "node_modules/@astrojs/compiler": { "version": "2.13.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz", - "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", "dev": true, "license": "MIT" }, "node_modules/@astrojs/compiler-binding": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.5.0.tgz", - "integrity": "sha512-PxFTx3WoxQnbgUvvwmF6LRQwhHO77a4pewOtJvzxlrYtQ90tLgomLKvks/akrd2iix2ngGlOhxQonKNd8YoBHg==", "license": "MIT", "engines": { "node": "^20.19.0 || >=22.12.0" @@ -333,8 +322,6 @@ }, "node_modules/@astrojs/compiler-binding-win32-x64-msvc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.5.0.tgz", - "integrity": "sha512-SgM158cSCJ248UIXaCCW2WqSTjOoFlDv93ed/ATguJqYpZNNVMlOdcPlgNH7WYj/OYeD0rIQr7XyRAYhB7+G1A==", "cpu": [ "x64" ], @@ -349,8 +336,6 @@ }, "node_modules/@astrojs/compiler-rs": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.5.0.tgz", - "integrity": "sha512-2xIypn5R33FRWCXXXv0sfbDj8xcOvc2VmIbteytxMjOzP9LiGfvqaAFJjhdAjzhs6+ZKzYzbSE79rrPObYW5mg==", "license": "MIT", "dependencies": { "@astrojs/compiler-binding": "0.5.0" @@ -361,8 +346,6 @@ }, "node_modules/@astrojs/internal-helpers": { "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.4.tgz", - "integrity": "sha512-nozZSy/mKYLqe4YrqbKtdOszedAfXYCtw3wZ0d+CAjz4GqQ4L9rl1ltIL5BlgwmYVinJg/RZ0MgGuWOdlyRZlA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.4", @@ -377,8 +360,6 @@ }, "node_modules/@astrojs/markdown-satteri": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.8.tgz", - "integrity": "sha512-n8ItpFTCmlDsVR5+rwDmehSf+jFCYLWmZiisZNGuF7xILqYhsVeBfcha4qgS2Seq3fAc9Tm58ZVrvqFQ6RQgRQ==", "license": "MIT", "dependencies": { "@astrojs/internal-helpers": "0.10.4", @@ -510,8 +491,6 @@ }, "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-win32-x64-msvc": { "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.10.5.tgz", - "integrity": "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==", "cpu": [ "x64" ], @@ -554,8 +533,6 @@ }, "node_modules/@astrojs/markdown-satteri/node_modules/satteri": { "version": "0.10.5", - "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", - "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.5", @@ -577,8 +554,6 @@ }, "node_modules/@astrojs/mdx": { "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-7.0.8.tgz", - "integrity": "sha512-RNuwq2ccTSi7NX9YqlR0noaWoVdOrZuJvdfWXotAzdhMVB0b0zEMLnNU+xar7le0GwTMlTObD/QAu8jeHA/3nA==", "license": "MIT", "dependencies": { "@astrojs/internal-helpers": "0.10.4", @@ -611,8 +586,6 @@ }, "node_modules/@astrojs/mdx/node_modules/@astrojs/markdown-remark": { "version": "7.2.4", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.4.tgz", - "integrity": "sha512-MvspGMynWKAjTe4/lTUdmBPHIFKNVLTCF6UlyWGogTGzNrTvjD+D4n48k7h8swxsEPKHK2TwxkZO7uoaCv1Pow==", "license": "MIT", "dependencies": { "@astrojs/internal-helpers": "0.10.4", @@ -636,8 +609,6 @@ }, "node_modules/@astrojs/prism": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", - "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", "license": "MIT", "dependencies": { "prismjs": "^1.30.0" @@ -648,8 +619,6 @@ }, "node_modules/@astrojs/telemetry": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", - "integrity": "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==", "license": "MIT", "dependencies": { "ci-info": "^4.4.0", @@ -663,8 +632,6 @@ }, "node_modules/@astrojs/ts-plugin": { "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@astrojs/ts-plugin/-/ts-plugin-1.10.11.tgz", - "integrity": "sha512-W7Fmbaw81mcecFgJWgfY8FX7G7nCiooiakgd8ZAVprglEo81W2HzXh2I+okmAorCZLICl4PeEELkpGzrEXze4g==", "dev": true, "license": "MIT", "dependencies": { @@ -679,8 +646,6 @@ }, "node_modules/@astrojs/yaml2ts": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz", - "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==", "dev": true, "license": "MIT", "dependencies": { @@ -689,8 +654,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -698,8 +661,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -707,8 +668,6 @@ }, "node_modules/@babel/parser": { "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.8" @@ -722,8 +681,6 @@ }, "node_modules/@babel/types": { "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", @@ -735,8 +692,6 @@ }, "node_modules/@bramus/specificity": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", "license": "MIT", "dependencies": { "css-tree": "^3.0.0" @@ -899,8 +854,6 @@ }, "node_modules/@bruits/satteri-win32-x64-msvc": { "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.5.tgz", - "integrity": "sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g==", "cpu": [ "x64" ], @@ -912,14 +865,10 @@ }, "node_modules/@bufbuild/protobuf": { "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.14.0.tgz", - "integrity": "sha512-C3UGsiCwSprE2NKIIFA3hCDlpXTMCAXRZuEVp88L1GY36Y41+rYL5fryE+nOFhp4p4JPQvdV8PQ4DWgHgeTE+w==", "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@capsizecss/unpack": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", - "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", "license": "MIT", "dependencies": { "fontkitten": "^1.0.3" @@ -930,8 +879,6 @@ }, "node_modules/@clack/core": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz", - "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==", "license": "MIT", "dependencies": { "fast-wrap-ansi": "^0.2.0", @@ -943,8 +890,6 @@ }, "node_modules/@clack/prompts": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.7.0.tgz", - "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==", "license": "MIT", "dependencies": { "@clack/core": "1.4.3", @@ -958,8 +903,6 @@ }, "node_modules/@cspell/cspell-bundled-dicts": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.8.0.tgz", - "integrity": "sha512-MpXFpVyBPfJQ1YuVotljqUaGf6lWuf+fuWBBgs0PHFYTSjRPWuIxviAaCDnup/CJLLH60xQL4IlcQe4TOjzljw==", "dev": true, "license": "MIT", "dependencies": { @@ -1029,8 +972,6 @@ }, "node_modules/@cspell/cspell-json-reporter": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.8.0.tgz", - "integrity": "sha512-nqUaSo9T7l8KrE22gc7ZIs+zvP7ak1i7JqGdRs8sGvh2Ijqj43qYQLePgb1b/vm8a1bavnc51m+vf05hpd3g3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1042,8 +983,6 @@ }, "node_modules/@cspell/cspell-performance-monitor": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-9.8.0.tgz", - "integrity": "sha512-IsrXYzn23yJICIQ915ACdf+2lNEcFNTu5BIQt3khHOsGVvZ9/AZYpu9Dk825vUyZG7RHg2Oi6dYNiJtULG4ouQ==", "dev": true, "license": "MIT", "engines": { @@ -1052,8 +991,6 @@ }, "node_modules/@cspell/cspell-pipe": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.8.0.tgz", - "integrity": "sha512-ISEUD8PHYkd2Ktafc6hFfIXdGKYUvthA09NbwwZsWmOqYyk4wWKHZKqyyxD+BcrFwOyMOJcD8OEvIjkRQp2SJw==", "dev": true, "license": "MIT", "engines": { @@ -1062,8 +999,6 @@ }, "node_modules/@cspell/cspell-resolver": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.8.0.tgz", - "integrity": "sha512-PZJj56BZpKfMxOzWkyt7b+aIXObe+8Ku/zLI4xDXPSuQPENbHBFHfPIZx68CyGEkanKxZ1ewKVx/FT1FUy+wDA==", "dev": true, "license": "MIT", "dependencies": { @@ -1075,8 +1010,6 @@ }, "node_modules/@cspell/cspell-service-bus": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.8.0.tgz", - "integrity": "sha512-P45sd2nqwcqhulBBbQnZB/JNcobecTrP4Ky3vmEq0cprsvavc+ZoHF9U2Ql5ghMSUzjrF2n1aNzZ8cH4IlsnKg==", "dev": true, "license": "MIT", "engines": { @@ -1085,8 +1018,6 @@ }, "node_modules/@cspell/cspell-types": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.8.0.tgz", - "integrity": "sha512-7Ge4UD6SCA49Tcc3+GTlz3Xn4cqVUAXtDO0u9IeHvJgkN3Me2Rw2GB/CtGmhKST3YeEeZMX7ww09TdHMUJlehw==", "dev": true, "license": "MIT", "engines": { @@ -1095,8 +1026,6 @@ }, "node_modules/@cspell/cspell-worker": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-worker/-/cspell-worker-9.8.0.tgz", - "integrity": "sha512-W8FLdE3MXPLbWtAXciILQhk9CHd6Mt+HRjZHM8m+dwE1Bc2TAjUai8kIxsdhHUq58p7gYY2ekr5sg1uYOUgTAA==", "dev": true, "license": "MIT", "dependencies": { @@ -1108,29 +1037,21 @@ }, "node_modules/@cspell/dict-ada": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", - "integrity": "sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-al": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.1.tgz", - "integrity": "sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-aws": { "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.17.tgz", - "integrity": "sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-bash": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.3.tgz", - "integrity": "sha512-ljUZoKHbDqw5Sx0qpL2qTUlmkmr+vhZH/sCNrNaBZKTbdgiswErSnIF1jRbGmEitJNxHRHWsuZyVgnTGfVO1Yw==", "dev": true, "license": "MIT", "dependencies": { @@ -1139,246 +1060,176 @@ }, "node_modules/@cspell/dict-companies": { "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.12.tgz", - "integrity": "sha512-mjiz/N3zWOCsz5VfwMUydSl7uW0OU9H2PnbCNc3RV44Vj6Q59CSp6EYGSGZQxrXU1gpsuZUrwr6QCjNjFOOg5A==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-cpp": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.1.0.tgz", - "integrity": "sha512-rcjycobioQUd9Jm/Y1n8U+sq6ytpZ0iV8AYIo+vyEFfutC5x7g6hL6Fh3bCdh6IporGHRqfEutGK/4sfopD2ZA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-cryptocurrencies": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", - "integrity": "sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-csharp": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz", - "integrity": "sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-css": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.1.2.tgz", - "integrity": "sha512-+ylGoKdwZ2sVOCOnU2Eq5wDZx+RaVX3HoKyNHGGsFvhSw6IidQ6tH/mAPKBDofViHJoWCPNlklE0lTr6MDG3QA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-dart": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.2.tgz", - "integrity": "sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-data-science": { "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.16.tgz", - "integrity": "sha512-M72mxv5asuAnORurz4iXRJ+Tw9XBq6eu7D2Ne7biP0Z1RciKGNxXWu9JycA/KlVvK1hAlKj/fANlXhuEWpXKFg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-django": { "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.6.tgz", - "integrity": "sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-docker": { "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.17.tgz", - "integrity": "sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-dotnet": { "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.13.tgz", - "integrity": "sha512-xPp7jMnFpOri7tzmqmm/dXMolXz1t2bhNqxYkOyMqXhvs08oc7BFs+EsbDY0X7hqiISgeFZGNqn0dOCr+ncPYw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-elixir": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz", - "integrity": "sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-en_us": { "version": "4.4.36", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.36.tgz", - "integrity": "sha512-2yOhI/+7d1DbfvMljGW4jw8pLqDEsVmnvUXBOCFXtLU2BWgQkrqOJDCNseYjEiEbTp0OtdrWEWWPFSP1TNugQw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-en-common-misspellings": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.2.0.tgz", - "integrity": "sha512-5PmCHv+AhY0LVNo3bE1FdRKMmw1esKj83GPwLymnVPYNtlI2Jf6y27EjC0azg4zny5keWmku0GQiMf55Fi+qeA==", "dev": true, "license": "CC BY-SA 4.0" }, "node_modules/@cspell/dict-en-gb-mit": { "version": "3.1.25", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.25.tgz", - "integrity": "sha512-zGODptk24CMrXi49ieG2SUm94CKxEsVF0dYNF+1ZYH0MSsQDZ/PKDlrrbvtBqSupKdPSj0Z9sjOmMNfHHW9ZSg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-filetypes": { "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.18.tgz", - "integrity": "sha512-yU7RKD/x1IWmDLzWeiItMwgV+6bUcU/af23uS0+uGiFUbsY1qWV/D4rxlAAO6Z7no3J2z8aZOkYIOvUrJq0Rcw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-flutter": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz", - "integrity": "sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-fonts": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.6.tgz", - "integrity": "sha512-aR/0csY01dNb0A1tw/UmN9rKgHruUxsYsvXu6YlSBJFu60s26SKr/k1o4LavpHTQ+lznlYMqAvuxGkE4Flliqw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-fsharp": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz", - "integrity": "sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-fullstack": { "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.9.tgz", - "integrity": "sha512-diZX+usW5aZ4/b2T0QM/H/Wl9aNMbdODa1Jq0ReBr/jazmNeWjd+PyqeVgzd1joEaHY+SAnjrf/i9CwKd2ZtWQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-gaming-terms": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz", - "integrity": "sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-git": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.1.0.tgz", - "integrity": "sha512-KEt9zGkxqGy2q1nwH4CbyqTSv5nadpn8BAlDnzlRcnL0Xb3LX9xTgSGShKvzb0bw35lHoYyLWN2ZKAqbC4pgGQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-golang": { "version": "6.0.27", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.27.tgz", - "integrity": "sha512-rRDb2JL8EefaezHGTEclKXCs4eMOS0q/datk94Lm7KQOhlGlzS9FDVZiR1/guh0o+iJCmejQuf5NR2FQeQSWsg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-google": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.9.tgz", - "integrity": "sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-haskell": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz", - "integrity": "sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-html": { "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.16.tgz", - "integrity": "sha512-9B6/Cpb5YVcYgsEAlKudun1yd4ONllYS/ZibKLYea2apPR+l2vQdARnPrP9kTqa7NUNfRKl7m9Fb6k9rjimnow==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-html-symbol-entities": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", - "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-java": { "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.12.tgz", - "integrity": "sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-julia": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.1.tgz", - "integrity": "sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-k8s": { "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.13.tgz", - "integrity": "sha512-ELGkS13k7K/NEfVimBSrxVTfqXvOF/Kvxj4I62YxRm8bvHbfoXgrGaOx28lPiNRz+dmu+yYtvuXbnURKtYbC6g==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-kotlin": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz", - "integrity": "sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-latex": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-5.1.0.tgz", - "integrity": "sha512-qxT4guhysyBt0gzoliXYEBYinkAdEtR2M7goRaUH0a7ltCsoqqAeEV8aXYRIdZGcV77gYSobvu3jJL038tlPAw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-lorem-ipsum": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz", - "integrity": "sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-lua": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.8.tgz", - "integrity": "sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-makefile": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz", - "integrity": "sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-markdown": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.18.tgz", - "integrity": "sha512-KLRSwVrwKDz4n7bl2XQjzvaBZbGgx5QKkP5Ok1b24xaO3TpXsLhAbAn1mItvFlI2tF6Rkt83iYjQcYppywuf5Q==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1390,50 +1241,36 @@ }, "node_modules/@cspell/dict-monkeyc": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.1.0.tgz", - "integrity": "sha512-mc/hgvSy/emOIYtc8kuVEaLUlnaERunfAubfJ5plUXq6s0A69bcukJzUzSt9C0UTCwS28641ILRPv80m3L9QbA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-node": { "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.9.tgz", - "integrity": "sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-npm": { "version": "5.2.47", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.47.tgz", - "integrity": "sha512-r5ePbkmRtpMwiv+MHd6be1xIRLuXoEwaSLIZLu3mY+qtPVo0LUj/kVl4YeIxHONiwyef75zqS3gnT+s5UF7diQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-php": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.1.tgz", - "integrity": "sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-powershell": { "version": "5.0.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz", - "integrity": "sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-public-licenses": { "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.16.tgz", - "integrity": "sha512-EQRrPvEOmwhwWezV+W7LjXbIBjiy6y/shrET6Qcpnk3XANTzfvWflf9PnJ5kId/oKWvihFy0za0AV1JHd03pSQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-python": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.4.0.tgz", - "integrity": "sha512-49Eju/a97V6ExAeMJDM2Tk4jsYr0pm+kQzqQrKLAZdrRd6VrLIgseI481EQSmgoVkPPdsuwK1xj9ZlpDQIF4qg==", "dev": true, "license": "MIT", "dependencies": { @@ -1442,99 +1279,71 @@ }, "node_modules/@cspell/dict-r": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.1.tgz", - "integrity": "sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-ruby": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.2.tgz", - "integrity": "sha512-f6Slf11N91ittf71AWlfVVG9GZPezVRBfcMPCTNTWhUsY/VEspkBRZYDhPXjV4df3jqHy5YJs8nlsFcFVF/bMA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-rust": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.2.tgz", - "integrity": "sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-scala": { "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", - "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-shell": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.2.0.tgz", - "integrity": "sha512-PVctvT22lJ49niMiakO8xieY7ELCAzjSqhejWR7bAMb5AZ9F4WDEs+XdGMnoVHWeXq7K5rcepLPmEJb+37zzIw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-software-terms": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.4.1.tgz", - "integrity": "sha512-tY88gnOWj2ax6h+i7BjU7dIH1f3fvY4WypS0a+TpjBgXC318AdOMmy0zK1SzxGNOjhWJfCeCZNVoLFM/DuOG4g==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-sql": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", - "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-svelte": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", - "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-swift": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", - "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-terraform": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.4.tgz", - "integrity": "sha512-Ere42ilvMFvQA4GlcN0OKlruMPR6EsvaB+iTHzj2xc+NJGRK64V7yApUcWrOrSgTiM/vhWXPIsK3OMfiAiNdmA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-typescript": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", - "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-vue": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", - "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-zig": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", - "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dynamic-import": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.8.0.tgz", - "integrity": "sha512-wMgb32lqG9g6lCipUQsY9Bk5idXPDz7wvzOqEsU1M2HmNYmdE1wfPoRpfQfsVL965iG3+6h8QLr2+8FKpweFEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1547,8 +1356,6 @@ }, "node_modules/@cspell/filetypes": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.8.0.tgz", - "integrity": "sha512-yHvtYn9qt6zykua77sNzTcf7HrG/dpo/+2pCMGSrfSrQypSNT6FUFvMS04W7kwhP86U1GkCjppNykXuoH3cqug==", "dev": true, "license": "MIT", "engines": { @@ -1557,8 +1364,6 @@ }, "node_modules/@cspell/rpc": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/rpc/-/rpc-9.8.0.tgz", - "integrity": "sha512-t4lHEa254W+PePXNQ1noW7QhQxz/mhsJ9X8LEt0ILzBbPWCJzN+JuaM7EiolIPiwxtfxpMwKx9482kt4eTja7A==", "dev": true, "license": "MIT", "engines": { @@ -1567,8 +1372,6 @@ }, "node_modules/@cspell/strong-weak-map": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.8.0.tgz", - "integrity": "sha512-HocksAqZ0JcWA5oWO7TIlOCftXVGkPGzbeFlCRRrjJpZmYQH+4NdeEXyQC6T89NGocp45td/CgyBcAaFMy1N9w==", "dev": true, "license": "MIT", "engines": { @@ -1577,8 +1380,6 @@ }, "node_modules/@cspell/url": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.8.0.tgz", - "integrity": "sha512-LY1lFiZLTQF/ma1ilfKmRmFmEOw0RfYhyl0UMhY7/d93b+kiDMhxP/9Qir4+5LyiRncaE3++ZcWno9Hya+ssRg==", "dev": true, "license": "MIT", "engines": { @@ -1587,8 +1388,6 @@ }, "node_modules/@csstools/color-helpers": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", - "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", "funding": [ { "type": "github", @@ -1606,8 +1405,6 @@ }, "node_modules/@csstools/css-calc": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", - "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", "funding": [ { "type": "github", @@ -1629,8 +1426,6 @@ }, "node_modules/@csstools/css-color-parser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.0.tgz", - "integrity": "sha512-5+5LEmFuY1AjXdYhmgjTJogtQnP1evJ1zrBZGUNZ0thkpwnnmKxcHdAMn/OtFjAb25zA+jKDVYVRl+5G7rjv1A==", "funding": [ { "type": "github", @@ -1656,8 +1451,6 @@ }, "node_modules/@csstools/css-parser-algorithms": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", "funding": [ { "type": "github", @@ -1678,8 +1471,6 @@ }, "node_modules/@csstools/css-syntax-patches-for-csstree": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.8.tgz", - "integrity": "sha512-CpMLjAvwQg3BL5S0IeqsZNMH7EQrEWi0kLKOC13ZBF0ZwERiLWlibNPJr8G1kdU3Ms/r2KiNrF81pUh2HwAHdg==", "funding": [ { "type": "github", @@ -1702,8 +1493,6 @@ }, "node_modules/@csstools/css-tokenizer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", "funding": [ { "type": "github", @@ -1752,8 +1541,6 @@ }, "node_modules/@epic-web/invariant": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", "dev": true, "license": "MIT" }, @@ -2159,8 +1946,6 @@ }, "node_modules/@esbuild/win32-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -2175,8 +1960,6 @@ }, "node_modules/@exodus/bytes": { "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", - "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", "license": "MIT", "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" @@ -2192,8 +1975,6 @@ }, "node_modules/@floating-ui/core": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", - "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.12" @@ -2201,8 +1982,6 @@ }, "node_modules/@floating-ui/dom": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", - "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { "@floating-ui/core": "^1.8.0", @@ -2211,14 +1990,10 @@ }, "node_modules/@floating-ui/utils": { "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", - "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@fontsource-variable/instrument-sans": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@fontsource-variable/instrument-sans/-/instrument-sans-5.3.0.tgz", - "integrity": "sha512-u4gKbDBTNFGkg997tfQn3eHOhHuquWUFTRT/rwzuKtrxX5P2ekfs2x+LgBPP4P32+cC+vUwF1Cr+IdRoPQbrGw==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" @@ -2226,8 +2001,6 @@ }, "node_modules/@fontsource-variable/inter": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", - "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" @@ -2235,8 +2008,6 @@ }, "node_modules/@fontsource-variable/jetbrains-mono": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@fontsource-variable/jetbrains-mono/-/jetbrains-mono-5.3.0.tgz", - "integrity": "sha512-F32xpS2NsGYoQi2ADSkKTgpJj7ozajsGgDJ8woTnqjmIB+dxDIqImjl4pXZVEExu8UFZ2ndhmX18EBS/hdz3Lw==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" @@ -2244,8 +2015,6 @@ }, "node_modules/@hono/node-server": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.1.tgz", - "integrity": "sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==", "license": "MIT", "engines": { "node": ">=20" @@ -2256,17 +2025,15 @@ }, "node_modules/@img/colour": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz", - "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz", + "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==", "cpu": [ "arm64" ], @@ -2282,13 +2049,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.3.3" + "@img/sharp-libvips-darwin-arm64": "1.3.2" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz", - "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz", + "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==", "cpu": [ "x64" ], @@ -2304,7 +2071,7 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.3.3" + "@img/sharp-libvips-darwin-x64": "1.3.2" } }, "node_modules/@img/sharp-freebsd-wasm32": { @@ -2326,26 +2093,10 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", - "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.11.1" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz", - "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz", + "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==", "cpu": [ "arm64" ], @@ -2359,9 +2110,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz", - "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz", + "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==", "cpu": [ "x64" ], @@ -2375,9 +2126,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz", - "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz", + "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==", "cpu": [ "arm" ], @@ -2394,9 +2145,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz", - "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz", + "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==", "cpu": [ "arm64" ], @@ -2413,9 +2164,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz", - "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz", + "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==", "cpu": [ "ppc64" ], @@ -2432,9 +2183,9 @@ } }, "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz", - "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz", + "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==", "cpu": [ "riscv64" ], @@ -2451,9 +2202,9 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz", - "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz", + "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==", "cpu": [ "s390x" ], @@ -2470,9 +2221,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz", - "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz", + "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==", "cpu": [ "x64" ], @@ -2489,9 +2240,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz", - "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz", + "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==", "cpu": [ "arm64" ], @@ -2508,9 +2259,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz", - "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz", + "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==", "cpu": [ "x64" ], @@ -2527,9 +2278,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz", - "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz", + "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==", "cpu": [ "arm" ], @@ -2548,13 +2299,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.3.3" + "@img/sharp-libvips-linux-arm": "1.3.2" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz", - "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz", + "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==", "cpu": [ "arm64" ], @@ -2573,13 +2324,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.3.3" + "@img/sharp-libvips-linux-arm64": "1.3.2" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz", - "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz", + "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==", "cpu": [ "ppc64" ], @@ -2598,13 +2349,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.3.3" + "@img/sharp-libvips-linux-ppc64": "1.3.2" } }, "node_modules/@img/sharp-linux-riscv64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz", - "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz", + "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==", "cpu": [ "riscv64" ], @@ -2623,13 +2374,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.3.3" + "@img/sharp-libvips-linux-riscv64": "1.3.2" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz", - "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz", + "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==", "cpu": [ "s390x" ], @@ -2648,13 +2399,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.3.3" + "@img/sharp-libvips-linux-s390x": "1.3.2" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz", - "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz", + "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==", "cpu": [ "x64" ], @@ -2673,13 +2424,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.3.3" + "@img/sharp-libvips-linux-x64": "1.3.2" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz", - "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz", + "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==", "cpu": [ "arm64" ], @@ -2698,13 +2449,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz", - "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz", + "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==", "cpu": [ "x64" ], @@ -2723,17 +2474,17 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.3.3" + "@img/sharp-libvips-linuxmusl-x64": "1.3.2" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", - "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", + "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.11.3" + "@emnapi/runtime": "^1.11.1" }, "engines": { "node": ">=20.9.0" @@ -2761,26 +2512,10 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", - "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.11.1" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz", - "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz", + "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==", "cpu": [ "arm64" ], @@ -2797,9 +2532,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz", - "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz", + "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==", "cpu": [ "ia32" ], @@ -2817,8 +2552,6 @@ }, "node_modules/@img/sharp-win32-x64": { "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz", - "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==", "cpu": [ "x64" ], @@ -2834,22 +2567,39 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.6.0.tgz", - "integrity": "sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==", "license": "BSD-3-Clause" }, "node_modules/@lit/context": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz", - "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==", "license": "BSD-3-Clause", "dependencies": { "@lit/reactive-element": "^1.6.2 || ^2.1.0" @@ -2857,8 +2607,6 @@ }, "node_modules/@lit/reactive-element": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz", - "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==", "license": "BSD-3-Clause", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.5.0" @@ -2866,8 +2614,6 @@ }, "node_modules/@mdx-js/mdx": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", - "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -2903,14 +2649,10 @@ }, "node_modules/@mixmark-io/domino": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", - "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", "license": "BSD-2-Clause" }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", - "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", "license": "MIT", "dependencies": { "@hono/node-server": "^1.19.9 || ^2.0.5", @@ -2970,14 +2712,10 @@ }, "node_modules/@oslojs/encoding": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", - "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT" }, "node_modules/@oxc-project/types": { "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" @@ -3063,8 +2801,6 @@ }, "node_modules/@pagefind/windows-x64": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz", - "integrity": "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==", "cpu": [ "x64" ], @@ -3076,8 +2812,6 @@ }, "node_modules/@parcel/watcher": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -3349,8 +3083,6 @@ }, "node_modules/@parcel/watcher-win32-x64": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", "cpu": [ "x64" ], @@ -3611,8 +3343,6 @@ }, "node_modules/@rolldown/binding-win32-x64-msvc": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", "cpu": [ "x64" ], @@ -3627,14 +3357,10 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "license": "MIT" }, "node_modules/@shikijs/core": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", - "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", "license": "MIT", "dependencies": { "@shikijs/primitive": "4.4.3", @@ -3649,8 +3375,6 @@ }, "node_modules/@shikijs/engine-javascript": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", - "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", "license": "MIT", "dependencies": { "@shikijs/types": "4.4.3", @@ -3663,8 +3387,6 @@ }, "node_modules/@shikijs/engine-oniguruma": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", - "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", "license": "MIT", "dependencies": { "@shikijs/types": "4.4.3", @@ -3676,8 +3398,6 @@ }, "node_modules/@shikijs/langs": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", - "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", "license": "MIT", "dependencies": { "@shikijs/types": "4.4.3" @@ -3688,8 +3408,6 @@ }, "node_modules/@shikijs/primitive": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", - "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", "license": "MIT", "dependencies": { "@shikijs/types": "4.4.3", @@ -3702,8 +3420,6 @@ }, "node_modules/@shikijs/themes": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", - "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", "license": "MIT", "dependencies": { "@shikijs/types": "4.4.3" @@ -3714,8 +3430,6 @@ }, "node_modules/@shikijs/types": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", - "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", @@ -3727,39 +3441,49 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "license": "MIT" }, "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, "node_modules/@types/debug": { "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "license": "MIT", "dependencies": { "@types/ms": "*" } }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "license": "MIT", "dependencies": { "@types/estree": "*" @@ -3767,8 +3491,6 @@ }, "node_modules/@types/hast": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", - "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -3776,8 +3498,6 @@ }, "node_modules/@types/jsdom": { "version": "28.0.3", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-28.0.3.tgz", - "integrity": "sha512-/HQ2uFoetFTXuye8vzIcHw2z6Fwi7Hi/qcgC+RoS9NCyewiqxhVGqlG+ViGB6lkax481R6dmhf1I7lIGlzJStQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3789,15 +3509,11 @@ }, "node_modules/@types/katex": { "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", "dev": true, "license": "MIT" }, "node_modules/@types/mdast": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -3805,20 +3521,14 @@ }, "node_modules/@types/mdx": { "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", - "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==", "license": "MIT" }, "node_modules/@types/ms": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, "node_modules/@types/nlcst": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", - "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -3826,8 +3536,6 @@ }, "node_modules/@types/node": { "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.3.0.tgz", - "integrity": "sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3836,40 +3544,66 @@ }, "node_modules/@types/node/node_modules/undici-types": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", "devOptional": true, "license": "MIT" }, "node_modules/@types/tough-cookie": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true, "license": "MIT" }, "node_modules/@types/trusted-types": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", - "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, + "node_modules/@vitest/mocker": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.2.tgz", + "integrity": "sha512-Z5FS00Q1SJHkB35xATsmWGdQ5WA1/0MV3CDjqyv7GavHv1OfOj145MNfHOlHk7QLes21dKFDHr8EO2zvL+9WGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.31", + "@vitest/spy": "5.0.2", + "estree-walker": "^3.0.3", + "magic-string": "^1.2.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/spy": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.2.tgz", + "integrity": "sha512-Ijc7T1nT9efNb5LxvjaBrEqw3f/QwUv5EE0nKqZxgqsaV/FxAAZ8baGylA8X/Z2oS4Lp+K74Jr6dTJsDKxJDeg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@volar/language-core": { "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3878,15 +3612,11 @@ }, "node_modules/@volar/source-map": { "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", "dev": true, "license": "MIT" }, "node_modules/@volar/typescript": { "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", "dev": true, "license": "MIT", "dependencies": { @@ -3897,8 +3627,6 @@ }, "node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -3910,8 +3638,6 @@ }, "node_modules/acorn": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3922,8 +3648,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -3931,8 +3655,6 @@ }, "node_modules/ajv": { "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -3947,8 +3669,6 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -3964,8 +3684,6 @@ }, "node_modules/am-i-vibing": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", - "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", "license": "MIT", "dependencies": { "process-ancestry": "^0.1.0" @@ -3980,8 +3698,6 @@ }, "node_modules/ansi-regex": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", - "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -3993,8 +3709,6 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -4006,8 +3720,6 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -4018,14 +3730,10 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -4033,8 +3741,6 @@ }, "node_modules/array-iterate": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", "license": "MIT", "funding": { "type": "github", @@ -4043,15 +3749,21 @@ }, "node_modules/array-timsort": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", "dev": true, "license": "MIT" }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/astring": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "license": "MIT", "bin": { "astring": "bin/astring" @@ -4059,8 +3771,6 @@ }, "node_modules/astro": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/astro/-/astro-7.3.5.tgz", - "integrity": "sha512-1p/ernaq/RuESbM5NMjWzbO6SiebMGrGcYlGjMfBhzzgM+n/X7AUmVyw8BqW2QYCdivpsHwJBcD1fqmlTZjZHg==", "license": "MIT", "dependencies": { "@astrojs/compiler-rs": "^0.5.0", @@ -4143,8 +3853,6 @@ }, "node_modules/astro-seo-schema": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/astro-seo-schema/-/astro-seo-schema-7.0.0.tgz", - "integrity": "sha512-icG6vL2pKNf7WBI03JxZYn6gQiLASxq/U3JVv27roaPJ+WH0p3sats9mMInzp6x40G1mVdLLoAEUObmKY1If+A==", "license": "MIT", "peerDependencies": { "astro": "^7.0.0", @@ -4153,8 +3861,6 @@ }, "node_modules/astro/node_modules/@astrojs/internal-helpers": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", - "integrity": "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.4", @@ -4169,8 +3875,6 @@ }, "node_modules/astro/node_modules/@astrojs/markdown-satteri": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.4.2.tgz", - "integrity": "sha512-g4QehXnB/MzxQWnSf17NciFInMqEJy9948p8cc7zGg/r7995m0Ln5PMr3Xlnj24iey1LchaoZ3SzTOa3D4P/3w==", "license": "MIT", "dependencies": { "@astrojs/internal-helpers": "0.11.0", @@ -4302,8 +4006,6 @@ }, "node_modules/astro/node_modules/@bruits/satteri-win32-x64-msvc": { "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.10.5.tgz", - "integrity": "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==", "cpu": [ "x64" ], @@ -4344,230 +4046,696 @@ "tslib": "^2.4.0" } }, - "node_modules/astro/node_modules/@img/sharp-freebsd-wasm32": { + "node_modules/astro/node_modules/@img/sharp-darwin-arm64": { "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz", - "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz", + "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==", + "cpu": [ + "arm64" + ], "license": "Apache-2.0", "optional": true, "os": [ - "freebsd" + "darwin" ], - "dependencies": { - "@img/sharp-wasm32": "0.35.4" - }, "engines": { "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.3" } }, - "node_modules/astro/node_modules/@img/sharp-webcontainers-wasm32": { + "node_modules/astro/node_modules/@img/sharp-darwin-x64": { "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz", - "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz", + "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==", "cpu": [ - "wasm32" + "x64" ], "license": "Apache-2.0", "optional": true, - "dependencies": { - "@img/sharp-wasm32": "0.35.4" - }, + "os": [ + "darwin" + ], "engines": { "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" - } - }, - "node_modules/astro/node_modules/satteri": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", - "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.5", - "@types/hast": "^3.0.5", - "@types/mdast": "^4.0.4", - "@types/unist": "^3.0.3" }, "optionalDependencies": { - "@bruits/satteri-darwin-arm64": "0.10.5", - "@bruits/satteri-darwin-x64": "0.10.5", - "@bruits/satteri-linux-arm64-gnu": "0.10.5", - "@bruits/satteri-linux-arm64-musl": "0.10.5", - "@bruits/satteri-linux-x64-gnu": "0.10.5", - "@bruits/satteri-linux-x64-musl": "0.10.5", - "@bruits/satteri-wasm32-wasi": "0.10.5", - "@bruits/satteri-win32-arm64-msvc": "0.10.5", - "@bruits/satteri-win32-x64-msvc": "0.10.5" + "@img/sharp-libvips-darwin-x64": "1.3.3" } }, - "node_modules/astro/node_modules/sharp": { + "node_modules/astro/node_modules/@img/sharp-freebsd-wasm32": { "version": "0.35.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz", - "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz", + "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==", "license": "Apache-2.0", "optional": true, + "os": [ + "freebsd" + ], "dependencies": { - "@img/colour": "^1.1.0", - "detect-libc": "^2.1.2", - "semver": "^7.8.5" + "@img/sharp-wasm32": "0.35.4" }, "engines": { "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.35.4", - "@img/sharp-darwin-x64": "0.35.4", - "@img/sharp-freebsd-wasm32": "0.35.4", - "@img/sharp-libvips-darwin-arm64": "1.3.3", - "@img/sharp-libvips-darwin-x64": "1.3.3", - "@img/sharp-libvips-linux-arm": "1.3.3", - "@img/sharp-libvips-linux-arm64": "1.3.3", - "@img/sharp-libvips-linux-ppc64": "1.3.3", - "@img/sharp-libvips-linux-riscv64": "1.3.3", - "@img/sharp-libvips-linux-s390x": "1.3.3", - "@img/sharp-libvips-linux-x64": "1.3.3", - "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", - "@img/sharp-libvips-linuxmusl-x64": "1.3.3", - "@img/sharp-linux-arm": "0.35.4", - "@img/sharp-linux-arm64": "0.35.4", - "@img/sharp-linux-ppc64": "0.35.4", - "@img/sharp-linux-riscv64": "0.35.4", - "@img/sharp-linux-s390x": "0.35.4", - "@img/sharp-linux-x64": "0.35.4", - "@img/sharp-linuxmusl-arm64": "0.35.4", - "@img/sharp-linuxmusl-x64": "0.35.4", - "@img/sharp-webcontainers-wasm32": "0.35.4", - "@img/sharp-win32-arm64": "0.35.4", - "@img/sharp-win32-ia32": "0.35.4", - "@img/sharp-win32-x64": "0.35.4" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz", + "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://opencollective.com/libvips" } }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz", + "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz", + "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^2.0.0", - "debug": "^4.4.3", - "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", - "on-finished": "^2.4.1", - "qs": "^6.15.2", - "raw-body": "^3.0.2", - "type-is": "^2.1.0" - }, - "engines": { - "node": ">=18" - }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz", + "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/libvips" } }, - "node_modules/body-parser/node_modules/content-type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", - "license": "MIT", - "engines": { - "node": ">=18" - }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz", + "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/libvips" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" + "node_modules/astro/node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz", + "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/buffer-builder": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", - "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", - "license": "MIT/X11" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "node_modules/astro/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz", + "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/call-bind-apply-helpers": { + "node_modules/astro/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz", + "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz", + "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz", + "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz", + "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.3" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz", + "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.3" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz", + "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.3" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz", + "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.3" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-s390x": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz", + "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.3" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz", + "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.3" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz", + "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz", + "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.3" + } + }, + "node_modules/astro/node_modules/@img/sharp-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", + "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/astro/node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz", + "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz", + "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-ia32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz", + "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/satteri": { + "version": "0.10.5", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.5", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.10.5", + "@bruits/satteri-darwin-x64": "0.10.5", + "@bruits/satteri-linux-arm64-gnu": "0.10.5", + "@bruits/satteri-linux-arm64-musl": "0.10.5", + "@bruits/satteri-linux-x64-gnu": "0.10.5", + "@bruits/satteri-linux-x64-musl": "0.10.5", + "@bruits/satteri-wasm32-wasi": "0.10.5", + "@bruits/satteri-win32-arm64-msvc": "0.10.5", + "@bruits/satteri-win32-x64-msvc": "0.10.5" + } + }, + "node_modules/astro/node_modules/sharp": { + "version": "0.35.4", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.4", + "@img/sharp-darwin-x64": "0.35.4", + "@img/sharp-freebsd-wasm32": "0.35.4", + "@img/sharp-libvips-darwin-arm64": "1.3.3", + "@img/sharp-libvips-darwin-x64": "1.3.3", + "@img/sharp-libvips-linux-arm": "1.3.3", + "@img/sharp-libvips-linux-arm64": "1.3.3", + "@img/sharp-libvips-linux-ppc64": "1.3.3", + "@img/sharp-libvips-linux-riscv64": "1.3.3", + "@img/sharp-libvips-linux-s390x": "1.3.3", + "@img/sharp-libvips-linux-x64": "1.3.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", + "@img/sharp-libvips-linuxmusl-x64": "1.3.3", + "@img/sharp-linux-arm": "0.35.4", + "@img/sharp-linux-arm64": "0.35.4", + "@img/sharp-linux-ppc64": "0.35.4", + "@img/sharp-linux-riscv64": "0.35.4", + "@img/sharp-linux-s390x": "0.35.4", + "@img/sharp-linux-x64": "0.35.4", + "@img/sharp-linuxmusl-arm64": "0.35.4", + "@img/sharp-linuxmusl-x64": "0.35.4", + "@img/sharp-webcontainers-wasm32": "0.35.4", + "@img/sharp-win32-arm64": "0.35.4", + "@img/sharp-win32-ia32": "0.35.4", + "@img/sharp-win32-x64": "0.35.4" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/body-parser": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "license": "MIT/X11" + }, + "node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4579,8 +4747,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -4595,8 +4761,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -4605,18 +4769,24 @@ }, "node_modules/ccount": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", "engines": { @@ -4628,8 +4798,6 @@ }, "node_modules/chalk-template": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", - "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", "dev": true, "license": "MIT", "dependencies": { @@ -4644,8 +4812,6 @@ }, "node_modules/character-entities": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", "funding": { "type": "github", @@ -4654,8 +4820,6 @@ }, "node_modules/character-entities-html4": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "license": "MIT", "funding": { "type": "github", @@ -4664,8 +4828,6 @@ }, "node_modules/character-entities-legacy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "license": "MIT", "funding": { "type": "github", @@ -4674,8 +4836,6 @@ }, "node_modules/character-reference-invalid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "license": "MIT", "funding": { "type": "github", @@ -4684,8 +4844,6 @@ }, "node_modules/chokidar": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { "readdirp": "^5.0.0" @@ -4699,8 +4857,6 @@ }, "node_modules/ci-info": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "funding": [ { "type": "github", @@ -4714,8 +4870,6 @@ }, "node_modules/clear-module": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.3.tgz", - "integrity": "sha512-XdLrg7BnbXKntyrbs2dNjDN9CVoTQ+WV0i7jT5/r9ahzAaSDSzC9e2OVZB/QVwbxBb1/1AeObzjlxsYk5HFvww==", "dev": true, "license": "MIT", "dependencies": { @@ -4731,8 +4885,6 @@ }, "node_modules/clsx": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" @@ -4740,8 +4892,6 @@ }, "node_modules/collapse-white-space": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", "license": "MIT", "funding": { "type": "github", @@ -4750,8 +4900,6 @@ }, "node_modules/colorjs.io": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.7.1.tgz", - "integrity": "sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==", "devOptional": true, "license": "MIT", "funding": { @@ -4761,8 +4909,6 @@ }, "node_modules/comma-separated-tokens": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "license": "MIT", "funding": { "type": "github", @@ -4771,8 +4917,6 @@ }, "node_modules/commander": { "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { @@ -4781,8 +4925,6 @@ }, "node_modules/comment-json": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.6.2.tgz", - "integrity": "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==", "dev": true, "license": "MIT", "dependencies": { @@ -4795,8 +4937,6 @@ }, "node_modules/common-ancestor-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", - "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", "license": "BlueOak-1.0.0", "engines": { "node": ">= 18" @@ -4804,8 +4944,6 @@ }, "node_modules/content-disposition": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "license": "MIT", "engines": { "node": ">=18" @@ -4817,8 +4955,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4826,8 +4962,6 @@ }, "node_modules/cookie": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", - "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", "license": "MIT", "engines": { "node": ">=22" @@ -4839,14 +4973,10 @@ }, "node_modules/cookie-es": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", - "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", "license": "MIT" }, "node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -4854,8 +4984,6 @@ }, "node_modules/cors": { "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -4871,8 +4999,6 @@ }, "node_modules/cross-env": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", - "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -4889,8 +5015,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -4903,8 +5027,6 @@ }, "node_modules/crossws": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", - "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", "license": "MIT", "dependencies": { "uncrypto": "^0.1.3" @@ -4912,8 +5034,6 @@ }, "node_modules/cspell": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.8.0.tgz", - "integrity": "sha512-qL0VErMSn8BDxaPxcV+9uenffgjPS+5Jfz+m4rCsvYjzLwr7AaaJBWWSV2UiAe/4cturae8n8qzxiGnbbazkRw==", "dev": true, "license": "MIT", "dependencies": { @@ -4952,8 +5072,6 @@ }, "node_modules/cspell-config-lib": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.8.0.tgz", - "integrity": "sha512-gMJBAgYPvvO+uDFLUcGWaTu6/e+r8mm4GD4rQfWa/yV4F9fj+yOYLIMZqLWRvT1moHZX1FxyVvUbJcmZ1gfebg==", "dev": true, "license": "MIT", "dependencies": { @@ -4968,8 +5086,6 @@ }, "node_modules/cspell-dictionary": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.8.0.tgz", - "integrity": "sha512-QW4hdkWcrxZA1QNqi26U0S/U3/V+tKCm7JaaesEJW2F6Ao+23AbHVwidyAVtXaEhGkn6PxB+epKrrAa6nE69qA==", "dev": true, "license": "MIT", "dependencies": { @@ -4985,8 +5101,6 @@ }, "node_modules/cspell-gitignore": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.8.0.tgz", - "integrity": "sha512-SDUa1DmSfT20+JH7XtyzcEL9KfurneoR/XbmlrtPQZP/LUHXh3yz4x/0vFIkEFXNWdSckY0QdWTz8DaxClCf4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5003,8 +5117,6 @@ }, "node_modules/cspell-glob": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.8.0.tgz", - "integrity": "sha512-Uvj/iHXs+jpsJyIEnhEoJTWXb1GVyZ9T05L5JFtZfsQNXrh8SRDQPscjxbg4okKr63N7WevfioQum/snHNYvmw==", "dev": true, "license": "MIT", "dependencies": { @@ -5017,8 +5129,6 @@ }, "node_modules/cspell-grammar": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.8.0.tgz", - "integrity": "sha512-01XMq2vhPS0Gvxnfed9uvOwH+3cXddHYxW0PwCE+SZdcC6TN8yM6glByuLt1qFustAmQVE5GSr7uAY9o4pZQRg==", "dev": true, "license": "MIT", "dependencies": { @@ -5034,8 +5144,6 @@ }, "node_modules/cspell-io": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.8.0.tgz", - "integrity": "sha512-JINaEWQEzR4f2upwdZOFcft+nBvQgizJfrOLszxG3p+BIzljnGklqE/nUtLFZpBu0oMJvuM/Fd+GsWor0yP7Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -5048,8 +5156,6 @@ }, "node_modules/cspell-lib": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.8.0.tgz", - "integrity": "sha512-G2TtPcye5QE5ev3YgWq42UOJLpTZ6naO/47oIm+jmeSYbgnbcOSThnEE7uMycx+TTNOz/vJVFpZmQyt0bWCftw==", "dev": true, "license": "MIT", "dependencies": { @@ -5084,8 +5190,6 @@ }, "node_modules/cspell-trie-lib": { "version": "9.8.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.8.0.tgz", - "integrity": "sha512-GXIyqxya8QLp6SjKsAN9w3apvt1Ww7GKcZvTBaP76OfLoyb1QC6unwmObY2cZs1manCntGwHrgU6vFNuXnTzpw==", "dev": true, "license": "MIT", "engines": { @@ -5097,8 +5201,6 @@ }, "node_modules/css-select": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", - "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -5113,8 +5215,6 @@ }, "node_modules/css-tree": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "license": "MIT", "dependencies": { "mdn-data": "2.27.1", @@ -5126,8 +5226,6 @@ }, "node_modules/css-what": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", - "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -5138,8 +5236,6 @@ }, "node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "license": "MIT", "dependencies": { "css-tree": "~2.2.0" @@ -5151,8 +5247,6 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "license": "MIT", "dependencies": { "mdn-data": "2.0.28", @@ -5165,14 +5259,10 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "license": "CC0-1.0" }, "node_modules/data-urls": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", - "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", "license": "MIT", "dependencies": { "whatwg-mimetype": "^5.0.0", @@ -5184,8 +5274,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5201,14 +5289,10 @@ }, "node_modules/decimal.js": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "license": "MIT" }, "node_modules/decode-named-character-reference": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -5220,8 +5304,6 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "license": "MIT", "engines": { @@ -5230,14 +5312,10 @@ }, "node_modules/defu": { "version": "6.1.7", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", - "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5245,8 +5323,6 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", "engines": { "node": ">=6" @@ -5254,14 +5330,10 @@ }, "node_modules/destr": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", "license": "MIT" }, "node_modules/detect-libc": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -5269,14 +5341,10 @@ }, "node_modules/devalue": { "version": "5.9.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.1.tgz", - "integrity": "sha512-+17vil3EVQRzvtDJSFuTWEb8XJRvXqAiV3qZyQWD398QeXUa6CxsUyMdD1fxzEhUrd4FojitFz7lhIHBTlV4fw==", "license": "MIT" }, "node_modules/devlop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "license": "MIT", "dependencies": { "dequal": "^2.0.0" @@ -5288,8 +5356,6 @@ }, "node_modules/diff": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", - "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -5301,8 +5367,6 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -5315,8 +5379,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -5327,8 +5389,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -5342,8 +5402,6 @@ }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -5356,8 +5414,6 @@ }, "node_modules/dset": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", - "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", "license": "MIT", "engines": { "node": ">=4" @@ -5365,8 +5421,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -5379,14 +5433,10 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5394,8 +5444,6 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -5406,8 +5454,6 @@ }, "node_modules/env-paths": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", - "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", "dev": true, "license": "MIT", "dependencies": { @@ -5422,8 +5468,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5431,8 +5475,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5440,14 +5482,10 @@ }, "node_modules/es-module-lexer": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -5458,8 +5496,6 @@ }, "node_modules/esast-util-from-estree": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -5474,8 +5510,6 @@ }, "node_modules/esast-util-from-js": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -5490,8 +5524,6 @@ }, "node_modules/esbuild": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", - "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -5531,14 +5563,10 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", "engines": { "node": ">=12" @@ -5549,8 +5577,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -5562,8 +5588,6 @@ }, "node_modules/estree-util-attach-comments": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -5575,8 +5599,6 @@ }, "node_modules/estree-util-build-jsx": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -5591,8 +5613,6 @@ }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", "license": "MIT", "funding": { "type": "opencollective", @@ -5601,8 +5621,6 @@ }, "node_modules/estree-util-scope": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", - "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -5615,8 +5633,6 @@ }, "node_modules/estree-util-to-js": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -5630,8 +5646,6 @@ }, "node_modules/estree-util-visit": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -5644,8 +5658,6 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -5653,8 +5665,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5662,14 +5672,10 @@ }, "node_modules/eventemitter3": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, "node_modules/eventsource": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -5680,17 +5686,23 @@ }, "node_modules/eventsource-parser": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", - "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", "license": "MIT", "engines": { "node": ">=18.0.0" } }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/express": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -5732,8 +5744,6 @@ }, "node_modules/express-rate-limit": { "version": "8.6.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.2.tgz", - "integrity": "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", "license": "MIT", "dependencies": { "debug": "^4.4.3", @@ -5751,8 +5761,6 @@ }, "node_modules/express/node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5760,14 +5768,10 @@ }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, "node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" @@ -5778,14 +5782,10 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-equals": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.2.tgz", - "integrity": "sha512-sAjhj9ZhOxYCGiNMnZLaucOqf5ZeFnHNoKoAZiD9thhJ0N8RP85qJK759/97C/3L7NzzmGVB5uiX9AUpySZmUQ==", "dev": true, "license": "MIT", "engines": { @@ -5794,21 +5794,15 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-string-truncated-width": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", - "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", "license": "MIT" }, "node_modules/fast-string-width": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", - "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", "license": "MIT", "dependencies": { "fast-string-truncated-width": "^3.0.2" @@ -5816,8 +5810,6 @@ }, "node_modules/fast-uri": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz", - "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==", "funding": [ { "type": "github", @@ -5832,8 +5824,6 @@ }, "node_modules/fast-wrap-ansi": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", - "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", "license": "MIT", "dependencies": { "fast-string-width": "^3.0.2" @@ -5841,8 +5831,6 @@ }, "node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", "engines": { "node": ">=12.0.0" @@ -5858,8 +5846,6 @@ }, "node_modules/finalhandler": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -5879,8 +5865,6 @@ }, "node_modules/find-proc": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/find-proc/-/find-proc-0.2.0.tgz", - "integrity": "sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==", "license": "MIT", "engines": { "node": "^20.19.0 || >=22.12.0" @@ -5888,15 +5872,11 @@ }, "node_modules/flatted": { "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, "node_modules/flattie": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", - "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", "license": "MIT", "engines": { "node": ">=8" @@ -5904,8 +5884,6 @@ }, "node_modules/fontace": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", - "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", "license": "MIT", "dependencies": { "fontkitten": "^1.0.2" @@ -5913,8 +5891,6 @@ }, "node_modules/fontkitten": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", - "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", "license": "MIT", "dependencies": { "tiny-inflate": "^1.0.3" @@ -5925,8 +5901,6 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5934,8 +5908,6 @@ }, "node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5957,8 +5929,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5966,8 +5936,6 @@ }, "node_modules/gensequence": { "version": "8.0.8", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", - "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", "dev": true, "license": "MIT", "engines": { @@ -5976,8 +5944,6 @@ }, "node_modules/get-east-asian-width": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { @@ -5989,8 +5955,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -6013,8 +5977,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -6026,8 +5988,6 @@ }, "node_modules/get-tsconfig": { "version": "5.0.0-beta.4", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", - "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -6041,14 +6001,10 @@ }, "node_modules/github-slugger": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "license": "ISC" }, "node_modules/global-directory": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", - "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -6063,8 +6019,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -6075,8 +6029,6 @@ }, "node_modules/gray-matter": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", @@ -6090,8 +6042,6 @@ }, "node_modules/gray-matter/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -6099,8 +6049,6 @@ }, "node_modules/gray-matter/node_modules/js-yaml": { "version": "3.15.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", - "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -6112,8 +6060,6 @@ }, "node_modules/h3": { "version": "1.15.11", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", - "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", "license": "MIT", "dependencies": { "cookie-es": "^1.2.3", @@ -6129,8 +6075,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -6138,8 +6082,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -6150,8 +6092,6 @@ }, "node_modules/hasown": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -6162,8 +6102,6 @@ }, "node_modules/hast-util-from-html": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", - "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -6180,8 +6118,6 @@ }, "node_modules/hast-util-from-html/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -6192,8 +6128,6 @@ }, "node_modules/hast-util-from-html/node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -6204,8 +6138,6 @@ }, "node_modules/hast-util-from-parse5": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -6224,8 +6156,6 @@ }, "node_modules/hast-util-is-element": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -6237,8 +6167,6 @@ }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -6250,8 +6178,6 @@ }, "node_modules/hast-util-raw": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -6275,8 +6201,6 @@ }, "node_modules/hast-util-raw/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -6287,8 +6211,6 @@ }, "node_modules/hast-util-raw/node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -6299,8 +6221,6 @@ }, "node_modules/hast-util-to-estree": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -6327,8 +6247,6 @@ }, "node_modules/hast-util-to-html": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -6350,8 +6268,6 @@ }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -6377,8 +6293,6 @@ }, "node_modules/hast-util-to-parse5": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -6396,8 +6310,6 @@ }, "node_modules/hast-util-to-text": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -6412,8 +6324,6 @@ }, "node_modules/hast-util-whitespace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -6425,8 +6335,6 @@ }, "node_modules/hastscript": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -6442,8 +6350,6 @@ }, "node_modules/hono": { "version": "4.13.9", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.9.tgz", - "integrity": "sha512-7dMkQmZoC4E6F7AtaQSPhlWAdnBti+j7rreMZl8QB4jFiEhP9TWbGWUMi8WYzBCgmgulxuvLQupKqo+Co6Omyg==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -6451,8 +6357,6 @@ }, "node_modules/html-encoding-sniffer": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", - "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", "license": "MIT", "dependencies": { "@exodus/bytes": "^1.6.0" @@ -6463,14 +6367,10 @@ }, "node_modules/html-escaper": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", "license": "MIT" }, "node_modules/html-void-elements": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "license": "MIT", "funding": { "type": "github", @@ -6479,14 +6379,10 @@ }, "node_modules/http-cache-semantics": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -6505,8 +6401,6 @@ }, "node_modules/iconv-lite": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", - "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -6521,8 +6415,6 @@ }, "node_modules/igniteui-astro-components": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/igniteui-astro-components/-/igniteui-astro-components-1.2.1.tgz", - "integrity": "sha512-8VYOQGVM56m717t4KrQeTqwIyI+SlVCFYweMJU+soyRtCiIxEa5koouPdhbodaSzttKuUVKoYNbbHHSk8KFk0w==", "license": "MIT", "dependencies": { "@astrojs/markdown-satteri": "^0.3.5", @@ -6546,8 +6438,6 @@ }, "node_modules/igniteui-i18n-core": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/igniteui-i18n-core/-/igniteui-i18n-core-1.0.5.tgz", - "integrity": "sha512-CO5Rqo5uqgyAfIHbFVuBEmo+fYXgLQ7zxRShqAu+ng8kDS5uwWjKeSGWVZjKMBgxmc6ZWMMbdcWIpGZUSOkPsw==", "license": "MIT", "peerDependencies": { "igniteui-i18n-resources": "1.0.5" @@ -6560,8 +6450,6 @@ }, "node_modules/igniteui-theming": { "version": "26.1.0", - "resolved": "https://registry.npmjs.org/igniteui-theming/-/igniteui-theming-26.1.0.tgz", - "integrity": "sha512-12qUYBBahI8mjpSSrSTUB8ZIklqiroNoft/MQK6lZ0uLx9jO6CX9hGvfmJSClPGGEvAMrhLUYbvXPUOT5Hscgg==", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.28.0", @@ -6590,8 +6478,6 @@ }, "node_modules/igniteui-theming/node_modules/colorjs.io": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", "license": "MIT" }, "node_modules/igniteui-theming/node_modules/readdirp": { @@ -6631,8 +6517,6 @@ }, "node_modules/igniteui-theming/node_modules/sass-embedded": { "version": "1.92.1", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.92.1.tgz", - "integrity": "sha512-28YwLnF5atAhogt3E4hXzz/NB9dwKffyw08a7DEasLh94P7+aELkG3ENSHYCWB9QFN14hYNLfwr9ozUsPDhcDQ==", "license": "MIT", "dependencies": { "@bufbuild/protobuf": "^2.5.0", @@ -6953,8 +6837,6 @@ }, "node_modules/igniteui-theming/node_modules/sass-embedded-win32-x64": { "version": "1.92.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.92.1.tgz", - "integrity": "sha512-B6Nz/GbH7Vkpb2TkQHsGcczWM5t+70VWopWF1x5V5yxLpA8ZzVQ7NTKKi+jDoVY2Efu6ZyzgT9n5KgG2kWliXA==", "cpu": [ "x64" ], @@ -6969,8 +6851,6 @@ }, "node_modules/igniteui-theming/node_modules/zod": { "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -6978,8 +6858,6 @@ }, "node_modules/igniteui-webcomponents": { "version": "7.3.0-beta.1", - "resolved": "https://registry.npmjs.org/igniteui-webcomponents/-/igniteui-webcomponents-7.3.0-beta.1.tgz", - "integrity": "sha512-AUZO4l0GahTAcJEQSZglHH2ataQ/fdp4PsDNoQmjEYSuj/7m3eH4+2XRkowaYeZ5PcKS96W2NxdxncOTK50TNg==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.8.0", @@ -7017,8 +6895,6 @@ }, "node_modules/ignore": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", - "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { @@ -7027,14 +6903,10 @@ }, "node_modules/immutable": { "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7050,8 +6922,6 @@ }, "node_modules/import-fresh/node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -7063,8 +6933,6 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -7073,8 +6941,6 @@ }, "node_modules/import-meta-resolve": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, "license": "MIT", "funding": { @@ -7084,14 +6950,10 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "dev": true, "license": "ISC", "engines": { @@ -7100,14 +6962,10 @@ }, "node_modules/inline-style-parser": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, "node_modules/ip-address": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.5.0.tgz", - "integrity": "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==", "license": "MIT", "engines": { "node": ">= 12" @@ -7115,8 +6973,6 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -7124,8 +6980,6 @@ }, "node_modules/iron-webcrypto": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", - "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/brc-dd" @@ -7133,8 +6987,6 @@ }, "node_modules/is-alphabetical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "license": "MIT", "funding": { "type": "github", @@ -7143,8 +6995,6 @@ }, "node_modules/is-alphanumerical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", @@ -7157,8 +7007,6 @@ }, "node_modules/is-decimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "license": "MIT", "funding": { "type": "github", @@ -7167,8 +7015,6 @@ }, "node_modules/is-docker": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", - "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -7182,8 +7028,6 @@ }, "node_modules/is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7191,8 +7035,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "optional": true, "engines": { @@ -7201,8 +7043,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "optional": true, "dependencies": { @@ -7214,8 +7054,6 @@ }, "node_modules/is-hexadecimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", "license": "MIT", "funding": { "type": "github", @@ -7224,8 +7062,6 @@ }, "node_modules/is-plain-obj": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "license": "MIT", "engines": { "node": ">=12" @@ -7236,20 +7072,14 @@ }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "license": "MIT" }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-safe-filename": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", - "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", "dev": true, "license": "MIT", "engines": { @@ -7261,14 +7091,10 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/jose": { "version": "6.2.10", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.10.tgz", - "integrity": "sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -7276,8 +7102,6 @@ }, "node_modules/js-yaml": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", - "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "funding": [ { "type": "github", @@ -7298,8 +7122,6 @@ }, "node_modules/jsdom": { "version": "29.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", - "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", "license": "MIT", "dependencies": { "@asamuzakjp/css-color": "^5.1.11", @@ -7338,26 +7160,18 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json-schema-typed": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", "license": "BSD-2-Clause" }, "node_modules/jsonc-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, "node_modules/jsonpointer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true, "license": "MIT", "engines": { @@ -7366,8 +7180,6 @@ }, "node_modules/katex": { "version": "0.16.47", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", - "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", "dev": true, "funding": [ "https://opencollective.com/katex", @@ -7383,8 +7195,6 @@ }, "node_modules/katex/node_modules/commander": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "license": "MIT", "engines": { @@ -7393,8 +7203,6 @@ }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7402,8 +7210,6 @@ }, "node_modules/lightningcss": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -7643,8 +7449,6 @@ }, "node_modules/lightningcss-win32-x64-msvc": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "cpu": [ "x64" ], @@ -7663,8 +7467,6 @@ }, "node_modules/linkify-it": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", - "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", "dev": true, "funding": [ { @@ -7683,8 +7485,6 @@ }, "node_modules/lit": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.3.tgz", - "integrity": "sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw==", "license": "BSD-3-Clause", "dependencies": { "@lit/reactive-element": "^2.1.0", @@ -7694,8 +7494,6 @@ }, "node_modules/lit-element": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz", - "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==", "license": "BSD-3-Clause", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.5.0", @@ -7705,8 +7503,6 @@ }, "node_modules/lit-html": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.3.tgz", - "integrity": "sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==", "license": "BSD-3-Clause", "dependencies": { "@types/trusted-types": "^2.0.2" @@ -7714,8 +7510,6 @@ }, "node_modules/longest-streak": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "license": "MIT", "funding": { "type": "github", @@ -7724,26 +7518,22 @@ }, "node_modules/lru-cache": { "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/magic-string": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.2.tgz", - "integrity": "sha512-veT/+7iXrXzT39XnEN4lOxtNl72dMgJ8Lp+5Bd6YcMSWpb0n0MjBM8Uuooi6jgJr8dhUW2swQgBmoZVMni5SVg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz", + "integrity": "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "@jridgewell/sourcemap-codec": "^1.6.0" } }, "node_modules/magicast": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", - "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "license": "MIT", "dependencies": { "@babel/parser": "^7.29.7", @@ -7753,8 +7543,6 @@ }, "node_modules/markdown-extensions": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", "license": "MIT", "engines": { "node": ">=16" @@ -7765,8 +7553,6 @@ }, "node_modules/markdown-it": { "version": "14.3.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", - "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", "dev": true, "funding": [ { @@ -7793,8 +7579,6 @@ }, "node_modules/markdown-table": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", "license": "MIT", "funding": { "type": "github", @@ -7803,8 +7587,6 @@ }, "node_modules/markdownlint": { "version": "0.41.1", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.41.1.tgz", - "integrity": "sha512-qHKeU2E1bdyNAT077go2FVTNXvYcktN5IHtF6XyeD1l0PClxzSp2tUApAV14ORI8DGX4H9bNKZEzelZp4qn8IA==", "dev": true, "license": "MIT", "dependencies": { @@ -7827,8 +7609,6 @@ }, "node_modules/markdownlint-cli": { "version": "0.49.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.49.1.tgz", - "integrity": "sha512-qpYqJbSYf3jv57bdnFmCaZ/Wlu6IYHp2b6SOKrKBJ7OnPrDHIKmx4NERWH49QH9viTI6yO6raVDDn5nrf60VQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7854,8 +7634,6 @@ }, "node_modules/markdownlint-cli/node_modules/commander": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", - "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", "dev": true, "license": "MIT", "engines": { @@ -7864,8 +7642,6 @@ }, "node_modules/markdownlint-cli/node_modules/js-yaml": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.2.3.tgz", - "integrity": "sha512-n+mUVyUX5bVv7G/G2zyIHOhdxfuU1dY2NOFzTQUWiMUbFss8b57NFlgCCaggU78wSw5KVS9cllzeLyzyR+n5nw==", "dev": true, "funding": [ { @@ -7887,8 +7663,6 @@ }, "node_modules/markdownlint-cli/node_modules/smol-toml": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.2.tgz", - "integrity": "sha512-pXFZ9B2WinEPzxWkMmlYE/oYx2BP+qLrE95wP8tCuK901uLSMGdCb6QSr82z+wnhXkG4+cO+OMLbZB2Cn+97zw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -7900,8 +7674,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -7909,8 +7681,6 @@ }, "node_modules/mdast-util-definitions": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", - "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -7924,8 +7694,6 @@ }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -7940,8 +7708,6 @@ }, "node_modules/mdast-util-from-markdown": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -7964,8 +7730,6 @@ }, "node_modules/mdast-util-gfm": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", @@ -7983,8 +7747,6 @@ }, "node_modules/mdast-util-gfm-autolink-literal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -8000,8 +7762,6 @@ }, "node_modules/mdast-util-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -8017,8 +7777,6 @@ }, "node_modules/mdast-util-gfm-strikethrough": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -8032,8 +7790,6 @@ }, "node_modules/mdast-util-gfm-table": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -8049,8 +7805,6 @@ }, "node_modules/mdast-util-gfm-task-list-item": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -8065,8 +7819,6 @@ }, "node_modules/mdast-util-mdx": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", @@ -8082,8 +7834,6 @@ }, "node_modules/mdast-util-mdx-expression": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -8100,8 +7850,6 @@ }, "node_modules/mdast-util-mdx-jsx": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -8124,8 +7872,6 @@ }, "node_modules/mdast-util-mdxjs-esm": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -8142,8 +7888,6 @@ }, "node_modules/mdast-util-phrasing": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -8156,8 +7900,6 @@ }, "node_modules/mdast-util-to-hast": { "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -8177,8 +7919,6 @@ }, "node_modules/mdast-util-to-markdown": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -8198,8 +7938,6 @@ }, "node_modules/mdast-util-to-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" @@ -8211,21 +7949,15 @@ }, "node_modules/mdn-data": { "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "license": "CC0-1.0" }, "node_modules/mdurl": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", - "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", "dev": true, "license": "MIT" }, "node_modules/media-typer": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", - "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -8237,8 +7969,6 @@ }, "node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -8249,8 +7979,6 @@ }, "node_modules/micromark": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "funding": [ { "type": "GitHub Sponsors", @@ -8284,8 +8012,6 @@ }, "node_modules/micromark-core-commonmark": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "funding": [ { "type": "GitHub Sponsors", @@ -8318,8 +8044,6 @@ }, "node_modules/micromark-extension-directive": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", "dev": true, "license": "MIT", "dependencies": { @@ -8338,8 +8062,6 @@ }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", @@ -8358,8 +8080,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", @@ -8374,8 +8094,6 @@ }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -8394,8 +8112,6 @@ }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -8412,8 +8128,6 @@ }, "node_modules/micromark-extension-gfm-table": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -8429,8 +8143,6 @@ }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -8442,8 +8154,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -8459,8 +8169,6 @@ }, "node_modules/micromark-extension-math": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", "dev": true, "license": "MIT", "dependencies": { @@ -8479,8 +8187,6 @@ }, "node_modules/micromark-extension-mdx-expression": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8505,8 +8211,6 @@ }, "node_modules/micromark-extension-mdx-jsx": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -8527,8 +8231,6 @@ }, "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -8540,8 +8242,6 @@ }, "node_modules/micromark-extension-mdxjs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", "license": "MIT", "dependencies": { "acorn": "^8.0.0", @@ -8552,270 +8252,33 @@ "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-decode-string": { + "node_modules/micromark-factory-destination": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "funding": [ { "type": "GitHub Sponsors", @@ -8828,16 +8291,13 @@ ], "license": "MIT", "dependencies": { - "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-encode": { + "node_modules/micromark-factory-label": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "funding": [ { "type": "GitHub Sponsors", @@ -8848,12 +8308,16 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/micromark-util-events-to-acorn": { + "node_modules/micromark-factory-mdx-expression": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", "funding": [ { "type": "GitHub Sponsors", @@ -8867,34 +8331,18 @@ "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { + "node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8907,13 +8355,12 @@ ], "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-resolve-all": { + "node_modules/micromark-factory-title": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "funding": [ { "type": "GitHub Sponsors", @@ -8926,13 +8373,14 @@ ], "license": "MIT", "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-sanitize-uri": { + "node_modules/micromark-factory-whitespace": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "funding": [ { "type": "GitHub Sponsors", @@ -8945,15 +8393,14 @@ ], "license": "MIT", "dependencies": { + "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "node_modules/micromark-util-character": { + "version": "2.1.1", "funding": [ { "type": "GitHub Sponsors", @@ -8966,16 +8413,12 @@ ], "license": "MIT", "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-symbol": { + "node_modules/micromark-util-chunked": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8986,12 +8429,13 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", "funding": [ { "type": "GitHub Sponsors", @@ -9002,2053 +8446,1601 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT" - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mrmime": { + "node_modules/micromark-util-combine-extensions": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", - "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", - "license": "MIT", - "dependencies": { - "content-type": "^2.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/negotiator/node_modules/content-type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/neotraverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-1.0.1.tgz", - "integrity": "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/nlcst-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", - "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT", - "optional": true - }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "license": "MIT" - }, - "node_modules/node-mock-http": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz", - "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/obug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", - "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], "license": "MIT", - "engines": { - "node": ">=12.20.0" + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/ofetch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", - "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "destr": "^2.0.5", - "node-fetch-native": "^1.6.7", - "ufo": "^1.6.1" + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/ohash": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", - "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" } }, - "node_modules/oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/p-limit": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.1.tgz", - "integrity": "sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==", + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "yocto-queue": "^1.2.1" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-types": "^2.0.0" } }, - "node_modules/p-queue": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", - "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.4", - "p-timeout": "^7.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", - "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-manager-detector": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", - "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", - "license": "MIT" - }, - "node_modules/pagefind": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", - "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", - "license": "MIT", - "bin": { - "pagefind": "lib/runner/bin.cjs" - }, - "optionalDependencies": { - "@pagefind/darwin-arm64": "1.5.2", - "@pagefind/darwin-x64": "1.5.2", - "@pagefind/freebsd-x64": "1.5.2", - "@pagefind/linux-arm64": "1.5.2", - "@pagefind/linux-x64": "1.5.2", - "@pagefind/windows-arm64": "1.5.2", - "@pagefind/windows-x64": "1.5.2" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/parent-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", - "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", - "dev": true, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "callsites": "^3.1.0" - }, - "engines": { - "node": ">=8" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "node_modules/micromark-util-types": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/parse-latin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", - "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "node_modules/mime-db": { + "version": "1.54.0", "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "@types/unist": "^3.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-modify-children": "^4.0.0", - "unist-util-visit-children": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">= 0.6" } }, - "node_modules/parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "node_modules/mime-types": { + "version": "3.0.2", "license": "MIT", "dependencies": { - "entities": "^8.0.0" + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/parse5/node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", - "license": "BSD-2-Clause", + "node_modules/minimatch": { + "version": "10.2.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, "engines": { - "node": ">=20.19.0" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, + "node_modules/ms": { + "version": "2.1.3", "license": "MIT" }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/nanoid": { + "version": "3.3.18", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/path-to-regexp": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "node_modules/negotiator": { + "version": "1.1.0", "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" } }, - "node_modules/piccolore": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", - "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", - "license": "ISC" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "node_modules/negotiator/node_modules/content-type": { + "version": "2.1.0", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "node_modules/neotraverse": { + "version": "1.0.1", "license": "MIT", "engines": { - "node": ">=16.20.0" + "node": ">= 10" } }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/nlcst-to-string": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "@types/nlcst": "^2.0.0" }, - "engines": { - "node": "^10 || ^12 || >=14" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "node_modules/node-addon-api": { + "version": "7.1.1", "license": "MIT", - "engines": { - "node": ">=6" - } + "optional": true }, - "node_modules/process-ancestry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz", - "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==", + "node_modules/node-fetch-native": { + "version": "1.6.7", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", - "license": "MIT", + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/object-assign": { + "version": "4.1.1", "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/object-inspect": { + "version": "1.13.4", "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, + "node_modules/obug": { + "version": "3.0.0", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12.20.0" } }, - "node_modules/qs": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", - "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", - "license": "BSD-3-Clause", + "node_modules/ofetch": { + "version": "1.5.1", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" } }, - "node_modules/radix3": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "node_modules/ohash": { + "version": "2.0.12", "license": "MIT" }, - "node_modules/range-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", - "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "node_modules/on-finished": { + "version": "2.4.1", "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" } }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" } }, - "node_modules/recma-build-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", - "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "node_modules/p-limit": { + "version": "7.3.1", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "vfile": "^6.0.0" + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/recma-jsx": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", - "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "node_modules/p-queue": { + "version": "9.3.3", "license": "MIT", "dependencies": { - "acorn-jsx": "^5.0.0", - "estree-util-to-js": "^2.0.0", - "recma-parse": "^1.0.0", - "recma-stringify": "^1.0.0", - "unified": "^11.0.0" + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=20" }, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/recma-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", - "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "node_modules/p-timeout": { + "version": "7.0.1", "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "esast-util-from-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" + "engines": { + "node": ">=20" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/recma-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", - "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "node_modules/package-manager-detector": { + "version": "1.8.0", + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.5.2", "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-to-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" + "bin": { + "pagefind": "lib/runner/bin.cjs" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.5.2", + "@pagefind/darwin-x64": "1.5.2", + "@pagefind/freebsd-x64": "1.5.2", + "@pagefind/linux-arm64": "1.5.2", + "@pagefind/linux-x64": "1.5.2", + "@pagefind/windows-arm64": "1.5.2", + "@pagefind/windows-x64": "1.5.2" } }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "node_modules/parent-module": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "regex-utilities": "^2.3.0" + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "node_modules/parse-entities": { + "version": "4.0.2", "license": "MIT", "dependencies": { - "regex-utilities": "^2.3.0" + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", "license": "MIT" }, - "node_modules/rehype-raw": { + "node_modules/parse-latin": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/rehype-recma": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", - "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "node_modules/parse5": { + "version": "8.0.1", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "hast-util-to-estree": "^3.0.0" + "entities": "^8.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/rehype-stringify": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", - "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "unified": "^11.0.0" + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "node_modules/parseurl": { + "version": "1.3.3", "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.8" } }, - "node_modules/remark-mdx": { + "node_modules/path-browserify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", - "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", "license": "MIT", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8" } }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "node_modules/path-to-regexp": { + "version": "8.4.2", "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/express" } }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "node_modules/piccolore": { + "version": "0.1.3", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/remark-smartypants": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.3.tgz", - "integrity": "sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==", + "node_modules/pkce-challenge": { + "version": "5.0.1", "license": "MIT", - "dependencies": { - "retext": "^9.0.0", - "retext-smartypants": "^6.0.0", - "unified": "^11.0.4", - "unist-util-visit": "^5.0.0" - }, "engines": { - "node": ">=16.0.0" + "node": ">=16.20.0" } }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "node_modules/postcss": { + "version": "8.5.26", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/prismjs": { + "version": "1.30.0", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, + "node_modules/process-ancestry": { + "version": "0.1.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/property-information": { + "version": "7.2.0", "license": "MIT", "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/retext": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", - "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "node_modules/proxy-addr": { + "version": "2.0.7", "license": "MIT", "dependencies": { - "@types/nlcst": "^2.0.0", - "retext-latin": "^4.0.0", - "retext-stringify": "^4.0.0", - "unified": "^11.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.10" } }, - "node_modules/retext-latin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", - "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "node_modules/punycode": { + "version": "2.3.1", "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "parse-latin": "^7.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6" } }, - "node_modules/retext-smartypants": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", - "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "node_modules/punycode.js": { + "version": "2.3.1", + "dev": true, "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.16.0", + "license": "BSD-3-Clause", "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-visit": "^5.0.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/retext-stringify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", - "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "node_modules/radix3": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.3.0", "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unified": "^11.0.0" + "engines": { + "node": ">= 0.6" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/express" } }, - "node_modules/rolldown": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", - "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "node_modules/raw-body": { + "version": "3.0.2", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.146.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "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" + "node": ">= 0.10" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "node_modules/readdirp": { + "version": "5.1.1", "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, "engines": { - "node": ">= 18" - } - }, - "node_modules/run-con": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.3.tgz", - "integrity": "sha512-Lb7OKM9aaykzyoNiHGhSVCjZsvbyy6qDMp2vDXL+MoCfz3GfNJtHYH7uYsU3QNMyInBk++xx+EZ8xZ8Sxs5fNQ==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~7.0.0", - "minimist": "^1.2.8", - "strip-json-comments": "~3.1.1" + "node": ">= 20.19.0" }, - "bin": { - "run-con": "cli.js" - } - }, - "node_modules/run-con/node_modules/ini": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-7.0.0.tgz", - "integrity": "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", - "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", + "node_modules/recma-build-jsx": { + "version": "1.0.0", "license": "MIT", - "optional": true, "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.103.1.tgz", - "integrity": "sha512-UVIuFZPzz+4DXYbHzQ5gKaKkyP2IH3Sc/WoF63N2V7QIfnC2E9UpQAtiKlCVJTfBe43HRgHDBLnXpZkYAEBsNQ==", - "devOptional": true, + "node_modules/recma-jsx": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.7.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">=20.19.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.103.1", - "sass-embedded-android-arm": "1.103.1", - "sass-embedded-android-arm64": "1.103.1", - "sass-embedded-android-riscv64": "1.103.1", - "sass-embedded-android-x64": "1.103.1", - "sass-embedded-darwin-arm64": "1.103.1", - "sass-embedded-darwin-x64": "1.103.1", - "sass-embedded-linux-arm": "1.103.1", - "sass-embedded-linux-arm64": "1.103.1", - "sass-embedded-linux-musl-arm": "1.103.1", - "sass-embedded-linux-musl-arm64": "1.103.1", - "sass-embedded-linux-musl-riscv64": "1.103.1", - "sass-embedded-linux-musl-x64": "1.103.1", - "sass-embedded-linux-riscv64": "1.103.1", - "sass-embedded-linux-x64": "1.103.1", - "sass-embedded-unknown-all": "1.103.1", - "sass-embedded-win32-arm64": "1.103.1", - "sass-embedded-win32-x64": "1.103.1" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.103.1.tgz", - "integrity": "sha512-MwX2ap06TbImAqlbnH6EndgBBejk6Eq2QB6Ae2hukCn9wmXf9cRu27um3mz3tyB4oJOOku0xfHqFH/+ckYj6YA==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], + "node_modules/recma-stringify": { + "version": "1.0.0", "license": "MIT", - "optional": true, "dependencies": { - "sass": "1.103.1" + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-android-arm": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.103.1.tgz", - "integrity": "sha512-p36WHpsu5HEo2+NVNbI2Nmb8VgVH0xwOQyzghvZhF7ikGCzEVYI5BP28vHUZlCcgj2TUvMEJKI2lV336a+F/sg==", - "cpu": [ - "arm" - ], + "node_modules/regex": { + "version": "6.1.0", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "regex-utilities": "^2.3.0" } }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.103.1.tgz", - "integrity": "sha512-jBXWMksyz55XeLOWvQs64BqiG5DcqflmMxcvMoA2oHtQT/7XZ02hBn502qpcF/q8Qd+qqG/hU5ccM+hGXrbQZw==", - "cpu": [ - "arm64" - ], + "node_modules/regex-recursion": { + "version": "6.0.2", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "regex-utilities": "^2.3.0" } }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.103.1.tgz", - "integrity": "sha512-rzrH7RNntk0rx+zCE9xOiAIUt37D1cQKvFfcoX0xiePdGbNHBN8DWKaWN9vaCRfbgKCmxPjevzaqFNI/G/8E1A==", - "cpu": [ - "riscv64" - ], + "node_modules/regex-utilities": { + "version": "2.3.0", + "license": "MIT" + }, + "node_modules/rehype-raw": { + "version": "7.0.0", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-android-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.103.1.tgz", - "integrity": "sha512-EQglAJXJutuIcqgZf7YOwzao2ND6ow/OgqN+cM48/Qaeb6AimYmZiUJmM9FFcmS3Q2n1k6/2OU3l3Hlin7bFpw==", - "cpu": [ - "x64" - ], + "node_modules/rehype-recma": { + "version": "1.0.0", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.103.1.tgz", - "integrity": "sha512-rlaBeCul8pLbDRKdBAxdDxSBwFU5fbX42ci6CxW2Vbs34jWTMQ72+nE2v2KkGGce+JnYbb7UV6xDP/4uDWWi+w==", - "cpu": [ - "arm64" - ], + "node_modules/rehype-stringify": { + "version": "10.0.1", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.103.1.tgz", - "integrity": "sha512-VSKFfhI//AOct6ppFmAaSH7tlW2LOFECMGs77jIoWf0ZjvGch/3sc9lUTTdIaYIOnTS4qpZck+8OcI2D0G92QA==", - "cpu": [ - "x64" - ], + "node_modules/remark-gfm": { + "version": "4.0.1", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.103.1.tgz", - "integrity": "sha512-tJRLPUtBwXHTnBnG7I39gQvCLreuOHLLCMyKHPR1hQ7aFNwiZjADYzKMRQPNMUqti/Os9z+6I7V13FqgQHfuzg==", - "cpu": [ - "arm" - ], - "libc": "glibc", + "node_modules/remark-mdx": { + "version": "3.1.1", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.103.1.tgz", - "integrity": "sha512-rC+80/Xr9svo0ka2Zr/sjD+N1zEHTw2Urm/nsEjaVp5HSH2i22jwhTKTIqie2OLl6ti+qdYnbI0sSfxOYRtgrg==", - "cpu": [ - "arm64" - ], - "libc": "glibc", + "node_modules/remark-parse": { + "version": "11.0.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.103.1.tgz", - "integrity": "sha512-N8L/kgVzXpnH+8d6ErIzqvb0l8kHODR3OfPaf0Azw6DOLGtEjwDRUbHno+G7iogGzyPOjKsM8OdyqHJj/bpTdw==", - "cpu": [ - "arm" - ], - "libc": "musl", + "node_modules/remark-rehype": { + "version": "11.1.2", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.103.1.tgz", - "integrity": "sha512-jMgG/C/VMo7+ShMFdk0xjJmQmYkj1PbJu/yrQiaQHpuo5pE2G+vnkEgsuM5EM3lTQ4MbMfnf715qy1fkbNPiUQ==", - "cpu": [ - "arm64" - ], - "libc": "musl", + "node_modules/remark-smartypants": { + "version": "3.0.3", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.103.1.tgz", - "integrity": "sha512-LZm8rEvI6sKU87qPOlODsYeAs7CmWy0B4ShYkjG4OMcGCcV4Ffxn25XW4TFqmruThITQvJ8WT+WGblzdoxYgbA==", - "cpu": [ - "riscv64" - ], - "libc": "musl", + "node_modules/remark-stringify": { + "version": "11.0.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.103.1.tgz", - "integrity": "sha512-rmKzgk4t6RpaDhSefbbnk5yrA4pk1nHlVhJECGay8yMfzK8eglATeY9fzPgt89xCuQk6rkOiy11e+m8tLYOW5Q==", - "cpu": [ - "x64" - ], - "libc": "musl", + "node_modules/require-from-string": { + "version": "2.0.2", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=14.0.0" + "node": ">=0.10.0" } }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.103.1.tgz", - "integrity": "sha512-xydQmtxla31uMrmN6z+mAogVGdEMDmkUElVq2+udomX/TPZDYJBkApEyJl237M2VLWVv29v1N4U4i2Z4xa7SDA==", - "cpu": [ - "riscv64" - ], - "libc": "glibc", + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.103.1.tgz", - "integrity": "sha512-Rln1oWm0MWKzzemOgQWrRFzfVBARwS9qxAidZPpCQHSohzPnWizFkmY1CUJad/YJNsA7sscueMdX63OEvxoM8w==", - "cpu": [ - "x64" - ], - "libc": "glibc", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.103.1.tgz", - "integrity": "sha512-p7kI4US8+n+YguKczXh+4KcodJnk+8cwv+QFdvMaz3OfPrdHV0EnhPsaVDWD9qXb1XXCEdUhpp6vQwGk3eKc3A==", + "node_modules/retext": { + "version": "9.0.0", "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], "dependencies": { - "sass": "1.103.1" + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.103.1.tgz", - "integrity": "sha512-/0renOj3SpZGu4TA8CZJ6qZbTxGZk1khkPfiBTmV1uFB40ESYM5VsdXNj76P07bsAjIj9X2fCjTafLQFLSd9Nw==", - "cpu": [ - "arm64" - ], + "node_modules/retext-latin": { + "version": "4.0.0", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.103.1.tgz", - "integrity": "sha512-fIg60j9u5YlLUU3W8FvySMR4HHIo9R12HHFQTW7njyQ8nXqgR+t+XfCzGJloQka8g583BlAfu31Q76Ljr5o+9g==", - "cpu": [ - "x64" - ], + "node_modules/retext-smartypants": { + "version": "6.2.0", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/satteri": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", - "integrity": "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==", + "node_modules/retext-stringify": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "@types/estree-jsx": "^1.0.5", - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "@types/unist": "^3.0.3" + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" }, - "optionalDependencies": { - "@bruits/satteri-darwin-arm64": "0.9.5", - "@bruits/satteri-darwin-x64": "0.9.5", - "@bruits/satteri-linux-arm64-gnu": "0.9.5", - "@bruits/satteri-linux-arm64-musl": "0.9.5", - "@bruits/satteri-linux-x64-gnu": "0.9.5", - "@bruits/satteri-linux-x64-musl": "0.9.5", - "@bruits/satteri-wasm32-wasi": "0.9.5", - "@bruits/satteri-win32-arm64-msvc": "0.9.5", - "@bruits/satteri-win32-x64-msvc": "0.9.5" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sax": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", - "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", - "license": "BlueOak-1.0.0", + "node_modules/rolldown": { + "version": "1.2.5", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, "engines": { - "node": ">=11.0.0" + "node": "^20.19.0 || >=22.12.0" + }, + "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" } }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "license": "ISC", + "node_modules/router": { + "version": "2.2.0", + "license": "MIT", "dependencies": { - "xmlchars": "^2.2.0" + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" }, "engines": { - "node": ">=v12.22.7" + "node": ">= 18" } }, - "node_modules/schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", + "node_modules/run-con": { + "version": "1.3.3", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" + "deep-extend": "^0.6.0", + "ini": "~7.0.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" }, - "engines": { - "node": ">=4" + "bin": { + "run-con": "cli.js" } }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "node_modules/run-con/node_modules/ini": { + "version": "7.0.0", + "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.103.1", "license": "MIT", + "optional": true, "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" }, "engines": { - "node": ">= 18" + "node": ">=20.19.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "node_modules/sass-embedded": { + "version": "1.103.1", + "devOptional": true, "license": "MIT", "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" + "@bufbuild/protobuf": "^2.5.0", + "colorjs.io": "^0.7.0", + "immutable": "^5.1.5", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" }, "engines": { - "node": ">= 18" + "node": ">=20.19.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "optionalDependencies": { + "sass-embedded-all-unknown": "1.103.1", + "sass-embedded-android-arm": "1.103.1", + "sass-embedded-android-arm64": "1.103.1", + "sass-embedded-android-riscv64": "1.103.1", + "sass-embedded-android-x64": "1.103.1", + "sass-embedded-darwin-arm64": "1.103.1", + "sass-embedded-darwin-x64": "1.103.1", + "sass-embedded-linux-arm": "1.103.1", + "sass-embedded-linux-arm64": "1.103.1", + "sass-embedded-linux-musl-arm": "1.103.1", + "sass-embedded-linux-musl-arm64": "1.103.1", + "sass-embedded-linux-musl-riscv64": "1.103.1", + "sass-embedded-linux-musl-x64": "1.103.1", + "sass-embedded-linux-riscv64": "1.103.1", + "sass-embedded-linux-x64": "1.103.1", + "sass-embedded-unknown-all": "1.103.1", + "sass-embedded-win32-arm64": "1.103.1", + "sass-embedded-win32-x64": "1.103.1" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sharp": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.3.tgz", - "integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==", - "license": "Apache-2.0", + "node_modules/sass-embedded-all-unknown": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.103.1.tgz", + "integrity": "sha512-MwX2ap06TbImAqlbnH6EndgBBejk6Eq2QB6Ae2hukCn9wmXf9cRu27um3mz3tyB4oJOOku0xfHqFH/+ckYj6YA==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "license": "MIT", + "optional": true, "dependencies": { - "@img/colour": "^1.1.0", - "detect-libc": "^2.1.2", - "semver": "^7.8.5" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.35.3", - "@img/sharp-darwin-x64": "0.35.3", - "@img/sharp-freebsd-wasm32": "0.35.3", - "@img/sharp-libvips-darwin-arm64": "1.3.2", - "@img/sharp-libvips-darwin-x64": "1.3.2", - "@img/sharp-libvips-linux-arm": "1.3.2", - "@img/sharp-libvips-linux-arm64": "1.3.2", - "@img/sharp-libvips-linux-ppc64": "1.3.2", - "@img/sharp-libvips-linux-riscv64": "1.3.2", - "@img/sharp-libvips-linux-s390x": "1.3.2", - "@img/sharp-libvips-linux-x64": "1.3.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", - "@img/sharp-libvips-linuxmusl-x64": "1.3.2", - "@img/sharp-linux-arm": "0.35.3", - "@img/sharp-linux-arm64": "0.35.3", - "@img/sharp-linux-ppc64": "0.35.3", - "@img/sharp-linux-riscv64": "0.35.3", - "@img/sharp-linux-s390x": "0.35.3", - "@img/sharp-linux-x64": "0.35.3", - "@img/sharp-linuxmusl-arm64": "0.35.3", - "@img/sharp-linuxmusl-x64": "0.35.3", - "@img/sharp-webcontainers-wasm32": "0.35.3", - "@img/sharp-win32-arm64": "0.35.3", - "@img/sharp-win32-ia32": "0.35.3", - "@img/sharp-win32-x64": "0.35.3" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "sass": "1.103.1" } }, - "node_modules/sharp/node_modules/@img/sharp-darwin-arm64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz", - "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==", + "node_modules/sass-embedded-android-arm": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.103.1.tgz", + "integrity": "sha512-p36WHpsu5HEo2+NVNbI2Nmb8VgVH0xwOQyzghvZhF7ikGCzEVYI5BP28vHUZlCcgj2TUvMEJKI2lV336a+F/sg==", "cpu": [ - "arm64" + "arm" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.3.2" + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-darwin-x64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz", - "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==", + "node_modules/sass-embedded-android-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.103.1.tgz", + "integrity": "sha512-jBXWMksyz55XeLOWvQs64BqiG5DcqflmMxcvMoA2oHtQT/7XZ02hBn502qpcF/q8Qd+qqG/hU5ccM+hGXrbQZw==", "cpu": [ - "x64" + "arm64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.3.2" + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz", - "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==", + "node_modules/sass-embedded-android-riscv64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.103.1.tgz", + "integrity": "sha512-rzrH7RNntk0rx+zCE9xOiAIUt37D1cQKvFfcoX0xiePdGbNHBN8DWKaWN9vaCRfbgKCmxPjevzaqFNI/G/8E1A==", "cpu": [ - "arm64" + "riscv64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz", - "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==", + "node_modules/sass-embedded-android-x64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.103.1.tgz", + "integrity": "sha512-EQglAJXJutuIcqgZf7YOwzao2ND6ow/OgqN+cM48/Qaeb6AimYmZiUJmM9FFcmS3Q2n1k6/2OU3l3Hlin7bFpw==", "cpu": [ "x64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz", - "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==", + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.103.1.tgz", + "integrity": "sha512-rlaBeCul8pLbDRKdBAxdDxSBwFU5fbX42ci6CxW2Vbs34jWTMQ72+nE2v2KkGGce+JnYbb7UV6xDP/4uDWWi+w==", "cpu": [ - "arm" - ], - "libc": [ - "glibc" + "arm64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz", - "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==", + "node_modules/sass-embedded-darwin-x64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.103.1.tgz", + "integrity": "sha512-VSKFfhI//AOct6ppFmAaSH7tlW2LOFECMGs77jIoWf0ZjvGch/3sc9lUTTdIaYIOnTS4qpZck+8OcI2D0G92QA==", "cpu": [ - "arm64" - ], - "libc": [ - "glibc" + "x64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz", - "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==", + "node_modules/sass-embedded-linux-arm": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.103.1.tgz", + "integrity": "sha512-tJRLPUtBwXHTnBnG7I39gQvCLreuOHLLCMyKHPR1hQ7aFNwiZjADYzKMRQPNMUqti/Os9z+6I7V13FqgQHfuzg==", "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" + "arm" ], - "license": "LGPL-3.0-or-later", + "libc": "glibc", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz", - "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==", + "node_modules/sass-embedded-linux-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.103.1.tgz", + "integrity": "sha512-rC+80/Xr9svo0ka2Zr/sjD+N1zEHTw2Urm/nsEjaVp5HSH2i22jwhTKTIqie2OLl6ti+qdYnbI0sSfxOYRtgrg==", "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" + "arm64" ], - "license": "LGPL-3.0-or-later", + "libc": "glibc", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz", - "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==", + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.103.1.tgz", + "integrity": "sha512-N8L/kgVzXpnH+8d6ErIzqvb0l8kHODR3OfPaf0Azw6DOLGtEjwDRUbHno+G7iogGzyPOjKsM8OdyqHJj/bpTdw==", "cpu": [ - "s390x" - ], - "libc": [ - "glibc" + "arm" ], - "license": "LGPL-3.0-or-later", + "libc": "musl", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz", - "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==", + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.103.1.tgz", + "integrity": "sha512-jMgG/C/VMo7+ShMFdk0xjJmQmYkj1PbJu/yrQiaQHpuo5pE2G+vnkEgsuM5EM3lTQ4MbMfnf715qy1fkbNPiUQ==", "cpu": [ - "x64" - ], - "libc": [ - "glibc" + "arm64" ], - "license": "LGPL-3.0-or-later", + "libc": "musl", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz", - "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==", + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.103.1.tgz", + "integrity": "sha512-LZm8rEvI6sKU87qPOlODsYeAs7CmWy0B4ShYkjG4OMcGCcV4Ffxn25XW4TFqmruThITQvJ8WT+WGblzdoxYgbA==", "cpu": [ - "arm64" - ], - "libc": [ - "musl" + "riscv64" ], - "license": "LGPL-3.0-or-later", + "libc": "musl", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz", - "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==", + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.103.1.tgz", + "integrity": "sha512-rmKzgk4t6RpaDhSefbbnk5yrA4pk1nHlVhJECGay8yMfzK8eglATeY9fzPgt89xCuQk6rkOiy11e+m8tLYOW5Q==", "cpu": [ "x64" ], - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", + "libc": "musl", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-arm": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz", - "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==", + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.103.1.tgz", + "integrity": "sha512-xydQmtxla31uMrmN6z+mAogVGdEMDmkUElVq2+udomX/TPZDYJBkApEyJl237M2VLWVv29v1N4U4i2Z4xa7SDA==", "cpu": [ - "arm" - ], - "libc": [ - "glibc" + "riscv64" ], - "license": "Apache-2.0", + "libc": "glibc", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.3.2" + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-arm64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz", - "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==", + "node_modules/sass-embedded-linux-x64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.103.1.tgz", + "integrity": "sha512-Rln1oWm0MWKzzemOgQWrRFzfVBARwS9qxAidZPpCQHSohzPnWizFkmY1CUJad/YJNsA7sscueMdX63OEvxoM8w==", "cpu": [ - "arm64" - ], - "libc": [ - "glibc" + "x64" ], - "license": "Apache-2.0", + "libc": "glibc", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.3.2" + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-ppc64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz", - "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==", - "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", + "node_modules/sass-embedded-unknown-all": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.103.1.tgz", + "integrity": "sha512-p7kI4US8+n+YguKczXh+4KcodJnk+8cwv+QFdvMaz3OfPrdHV0EnhPsaVDWD9qXb1XXCEdUhpp6vQwGk3eKc3A==", + "license": "MIT", "optional": true, "os": [ - "linux" + "!android", + "!darwin", + "!linux", + "!win32" ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.3.2" + "dependencies": { + "sass": "1.103.1" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-riscv64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz", - "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==", + "node_modules/sass-embedded-win32-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.103.1.tgz", + "integrity": "sha512-/0renOj3SpZGu4TA8CZJ6qZbTxGZk1khkPfiBTmV1uFB40ESYM5VsdXNj76P07bsAjIj9X2fCjTafLQFLSd9Nw==", "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" + "arm64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.3.2" + "node": ">=14.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-s390x": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz", - "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==", + "node_modules/sass-embedded-win32-x64": { + "version": "1.103.1", "cpu": [ - "s390x" - ], - "libc": [ - "glibc" + "x64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=20.9.0" + "node": ">=14.0.0" + } + }, + "node_modules/satteri": { + "version": "0.9.5", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" }, - "funding": { - "url": "https://opencollective.com/libvips" + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.9.5", + "@bruits/satteri-darwin-x64": "0.9.5", + "@bruits/satteri-linux-arm64-gnu": "0.9.5", + "@bruits/satteri-linux-arm64-musl": "0.9.5", + "@bruits/satteri-linux-x64-gnu": "0.9.5", + "@bruits/satteri-linux-x64-musl": "0.9.5", + "@bruits/satteri-wasm32-wasi": "0.9.5", + "@bruits/satteri-win32-arm64-msvc": "0.9.5", + "@bruits/satteri-win32-x64-msvc": "0.9.5" + } + }, + "node_modules/sax": { + "version": "1.6.1", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.3.2" + "engines": { + "node": ">=v12.22.7" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-x64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz", - "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], + "node_modules/schema-dts": { + "version": "1.1.5", "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.3.2" + "engines": { + "node": ">=4" } }, - "node_modules/sharp/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz", - "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/semver": { + "version": "7.8.5", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" + "engines": { + "node": ">=10" } }, - "node_modules/sharp/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz", - "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/send": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, "engines": { - "node": ">=20.9.0" + "node": ">= 18" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.3.2" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/sharp/node_modules/@img/sharp-win32-arm64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz", - "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/serve-static": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, "engines": { - "node": ">=20.9.0" + "node": ">= 18" }, "funding": { - "url": "https://opencollective.com/libvips" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/sharp/node_modules/@img/sharp-win32-ia32": { + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/sharp": { "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz", - "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, "engines": { - "node": "^20.9.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.3", + "@img/sharp-darwin-x64": "0.35.3", + "@img/sharp-freebsd-wasm32": "0.35.3", + "@img/sharp-libvips-darwin-arm64": "1.3.2", + "@img/sharp-libvips-darwin-x64": "1.3.2", + "@img/sharp-libvips-linux-arm": "1.3.2", + "@img/sharp-libvips-linux-arm64": "1.3.2", + "@img/sharp-libvips-linux-ppc64": "1.3.2", + "@img/sharp-libvips-linux-riscv64": "1.3.2", + "@img/sharp-libvips-linux-s390x": "1.3.2", + "@img/sharp-libvips-linux-x64": "1.3.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", + "@img/sharp-libvips-linuxmusl-x64": "1.3.2", + "@img/sharp-linux-arm": "0.35.3", + "@img/sharp-linux-arm64": "0.35.3", + "@img/sharp-linux-ppc64": "0.35.3", + "@img/sharp-linux-riscv64": "0.35.3", + "@img/sharp-linux-s390x": "0.35.3", + "@img/sharp-linux-x64": "0.35.3", + "@img/sharp-linuxmusl-arm64": "0.35.3", + "@img/sharp-linuxmusl-x64": "0.35.3", + "@img/sharp-webcontainers-wasm32": "0.35.3", + "@img/sharp-win32-arm64": "0.35.3", + "@img/sharp-win32-ia32": "0.35.3", + "@img/sharp-win32-x64": "0.35.3" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/sharp/node_modules/@img/sharp-win32-x64": { "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz", - "integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==", "cpu": [ "x64" ], @@ -11066,8 +10058,6 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -11078,8 +10068,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -11087,8 +10075,6 @@ }, "node_modules/shiki": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", - "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", "license": "MIT", "dependencies": { "@shikijs/core": "4.4.3", @@ -11106,8 +10092,6 @@ }, "node_modules/side-channel": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -11125,8 +10109,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -11141,8 +10123,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -11159,8 +10139,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -11178,14 +10156,10 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT" }, "node_modules/smol-toml": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", - "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -11196,8 +10170,6 @@ }, "node_modules/source-map": { "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "license": "BSD-3-Clause", "engines": { "node": ">= 12" @@ -11205,8 +10177,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -11214,8 +10184,6 @@ }, "node_modules/space-separated-tokens": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "license": "MIT", "funding": { "type": "github", @@ -11224,23 +10192,24 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/std-env": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width": { "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "dev": true, "license": "MIT", "dependencies": { @@ -11256,8 +10225,6 @@ }, "node_modules/stringify-entities": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", @@ -11270,8 +10237,6 @@ }, "node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -11286,8 +10251,6 @@ }, "node_modules/strip-bom-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11295,8 +10258,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -11308,8 +10269,6 @@ }, "node_modules/style-to-js": { "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", "license": "MIT", "dependencies": { "style-to-object": "1.0.14" @@ -11317,8 +10276,6 @@ }, "node_modules/style-to-object": { "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", "license": "MIT", "dependencies": { "inline-style-parser": "0.2.7" @@ -11326,8 +10283,6 @@ }, "node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -11341,8 +10296,6 @@ }, "node_modules/svgo": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz", - "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==", "license": "MIT", "dependencies": { "commander": "^11.1.0", @@ -11366,8 +10319,6 @@ }, "node_modules/svgo/node_modules/commander": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "license": "MIT", "engines": { "node": ">=16" @@ -11375,14 +10326,10 @@ }, "node_modules/symbol-tree": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "license": "MIT" }, "node_modules/sync-child-process": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", "license": "MIT", "dependencies": { "sync-message-port": "^1.0.0" @@ -11393,8 +10340,6 @@ }, "node_modules/sync-message-port": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", "license": "MIT", "engines": { "node": ">=16.0.0" @@ -11402,14 +10347,20 @@ }, "node_modules/tiny-inflate": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, + "node_modules/tinybench": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.2.0.tgz", + "integrity": "sha512-78U2TlB2CnVenajOFzf3BKSm0J6oz5L0NV7g32LCPccvYc0lbWvys4d3uUUCS2B1N8PAf2+aekR8i1KbC3HO7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/tinyclip": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-1.0.3.tgz", - "integrity": "sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==", "license": "MIT", "engines": { "node": "^16.14.0 || >= 17.3.0" @@ -11417,8 +10368,6 @@ }, "node_modules/tinyexec": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", - "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "license": "MIT", "engines": { "node": ">=18" @@ -11426,8 +10375,6 @@ }, "node_modules/tinyglobby": { "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -11442,8 +10389,6 @@ }, "node_modules/tldts": { "version": "7.4.11", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", - "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", "license": "MIT", "dependencies": { "tldts-core": "^7.4.11" @@ -11454,14 +10399,10 @@ }, "node_modules/tldts-core": { "version": "7.4.11", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", - "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", "license": "MIT" }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -11469,8 +10410,6 @@ }, "node_modules/tough-cookie": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", - "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" @@ -11481,8 +10420,6 @@ }, "node_modules/tr46": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", - "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", "license": "MIT", "dependencies": { "punycode": "^2.3.1" @@ -11493,8 +10430,6 @@ }, "node_modules/trim-lines": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "license": "MIT", "funding": { "type": "github", @@ -11503,8 +10438,6 @@ }, "node_modules/trough": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "license": "MIT", "funding": { "type": "github", @@ -11513,14 +10446,10 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/turndown": { "version": "7.2.4", - "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.4.tgz", - "integrity": "sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ==", "license": "MIT", "dependencies": { "@mixmark-io/domino": "^2.2.0" @@ -11532,14 +10461,10 @@ }, "node_modules/turndown-plugin-gfm": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz", - "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==", "license": "MIT" }, "node_modules/type-is": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", - "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", "license": "MIT", "dependencies": { "content-type": "^2.0.0", @@ -11556,8 +10481,6 @@ }, "node_modules/type-is/node_modules/content-type": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "license": "MIT", "engines": { "node": ">=18" @@ -11569,8 +10492,6 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -11583,33 +10504,23 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, "node_modules/ufo": { "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "license": "MIT" }, "node_modules/ultrahtml": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", - "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==", "license": "MIT" }, "node_modules/uncrypto": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", "license": "MIT" }, "node_modules/undici": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", - "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -11617,15 +10528,11 @@ }, "node_modules/undici-types": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.29.0.tgz", - "integrity": "sha512-vamA8dGlzMwhpyYpQp9d8vka3o4D/yn5I7ez7Or+msDA4bZ8Uh+Zy91WvWf3I73gDAkFha9JcYRqm2li0Npfgg==", "dev": true, "license": "MIT" }, "node_modules/unified": { "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -11643,8 +10550,6 @@ }, "node_modules/unifont": { "version": "0.7.5", - "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.5.tgz", - "integrity": "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==", "license": "MIT", "dependencies": { "css-tree": "^3.1.0", @@ -11654,8 +10559,6 @@ }, "node_modules/unifont/node_modules/undici": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", - "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", "license": "MIT", "engines": { "node": ">=22.19.0" @@ -11663,8 +10566,6 @@ }, "node_modules/unist-util-find-after": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -11677,8 +10578,6 @@ }, "node_modules/unist-util-is": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -11690,8 +10589,6 @@ }, "node_modules/unist-util-modify-children": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", - "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -11704,8 +10601,6 @@ }, "node_modules/unist-util-position": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -11717,8 +10612,6 @@ }, "node_modules/unist-util-position-from-estree": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -11730,8 +10623,6 @@ }, "node_modules/unist-util-remove-position": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -11744,8 +10635,6 @@ }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -11757,8 +10646,6 @@ }, "node_modules/unist-util-visit": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -11772,8 +10659,6 @@ }, "node_modules/unist-util-visit-children": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", - "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -11785,8 +10670,6 @@ }, "node_modules/unist-util-visit-parents": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -11799,8 +10682,6 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11808,8 +10689,6 @@ }, "node_modules/unstorage": { "version": "1.17.5", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", - "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", @@ -11904,14 +10783,10 @@ }, "node_modules/varint": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11919,8 +10794,6 @@ }, "node_modules/verkit": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.4.1.tgz", - "integrity": "sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==", "license": "MIT", "engines": { "node": ">=18.12.0" @@ -11931,8 +10804,6 @@ }, "node_modules/vfile": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -11945,8 +10816,6 @@ }, "node_modules/vfile-location": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -11959,8 +10828,6 @@ }, "node_modules/vfile-message": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -11973,8 +10840,6 @@ }, "node_modules/vite": { "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", @@ -12050,8 +10915,6 @@ }, "node_modules/vitefu": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", - "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", "license": "MIT", "workspaces": [ "tests/deps/*", @@ -12067,24 +10930,115 @@ } } }, + "node_modules/vitest": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.2.tgz", + "integrity": "sha512-7MQrx9pDv5aHiUcovIb/70Ys3tgtkUVgCtledvKdCmEO+/1Dicq5ZqoSxOW034m03oqC+oHOKui2dM6qtMLoJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/mocker": "5.0.2", + "chai": "^6.2.2", + "es-module-lexer": "^2.3.2", + "expect-type": "^1.4.0", + "magic-string": "^1.2.3", + "obug": "^2.1.4", + "picomatch": "^4.0.7", + "std-env": "^4.2.0", + "tinybench": "^6.1.4", + "tinyexec": "^1.3.0", + "tinyglobby": "^0.2.17", + "why-is-node-running": "^3.2.1" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^22.12.0 || ^24.0.0 || >=26.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "5.0.2", + "@vitest/browser-preview": "5.0.2", + "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", + "@vitest/coverage-istanbul": "5.0.2", + "@vitest/coverage-v8": "5.0.2", + "@vitest/ui": "5.0.2", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/obug": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", "dev": true, "license": "MIT" }, "node_modules/vscode-uri": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", - "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", "dev": true, "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "license": "MIT", "dependencies": { "xml-name-validator": "^5.0.0" @@ -12095,8 +11049,6 @@ }, "node_modules/web-namespaces": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", "license": "MIT", "funding": { "type": "github", @@ -12105,8 +11057,6 @@ }, "node_modules/webidl-conversions": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", "license": "BSD-2-Clause", "engines": { "node": ">=20" @@ -12114,8 +11064,6 @@ }, "node_modules/whatwg-mimetype": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", "license": "MIT", "engines": { "node": ">=20" @@ -12123,8 +11071,6 @@ }, "node_modules/whatwg-url": { "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", "license": "MIT", "dependencies": { "@exodus/bytes": "^1.11.0", @@ -12137,8 +11083,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -12150,16 +11094,25 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-3.2.2.tgz", + "integrity": "sha512-NKUzAelcoCXhXL4dJzKIwXeR8iEVqsA0Lq6Vnd0UXvgaKbzVo4ZTHROF2Jidrv+SgxOQ03fMinnNhzZATxOD3A==", + "dev": true, + "license": "MIT", + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=20.11" + } + }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/xdg-basedir": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true, "license": "MIT", "engines": { @@ -12171,8 +11124,6 @@ }, "node_modules/xml-name-validator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "license": "Apache-2.0", "engines": { "node": ">=18" @@ -12180,8 +11131,6 @@ }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "license": "MIT" }, "node_modules/xplat-docs": { @@ -12190,14 +11139,10 @@ }, "node_modules/xxhash-wasm": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", - "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", "license": "MIT" }, "node_modules/yaml": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "devOptional": true, "license": "ISC", "bin": { @@ -12212,8 +11157,6 @@ }, "node_modules/yargs-parser": { "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" @@ -12221,8 +11164,6 @@ }, "node_modules/yocto-queue": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { "node": ">=12.20" @@ -12233,8 +11174,6 @@ }, "node_modules/zod": { "version": "4.6.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", - "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -12242,8 +11181,6 @@ }, "node_modules/zod-to-json-schema": { "version": "3.25.2", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", - "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", "license": "ISC", "peerDependencies": { "zod": "^3.25.28 || ^4" @@ -12251,8 +11188,6 @@ }, "node_modules/zwitch": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "license": "MIT", "funding": { "type": "github", diff --git a/package.json b/package.json index f529a12098..50b776e59c 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,8 @@ "xplat:build-production:react:jp": "npm run build-production:react:jp --prefix docs/xplat", "xplat:build-production:webcomponents:jp": "npm run build-production:webcomponents:jp --prefix docs/xplat", "xplat:build-production:blazor:jp": "npm run build-production:blazor:jp --prefix docs/xplat", + "test": "vitest run", + "test:watch": "vitest", "lint:md": "markdownlint \"docs/**/*.mdx\" \"docs/**/*.md\"", "lint:md:fix": "markdownlint --fix \"docs/**/*.mdx\" \"docs/**/*.md\"", "spellcheck": "cspell \"docs/**/*.mdx\" \"docs/**/*.md\" --no-progress", @@ -141,8 +143,8 @@ "check-mdx-links:broken:wc": "node --experimental-strip-types scripts/check-mdx-links.mjs --platform=wc --resolve-only --list-broken --broken-limit=100 --broken-md=reports/mdx-broken-links-wc.md --list-ambiguities --ambiguity-md=reports/api-link-ambiguity-report-wc.md --fail-on-ambiguity", "check-mdx-links:broken:blazor": "node --experimental-strip-types scripts/check-mdx-links.mjs --platform=blazor --resolve-only --list-broken --broken-limit=100 --broken-md=reports/mdx-broken-links-blazor.md --list-ambiguities --ambiguity-md=reports/api-link-ambiguity-report-blazor.md --fail-on-ambiguity", "check-relative-links": "node scripts/check-relative-links.mjs", - "check-relative-links:ci": "npm run sync:generated-from-xplat --prefix docs/angular && npm run sync:generated-from-xplat:jp --prefix docs/angular && npm run generate:en --prefix docs/angular && npm run generate:jp --prefix docs/angular && npm run generate:react --prefix docs/xplat && npm run generate:webcomponents --prefix docs/xplat && npm run generate:blazor --prefix docs/xplat && npm run generate:react:jp --prefix docs/xplat && npm run generate:webcomponents:jp --prefix docs/xplat && npm run generate:blazor:jp --prefix docs/xplat && node scripts/check-relative-links-ci.mjs", - "check-relative-links:report": "npm run generate:en --prefix docs/angular && npm run generate:jp --prefix docs/angular && npm run generate:react --prefix docs/xplat && npm run generate:webcomponents --prefix docs/xplat && npm run generate:blazor --prefix docs/xplat && npm run generate:react:jp --prefix docs/xplat && npm run generate:webcomponents:jp --prefix docs/xplat && npm run generate:blazor:jp --prefix docs/xplat && node scripts/check-relative-links-ci.mjs --md=reports/relative-links-report.md", + "check-relative-links:ci": "npm run xplat:generate --prefix docs/angular && npm run xplat:generate:jp --prefix docs/angular && npm run generate:en --prefix docs/angular && npm run generate:jp --prefix docs/angular && npm run generate:react --prefix docs/xplat && npm run generate:webcomponents --prefix docs/xplat && npm run generate:blazor --prefix docs/xplat && npm run generate:react:jp --prefix docs/xplat && npm run generate:webcomponents:jp --prefix docs/xplat && npm run generate:blazor:jp --prefix docs/xplat && node scripts/check-relative-links-ci.mjs", + "check-relative-links:report": "npm run xplat:generate --prefix docs/angular && npm run xplat:generate:jp --prefix docs/angular && npm run generate:en --prefix docs/angular && npm run generate:jp --prefix docs/angular && npm run generate:react --prefix docs/xplat && npm run generate:webcomponents --prefix docs/xplat && npm run generate:blazor --prefix docs/xplat && npm run generate:react:jp --prefix docs/xplat && npm run generate:webcomponents:jp --prefix docs/xplat && npm run generate:blazor:jp --prefix docs/xplat && node scripts/check-relative-links-ci.mjs --md=reports/relative-links-report.md", "check-html-links": "node scripts/check-html-links.mjs", "check-html-links:report": "node scripts/check-html-links.mjs --md=reports/html-links-report.md" }, @@ -170,7 +172,8 @@ "cspell": "^9.2.2", "markdownlint-cli": "^0.49.1", "sass-embedded": "^1.98.0", - "typescript": "^5.4.0" + "typescript": "^5.4.0", + "vitest": "^5.0.0" }, "peerDependencies": { "@astrojs/mdx": ">=7", diff --git a/scripts/check-mdx-links.mjs b/scripts/check-mdx-links.mjs index c5a514265f..54c1c93d27 100644 --- a/scripts/check-mdx-links.mjs +++ b/scripts/check-mdx-links.mjs @@ -39,6 +39,12 @@ import { getPackageClassSuffixes, getPackageIds, } from '../src/lib/api-platform-config.ts'; +import { + ANGULAR_AUTHORED_ROOT, + ANGULAR_OVERLAY_ROOT, + isShadowedAuthoredFile, + isUnservedOverlayFile, +} from './lib/angular-content-roots.mjs'; // CLI args const args = Object.fromEntries( @@ -66,10 +72,33 @@ const FAIL_ON_AMBIGUITY = args['fail-on-ambiguity'] !== undefined; const BROKEN_LIMIT = parseListLimit(args['broken-limit'] ?? args['unresolved-limit'] ?? '100'); const NO_SYNC = !!args['no-sync']; const RESOLVE_ONLY = !!args['resolve-only']; +// The Angular site serves two content roots: its own topics plus the xplat +// generator's Angular output, which it overlays rather than copying in. Both +// are scanned so API links in generated topics keep their coverage. const DEFAULT_SRC = PLATFORM === 'angular' - ? 'docs/angular/src/content' - : 'docs/xplat/src/content'; -const SRC_DIR = String(args.src ?? DEFAULT_SRC); + ? [ANGULAR_AUTHORED_ROOT, ANGULAR_OVERLAY_ROOT] + : ['docs/xplat/src/content']; +// Configured, *unfiltered*: docs/xplat/generated/Angular does not exist on a +// clean checkout and is created by the generate step further down, so an +// existsSync() filter here would drop it before it is ever written and silently +// shrink Angular coverage. Existence is resolved at scan time instead. +const CONFIGURED_SRC_DIRS = args.src ? [String(args.src)] : DEFAULT_SRC; +let SRC_DIRS = CONFIGURED_SRC_DIRS; +let SRC_DIR = SRC_DIRS.join(', '); + +/** Drops configured roots that are still absent at scan time, warning about each. */ +function resolveSrcDirs(dirs) { + return dirs.filter(d => { + if (existsSync(d)) return true; + const hint = d === ANGULAR_OVERLAY_ROOT + ? '\n Generate it first:\n' + + ' npm run xplat:generate --prefix docs/angular\n' + + ' npm run xplat:generate:jp --prefix docs/angular' + : ''; + console.warn(`\n[warn] Source root "${d}" does not exist — skipping it.${hint}`); + return false; + }); +} const API_LINK_INDEX_VERSION = String(args.index ?? process.env.API_LINK_INDEX_VERSION ?? (process.env.NODE_ENV === 'production' ? 'prod-latest' : 'staging-latest')); const PLATFORM_CONFIGS = API_PLATFORM_CONFIGS; @@ -579,14 +608,14 @@ function runRequiredNpmScript(script, prefix, description) { } } -// For Angular: regenerate xplat Angular MDX and sync it into docs/angular before scanning +// For Angular: regenerate the xplat Angular MDX the site overlays before scanning if (PLATFORM === 'angular' && !NO_SYNC) { - const syncScripts = [ - ['en', 'sync:generated-from-xplat'], - ['jp', 'sync:generated-from-xplat:jp'], + const generateScripts = [ + ['en', 'xplat:generate'], + ['jp', 'xplat:generate:jp'], ]; - for (const [lang, script] of syncScripts) { + for (const [lang, script] of generateScripts) { runRequiredNpmScript(script, 'docs/angular', `Refreshing Angular generated content (lang=${lang})`); } console.log(); @@ -600,10 +629,23 @@ if (XPLAT_GENERATE_SCRIPTS[PLATFORM] && !NO_SYNC && !args.src) { console.log(); } +// Resolved here, *after* any generate step above, so a root that only exists +// once generation has run is still picked up. +SRC_DIRS = resolveSrcDirs(CONFIGURED_SRC_DIRS); +SRC_DIR = SRC_DIRS.join(', '); + console.log(`\nScanning sources in "${SRC_DIR}"`); console.log(`Platforms: ${targetPlatforms.join(', ')}\n`); -let mdxFiles = walkMdx(resolve(SRC_DIR)); +let mdxFiles = SRC_DIRS.flatMap(d => walkMdx(resolve(d))); +if (PLATFORM === 'angular') { + // Only files the Angular site renders: the overlay's excluded grids/ and + // changelog/ are on disk but never served, and an authored topic whose slug + // xplat also provides is shadowed — xplat always wins. + const beforeFilter = mdxFiles.length; + mdxFiles = mdxFiles.filter(f => !isUnservedOverlayFile(f) && !isShadowedAuthoredFile(f)); + console.log(` Overlay filter : ${beforeFilter - mdxFiles.length} unserved MDX file(s) skipped\n`); +} if (XPLAT_GENERATE_SCRIPTS[PLATFORM] && !args.src) { const platformName = PLATFORM_MAP[PLATFORM]; const beforeFilter = mdxFiles.length; diff --git a/scripts/check-relative-links.mjs b/scripts/check-relative-links.mjs index de2f48ea02..3cac72dcf5 100644 --- a/scripts/check-relative-links.mjs +++ b/scripts/check-relative-links.mjs @@ -14,9 +14,10 @@ * drops an entry whose target is missing instead of failing, so a stale one * disappears from the sidebar with no error. * - * When --platform=angular the script scans docs/angular/src/content. + * When --platform=angular the script scans docs/angular/src/content plus + * docs/xplat/generated/Angular — the two roots the Angular site serves. * When --platform=react|wc|blazor it scans docs/xplat/src/content. - * Omitting --platform scans both trees in one pass. + * Omitting --platform scans every tree in one pass. * * Usage: * node scripts/check-relative-links.mjs @@ -32,6 +33,13 @@ import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs'; import { dirname, join, relative, resolve } from 'node:path'; // join used in walkMdx +import { + ANGULAR_AUTHORED_ROOT, + ANGULAR_OVERLAY_ROOT, + getRootGroup, + isShadowedAuthoredFile, + isUnservedOverlayFile, +} from './lib/angular-content-roots.mjs'; // CLI args const args = Object.fromEntries( @@ -49,15 +57,43 @@ const SUMMARY = args.summary === true; const XPLAT_PLATFORMS = new Set(['react', 'wc', 'blazor']); +/** + * Drops roots that are not on disk, so a language the xplat generator does not + * emit (`kr`) simply has no overlay rather than a hard failure. Losing an en/jp + * overlay, though, silently shrinks coverage: its generated topics are skipped, + * and links and toc entries pointing at them report a false "not found" — so + * each missing language is called out. + */ +function keepExisting(dirs) { + if (dirs.includes(ANGULAR_OVERLAY_ROOT)) { + const missing = ['en', 'jp'].filter(lang => !existsSync(`${ANGULAR_OVERLAY_ROOT}/${lang}`)); + if (missing.length) { + console.warn( + `[warn] "${ANGULAR_OVERLAY_ROOT}" is missing ${missing.join(' and ')} — that part of the xplat Angular overlay was not scanned.\n` + + ' Links in its generated topics are unchecked, and links or toc entries pointing at\n' + + ' those topics may report a false "not found". Generate it first:\n' + + missing + .map(lang => ` npm run ${lang === 'en' ? 'xplat:generate' : 'xplat:generate:jp'} --prefix docs/angular`) + .join('\n') + ); + } + } + return dirs.filter(d => existsSync(d)); +} + function getSrcDirs() { if (args.src) return [String(args.src)]; - if (PLATFORM === 'angular') return ['docs/angular/src/content']; + // The Angular site overlays the xplat generator's Angular output on its own + // content instead of copying it in, so both trees have to be scanned — and + // links may point across them (see lib/angular-content-roots.mjs). + if (PLATFORM === 'angular') { + return keepExisting([ANGULAR_AUTHORED_ROOT, ANGULAR_OVERLAY_ROOT]); + } if (PLATFORM === 'xplat' || (PLATFORM && XPLAT_PLATFORMS.has(PLATFORM))) { // Scan source for _shared/ template links, plus the React/WC/Blazor // generated output (after generate.mjs has rewritten _shared/ paths). - // Angular is intentionally excluded: generated/Angular/ is an - // intermediate artifact that gets synced into docs/angular/src/content/ - // and validated there by --platform=angular. + // Angular is intentionally excluded here: generated/Angular/ is one of + // the two roots the Angular site serves, so --platform=angular scans it. // Run the generate scripts before this check so generated/ is up to date. const dirs = ['docs/xplat/src/content']; for (const p of ['React', 'WebComponents', 'Blazor']) { @@ -70,7 +106,7 @@ function getSrcDirs() { console.error(`Unknown platform "${PLATFORM}". Use: angular, xplat, react, wc, blazor`); process.exit(1); } - return ['docs/angular/src/content', 'docs/xplat/src/content']; + return keepExisting([ANGULAR_AUTHORED_ROOT, ANGULAR_OVERLAY_ROOT, 'docs/xplat/src/content']); } // File walking @@ -171,12 +207,12 @@ function blankInapplicablePlatformBlocks(content, platforms) { /** * Maps a source file path to the set of applicable platforms for PlatformBlock * filtering. Files in docs/xplat/src/content are shared across all xplat - * platforms, we filter out Angular only blocks; files in docs/angular/src - * keep Angular blocks and skip xplat-only ones. + * platforms, we filter out Angular only blocks; files in docs/angular/src and + * in the generator's Angular output keep Angular blocks and skip xplat-only ones. */ function platformSetForFile(filePath) { const normalized = filePath.replace(/\\/g, '/'); - if (normalized.includes('docs/angular/src/')) { + if (normalized.includes('docs/angular/src/') || normalized.includes('docs/xplat/generated/Angular/')) { return new Set(['Angular']); } if (normalized.includes('docs/xplat/src/')) { @@ -209,6 +245,18 @@ function isFile(path) { } } +/** + * True when `path` is a file the site actually serves. + * + * A file the site never renders cannot satisfy a link: the xplat copies of + * grids/ and changelog/ sit on disk but are excluded from the Angular overlay, + * so accepting one would hide a genuinely broken link on a page that *is* + * served (see lib/angular-content-roots.mjs). + */ +function isServedFile(path) { + return !isUnservedOverlayFile(path) && isFile(path); +} + /** * Every on-disk file that can publish at the URL `base` maps to. * @@ -279,66 +327,24 @@ function isAbsoluteDocLink(url) { */ function getLangRoot(filePath) { const normalized = filePath.replace(/\\/g, '/'); - const m = normalized.match(/^(.*\/content\/(?:en|jp|kr))\//i); + const m = normalized.match(/^(.*\/(?:content|generated\/[^/]+)\/(?:en|jp|kr))\//i); return m ? m[1] + '/' : null; } -/** - * Paths that docs/angular/scripts/sync-generated.mjs refuses to copy into the - * Angular tree: grids/ and changelog/, because Angular ships its own versions. - * Pages under them exist in docs/xplat/generated/Angular but never reach the - * Angular site, so they must not satisfy an Angular link. - * - * Keep in step with shouldCopy() in docs/angular/scripts/sync-generated.mjs. - */ -const NOT_SYNCED_TO_ANGULAR_RE = /(^|\/)(grids|changelog)\//i; - -/** True when `relPath` (relative to components/) is synced into the Angular tree. */ -function isSyncedToAngular(relPath) { - return !NOT_SYNCED_TO_ANGULAR_RE.test(relPath); -} - -/** - * Content roots that feed the same published URL space as `langRoot`. - * - * New topics — Angular-only ones included — are authored under docs/xplat and - * copied into the Angular tree at build time by - * docs/angular/scripts/sync-generated.mjs. A link in docs/angular/src/content - * may therefore legitimately target a page that exists only under - * docs/xplat/generated/Angular//, so resolution has to consider both - * roots. Without the second root, every link to an xplat-authored Angular topic - * reports a false "not found" whenever the sync step has not run. - * - * Returns an ordered list of { dir, accepts } (own tree first). `accepts` takes - * a path relative to components/ and reports whether that root can serve it, so - * a root only satisfies links to pages it actually publishes. - */ -const docRootsCache = new Map(); - -function getDocRoots(langRoot) { - const cached = docRootsCache.get(langRoot); - if (cached) return cached; - - const roots = [{ dir: langRoot, accepts: () => true }]; - const m = langRoot.replace(/\\/g, '/').match(/docs\/angular\/src\/content\/(en|jp|kr)\/$/i); - if (m) { - const generated = resolve(process.cwd(), 'docs/xplat/generated/Angular', m[1]) + '/'; - if (existsSync(generated)) roots.push({ dir: generated, accepts: isSyncedToAngular }); - } - - docRootsCache.set(langRoot, roots); - return roots; -} +// `OVERLAY_ROOT_GROUPS`, `getRootGroup`, `isUnservedOverlayFile` and +// `isShadowedAuthoredFile` live in scripts/lib/angular-content-roots.mjs — the +// single description of what the Angular site actually serves, shared with +// check-mdx-links.mjs. /** Legacy docfx extension on a doc URL, e.g. /themes/palettes.html */ const LEGACY_HTML_RE = /\.html?$/i; /** - * Resolves an absolute doc link like /treegrid/tree-grid against every content - * root feeding this URL space. Returns { resolved, reason }; resolved is null - * when the target does not exist. + * Resolves an absolute doc link like /treegrid/tree-grid against `langRoots` — + * every content root that shares this slug namespace (see getRootGroup). + * Returns { resolved, reason }; resolved is null when the target does not exist. */ -function resolveAbsoluteLink(langRoot, url) { +function resolveAbsoluteLink(langRoots, url) { let path = stripHash(url).slice(1); // strip leading '/' if (!path) return { resolved: 'hash-only', reason: null }; @@ -360,12 +366,10 @@ function resolveAbsoluteLink(langRoot, url) { const legacyHtml = LEGACY_HTML_RE.test(path); if (legacyHtml) path = path.replace(LEGACY_HTML_RE, ''); - for (const { dir, accepts } of getDocRoots(langRoot)) { - if (!accepts(path)) continue; - - const base = resolve(dir, 'components', path); + for (const langRoot of langRoots) { + const base = resolve(langRoot, 'components', path); for (const candidate of pageCandidates(base)) { - if (isFile(candidate)) { + if (isServedFile(candidate)) { return { resolved: candidate, reason: legacyHtml ? 'legacy-html' : null }; } } @@ -454,24 +458,21 @@ function extractRelativeLinks(content, filePath) { // File resolution /** - * Maps `abs` — a path inside the components dir of `langRoot` — onto the - * equivalent path under each additional content root feeding the same URL - * space. Returns [] when langRoot is unknown, has no extra roots, or the - * target sits outside the components dir (images and other assets). + * Returns `abs` followed by the same path re-anchored on every peer in + * `langRoots` — the file's own root first, then each root it shares a slug + * namespace with (see getRootGroup). A path outside the own root is returned + * alone. */ -function siblingRootPaths(langRoot, abs) { - if (!langRoot) return []; - - const roots = getDocRoots(langRoot); - if (roots.length < 2) return []; - - const rel = relative(resolve(langRoot, 'components'), abs).replace(/\\/g, '/'); - if (!rel || rel.startsWith('../')) return []; - - return roots - .slice(1) - .filter(({ accepts }) => accepts(rel)) - .map(({ dir }) => resolve(dir, 'components', rel)); +function acrossRoots(abs, langRoots) { + const [ownRoot, ...peerRoots] = langRoots; + const paths = [abs]; + if (ownRoot && peerRoots.length) { + const fromRoot = relative(resolve(ownRoot), abs); + if (!fromRoot.startsWith('..')) { + for (const peer of peerRoots) paths.push(resolve(peer, fromRoot)); + } + } + return paths; } /** @@ -480,23 +481,25 @@ function siblingRootPaths(langRoot, abs) { * missingExt = true means the path has no extension but resolves via .mdx — * the link should be written as ./page.mdx, not ./page. * - * Candidates cover the tree the file lives in first, then the equivalent path - * under the other roots feeding this URL space, so a relative link to an - * xplat-authored Angular topic resolves before the sync step has run. + * Candidates cover the tree the file lives in first, then the same relative + * path re-anchored on each root it shares a slug namespace with, so a link + * that points at a topic served from the other tree still resolves. */ -function resolveLink(fileDir, href, langRoot) { +function resolveLink(fileDir, href, langRoots = []) { const path = stripHash(href); if (!path) return { resolved: 'hash-only', missingExt: false }; - const abs = resolve(fileDir, path); - const candidates = [abs, ...siblingRootPaths(langRoot, abs)]; + // Candidates re-anchored on a peer root can land on a file the site never + // serves (the overlay's excluded grids/ and changelog/); isServedFile() + // rejects those, or a broken /grids/... reference would pass. + const candidates = acrossRoots(resolve(fileDir, path), langRoots); for (const candidate of candidates) { - if (isFile(candidate)) return { resolved: candidate, missingExt: false }; + if (isServedFile(candidate)) return { resolved: candidate, missingExt: false }; } for (const candidate of candidates) { - const target = pageCandidates(candidate).find(isFile); + const target = pageCandidates(candidate).find(isServedFile); if (!target) continue; const lastDot = path.lastIndexOf('.'); @@ -519,7 +522,12 @@ let filesToScan; let scanDescription; const srcDirs = getSrcDirs(); -filesToScan = srcDirs.flatMap(d => walkMdx(resolve(d))); +// Only scan files the Angular site actually renders: skip the overlay's +// excluded grids/ and changelog/, and skip authored topics that xplat shadows — +// the latter are on disk but never served, so their links belong to no page. +filesToScan = srcDirs + .flatMap(d => walkMdx(resolve(d))) + .filter(f => !isUnservedOverlayFile(f) && !isShadowedAuthoredFile(f)); scanDescription = `source dirs: ${srcDirs.join(', ')}`; console.log(`\nScanning for relative links`); @@ -527,23 +535,6 @@ console.log(`Scope: ${scanDescription}`); if (PLATFORM) console.log(`Platform: ${PLATFORM}`); console.log(''); -// The Angular URL space is fed by two trees: docs/angular/src/content plus the -// xplat-authored Angular pages under docs/xplat/generated/Angular, which the -// build copies in via docs/angular/scripts/sync-generated.mjs. New topics are -// authored in xplat, so without that tree present links to them would report a -// false "not found". -if (PLATFORM === 'angular' || (!PLATFORM && !args.src)) { - for (const lang of ['en', 'jp']) { - if (existsSync(resolve(cwd, 'docs/xplat/generated/Angular', lang))) continue; - - const script = lang === 'en' ? 'generate:angular' : 'generate:angular:jp'; - console.log(` ! docs/xplat/generated/Angular/${lang} is missing — links to xplat-authored`); - console.log(` Angular topics may report a false "not found". Run:`); - console.log(` npm run ${script} --prefix docs/xplat`); - console.log(''); - } -} - /** @type {Array<{file: string, line: number, href: string}>} */ const brokenLinks = []; let totalFiles = 0; @@ -558,11 +549,12 @@ for (const file of filesToScan) { const relFile = relative(cwd, file).replace(/\\/g, '/'); const langRoot = getLangRoot(file); + const langRoots = getRootGroup(langRoot); for (const { href, line, kind } of links) { if (kind === 'absolute') { if (langRoot) { - const { resolved, reason } = resolveAbsoluteLink(langRoot, href); + const { resolved, reason } = resolveAbsoluteLink(langRoots, href); // A legacy .html suffix 404s on the Astro routes even when the // target page itself exists, so report it either way. if (resolved === null || reason === 'legacy-html') { @@ -571,7 +563,7 @@ for (const file of filesToScan) { } continue; } - const { resolved, missingExt, bare } = resolveLink(fileDir, href, langRoot); + const { resolved, missingExt, bare } = resolveLink(fileDir, href, langRoots); if (resolved === null) { brokenLinks.push({ file: relFile, line, href, reason: 'not-found' }); } else if (bare) { @@ -587,9 +579,8 @@ for (const file of filesToScan) { for (const m of content.matchAll(BARE_LINK_RE)) { const href = m[1]; const hash = m[2] ?? ''; - const abs = resolve(fileDir, href); - const resolvesToPage = [abs, ...siblingRootPaths(langRoot, abs)] - .some(candidate => existsSync(candidate + '.mdx')); + const resolvesToPage = acrossRoots(resolve(fileDir, href), langRoots) + .some(candidate => isServedFile(candidate + '.mdx')); if (resolvesToPage) { const line = (content.slice(0, m.index).match(/\n/g) || []).length + 1; brokenLinks.push({ file: relFile, line, href: href + hash, reason: 'bare-path' }); @@ -608,8 +599,8 @@ for (const file of filesToScan) { * entry whose target is missing (docExists() → null in src/sidebar.ts) rather * than failing, so a stale href disappears from the sidebar with no error. * - * Resolution reuses getDocRoots(), so an Angular toc entry may point at a page - * that only exists under docs/xplat/generated/Angular// until the sync runs. + * Resolution reuses getRootGroup(), so an Angular toc entry may point at a page + * that only the xplat overlay (docs/xplat/generated/Angular//) provides. */ /** Ordered { value, line } for every "href" in a toc, read from the raw text. */ @@ -653,41 +644,40 @@ function* walkTocEntries(entries, trail = [], excluded = [], counter = { n: 0 }) } /** - * True when a toc href resolves under any of `roots`. + * True when a toc href resolves under any of `langRoots`. * * docExists() accepts the href as written and also swaps .md ↔ .mdx, so both - * count here. + * count here. Like docExists(), a root never answers for a path it excludes. */ -function tocHrefResolves(roots, href) { +function tocHrefResolves(langRoots, href) { const normalized = href.replace(/\\/g, '/'); const swapped = normalized.endsWith('.mdx') ? normalized.slice(0, -4) + '.md' : normalized.endsWith('.md') ? normalized.slice(0, -3) + '.mdx' : null; - for (const { dir, accepts } of roots) { - if (!accepts(normalized)) continue; - if (isFile(resolve(dir, 'components', normalized))) return true; - if (swapped && isFile(resolve(dir, 'components', swapped))) return true; + for (const langRoot of langRoots) { + if (isServedFile(resolve(langRoot, 'components', normalized))) return true; + if (swapped && isServedFile(resolve(langRoot, 'components', swapped))) return true; } return false; } /** - * The tocs in scope, as { toc, roots, platform }. + * The tocs in scope, as { toc, langRoots, platform }. * - * Angular ships its own toc per language and resolves through getDocRoots(), so - * it picks up the xplat-authored pages the sync copies in. The xplat platforms - * share one source toc that astro.config.ts filters per platform at build time, - * so the same filter is applied here against each generated tree. + * Angular ships its own toc per language and resolves through getRootGroup(), + * so it picks up the xplat-authored pages the site overlays. The xplat + * platforms share one source toc that astro.config.ts filters per platform at + * build time, so the same filter is applied here against each generated tree. */ function getTocTargets() { const targets = []; if (!PLATFORM || PLATFORM === 'angular') { for (const lang of ['en', 'jp']) { - const langRoot = resolve(cwd, 'docs/angular/src/content', lang) + '/'; + const langRoot = resolve(cwd, ANGULAR_AUTHORED_ROOT, lang) + '/'; const toc = resolve(langRoot, 'components', 'toc.json'); - if (existsSync(toc)) targets.push({ toc, roots: getDocRoots(langRoot), platform: null }); + if (existsSync(toc)) targets.push({ toc, langRoots: getRootGroup(langRoot), platform: null }); } } @@ -698,7 +688,7 @@ function getTocTargets() { const dir = resolve(cwd, 'docs/xplat/generated', platform, lang) + '/'; if (!existsSync(toc) || !existsSync(dir)) continue; - targets.push({ toc, roots: [{ dir, accepts: () => true }], platform }); + targets.push({ toc, langRoots: [dir], platform }); } } } @@ -708,7 +698,7 @@ function getTocTargets() { let totalTocHrefs = 0; -for (const { toc, roots, platform } of getTocTargets()) { +for (const { toc, langRoots, platform } of getTocTargets()) { const text = readFileSync(toc, 'utf-8'); const relToc = relative(cwd, toc).replace(/\\/g, '/'); @@ -726,7 +716,7 @@ for (const { toc, roots, platform } of getTocTargets()) { if (platform && excluded.includes(platform)) continue; totalTocHrefs++; - if (tocHrefResolves(roots, href)) continue; + if (tocHrefResolves(langRoots, href)) continue; brokenLinks.push({ file: relToc, diff --git a/scripts/lib/angular-content-roots.mjs b/scripts/lib/angular-content-roots.mjs new file mode 100644 index 0000000000..0ad5b50e1e --- /dev/null +++ b/scripts/lib/angular-content-roots.mjs @@ -0,0 +1,129 @@ +/** + * angular-content-roots.mjs + * + * One description of "which files does the Angular site actually serve", shared + * by every link checker so the answer cannot drift between them. + * + * The Angular site is built from two content roots overlaid in place — nothing + * is ever copied between the trees: + * + * 1. docs/xplat/generated/Angular/{lang}/components (highest precedence) + * 2. docs/angular/src/content/{lang}/components (hand-authored) + * + * Two consequences a checker has to model: + * + * • Parts of the overlay are excluded, so those files exist on disk but are + * never rendered — see `isUnservedOverlayFile`. + * • xplat always wins a slug collision, so an authored topic the generator + * also emits is never rendered either — see `isShadowedAuthoredFile`. + * + * KEEP IN SYNC with the roots and excludes in + * `docs/angular/src/content.config.ts` and the `source.overlayDirs` entry in + * `docs/angular/astro.config.ts`. If an exclude is added there, add it here. + */ + +import { existsSync } from 'node:fs'; + +/** Repo-relative path of the Angular site's own, hand-authored content root. */ +export const ANGULAR_AUTHORED_ROOT = 'docs/angular/src/content'; + +/** Repo-relative path of the xplat generator's Angular output (the overlay). */ +export const ANGULAR_OVERLAY_ROOT = 'docs/xplat/generated/Angular'; + +/** + * Content roots that share one slug namespace. The Angular site serves its own + * tree and the xplat generator's Angular output as a single set of pages, so a + * link may legitimately point from one tree at a topic that lives in the other. + */ +export const OVERLAY_ROOT_GROUPS = [ + [ANGULAR_AUTHORED_ROOT, ANGULAR_OVERLAY_ROOT], +]; + +/** + * Directories excluded from the overlay in `docs/angular/src/content.config.ts`. + * They stay Angular-owned, so the xplat copies are never served. + */ +export const OVERLAY_EXCLUDED_DIRS = ['changelog', 'grids']; + +/** + * Paths that exist in the generated tree but are not served, because the site + * excludes them from the overlay. + */ +const UNSERVED_OVERLAY_PATHS = [ + new RegExp( + `(^|/)${ANGULAR_OVERLAY_ROOT}/[^/]+/components/(${OVERLAY_EXCLUDED_DIRS.join('|')})(/|$)`, + 'i', + ), +]; + +/** Forward-slash form of a path, for matching against the repo-relative patterns. */ +function normalize(filePath) { + return String(filePath).replace(/\\/g, '/'); +} + +/** + * True when `filePath` lives in the overlay but under a path the Angular site + * excludes, so the file is on disk yet never rendered. Such files must not be + * scanned, and must not satisfy a link from a page that *is* rendered. + */ +export function isUnservedOverlayFile(filePath) { + const normalized = normalize(filePath); + return UNSERVED_OVERLAY_PATHS.some(re => re.test(normalized)); +} + +// The leading group is whatever precedes the repo-relative root — an absolute +// prefix ending in `/`, or nothing at all for an already-relative path. +const AUTHORED_TOPIC_RE = new RegExp( + `^(|.*/)${ANGULAR_AUTHORED_ROOT}/([^/]+)/components/(.+)$`, + 'i', +); + +/** + * True when `filePath` is a hand-authored Angular topic whose slug the xplat + * generator also provides. xplat wins every collision, so the authored file is + * dead weight: it is never rendered, and scanning it would report links that no + * published page contains. + */ +export function isShadowedAuthoredFile(filePath) { + const match = AUTHORED_TOPIC_RE.exec(normalize(filePath)); + if (!match) return false; + const [, prefix, lang, rel] = match; + const overlayCandidate = `${prefix}${ANGULAR_OVERLAY_ROOT}/${lang}/components/${rel}`; + // An overlay file the site excludes shadows nothing — `grids/` and + // `changelog/` stay Angular-owned even though xplat also emits them. + if (isUnservedOverlayFile(overlayCandidate)) return false; + return existsSync(overlayCandidate); +} + +/** True when the Angular site never renders `filePath`, for either reason above. */ +export function isUnservedAngularFile(filePath) { + return isUnservedOverlayFile(filePath) || isShadowedAuthoredFile(filePath); +} + +/** + * Returns every language root that resolves alongside `langRoot`, itself first. + * Roots that are not on disk (a language the generator does not emit) are dropped. + * + * `langRoot` is absolute — the scan resolves its source dirs — so the + * repo-relative group entries are matched as a substring and the prefix before + * them is carried over to the peers. + */ +export function getRootGroup(langRoot) { + if (!langRoot) return []; + const normalized = normalize(langRoot).replace(/\/$/, ''); + for (const group of OVERLAY_ROOT_GROUPS) { + for (const base of group) { + const at = normalized.lastIndexOf(base + '/'); + if (at === -1) continue; + const prefix = normalized.slice(0, at); + const lang = normalized.slice(at + base.length + 1); + if (!lang || lang.includes('/')) continue; + const peers = group + .filter(other => other !== base) + .map(other => `${prefix}${other}/${lang}/`) + .filter(dir => existsSync(dir)); + return [langRoot, ...peers]; + } + } + return [langRoot]; +} diff --git a/scripts/lib/angular-content-roots.test.ts b/scripts/lib/angular-content-roots.test.ts new file mode 100644 index 0000000000..e5359bd612 --- /dev/null +++ b/scripts/lib/angular-content-roots.test.ts @@ -0,0 +1,165 @@ +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { + ANGULAR_AUTHORED_ROOT, + ANGULAR_OVERLAY_ROOT, + getRootGroup, + isShadowedAuthoredFile, + isUnservedAngularFile, + isUnservedOverlayFile, + OVERLAY_EXCLUDED_DIRS, +} from './angular-content-roots.mjs'; + +/** Repo root of the fake checkout, in the forward-slash form the module expects. */ +let repo: string; + +const authored = (lang: string): string => `${repo}/${ANGULAR_AUTHORED_ROOT}/${lang}`; +const overlay = (lang: string): string => `${repo}/${ANGULAR_OVERLAY_ROOT}/${lang}`; + +/** Creates an empty file at `absPath`, parents included. */ +function touch(absPath: string): string { + fs.mkdirSync(path.dirname(absPath), { recursive: true }); + fs.writeFileSync(absPath, ''); + return absPath; +} + +beforeEach(() => { + repo = fs.mkdtempSync(path.join(os.tmpdir(), 'ng-roots-')).replace(/\\/g, '/'); + + // Authored tree: one topic the generator also emits, one it does not, and + // one under a directory the site keeps for itself. + touch(`${authored('en')}/components/charts/pie.md`); + touch(`${authored('en')}/components/unique.md`); + touch(`${authored('en')}/components/grids/grid.md`); + touch(`${authored('jp')}/components/charts/pie.md`); + touch(`${authored('kr')}/components/charts/pie.md`); + + // Overlay tree: the generated twins, plus the excluded subtrees. + touch(`${overlay('en')}/components/charts/pie.md`); + touch(`${overlay('en')}/components/grids/grid.md`); + touch(`${overlay('en')}/components/changelog/notes.md`); + touch(`${overlay('jp')}/components/charts/pie.md`); +}); + +afterEach(() => { + fs.rmSync(repo, { recursive: true, force: true }); +}); + +describe('isUnservedOverlayFile', () => { + it.each(OVERLAY_EXCLUDED_DIRS)('treats the overlay %s directory as unserved', dir => { + expect(isUnservedOverlayFile(`${ANGULAR_OVERLAY_ROOT}/en/components/${dir}/topic.md`)).toBe(true); + }); + + it('serves an overlay file outside the excluded directories', () => { + expect(isUnservedOverlayFile(`${ANGULAR_OVERLAY_ROOT}/en/components/charts/pie.md`)).toBe(false); + }); + + it('matches the excluded directory itself, without a trailing path', () => { + expect(isUnservedOverlayFile(`${ANGULAR_OVERLAY_ROOT}/en/components/grids`)).toBe(true); + }); + + it('does not match a directory that merely starts with an excluded name', () => { + expect(isUnservedOverlayFile(`${ANGULAR_OVERLAY_ROOT}/en/components/gridsy/topic.md`)).toBe(false); + }); + + it('matches when the repo-relative path is prefixed by an absolute directory', () => { + expect(isUnservedOverlayFile(`${overlay('en')}/components/changelog/notes.md`)).toBe(true); + }); + + it('normalises Windows separators', () => { + expect(isUnservedOverlayFile(`${ANGULAR_OVERLAY_ROOT}/en/components/grids/grid.md`.replace(/\//g, '\\'))) + .toBe(true); + }); + + it('ignores case', () => { + expect(isUnservedOverlayFile('docs/xplat/generated/angular/EN/components/Changelog/notes.md')).toBe(true); + }); + + it('never treats an authored file as an unserved overlay file', () => { + expect(isUnservedOverlayFile(`${ANGULAR_AUTHORED_ROOT}/en/components/grids/grid.md`)).toBe(false); + }); +}); + +describe('isShadowedAuthoredFile', () => { + it('reports an authored topic the generator also emits', () => { + expect(isShadowedAuthoredFile(`${authored('en')}/components/charts/pie.md`)).toBe(true); + }); + + it('does not report an authored topic with no generated twin', () => { + expect(isShadowedAuthoredFile(`${authored('en')}/components/unique.md`)).toBe(false); + }); + + it('does not report an authored topic whose twin the site excludes', () => { + // `grids/` stays Angular-owned, so the generated copy shadows nothing. + expect(isShadowedAuthoredFile(`${authored('en')}/components/grids/grid.md`)).toBe(false); + }); + + it('does not report a topic in a language the generator does not emit', () => { + expect(isShadowedAuthoredFile(`${authored('kr')}/components/charts/pie.md`)).toBe(false); + }); + + it('reports a shadowed topic in the Japanese tree', () => { + expect(isShadowedAuthoredFile(`${authored('jp')}/components/charts/pie.md`)).toBe(true); + }); + + it('returns false for a path outside the authored root', () => { + expect(isShadowedAuthoredFile(`${overlay('en')}/components/charts/pie.md`)).toBe(false); + expect(isShadowedAuthoredFile(`${repo}/docs/xplat/src/content/en/components/charts/pie.md`)).toBe(false); + }); +}); + +describe('isUnservedAngularFile', () => { + it('is true for an excluded overlay file', () => { + expect(isUnservedAngularFile(`${overlay('en')}/components/changelog/notes.md`)).toBe(true); + }); + + it('is true for a shadowed authored file', () => { + expect(isUnservedAngularFile(`${authored('en')}/components/charts/pie.md`)).toBe(true); + }); + + it('is false for an authored file the site actually renders', () => { + expect(isUnservedAngularFile(`${authored('en')}/components/unique.md`)).toBe(false); + }); + + it('is false for a served overlay file', () => { + expect(isUnservedAngularFile(`${overlay('en')}/components/charts/pie.md`)).toBe(false); + }); +}); + +describe('getRootGroup', () => { + it('pairs the authored English root with its overlay', () => { + expect(getRootGroup(authored('en'))).toEqual([authored('en'), `${overlay('en')}/`]); + }); + + it('pairs the overlay root with the authored tree', () => { + expect(getRootGroup(overlay('en'))).toEqual([overlay('en'), `${authored('en')}/`]); + }); + + it('pairs the Japanese roots', () => { + expect(getRootGroup(authored('jp'))).toEqual([authored('jp'), `${overlay('jp')}/`]); + }); + + it('drops a peer the generator does not emit', () => { + expect(getRootGroup(authored('kr'))).toEqual([authored('kr')]); + }); + + it('ignores a trailing slash on the input', () => { + expect(getRootGroup(`${authored('en')}/`)).toEqual([`${authored('en')}/`, `${overlay('en')}/`]); + }); + + it('returns a path outside both roots on its own', () => { + const outside = `${repo}/docs/xplat/src/content/en`; + expect(getRootGroup(outside)).toEqual([outside]); + }); + + it('returns a deeper path inside a root on its own', () => { + const deeper = `${authored('en')}/components`; + expect(getRootGroup(deeper)).toEqual([deeper]); + }); + + it('returns an empty list for an empty root', () => { + expect(getRootGroup('')).toEqual([]); + }); +}); diff --git a/src/__snapshots__/html-page.md b/src/__snapshots__/html-page.md new file mode 100644 index 0000000000..8ac3bc615b --- /dev/null +++ b/src/__snapshots__/html-page.md @@ -0,0 +1,24 @@ +# Data Grid + +The grid supports "smart" quotes, an ellipsis... and the Ignite UI(TM) trademark. + +Read the [editing topic](https://example.test/docs/grids/data-grid/editing.md), the [API section](https://example.test/docs/grids/data-grid/editing.md?tab=api#cells), the [PDF sheet](https://example.test/docs/assets/sheet.pdf) and the [external page](https://example.test/external). + +## Options + +| Name | Type | +| --- | --- | +| data | Array | + +- Sorting +- Filtering + +```typescript +const grid = new Grid(); +grid.data = []; +``` + +> **Note:** +> Virtualization is on by default. + +[Grid Overview Example](https://example.test/samples/grid-overview) diff --git a/src/__snapshots__/llms-txt.txt b/src/__snapshots__/llms-txt.txt new file mode 100644 index 0000000000..a224d8322e --- /dev/null +++ b/src/__snapshots__/llms-txt.txt @@ -0,0 +1,25 @@ +# Ignite UI + +> Docs for Ignite UI. + +## Documentation sets + +- [Abridged documentation](/docs/llms-small.txt): a compact version of the documentation, with non-essential content removed +- [Combined docs](/docs/llms-full.txt): Single-file Markdown export of all docs. +- [API Reference](https://example.test/api/angular/llms.txt): Full TypeDoc/docfx API reference for all packages — classes, interfaces, enums, and members + +- [React Grids](/docs/_llms-txt/react-grids.txt): Grid docs only. + +## Grids & Lists + +- [Grids & Lists Overview](/docs/grids.md): Every grid component. + Tags: grid, table + +### Data Grid + +- [Grids & Lists Data Grid Overview](/docs/grids/data-grid.md) +- [Grids & Lists Cell Editing](/docs/grids/data-grid/editing.md): Editing cells in the grid. + +## General + +- [General Getting Started](/docs/general/getting-started.md) \ No newline at end of file diff --git a/src/content-helper.ts b/src/content-helper.ts index 77ba71a9f6..a320054747 100644 --- a/src/content-helper.ts +++ b/src/content-helper.ts @@ -10,9 +10,9 @@ * import { collections } from 'docs-template/content'; * export { collections }; * - * `createDocsSite({ source: { docsDir } })` in astro.config.ts - * automatically sets DOCS_SOURCE_PATH, so the exported `collections` - * object picks it up with no extra configuration. + * `createDocsSite({ source: { docsDir, overlayDirs } })` in astro.config.ts + * publishes the full root list, so the exported `collections` object picks + * it up with no extra configuration. * * ── Custom excludes / extra schema fields ──────────────────────────────── * @@ -25,12 +25,34 @@ * extendSchema: z.object({ myCustomField: z.string().optional() }), * }), * }; + * + * ── Overlaying a generated tree on an authored one ──────────────────────── + * + * Pass several roots, highest precedence first. All roots share one slug + * namespace, and the first root to provide a slug wins — nothing is copied + * between the trees, so the authored tree stays free of build output: + * + * export const collections = { + * docs: createDocsCollection([ + * { dir: generatedDir, exclude: ['changelog/**'] }, // wins + * authoredDir, + * ]), + * }; */ import { defineCollection } from 'astro:content'; import { glob } from 'astro/loaders'; import { z } from 'astro/zod'; -import { pathToFileURL } from 'node:url'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +import { docRootsFromEnv, toRootList, type DocsContentRoot } from './lib/doc-roots.ts'; + +// The canonical root helpers live in `lib/doc-roots.ts` — re-exported here so a +// consuming `content.config.ts` can read the root list `createDocsSite` +// published (`docRootsFromEnv()`) from the same module it already imports. +export { docRootsFromEnv } from './lib/doc-roots.ts'; +export type { DocsContentRoot, ResolvedDocRoot } from './lib/doc-roots.ts'; /** Sentinel value placed on entries that have no title so we can remove them after loading. */ const SKIP_TITLE = '\x00skip'; @@ -55,6 +77,269 @@ function withTitleFilter(baseLoader: any): any { }; } +// --------------------------------------------------------------------------- +// Multi-root overlay support +// --------------------------------------------------------------------------- +// +// Astro's `glob()` loader owns the whole store: it snapshots `store.keys()` when +// it starts and deletes every id it did not touch by the time it finishes. Two +// glob loaders sharing one collection would therefore wipe each other's entries. +// +// `scopeStore` hands each root its own view of the store so that: +// • `keys()` lists only the entries that came from *that* root, so a root's +// cleanup sweep can never delete another root's pages; +// • `get()` only ever hands a root back its *own* entries, so a shadowed page +// is silently skipped instead of overwriting the winner (and without +// tripping Astro's duplicate-slug warning, which fires inside the loader +// between its `get` and its `set`); +// • `set()` is refused for ids a higher-precedence root has claimed. +// +// Ownership is decided by the entry's own `filePath`, not just by what a root +// wrote during this pass: on a *warm* load the glob loader returns early — with +// no `set` — as soon as it sees an unchanged digest, so a root that wins every +// one of its slugs may never call `set` at all. `get()` therefore registers the +// claim itself, which is what keeps the winner from being overwritten by the +// next root on the second and every later build against a populated store. +// +// Roots are always ordered highest precedence first, so root 0 wins every +// collision — see `src/lib/doc-roots.ts` for the convention. +// +// ── Dev-server watching ────────────────────────────────────────────────────── +// Each glob loader registers its own `add`/`change`/`unlink` handlers on the +// shared file watcher, and each handler only reacts to paths under its own +// root. That is fine for adds and edits (the scoped store lets a higher root +// take a slug over, and keeps a lower one from stealing it) but not for +// deletes: when a *winning* file goes away, its root removes the entry, and +// nothing tells the shadowed root that its file is now the page — the route +// vanishes until the next full reload. `scopeWatcher` closes that gap by +// following every unlink under root N with a synthetic change for the same +// relative path in roots N+1…, so the first lower root that still has the file +// re-syncs it through its own loader (and the scoped store again makes sure +// only the highest of those wins). + +/** Absolute path of the file an entry was loaded from, or `undefined`. */ +function entrySourcePath(entry: unknown, configRoot: string): string | undefined { + const filePath = (entry as { filePath?: string } | undefined)?.filePath; + return filePath ? path.resolve(configRoot, filePath) : undefined; +} + +interface ScopeStoreOptions { + /** Absolute path of the root this view belongs to. */ + root: string; + /** Index of this root in the precedence list (0 = highest). */ + rootIndex: number; + /** True when this is the lowest-precedence root. */ + isLast: boolean; + /** Astro's `config.root`, used to absolutize the relative `filePath` on entries. */ + configRoot: string; + /** Shared across roots for one load pass: entry id → index of the root that claimed it. */ + claimed: Map; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function scopeStore(store: any, options: ScopeStoreOptions): any { + const { root, rootIndex, isLast, configRoot, claimed } = options; + const rootWithSep = root.endsWith(path.sep) ? root : root + path.sep; + + /** + * Ownership of a stored entry, decided by the file it was loaded from: + * `'mine'` — the file lives under this root; + * `'other'` — it lives under a different root; + * `'orphan'` — it has no file path (predates this loader, or came from + * elsewhere). Only the last root claims orphans, so they are + * still swept exactly once. + */ + const ownership = (id: string): 'mine' | 'other' | 'orphan' => { + const source = entrySourcePath(store.get(id), configRoot); + if (!source) return 'orphan'; + return source.startsWith(rootWithSep) ? 'mine' : 'other'; + }; + + /** True when `id` was loaded from this root — decided by the entry's own file path. */ + const ownsEntry = (id: string): boolean => { + const owner = ownership(id); + return owner === 'orphan' ? isLast : owner === 'mine'; + }; + + /** True when any *other* root has taken this id during this load pass. */ + const takenByOther = (id: string): boolean => { + const owner = claimed.get(id); + return owner !== undefined && owner !== rootIndex; + }; + + /** + * True when a root that outranks this one has taken the id. Writes are + * blocked only by higher precedence, never by lower, so a root can still + * take over a slug it should win — which is what happens when the dev + * server's watcher adds a file that shadows an already-loaded page. + */ + const takenByHigher = (id: string): boolean => { + const owner = claimed.get(id); + return owner !== undefined && owner < rootIndex; + }; + + return { + ...store, + keys: () => [...store.keys()].filter(ownsEntry), + entries: () => [...store.entries()].filter(([id]: [string]) => ownsEntry(id)), + values: () => [...store.entries()].filter(([id]: [string]) => ownsEntry(id)).map(([, v]: [string, unknown]) => v), + // Hiding another root's entry keeps the two files from being compared + // against each other, which is what would otherwise emit a + // duplicate-slug warning for a slug that is deliberately shadowed. + // + // Reading one's own entry also *claims* the id. The loader calls `get` + // for every file it walks, but only calls `set` when the content + // actually changed, so claiming here is the only thing that records the + // winner on a warm load — without it the next root would see an + // unclaimed id and overwrite the page it is supposed to be shadowed by. + get: (id: string) => { + if (takenByOther(id)) return undefined; + switch (ownership(id)) { + case 'mine': + claimed.set(id, rootIndex); + return store.get(id); + case 'other': + return undefined; + default: + // No file path to go on (or no entry at all) — nothing to + // claim; hand back whatever the store has. + return store.get(id); + } + }, + set: (entry: { id: string }) => { + if (takenByHigher(entry.id)) return false; + claimed.set(entry.id, rootIndex); + return store.set(entry); + }, + delete: (id: string) => { + if (takenByOther(id)) return; + claimed.delete(id); + return store.delete(id); + }, + }; +} + +type WatchHandler = (filePath: string) => unknown; + +/** Source extensions the loaders serve; a deleted `.mdx` may be backed by a `.md`. */ +const SOURCE_EXTENSIONS = ['.md', '.mdx']; + +interface ScopeWatcherOptions { + /** Index of the root this view belongs to (0 = highest precedence). */ + rootIndex: number; + /** Per-root `change` handlers registered so far, shared across all views. */ + changeHandlers: WatchHandler[][]; + /** Called after a root's own `unlink` handler has run for `filePath`. */ + onUnlinked: (rootIndex: number, filePath: string) => Promise; +} + +/** + * Wraps the dev server's file watcher for one root. Every call passes through + * to the real watcher; the view only records the root's `change` handler (so + * the overlay can re-sync a file on the root's behalf) and follows the root's + * `unlink` handler with `onUnlinked`. + * + * Methods are bound to the real watcher rather than delegated through a + * prototype so the watcher's internal state is never written onto the view. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function scopeWatcher(watcher: any, options: ScopeWatcherOptions): any { + const { rootIndex, changeHandlers, onUnlinked } = options; + + return new Proxy(watcher, { + get(target, prop, receiver) { + if (prop === 'on') { + return (event: string, handler: WatchHandler) => { + let registered = handler; + if (event === 'change') { + changeHandlers[rootIndex].push(handler); + } else if (event === 'unlink') { + registered = async (filePath: string) => { + await handler(filePath); + await onUnlinked(rootIndex, filePath); + }; + } + target.on(event, registered); + return receiver; + }; + } + const value = Reflect.get(target, prop, target); + return typeof value === 'function' ? value.bind(target) : value; + }, + }); +} + +/** + * Runs one glob loader per content root against a single collection. + * + * Roots are listed highest precedence first and loaded in that order, so the + * first root to provide a slug is the one that wins. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function overlayLoader(loaders: Array<{ root: string; loader: any }>): any { + if (loaders.length === 1) return loaders[0].loader; + + const rootsWithSep = loaders.map(({ root }) => (root.endsWith(path.sep) ? root : root + path.sep)); + + return { + name: 'docs-overlay-loader', + load: async (ctx: any) => { + // Entry `filePath`s are stored relative to Astro's project root, + // which the config exposes as a file:// URL. + const configRoot = ctx.config?.root ? fileURLToPath(ctx.config.root) : process.cwd(); + const claimed = new Map(); + const changeHandlers: WatchHandler[][] = loaders.map(() => []); + + /** + * A file under root `rootIndex` was deleted. Re-sync the same + * relative path from every lower-precedence root that still has it, + * highest first — the scoped store lets the first of them claim the + * slug and refuses the rest, so the page never disappears while a + * shadowed copy exists. Paths outside the root (which the root's own + * handler ignored too) and paths no lower root can serve are no-ops. + */ + const onUnlinked = async (rootIndex: number, deletedPath: string): Promise => { + const abs = path.resolve(deletedPath); + if (!abs.startsWith(rootsWithSep[rootIndex])) return; + + const relPath = abs.slice(rootsWithSep[rootIndex].length); + const ext = path.extname(relPath); + if (!SOURCE_EXTENSIONS.includes(ext)) return; + const stem = relPath.slice(0, -ext.length); + // Same extension first, so an overlay `.mdx` falls back to a base + // `.mdx` before a base `.md` — matching `findFirstInRoots`. + const candidates = [ext, ...SOURCE_EXTENSIONS.filter(e => e !== ext)].map(e => stem + e); + + for (let lower = rootIndex + 1; lower < loaders.length; lower++) { + for (const candidate of candidates) { + const file = path.join(loaders[lower].root, candidate); + if (!fs.existsSync(file)) continue; + // The root's own handler applies its glob (and excludes) + // before syncing, so an excluded copy is skipped here too. + for (const handler of changeHandlers[lower]) await handler(file); + } + } + }; + + for (const [rootIndex, { root, loader }] of loaders.entries()) { + await loader.load({ + ...ctx, + store: scopeStore(ctx.store, { + root, + rootIndex, + isLast: rootIndex === loaders.length - 1, + configRoot, + claimed, + }), + watcher: ctx.watcher + ? scopeWatcher(ctx.watcher, { rootIndex, changeHandlers, onUnlinked }) + : ctx.watcher, + }); + } + }, + }; +} + /** * Base frontmatter schema for MDX/Markdown documentation files. * Wraps with a z.preprocess that injects a sentinel title for entries @@ -86,8 +371,8 @@ function makeDocsSchema(extend?: z.ZodObject) { interface CreateDocsCollectionOptions { /** - * Glob patterns to exclude (relative to `sourceDir`). A leading `!` is - * added automatically when missing, so `'internal/**'` and + * Glob patterns to exclude, applied to *every* root (relative to each root). + * A leading `!` is added automatically when missing, so `'internal/**'` and * `'!internal/**'` are both accepted. */ exclude?: string[]; @@ -99,29 +384,38 @@ interface CreateDocsCollectionOptions { } /** - * Creates an Astro content collection (`docs`) for a docs site, - * using a glob loader against the given source directory. + * Creates an Astro content collection (`docs`) for a docs site, using a glob + * loader against each source directory. * * @param sourceDir - Absolute path to the directory containing the source - * `.md`/`.mdx` files. Defaults to `process.env.DOCS_SOURCE_PATH` if omitted. + * `.md`/`.mdx` files, or a list of such directories **ordered highest + * precedence first**: when the same slug exists in more than one root, the + * earliest root in the list provides the page and the rest are ignored. + * Defaults to `process.env.DOCS_SOURCE_PATH` if omitted. * @param options - Optional exclude patterns and schema extension. */ export function createDocsCollection( - sourceDir?: string, + sourceDir?: DocsContentRoot | DocsContentRoot[], { exclude = [], extendSchema }: CreateDocsCollectionOptions = {}, ) { - const dir = sourceDir ?? process.env.DOCS_SOURCE_PATH; - if (!dir) { + const configured = sourceDir ?? process.env.DOCS_SOURCE_PATH; + const roots = toRootList( + (Array.isArray(configured) ? configured : [configured]) + .filter((r): r is DocsContentRoot => Boolean(r)), + ).filter(r => Boolean(r.dir)); + + if (roots.length === 0) { throw new Error( '[docs-template] createDocsCollection: no source directory provided. ' + - 'Pass a path as the first argument or set the DOCS_SOURCE_PATH env variable.' + 'Pass a path (or list of paths) as the first argument or set the DOCS_SOURCE_PATH env variable.' ); } - const excludePatterns = exclude.map(p => (p.startsWith('!') ? p : `!${p}`)); + const toNegated = (patterns: string[]) => patterns.map(p => (p.startsWith('!') ? p : `!${p}`)); - return defineCollection({ - loader: withTitleFilter(glob({ + const loaders = roots.map(({ dir, exclude: rootExclude }) => ({ + root: path.resolve(dir), + loader: glob({ base: pathToFileURL(dir.endsWith('/') ? dir : dir + '/'), pattern: [ '*.{md,mdx}', @@ -133,9 +427,13 @@ export function createDocsCollection( '!README.md', '!CHANGELOG.md', '!LICENSE.md', - ...excludePatterns, + ...toNegated([...exclude, ...rootExclude]), ], - })), + }), + })); + + return defineCollection({ + loader: withTitleFilter(overlayLoader(loaders)), // eslint-disable-next-line @typescript-eslint/no-explicit-any schema: makeDocsSchema(extendSchema) as any, }); @@ -155,5 +453,5 @@ export function createDocsCollection( * export { collections }; */ export const collections = { - docs: createDocsCollection(process.env.DOCS_SOURCE_PATH), + docs: createDocsCollection(docRootsFromEnv()), }; diff --git a/src/html-to-md.test.ts b/src/html-to-md.test.ts new file mode 100644 index 0000000000..7762ca10a0 --- /dev/null +++ b/src/html-to-md.test.ts @@ -0,0 +1,153 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it, vi } from 'vitest'; +import { buildHtmlToMdConverter, htmlPageToMd } from './html-to-md.ts'; + +const fixture = (name: string): string => + path.join(fileURLToPath(new URL('../test/fixtures/html-to-md/', import.meta.url)), name); + +const PAGE = fixture('page.html'); +const SITE_URL = 'https://example.test/docs/'; + +describe('buildHtmlToMdConverter', () => { + const td = buildHtmlToMdConverter(); + + it('writes headings in ATX style', () => { + expect(td.turndown('

Options

')).toBe('## Options'); + }); + + it('converts a table to GFM pipe syntax', () => { + const md: string = td.turndown( + '' + + '
NameType
dataArray
', + ); + + expect(md).toContain('| Name | Type |'); + expect(md).toContain('| data | Array |'); + }); + + it('writes code blocks as fenced blocks carrying the language', () => { + const md: string = td.turndown('
const a = 1;
'); + + expect(md).toBe('```typescript\nconst a = 1;\n```'); + }); + + it('uses a dash as the bullet list marker', () => { + expect(td.turndown('
  • Sorting
  • Filtering
')).toBe('- Sorting\n- Filtering'); + }); + + it('drops scripts, styles and decorative icons', () => { + const md: string = td.turndown( + '

Text

' + + '', + ); + + expect(md).toBe('Text'); + }); + + it('removes the breadcrumb nav', () => { + const md: string = td.turndown('

Body

'); + + expect(md).toBe('Body'); + }); + + it('turns a DocsAside into a blockquote labelled from aria-label', () => { + const md: string = td.turndown('

Careful.

'); + + expect(md).toBe('> **Warning:**\n> Careful.'); + }); + + it('turns a sample iframe into a titled link', () => { + const md: string = td.turndown( + '
', + ); + + expect(md).toBe('[Grid Example](https://example.test/s/1)'); + }); +}); + +describe('htmlPageToMd', () => { + const convert = (url = SITE_URL) => htmlPageToMd(PAGE, url, buildHtmlToMdConverter()); + + it('returns an empty string when the file does not exist', async () => { + expect(await htmlPageToMd(fixture('missing.html'), SITE_URL, buildHtmlToMdConverter())).toBe(''); + }); + + it('returns an empty string when the page has no content element', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}); + try { + expect(await htmlPageToMd(fixture('no-content.html'), SITE_URL, buildHtmlToMdConverter())).toBe(''); + expect(warn).toHaveBeenCalledOnce(); + } finally { + warn.mockRestore(); + } + }); + + it('keeps the fenced code block with its language and unhighlighted source', async () => { + const md = await convert(); + + expect(md).toContain('```typescript\nconst grid = new Grid();\ngrid.data = [];\n```'); + }); + + it('strips navigation chrome from the page', async () => { + const md = await convert(); + + expect(md).not.toContain('Home'); + expect(md).not.toContain('docs-breadcrumb'); + expect(md).not.toContain('Footer chrome'); + expect(md).not.toContain('Premium'); + }); + + it('normalises typographic characters to ASCII', async () => { + const md = await convert(); + + expect(md).toContain('"smart" quotes'); + expect(md).toContain('an ellipsis...'); + expect(md).toContain('Ignite UI(TM)'); + expect(md).not.toMatch(/[‘’“”…™]/); + }); + + it('absolutizes internal links and appends .md, keeping query and fragment', async () => { + const md = await convert(); + + expect(md).toContain('(https://example.test/docs/grids/data-grid/editing.md)'); + expect(md).toContain('(https://example.test/docs/grids/data-grid/editing.md?tab=api#cells)'); + }); + + it('leaves a link that already has a file extension alone', async () => { + const md = await convert(); + + expect(md).toContain('(https://example.test/docs/assets/sheet.pdf)'); + }); + + it('leaves external links untouched', async () => { + const md = await convert(); + + expect(md).toContain('(https://example.test/external)'); + expect(md).not.toContain('external.md'); + }); + + it('leaves links alone when the site URL cannot be parsed', async () => { + const md = await convert('not a url'); + + expect(md).toContain('(/docs/grids/data-grid/editing)'); + }); + + it('renders the aside as a blockquote without its decorative icon or title', async () => { + const md = await convert(); + + expect(md).toContain('> **Note:**'); + expect(md).toContain('> Virtualization is on by default.'); + }); + + it('ends with exactly one trailing newline', async () => { + const md = await convert(); + + expect(md.endsWith('\n')).toBe(true); + expect(md.endsWith('\n\n')).toBe(false); + }); + + it('matches the recorded Markdown for the fixture page', async () => { + await expect(await convert()).toMatchFileSnapshot('./__snapshots__/html-page.md'); + }); +}); diff --git a/src/integration.ts b/src/integration.ts index 03c8a7c9d0..0786618f1d 100644 --- a/src/integration.ts +++ b/src/integration.ts @@ -59,6 +59,15 @@ import { type LlmsMeta, type LlmsSet, type SidebarEntry, } from './llms.ts'; import { buildSidebarFromToc } from './sidebar'; +import { + DOC_ROOTS_ENV, + findFirstInRoots, + resolveDocRoots, + serializeDocRoots, + toRootList, + type DocsContentRoot, + type ResolvedDocRoot, +} from './lib/doc-roots.ts'; import { getPlatformHead } from './platform'; import type { HeadEntry, PlatformKey, NavLang } from './platform.ts'; import { getGtmContainerId } from './lib/platform-context.js'; @@ -155,8 +164,8 @@ interface GenerateLlmsMdOptions { outDir: string; /** Page slugs to convert (stripped of trailing slashes). */ slugs: string[]; - /** Path to the source docs directory — used only for diagnostic warnings. */ - docsDir: string; + /** Source docs roots, highest precedence first — used only for diagnostic warnings. */ + docsDirs: ResolvedDocRoot[]; /** Configured site URL. */ siteUrl: string; /** Named documentation subsets to assemble into combined .txt files. */ @@ -218,7 +227,7 @@ function resolveApiDocsLlmsUrl(siteUrl: string, platform: PlatformKey | null): s * /llms-small.txt — same as full, but with code blocks and inline code removed * /_llms-txt/*.txt — topic-specific bundles defined by `llmsSets` */ -async function generateLlmsMdFiles({ outDir, slugs, docsDir, siteUrl, llmsSets }: GenerateLlmsMdOptions): Promise { +async function generateLlmsMdFiles({ outDir, slugs, docsDirs, siteUrl, llmsSets }: GenerateLlmsMdOptions): Promise { console.log(`[docs-template] Generating ${slugs.length} .md files…`); const mdStart = Date.now(); @@ -236,9 +245,8 @@ async function generateLlmsMdFiles({ outDir, slugs, docsDir, siteUrl, llmsSets } // Resolve the source MDX/MD path so warnings point developers at the // file they need to edit, not the built HTML artifact. - const sourceRef = ['.mdx', '.md'] - .map(ext => path.join(docsDir, slug + ext)) - .find(f => fs.existsSync(f)) ?? path.join(docsDir, slug + '.mdx'); + const sourceRef = findFirstInRoots(docsDirs, ['.mdx', '.md'].map(ext => slug + ext)) + ?? path.join(docsDirs[0]?.dir ?? '', slug + '.mdx'); const md = await htmlPageToMd(htmlPath, siteUrl, td, sourceRef); if (!md) { skippedSlugs.push(slug); mdDone++; return ''; } @@ -356,8 +364,13 @@ export interface SiteMetaOptions { /** Localized site description for non-English builds. Used in the llms.txt * manifest blockquote instead of the (typically English) `description`. */ localizedDescription?: string; - /** Path to the source markdown files. */ - docsDir?: string; + /** + * Path to the source markdown files, or several such roots ordered + * highest precedence first when the site overlays content roots. A root + * may carry its own `exclude` globs — those subtrees are treated as absent + * from it, so the next root supplies the slug. + */ + docsDir?: DocsContentRoot | DocsContentRoot[]; sidebar?: SidebarEntry[]; platform?: PlatformKey | null; navLang?: NavLang; @@ -410,8 +423,11 @@ export function siteMetaIntegration({ packages = [], selectedPackage = '', }: SiteMetaOptions = {} as SiteMetaOptions): AstroIntegration { - const llmsMetaMap = docsDir - ? buildLlmsMetaMap(docsDir, sidebar ?? []) + // Content roots, highest precedence first. A page's metadata and its raw + // source are both read from the first root that supplies its slug. + const docsDirs = toRootList(docsDir); + const llmsMetaMap = docsDirs.length + ? buildLlmsMetaMap(docsDirs, sidebar ?? []) : new Map(); const virtualId = 'virtual:docs-template/site-meta'; @@ -508,7 +524,7 @@ export const selectedPackage = ${JSON.stringify(selectedPackage)}; }, 'astro:server:setup'({ server }) { - if (!docsDir) return; + if (!docsDirs.length) return; // Dev-mode convenience: serve raw source MDX/MD files for /{slug}.md // requests so LLM clients can fetch Markdown during local development // without a full production build. The HTML→MD pipeline only runs at @@ -518,14 +534,14 @@ export const selectedPackage = ${JSON.stringify(selectedPackage)}; if (!req.url?.endsWith('.md')) return next(); // Strip leading slash and .md suffix to get the slug const slug = req.url.slice(1, -3); - for (const ext of ['.md', '.mdx']) { - const src = path.join(docsDir, slug + ext); + const src = findFirstInRoots(docsDirs, ['.md', '.mdx'].map(ext => slug + ext)); + if (src) { try { const raw = await fsp.readFile(src, 'utf-8'); res.setHeader('Content-Type', 'text/plain; charset=utf-8'); res.end(raw); return; - } catch { /* try next extension */ } + } catch { /* fall through to the next middleware */ } } next(); }); @@ -548,7 +564,7 @@ export const selectedPackage = ${JSON.stringify(selectedPackage)}; // Include a UTF-8 signature because static preview servers may omit charset. await fsp.writeFile(path.join(outDir, 'llms.txt'), withUtf8Bom(llmsContent), 'utf-8'); - if (docsDir) { + if (docsDirs.length) { const slugs = pages .map(p => p.pathname.replace(/\/$/, '')) .filter(s => s && s !== '404' && s !== 'index'); @@ -556,7 +572,7 @@ export const selectedPackage = ${JSON.stringify(selectedPackage)}; await generateLlmsMdFiles({ outDir, slugs, - docsDir, + docsDirs, siteUrl: configuredSite, llmsSets, }); @@ -639,8 +655,22 @@ function createBasePrependIntegration(base: string): AstroIntegration { export interface DocsSiteSource { /** Absolute path to the TOC file. */ tocPath: string; - /** Absolute path to the Markdown docs directory. */ + /** + * Absolute path to the site's own Markdown docs directory. This stays the + * site's "home" root: sibling files such as `environment.json` are looked + * up next to it, and it is the lowest-precedence content root. + */ docsDir: string; + /** + * Extra content roots overlaid on `docsDir`, ordered highest precedence + * first. All roots share one slug namespace, so a page present in an + * overlay replaces the `docsDir` page with the same slug — nothing is + * copied between the trees. + * + * Roots that do not exist on disk are ignored, so a language an upstream + * generator does not emit simply has no overlay. + */ + overlayDirs?: DocsContentRoot[]; } export interface CreateDocsSiteOptions { @@ -727,16 +757,26 @@ export function createDocsSite(options: CreateDocsSiteOptions = {} as CreateDocs ...astroExtra } = options; + // Ordered content roots, highest precedence first: any overlays, then the + // site's own docs directory. Overlays that are absent on disk are dropped. + const docRoots = resolveDocRoots(source.docsDir, source.overlayDirs); + const sidebar = buildSidebarFromToc({ tocPath: source.tocPath!, - docsDir: source.docsDir!, + docsDir: docRoots, exclude: sidebarOptions.exclude ?? [], }); // Expose env vars so consuming content.config.ts and components can read them. + // DOCS_SOURCE_PATH stays the site's own root — `environment.json` and other + // siblings are resolved against it — while DOCS_SOURCE_PATHS carries the + // full precedence-ordered list for the content loader and remark plugins. if (source.docsDir) { process.env.DOCS_SOURCE_PATH = source.docsDir; } + if (docRoots.length) { + process.env[DOC_ROOTS_ENV] = serializeDocRoots(docRoots); + } process.env.DOCS_BUILD_MODE = mode; process.env.DOCS_BASE = base ? base.replace(/\/$/, '') : ''; process.env.DOCS_TRAILING_SLASH = (astroExtra.trailingSlash as string) ?? 'ignore'; @@ -872,7 +912,7 @@ export function createDocsSite(options: CreateDocsSiteOptions = {} as CreateDocs title, description, localizedDescription, - docsDir: source.docsDir, + docsDir: docRoots, sidebar, platform, navLang, diff --git a/src/lib/api-platform-config.test.ts b/src/lib/api-platform-config.test.ts new file mode 100644 index 0000000000..b19a52f17a --- /dev/null +++ b/src/lib/api-platform-config.test.ts @@ -0,0 +1,120 @@ +import { describe, expect, it } from 'vitest'; +import { + API_PLATFORM_CONFIGS, + apiDocRoot, + apiDocsPlatformPath, + createApiPackages, + getPackageClassSuffixes, + getPackageIds, + PLATFORM_MAP, + type PlatformName, +} from './api-platform-config.ts'; + +const PLATFORMS = Object.keys(API_PLATFORM_CONFIGS) as PlatformName[]; +const BASE = 'https://staging.example.test/api'; + +describe('apiDocsPlatformPath', () => { + it.each([ + ['Angular', 'angular'], + ['React', 'react'], + ['WebComponents', 'webcomponents'], + ['Blazor', 'blazor'], + ] as Array<[PlatformName, string]>)('maps %s to the %s folder', (platform, folder) => { + expect(apiDocsPlatformPath(platform)).toBe(folder); + }); +}); + +describe('apiDocRoot', () => { + it('joins the base URL, the platform folder, the package and the version', () => { + expect(apiDocRoot(BASE, 'Angular', 'igniteui-angular-charts')) + .toBe('https://staging.example.test/api/angular/igniteui-angular-charts/latest'); + }); + + it.each(PLATFORMS)('uses the folder of %s', platform => { + expect(apiDocRoot(BASE, platform, 'pkg')) + .toBe(`${BASE}/${apiDocsPlatformPath(platform)}/pkg/latest`); + }); +}); + +describe('createApiPackages', () => { + it.each(PLATFORMS)('returns one entry per package for %s', platform => { + const packages = createApiPackages(BASE, platform); + const definitions = API_PLATFORM_CONFIGS[platform].apiPackages; + + expect(Object.keys(packages)).toEqual(Object.keys(definitions)); + }); + + it('builds each docRoot from the given base URL', () => { + const packages = createApiPackages(BASE, 'React'); + + expect(packages['charts'].docRoot).toBe(`${BASE}/react/igniteui-react-charts/latest`); + expect(packages['core'].docRoot).toBe(`${BASE}/react/igniteui-react/latest`); + }); + + it('keeps the definition fields and adds the runtime flags', () => { + expect(createApiPackages(BASE, 'Angular')['core']).toEqual({ + packageId: 'igniteui-angular', + classSuffix: 'Component', + docRoot: `${BASE}/angular/igniteui-angular/latest`, + noPackagePrefix: true, + preserveCase: true, + }); + }); + + it('carries the pascalCaseMembers flag through for Blazor', () => { + expect(createApiPackages(BASE, 'Blazor')['core'].pascalCaseMembers).toBe(true); + }); +}); + +describe('getPackageIds', () => { + it.each(PLATFORMS)('returns a package id for every key of %s', platform => { + const ids = getPackageIds(platform); + const definitions = API_PLATFORM_CONFIGS[platform].apiPackages; + + expect(Object.keys(ids)).toEqual(Object.keys(definitions)); + for (const [key, id] of Object.entries(ids)) { + expect(id).toBe(definitions[key].packageId); + } + }); + + it('maps every Blazor key onto an IgniteUI.Blazor package', () => { + for (const id of Object.values(getPackageIds('Blazor'))) { + expect(id.startsWith('IgniteUI.Blazor')).toBe(true); + } + }); +}); + +describe('getPackageClassSuffixes', () => { + it('returns Component for the Angular packages that declare it', () => { + const suffixes = getPackageClassSuffixes('Angular'); + + expect(suffixes['core']).toBe('Component'); + expect(suffixes['excel']).toBeUndefined(); + }); + + it('leaves every React suffix undefined', () => { + const suffixes = getPackageClassSuffixes('React'); + + expect(Object.values(suffixes).every(value => value === undefined)).toBe(true); + }); + + it.each(PLATFORMS)('returns an entry for every key of %s', platform => { + expect(Object.keys(getPackageClassSuffixes(platform))) + .toEqual(Object.keys(API_PLATFORM_CONFIGS[platform].apiPackages)); + }); +}); + +describe('PLATFORM_MAP', () => { + it('maps each short name to a configured platform', () => { + expect(PLATFORM_MAP).toEqual({ + angular: 'Angular', + react: 'React', + wc: 'WebComponents', + blazor: 'Blazor', + }); + }); + + it('covers every platform in the config registry', () => { + expect(new Set(Object.values(PLATFORM_MAP))).toEqual(new Set(PLATFORMS)); + }); +}); diff --git a/src/lib/doc-roots.test.ts b/src/lib/doc-roots.test.ts new file mode 100644 index 0000000000..abc535d511 --- /dev/null +++ b/src/lib/doc-roots.test.ts @@ -0,0 +1,365 @@ +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { + DOC_ROOTS_ENV, + docRootsFromEnv, + findFirstInRoots, + findInRoots, + isExcludedFromRoot, + normalizeRoot, + resolveDocRoots, + rootDirs, + rootForFile, + serializeDocRoots, + toRootList, + type ResolvedDocRoot, +} from './doc-roots.ts'; + +let tmp: string; + +/** A root object for the exclude tests; the directory never has to exist. */ +const rootWith = (...exclude: string[]): ResolvedDocRoot => ({ dir: path.resolve('/docs'), exclude }); + +/** Creates `/` and returns its absolute path. */ +function makeDir(name: string): string { + const dir = path.join(tmp, name); + fs.mkdirSync(dir, { recursive: true }); + return dir; +} + +/** Writes an empty file under `dir`, creating parent directories. */ +function makeFile(dir: string, relPath: string): string { + const file = path.join(dir, relPath); + fs.mkdirSync(path.dirname(file), { recursive: true }); + fs.writeFileSync(file, ''); + return file; +} + +beforeEach(() => { + tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'doc-roots-')); +}); + +afterEach(() => { + vi.unstubAllEnvs(); + fs.rmSync(tmp, { recursive: true, force: true }); +}); + +describe('isExcludedFromRoot', () => { + it('returns false when the root excludes nothing', () => { + expect(isExcludedFromRoot(rootWith(), 'changelog/a.mdx')).toBe(false); + }); + + it('matches a whole subtree with a trailing double star', () => { + const root = rootWith('changelog/**'); + + expect(isExcludedFromRoot(root, 'changelog/a.mdx')).toBe(true); + expect(isExcludedFromRoot(root, 'changelog/x/y.mdx')).toBe(true); + }); + + it('does not let a subtree pattern match a longer directory name', () => { + expect(isExcludedFromRoot(rootWith('changelog/**'), 'changelogs/a.mdx')).toBe(false); + }); + + it('matches only one level with a single star', () => { + const root = rootWith('internal/*.mdx'); + + expect(isExcludedFromRoot(root, 'internal/notes.mdx')).toBe(true); + expect(isExcludedFromRoot(root, 'internal/deep/notes.mdx')).toBe(false); + }); + + it('matches at any depth with a leading double star', () => { + const root = rootWith('**/_*.mdx'); + + expect(isExcludedFromRoot(root, '_draft.mdx')).toBe(true); + expect(isExcludedFromRoot(root, 'grids/_draft.mdx')).toBe(true); + expect(isExcludedFromRoot(root, 'grids/data-grid/_draft.mdx')).toBe(true); + expect(isExcludedFromRoot(root, 'grids/draft.mdx')).toBe(false); + }); + + it('matches exactly one non-slash character with a question mark', () => { + const root = rootWith('a?.mdx'); + + expect(isExcludedFromRoot(root, 'ab.mdx')).toBe(true); + expect(isExcludedFromRoot(root, 'abc.mdx')).toBe(false); + expect(isExcludedFromRoot(root, 'a.mdx')).toBe(false); + expect(isExcludedFromRoot(root, 'a/.mdx')).toBe(false); + }); + + it('treats regex metacharacters as literals', () => { + const root = rootWith('a.b'); + + expect(isExcludedFromRoot(root, 'a.b')).toBe(true); + expect(isExcludedFromRoot(root, 'axb')).toBe(false); + }); + + it('ignores a leading negation marker', () => { + expect(isExcludedFromRoot(rootWith('!changelog/**'), 'changelog/a.mdx')).toBe(true); + }); + + it('normalises Windows separators in the path being tested', () => { + expect(isExcludedFromRoot(rootWith('changelog/**'), 'changelog\\x\\y.mdx')).toBe(true); + }); + + it('is true when any of several patterns matches', () => { + const root = rootWith('changelog/**', 'grids/**'); + + expect(isExcludedFromRoot(root, 'grids/data-grid.mdx')).toBe(true); + expect(isExcludedFromRoot(root, 'charts/pie.mdx')).toBe(false); + }); +}); + +describe('normalizeRoot', () => { + it('absolutises a string root and gives it an empty exclude list', () => { + expect(normalizeRoot('docs/content')).toEqual({ + dir: path.resolve('docs/content'), + exclude: [], + }); + }); + + it('absolutises an object root and keeps its excludes', () => { + expect(normalizeRoot({ dir: 'docs/content', exclude: ['changelog/**'] })).toEqual({ + dir: path.resolve('docs/content'), + exclude: ['changelog/**'], + }); + }); + + it('fills in a missing exclude list on an object root', () => { + expect(normalizeRoot({ dir: tmp }).exclude).toEqual([]); + }); + + it('copies the exclude list so the result cannot mutate the input', () => { + const input = { dir: tmp, exclude: ['changelog/**'] }; + const result = normalizeRoot(input); + result.exclude.push('grids/**'); + + expect(input.exclude).toEqual(['changelog/**']); + }); + + it('leaves an already absolute directory alone', () => { + expect(normalizeRoot(tmp).dir).toBe(path.resolve(tmp)); + }); +}); + +describe('resolveDocRoots', () => { + it('lists the overlays before the base directory', () => { + const base = makeDir('base'); + const overlay = makeDir('overlay'); + + expect(resolveDocRoots(base, [overlay]).map(r => r.dir)).toEqual([overlay, base]); + }); + + it('de-duplicates repeated directories, keeping the first entry', () => { + const base = makeDir('base'); + + const roots = resolveDocRoots(base, [{ dir: base, exclude: ['changelog/**'] }]); + + expect(roots).toHaveLength(1); + expect(roots[0].exclude).toEqual(['changelog/**']); + }); + + it('drops roots that do not exist on disk', () => { + const base = makeDir('base'); + + expect(resolveDocRoots(base, [path.join(tmp, 'no-such-overlay')]).map(r => r.dir)).toEqual([base]); + }); + + it('returns an empty list when there is no base and no overlay', () => { + expect(resolveDocRoots(undefined)).toEqual([]); + }); + + it('returns only the overlays when the base is undefined', () => { + const overlay = makeDir('overlay'); + + expect(resolveDocRoots(undefined, [overlay]).map(r => r.dir)).toEqual([overlay]); + }); + + it('keeps the excludes of each root', () => { + const base = makeDir('base'); + const overlay = makeDir('overlay'); + + const roots = resolveDocRoots(base, [{ dir: overlay, exclude: ['changelog/**'] }]); + + expect(roots.map(r => r.exclude)).toEqual([['changelog/**'], []]); + }); +}); + +describe('toRootList', () => { + it('returns an empty list for undefined', () => { + expect(toRootList(undefined)).toEqual([]); + }); + + it('wraps a single root into a one-entry list', () => { + expect(toRootList(tmp)).toEqual([{ dir: path.resolve(tmp), exclude: [] }]); + }); + + it('normalises every entry of an array', () => { + expect(toRootList([tmp, { dir: tmp, exclude: ['a/**'] }])).toEqual([ + { dir: path.resolve(tmp), exclude: [] }, + { dir: path.resolve(tmp), exclude: ['a/**'] }, + ]); + }); + + it('drops falsy entries of an array', () => { + expect(toRootList([tmp, '', undefined as never])).toHaveLength(1); + }); + + it('returns an empty list for an empty array', () => { + expect(toRootList([])).toEqual([]); + }); +}); + +describe('rootDirs', () => { + it('returns the bare directories in order', () => { + expect(rootDirs([tmp, { dir: path.join(tmp, 'overlay') }])) + .toEqual([path.resolve(tmp), path.resolve(path.join(tmp, 'overlay'))]); + }); + + it('returns an empty list for an empty root list', () => { + expect(rootDirs([])).toEqual([]); + }); +}); + +describe('findInRoots', () => { + it('returns the file from the first root that has it', () => { + const overlay = makeDir('overlay'); + const base = makeDir('base'); + const wanted = makeFile(overlay, 'a.mdx'); + makeFile(base, 'a.mdx'); + + expect(findInRoots([overlay, base], 'a.mdx')).toBe(wanted); + }); + + it('falls through to the next root when the first excludes the path', () => { + const overlay = makeDir('overlay'); + const base = makeDir('base'); + makeFile(overlay, 'changelog/a.mdx'); + const wanted = makeFile(base, 'changelog/a.mdx'); + + expect(findInRoots([{ dir: overlay, exclude: ['changelog/**'] }, base], 'changelog/a.mdx')).toBe(wanted); + }); + + it('returns undefined when no root has the file', () => { + expect(findInRoots([makeDir('base')], 'missing.mdx')).toBeUndefined(); + }); + + it('returns undefined for an empty root list', () => { + expect(findInRoots([], 'a.mdx')).toBeUndefined(); + }); +}); + +describe('findFirstInRoots', () => { + it('checks a root against every candidate before moving to the next root', () => { + const overlay = makeDir('overlay'); + const base = makeDir('base'); + const wanted = makeFile(overlay, 'a.md'); + makeFile(base, 'a.mdx'); + + // The overlay's `.md` wins over the base's `.mdx` even though `.mdx` + // comes first in the candidate list. + expect(findFirstInRoots([overlay, base], ['a.mdx', 'a.md'])).toBe(wanted); + }); + + it('prefers the earlier candidate within one root', () => { + const base = makeDir('base'); + const wanted = makeFile(base, 'a.mdx'); + makeFile(base, 'a.md'); + + expect(findFirstInRoots([base], ['a.mdx', 'a.md'])).toBe(wanted); + }); + + it('skips candidates the root excludes', () => { + const overlay = makeDir('overlay'); + const base = makeDir('base'); + makeFile(overlay, 'changelog/a.mdx'); + const wanted = makeFile(base, 'changelog/a.mdx'); + + expect(findFirstInRoots( + [{ dir: overlay, exclude: ['changelog/**'] }, base], + ['changelog/a.mdx', 'changelog/a.md'], + )).toBe(wanted); + }); + + it('returns undefined when no candidate exists anywhere', () => { + expect(findFirstInRoots([makeDir('base')], ['a.mdx', 'a.md'])).toBeUndefined(); + }); +}); + +describe('rootForFile', () => { + it('returns the root a file lives under', () => { + const base = makeDir('base'); + + expect(rootForFile([base], path.join(base, 'grids', 'a.mdx'))).toBe(path.resolve(base)); + }); + + it('picks the longest matching root when roots are nested', () => { + const outer = makeDir('outer'); + const inner = makeDir(path.join('outer', 'inner')); + + expect(rootForFile([outer, inner], path.join(inner, 'a.mdx'))).toBe(path.resolve(inner)); + }); + + it('does not match a directory that only shares a name prefix', () => { + const base = makeDir('base'); + const sibling = makeDir('base-other'); + + expect(rootForFile([base], path.join(sibling, 'a.mdx'))).toBeUndefined(); + }); + + it('returns undefined for a file outside every root', () => { + expect(rootForFile([makeDir('base')], path.join(tmp, 'elsewhere', 'a.mdx'))).toBeUndefined(); + }); + + it('returns undefined for an empty root list', () => { + expect(rootForFile([], path.join(tmp, 'a.mdx'))).toBeUndefined(); + }); +}); + +describe('serializeDocRoots and docRootsFromEnv', () => { + it('serialises a root without excludes as a bare string', () => { + expect(serializeDocRoots([{ dir: '/docs', exclude: [] }])).toBe('["/docs"]'); + }); + + it('serialises a root with excludes as an object', () => { + expect(serializeDocRoots([{ dir: '/docs', exclude: ['changelog/**'] }])) + .toBe('[{"dir":"/docs","exclude":["changelog/**"]}]'); + }); + + it('round-trips a mixed root list through the environment', () => { + const roots: ResolvedDocRoot[] = [ + { dir: path.resolve(tmp, 'overlay'), exclude: ['changelog/**'] }, + { dir: path.resolve(tmp, 'base'), exclude: [] }, + ]; + vi.stubEnv(DOC_ROOTS_ENV, serializeDocRoots(roots)); + + expect(docRootsFromEnv()).toEqual(roots); + }); + + it('falls back to DOCS_SOURCE_PATH when the root list is malformed JSON', () => { + vi.stubEnv(DOC_ROOTS_ENV, '{not json'); + vi.stubEnv('DOCS_SOURCE_PATH', tmp); + + expect(docRootsFromEnv()).toEqual([{ dir: path.resolve(tmp), exclude: [] }]); + }); + + it('falls back to DOCS_SOURCE_PATH when the root list is not an array', () => { + vi.stubEnv(DOC_ROOTS_ENV, '{"dir":"/docs"}'); + vi.stubEnv('DOCS_SOURCE_PATH', tmp); + + expect(docRootsFromEnv()).toEqual([{ dir: path.resolve(tmp), exclude: [] }]); + }); + + it('drops entries of the wrong shape', () => { + vi.stubEnv(DOC_ROOTS_ENV, JSON.stringify(['/docs', 42, null, { exclude: [] }])); + + expect(docRootsFromEnv()).toEqual([{ dir: path.resolve('/docs'), exclude: [] }]); + }); + + it('returns an empty list when neither variable is set', () => { + vi.stubEnv(DOC_ROOTS_ENV, undefined); + vi.stubEnv('DOCS_SOURCE_PATH', undefined); + + expect(docRootsFromEnv()).toEqual([]); + }); +}); diff --git a/src/lib/doc-roots.ts b/src/lib/doc-roots.ts new file mode 100644 index 0000000000..26806cbcb8 --- /dev/null +++ b/src/lib/doc-roots.ts @@ -0,0 +1,267 @@ +/** + * doc-roots.ts + * + * Helpers for docs sites whose content is assembled from more than one + * directory on disk. + * + * A docs site has one *base* content root (`source.docsDir`) and zero or more + * *overlay* roots (`source.overlayDirs`). All roots share a single slug + * namespace: a file at `/charts/types/area-chart.mdx` is always the page + * `/charts/types/area-chart`, whichever root it came from. + * + * When the same slug exists in several roots, the overlay wins. This is how the + * Angular docs consume the cross-platform (xplat) generator: the generated + * topics under `docs/xplat/generated/Angular/{lang}/components` override the + * hand-authored ones under `docs/angular/src/content/{lang}/components`, without + * anything ever being copied into the tracked tree. + * + * ── Ordering convention ────────────────────────────────────────────────────── + * Every function here takes and returns roots **highest precedence first**, so + * a plain `for` loop over the list resolves a slug the same way the site does. + * The content loader follows the same convention: it loads the roots in list + * order and refuses writes from a lower-precedence root for any id a higher one + * has already claimed, so the *first* root to provide a slug is the one that + * wins. Never reverse the list before handing it to a consumer. + * + * ── Excludes ──────────────────────────────────────────────────────────────── + * A root may carry its own `exclude` globs — subtrees it contributes on disk but + * that the site does not serve (the Angular site keeps `changelog/` and `grids/` + * for itself, for example). The excludes travel with the root through + * `DOCS_SOURCE_PATHS`, so the content loader, the sidebar, the llms.txt metadata + * and the dev-mode raw-Markdown middleware all resolve a slug to the same file. + */ + +import fs from 'node:fs'; +import path from 'node:path'; + +/** Env var carrying the full ordered root list as a JSON array. */ +export const DOC_ROOTS_ENV = 'DOCS_SOURCE_PATHS'; + +/** + * A content root. Use the object form to give one root its own exclusions — + * for example, keeping a generated tree's `changelog/` out of a site that + * maintains its own. + */ +export type DocsContentRoot = string | { dir: string; exclude?: string[] }; + +/** A content root with its directory absolutized and its excludes normalized. */ +export interface ResolvedDocRoot { + /** Absolute path of the root directory. */ + dir: string; + /** Glob patterns, relative to `dir`, that this root does not contribute. */ + exclude: string[]; +} + +/** Absolutizes a root and fills in a missing `exclude` list. */ +export function normalizeRoot(root: DocsContentRoot): ResolvedDocRoot { + return typeof root === 'string' + ? { dir: path.resolve(root), exclude: [] } + : { dir: path.resolve(root.dir), exclude: [...(root.exclude ?? [])] }; +} + +// --------------------------------------------------------------------------- +// Exclude matching +// --------------------------------------------------------------------------- + +/** + * Compiles one of the simple globs used by root excludes (`changelog/**`, + * `grids/**`, `internal/*.mdx`) into a regular expression. + * + * Supported: `**` (any number of path segments), `*` (anything but `/`) and + * `?` (a single character but `/`). That is the whole vocabulary the excludes + * use, which keeps this dependency-free — the content loader hands the same + * patterns to Astro's glob loader, which understands a much larger grammar, + * so anything fancier belongs there rather than here. + */ +function globToRegExp(pattern: string): RegExp { + const src = pattern.replace(/^!/, ''); + let body = ''; + + for (let i = 0; i < src.length; i++) { + const char = src[i]; + if (char === '*') { + if (src[i + 1] === '*') { + if (src[i + 2] === '/') { + // `**/` spans zero or more whole path segments. + body += '(?:[^/]*/)*'; + i += 2; + } else { + // A trailing `**` matches everything below this point. + body += '.*'; + i += 1; + } + } else { + body += '[^/]*'; + } + } else if (char === '?') { + body += '[^/]'; + } else if (char && '.+^${}()|[]'.includes(char)) { + body += '\\' + char; + } else if (char === '\\') { + body += '\\\\'; + } else { + body += char; + } + } + + return new RegExp(`^${body}$`); +} + +const globCache = new Map(); + +function matchesGlob(pattern: string, relPath: string): boolean { + let re = globCache.get(pattern); + if (!re) { + re = globToRegExp(pattern); + globCache.set(pattern, re); + } + return re.test(relPath); +} + +/** + * True when `relPath` (root-relative, POSIX separators) is excluded from `root`. + * An excluded path is treated as absent: the next root gets a chance to supply + * the slug, exactly as the content loader resolves it. + */ +export function isExcludedFromRoot(root: ResolvedDocRoot, relPath: string): boolean { + if (!root.exclude.length) return false; + const normalized = relPath.replace(/\\/g, '/'); + return root.exclude.some(pattern => matchesGlob(pattern, normalized)); +} + +// --------------------------------------------------------------------------- +// Root lists +// --------------------------------------------------------------------------- + +/** + * Normalizes a base dir plus optional overlays into an ordered, de-duplicated + * list of roots, highest precedence first. + * + * Roots that do not exist on disk are dropped — a language the xplat generator + * does not emit (`kr`, today) simply has no overlay rather than a broken one. + */ +export function resolveDocRoots( + docsDir: DocsContentRoot | undefined, + overlayDirs: readonly DocsContentRoot[] = [], +): ResolvedDocRoot[] { + const ordered = [...overlayDirs, docsDir].filter((d): d is DocsContentRoot => Boolean(d)); + const seen = new Set(); + const roots: ResolvedDocRoot[] = []; + + for (const entry of ordered) { + const root = normalizeRoot(entry); + if (!root.dir || seen.has(root.dir)) continue; + seen.add(root.dir); + if (fs.existsSync(root.dir)) roots.push(root); + } + + return roots; +} + +/** Coerces the shapes accepted by the public options into a resolved root list. */ +export function toRootList( + docsDir: DocsContentRoot | readonly DocsContentRoot[] | undefined, +): ResolvedDocRoot[] { + if (!docsDir) return []; + const list = Array.isArray(docsDir) + ? (docsDir as readonly DocsContentRoot[]) + : [docsDir as DocsContentRoot]; + return list.filter(Boolean).map(normalizeRoot); +} + +/** The bare directory paths of a root list, for consumers that only need those. */ +export function rootDirs(roots: readonly DocsContentRoot[]): string[] { + return toRootList(roots).map(r => r.dir); +} + +/** + * Returns the absolute path of the first root that contains `relPath`, + * or `undefined` when no root does. Paths a root excludes are skipped, so a + * root never answers for a page the site does not serve from it. + */ +export function findInRoots( + roots: readonly DocsContentRoot[], + relPath: string, +): string | undefined { + for (const root of toRootList(roots)) { + if (isExcludedFromRoot(root, relPath)) continue; + const candidate = path.join(root.dir, relPath); + if (fs.existsSync(candidate)) return candidate; + } + return undefined; +} + +/** + * Returns the first existing file among `relPaths`, searched root-by-root in + * precedence order. Each root is fully checked before moving to the next, so an + * overlay's `.md` beats the base's `.mdx` — matching how the loader resolves a + * slug that exists in both roots. Excluded paths are skipped, for the same + * reason as in `findInRoots`. + */ +export function findFirstInRoots( + roots: readonly DocsContentRoot[], + relPaths: readonly string[], +): string | undefined { + for (const root of toRootList(roots)) { + for (const relPath of relPaths) { + if (isExcludedFromRoot(root, relPath)) continue; + const candidate = path.join(root.dir, relPath); + if (fs.existsSync(candidate)) return candidate; + } + } + return undefined; +} + +/** + * Returns the root directory that `filePath` lives under, or `undefined` when it + * lives outside every root. Used to turn an absolute source path back into a + * slug — the relative path must be computed against the file's *own* root, not + * the highest-precedence one, or cross-root links resolve to the wrong slug. + * + * The longest matching root wins, so nested roots behave sensibly. + */ +export function rootForFile( + roots: readonly DocsContentRoot[], + filePath: string, +): string | undefined { + const abs = path.resolve(filePath); + let best: string | undefined; + + for (const { dir } of toRootList(roots)) { + const withSep = dir.endsWith(path.sep) ? dir : dir + path.sep; + if (!abs.startsWith(withSep)) continue; + if (!best || dir.length > best.length) best = dir; + } + + return best; +} + +/** Serializes a root list for `DOCS_SOURCE_PATHS`. */ +export function serializeDocRoots(roots: readonly ResolvedDocRoot[]): string { + return JSON.stringify( + roots.map(r => (r.exclude.length ? { dir: r.dir, exclude: r.exclude } : r.dir)), + ); +} + +/** + * Reads the ordered root list published by `createDocsSite`, excludes included. + * Falls back to the single `DOCS_SOURCE_PATH` for sites that never set overlays. + */ +export function docRootsFromEnv(): ResolvedDocRoot[] { + const raw = process.env[DOC_ROOTS_ENV]; + if (raw) { + try { + const parsed: unknown = JSON.parse(raw); + if (Array.isArray(parsed)) { + return parsed + .filter((entry): entry is DocsContentRoot => + typeof entry === 'string' || + (typeof entry === 'object' && entry !== null && 'dir' in entry)) + .map(normalizeRoot); + } + } catch { /* fall through to the single-path form */ } + } + return process.env.DOCS_SOURCE_PATH + ? [normalizeRoot(process.env.DOCS_SOURCE_PATH)] + : []; +} diff --git a/src/lib/platform-context.test.ts b/src/lib/platform-context.test.ts new file mode 100644 index 0000000000..5b9d0acb93 --- /dev/null +++ b/src/lib/platform-context.test.ts @@ -0,0 +1,292 @@ +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import type { PlatformName } from './api-platform-config.ts'; + +const STAGING = 'https://staging.infragistics.com/api'; +const PLATFORMS: PlatformName[] = ['Angular', 'React', 'WebComponents', 'Blazor']; + +let tmp: string; + +/** Loads a fresh copy of the module so its `_ctx` / `_env` caches start empty. */ +async function loadModule() { + vi.resetModules(); + return import('./platform-context.ts'); +} + +/** Points `process.cwd()` at the temp dir the test populated. */ +function useTmpAsCwd(): void { + vi.spyOn(process, 'cwd').mockReturnValue(tmp); +} + +function writeJson(relPath: string, data: unknown): void { + const file = path.join(tmp, relPath); + fs.mkdirSync(path.dirname(file), { recursive: true }); + fs.writeFileSync(file, JSON.stringify(data)); +} + +beforeEach(() => { + tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'platform-ctx-')); + // A clean slate: every env var the module reads is removed by default. + // The module uses `??`, so an empty string would be a *value*, not "unset". + for (const name of ['PLATFORM', 'DOCS_ENV', 'NODE_ENV', 'API_DOCS_BASE_URL', 'LANG_CODE', 'API_LINK_INDEX_VERSION', 'DOCS_SOURCE_PATH', 'DOCS_PROJECT_ROOT', 'GTM_CONTAINER_ID']) { + vi.stubEnv(name, undefined); + } + vi.stubEnv('DOCS_ENV', 'development'); +}); + +afterEach(() => { + vi.unstubAllEnvs(); + vi.restoreAllMocks(); + fs.rmSync(tmp, { recursive: true, force: true }); +}); + +describe('getPlatformContext', () => { + it.each(PLATFORMS)('returns the context of %s when named explicitly', async name => { + useTmpAsCwd(); + const { getPlatformContext } = await loadModule(); + const ctx = getPlatformContext(name); + + expect(ctx.name).toBe(name); + expect(Object.keys(ctx.packages)).toEqual(['common', 'charts', 'grids', 'gauges', 'maps']); + }); + + it.each(PLATFORMS)('roots every %s API package at the staging API docs base', async name => { + useTmpAsCwd(); + const { getPlatformContext } = await loadModule(); + const roots = Object.values(getPlatformContext(name).apiPackages).map(pkg => pkg.docRoot); + + expect(roots.length).toBeGreaterThan(0); + expect(roots.every(root => root.startsWith(`${STAGING}/`))).toBe(true); + }); + + it('uses the production API docs base in production', async () => { + useTmpAsCwd(); + vi.stubEnv('DOCS_ENV', 'production'); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext('Angular').apiPackages['core'].docRoot) + .toBe('https://www.infragistics.com/api/angular/igniteui-angular/latest'); + }); + + it('rewrites the docRoot from API_DOCS_BASE_URL', async () => { + useTmpAsCwd(); + vi.stubEnv('API_DOCS_BASE_URL', 'https://custom.test/api'); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext('React').apiPackages['charts'].docRoot) + .toBe('https://custom.test/api/react/igniteui-react-charts/latest'); + }); + + it('appends the /api segment to an API_DOCS_BASE_URL that lacks it', async () => { + useTmpAsCwd(); + vi.stubEnv('API_DOCS_BASE_URL', 'https://custom.test/'); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext('React').apiPackages['charts'].docRoot) + .toBe('https://custom.test/api/react/igniteui-react-charts/latest'); + }); + + it('resolves the platform from the PLATFORM env var', async () => { + useTmpAsCwd(); + vi.stubEnv('PLATFORM', 'Blazor'); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext().name).toBe('Blazor'); + }); + + it('falls back to .platform.json in the working directory', async () => { + writeJson('.platform.json', { platform: 'WebComponents' }); + useTmpAsCwd(); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext().name).toBe('WebComponents'); + }); + + it('prefers the PLATFORM env var over .platform.json', async () => { + writeJson('.platform.json', { platform: 'WebComponents' }); + useTmpAsCwd(); + vi.stubEnv('PLATFORM', 'Angular'); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext().name).toBe('Angular'); + }); + + it('defaults to React when nothing selects a platform', async () => { + useTmpAsCwd(); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext().name).toBe('React'); + }); + + it('falls back to React for an unknown PLATFORM value', async () => { + useTmpAsCwd(); + vi.stubEnv('PLATFORM', 'Vue'); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext().name).toBe('React'); + }); + + it('falls back to React for an unknown platform in .platform.json', async () => { + writeJson('.platform.json', { platform: 'Vue' }); + useTmpAsCwd(); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext().name).toBe('React'); + }); + + it('caches the no-arg context but not the explicitly named one', async () => { + useTmpAsCwd(); + const { getPlatformContext } = await loadModule(); + + expect(getPlatformContext()).toBe(getPlatformContext()); + expect(getPlatformContext('Angular')).not.toBe(getPlatformContext('Angular')); + }); +}); + +describe('getEnvVars', () => { + it('reads the generated environment.json for the platform, locale and mode', async () => { + writeJson('generated/React/en/environment.json', { + development: { demosBaseUrl: 'https://dev.test' }, + production: { demosBaseUrl: 'https://prod.test' }, + }); + useTmpAsCwd(); + const { getEnvVars } = await loadModule(); + + expect(getEnvVars()).toEqual({ demosBaseUrl: 'https://dev.test' }); + }); + + it('honours LANG_CODE when locating the generated file', async () => { + writeJson('generated/React/jp/environment.json', { development: { demosBaseUrl: 'https://jp.test' } }); + useTmpAsCwd(); + vi.stubEnv('LANG_CODE', 'jp'); + const { getEnvVars } = await loadModule(); + + expect(getEnvVars()).toEqual({ demosBaseUrl: 'https://jp.test' }); + }); + + it('falls back to the development block for an unknown mode', async () => { + writeJson('generated/React/en/environment.json', { development: { demosBaseUrl: 'https://dev.test' } }); + useTmpAsCwd(); + vi.stubEnv('DOCS_ENV', 'staging'); + const { getEnvVars } = await loadModule(); + + expect(getEnvVars()).toEqual({ demosBaseUrl: 'https://dev.test' }); + }); + + it('falls back to an environment.json under DOCS_SOURCE_PATH', async () => { + const source = path.join(tmp, 'source'); + fs.mkdirSync(source, { recursive: true }); + fs.writeFileSync( + path.join(source, 'environment.json'), + JSON.stringify({ development: { demosBaseUrl: 'https://source.test' } }), + ); + useTmpAsCwd(); + vi.stubEnv('DOCS_SOURCE_PATH', source); + const { getEnvVars } = await loadModule(); + + expect(getEnvVars()).toEqual({ demosBaseUrl: 'https://source.test' }); + }); + + it('prefers the en/environment.json under DOCS_SOURCE_PATH', async () => { + const source = path.join(tmp, 'source'); + fs.mkdirSync(path.join(source, 'en'), { recursive: true }); + fs.writeFileSync( + path.join(source, 'environment.json'), + JSON.stringify({ development: { demosBaseUrl: 'https://root.test' } }), + ); + fs.writeFileSync( + path.join(source, 'en', 'environment.json'), + JSON.stringify({ development: { demosBaseUrl: 'https://en.test' } }), + ); + useTmpAsCwd(); + vi.stubEnv('DOCS_SOURCE_PATH', source); + const { getEnvVars } = await loadModule(); + + expect(getEnvVars()).toEqual({ demosBaseUrl: 'https://en.test' }); + }); + + it('falls back to the samplesBrowsers block of docConfig.json', async () => { + writeJson('docConfig.json', { React: { samplesBrowsers: { development: 'https://demos.test' } } }); + useTmpAsCwd(); + const { getEnvVars } = await loadModule(); + + expect(getEnvVars()).toEqual({ + dvDemosBaseUrl: 'https://demos.test', + demosBaseUrl: 'https://demos.test', + infragisticsBaseUrl: 'https://www.infragistics.com', + }); + }); + + it('returns an empty object when no environment source exists', async () => { + useTmpAsCwd(); + const { getEnvVars } = await loadModule(); + + expect(getEnvVars()).toEqual({}); + }); + + it('caches the result for the build lifetime', async () => { + writeJson('generated/React/en/environment.json', { development: { demosBaseUrl: 'https://dev.test' } }); + useTmpAsCwd(); + const { getEnvVars } = await loadModule(); + + expect(getEnvVars()).toBe(getEnvVars()); + }); +}); + +describe('getGtmContainerId', () => { + it('returns the explicit GTM_CONTAINER_ID override', async () => { + useTmpAsCwd(); + vi.stubEnv('GTM_CONTAINER_ID', 'GTM-OVERRIDE'); + const { getGtmContainerId } = await loadModule(); + + expect(getGtmContainerId()).toBe('GTM-OVERRIDE'); + }); + + it('reads GTMContainerId out of the resolved environment.json', async () => { + writeJson('generated/React/en/environment.json', { development: { GTMContainerId: 'GTM-FROMJSON' } }); + useTmpAsCwd(); + const { getGtmContainerId } = await loadModule(); + + expect(getGtmContainerId()).toBe('GTM-FROMJSON'); + }); + + it.each([ + ['development', 'GTM-WLXLBZD'], + ['staging', 'GTM-NCKNPN'], + ['production', 'GTM-T65CF7'], + ])('falls back to the built-in English id for %s', async (mode, expected) => { + useTmpAsCwd(); + vi.stubEnv('DOCS_ENV', mode); + const { getGtmContainerId } = await loadModule(); + + expect(getGtmContainerId()).toBe(expected); + }); + + it('uses the Japanese defaults for LANG_CODE jp', async () => { + useTmpAsCwd(); + vi.stubEnv('LANG_CODE', 'jp'); + vi.stubEnv('DOCS_ENV', 'production'); + const { getGtmContainerId } = await loadModule(); + + expect(getGtmContainerId()).toBe('GTM-KVNSWJ'); + }); + + it('falls back to the English defaults for a locale without its own set', async () => { + useTmpAsCwd(); + vi.stubEnv('LANG_CODE', 'kr'); + vi.stubEnv('DOCS_ENV', 'production'); + const { getGtmContainerId } = await loadModule(); + + expect(getGtmContainerId()).toBe('GTM-T65CF7'); + }); + + it('falls back to the development id for an unknown build mode', async () => { + useTmpAsCwd(); + vi.stubEnv('DOCS_ENV', 'qa'); + const { getGtmContainerId } = await loadModule(); + + expect(getGtmContainerId()).toBe('GTM-WLXLBZD'); + }); +}); diff --git a/src/lib/sidebar/helpers.test.ts b/src/lib/sidebar/helpers.test.ts new file mode 100644 index 0000000000..3cae6496b0 --- /dev/null +++ b/src/lib/sidebar/helpers.test.ts @@ -0,0 +1,219 @@ +import { describe, expect, it } from 'vitest'; +import { + getActiveLabel, + getAncestorTrail, + getBreadcrumb, + hasActive, + isActive, + isGroup, + isInitiallyOpen, + joinPath, + normalizeSlug, +} from './helpers.ts'; +import type { SidebarEntry, SidebarGroup } from './types'; + +/** + * Three-level fixture reused by the tree-walking helpers: + * + * Grids & Lists (root group) + * └ Data Grid (nested group) + * └ Editing (nested group) + * ├ Overview grids/data-grid/editing + * └ Cell Editing grids/data-grid/editing/cell + * └ List grids/list + * General (root group) + * └ Getting Started general/getting-started + */ +const tree = (): SidebarEntry[] => [ + { + label: 'Grids & Lists', + collapsed: false, + items: [ + { + label: 'Data Grid', + collapsed: true, + items: [ + { + label: 'Editing', + collapsed: true, + items: [ + { label: 'Overview', slug: 'grids/data-grid/editing' }, + { label: 'Cell Editing', slug: 'grids/data-grid/editing/cell' }, + ], + }, + ], + }, + { label: 'List', slug: 'grids/list' }, + ], + }, + { + label: 'General', + collapsed: false, + items: [ + { label: 'Getting Started', slug: 'general/getting-started' }, + ], + }, +]; + +describe('isGroup', () => { + it('recognises an entry with items as a group', () => { + expect(isGroup({ label: 'Grids', items: [] })).toBe(true); + }); + + it('recognises an entry with a slug as a link', () => { + expect(isGroup({ label: 'List', slug: 'grids/list' })).toBe(false); + }); +}); + +describe('normalizeSlug', () => { + it('strips a leading slash', () => { + expect(normalizeSlug('/grids/list')).toBe('grids/list'); + }); + + it('strips a trailing slash', () => { + expect(normalizeSlug('grids/list/')).toBe('grids/list'); + }); + + it('strips both a leading and a trailing slash', () => { + expect(normalizeSlug('/grids/list/')).toBe('grids/list'); + }); + + it('leaves inner slashes alone', () => { + expect(normalizeSlug('grids/data-grid/editing')).toBe('grids/data-grid/editing'); + }); + + it('returns an empty string for the root slug', () => { + expect(normalizeSlug('/')).toBe(''); + }); +}); + +describe('isActive', () => { + it('matches two identical slugs', () => { + expect(isActive('grids/list', 'grids/list')).toBe(true); + }); + + it('does not match two different slugs', () => { + expect(isActive('grids/list', 'grids/grid')).toBe(false); + }); + + it('ignores leading and trailing slashes on either side', () => { + expect(isActive('/grids/list/', 'grids/list')).toBe(true); + expect(isActive('grids/list', '/grids/list/')).toBe(true); + }); + + it('does not treat a prefix as a match', () => { + expect(isActive('grids', 'grids/list')).toBe(false); + }); +}); + +describe('hasActive', () => { + it('finds a match among the links at the top level of the list', () => { + const items = (tree()[0] as SidebarGroup).items; + expect(hasActive(items, 'grids/list')).toBe(true); + }); + + it('finds a match nested several levels deep', () => { + expect(hasActive(tree(), 'grids/data-grid/editing/cell')).toBe(true); + }); + + it('returns false when no descendant matches', () => { + expect(hasActive(tree(), 'charts/pie')).toBe(false); + }); +}); + +describe('joinPath', () => { + it('joins ancestors and the label with a greater-than sign', () => { + expect(joinPath(['Grids & Lists', 'Data Grid'], 'Editing')).toBe('Grids & Lists>Data Grid>Editing'); + }); + + it('returns just the label when there are no ancestors', () => { + expect(joinPath([], 'General')).toBe('General'); + }); + + it('keeps empty ancestor labels as empty segments', () => { + expect(joinPath([''], 'General')).toBe('>General'); + }); +}); + +describe('isInitiallyOpen', () => { + it('opens a collapsed group that contains the active page', () => { + const group: SidebarGroup = { + label: 'Editing', + collapsed: true, + items: [{ label: 'Overview', slug: 'grids/data-grid/editing' }], + }; + expect(isInitiallyOpen(group, 'grids/data-grid/editing')).toBe(true); + }); + + it('keeps a collapsed group closed when it does not contain the active page', () => { + const group: SidebarGroup = { + label: 'Editing', + collapsed: true, + items: [{ label: 'Overview', slug: 'grids/data-grid/editing' }], + }; + expect(isInitiallyOpen(group, 'charts/pie')).toBe(false); + }); + + it('opens a group explicitly marked as not collapsed', () => { + const group: SidebarGroup = { + label: 'General', + collapsed: false, + items: [{ label: 'Getting Started', slug: 'general/getting-started' }], + }; + expect(isInitiallyOpen(group, 'charts/pie')).toBe(true); + }); + + it('keeps a group without a collapsed flag closed', () => { + const group: SidebarGroup = { + label: 'General', + items: [{ label: 'Getting Started', slug: 'general/getting-started' }], + }; + expect(isInitiallyOpen(group, 'charts/pie')).toBe(false); + }); +}); + +describe('getAncestorTrail', () => { + it('returns every ancestor label root-first for a deeply nested page', () => { + expect(getAncestorTrail(tree(), 'grids/data-grid/editing/cell')).toEqual([ + 'Grids & Lists', + 'Data Grid', + 'Editing', + ]); + }); + + it('returns the single ancestor of a page one level down', () => { + expect(getAncestorTrail(tree(), 'general/getting-started')).toEqual(['General']); + }); + + it('returns an empty array when the slug is not in the tree', () => { + expect(getAncestorTrail(tree(), 'charts/pie')).toEqual([]); + }); +}); + +describe('getActiveLabel', () => { + it('returns the label of the matching nested link', () => { + expect(getActiveLabel(tree(), 'grids/data-grid/editing/cell')).toBe('Cell Editing'); + }); + + it('returns an empty string when the slug is not in the tree', () => { + expect(getActiveLabel(tree(), 'charts/pie')).toBe(''); + }); +}); + +describe('getBreadcrumb', () => { + it('drops the root group and ends with the active label', () => { + expect(getBreadcrumb(tree(), 'grids/data-grid/editing/cell')).toEqual([ + 'Data Grid', + 'Editing', + 'Cell Editing', + ]); + }); + + it('returns just the leaf label for a page directly under a root group', () => { + expect(getBreadcrumb(tree(), 'general/getting-started')).toEqual(['Getting Started']); + }); + + it('returns an empty array when the slug is not in the tree', () => { + expect(getBreadcrumb(tree(), 'charts/pie')).toEqual([]); + }); +}); diff --git a/src/llms.test.ts b/src/llms.test.ts new file mode 100644 index 0000000000..ff15f56b0d --- /dev/null +++ b/src/llms.test.ts @@ -0,0 +1,300 @@ +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { + buildLlmsMetaMap, + buildLlmsTxt, + collectSlugs, + extractLlmsMeta, + getBroadSectionsForPlatform, + IGDOCS_BROAD_SECTIONS, + toUrlSlug, + type LlmsMeta, +} from './llms.ts'; +import type { SidebarEntry } from './lib/sidebar/types'; + +let tmp: string; + +beforeEach(() => { + tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'llms-')); +}); + +afterEach(() => { + fs.rmSync(tmp, { recursive: true, force: true }); +}); + +function writeDoc(relPath: string, contents: string): void { + const file = path.join(tmp, relPath); + fs.mkdirSync(path.dirname(file), { recursive: true }); + fs.writeFileSync(file, contents); +} + +/** A three-level sidebar reused by the walk-based helpers. */ +const sidebar = (): SidebarEntry[] => [ + { + label: 'Grids & Lists', + collapsed: false, + items: [ + { label: 'Overview', slug: 'grids' }, + { + label: 'Data Grid', + collapsed: true, + items: [ + { label: 'Overview', slug: 'grids/data-grid' }, + { label: 'Cell Editing', slug: 'grids/data-grid/editing' }, + ], + }, + ], + }, + { + label: 'General', + collapsed: false, + items: [{ label: 'Getting Started', slug: 'general/getting-started' }], + }, +]; + +describe('extractLlmsMeta', () => { + it('reads the description and keywords from the llms block', () => { + const meta = extractLlmsMeta([ + '---', + 'title: Grid', + 'llms:', + ' description: The data grid.', + ' keywords:', + ' - grid', + ' - table', + '---', + 'body', + ].join('\n')); + + expect(meta).toEqual({ description: 'The data grid.', keywords: ['grid', 'table'] }); + }); + + it('falls back to the flat llmsdescription field', () => { + const meta = extractLlmsMeta('---\ntitle: Grid\nllmsdescription: Flat form.\n---\n'); + expect(meta).toEqual({ description: 'Flat form.' }); + }); + + it('falls back to the plain description when no llms block is present', () => { + const meta = extractLlmsMeta('---\ntitle: Grid\ndescription: Plain description.\n---\n'); + expect(meta).toEqual({ description: 'Plain description.' }); + }); + + it('prefers the llms description over the plain one', () => { + const meta = extractLlmsMeta([ + '---', + 'description: Plain.', + 'llmsdescription: Flat.', + 'llms:', + ' description: Nested.', + '---', + ].join('\n')); + + expect(meta.description).toBe('Nested.'); + }); + + it('ignores a null description', () => { + expect(extractLlmsMeta('---\ntitle: Grid\ndescription: null\n---\n')).toEqual({}); + }); + + it('wraps a single string keyword into an array', () => { + expect(extractLlmsMeta('---\nllmskeywords: grid\n---\n')).toEqual({ keywords: ['grid'] }); + }); + + it('ignores keywords that are neither a string nor an array', () => { + expect(extractLlmsMeta('---\nllmskeywords: 42\n---\n')).toEqual({}); + }); + + it('returns an empty object for a document without frontmatter', () => { + expect(extractLlmsMeta('# Just a heading\n')).toEqual({}); + }); + + it('drops an empty keyword list', () => { + expect(extractLlmsMeta('---\ndescription: Grid.\nllmskeywords: []\n---\n')).toEqual({ + description: 'Grid.', + }); + }); +}); + +describe('collectSlugs', () => { + it('returns every link slug in tree order', () => { + expect(collectSlugs(sidebar())).toEqual([ + 'grids', + 'grids/data-grid', + 'grids/data-grid/editing', + 'general/getting-started', + ]); + }); + + it('returns an empty array for an empty tree', () => { + expect(collectSlugs([])).toEqual([]); + }); +}); + +describe('buildLlmsMetaMap', () => { + it('reads metadata for the slugs that have a source file', () => { + writeDoc('grids.mdx', '---\ntitle: Grids\ndescription: All grids.\n---\n'); + writeDoc('grids/data-grid/index.md', '---\ntitle: Data Grid\nllmsdescription: The grid.\n---\n'); + + const map = buildLlmsMetaMap(tmp, sidebar()); + + expect([...map.keys()]).toEqual(['grids', 'grids/data-grid']); + expect(map.get('grids')).toEqual({ description: 'All grids.' }); + expect(map.get('grids/data-grid')).toEqual({ description: 'The grid.' }); + }); + + it('skips a slug whose file has no llms metadata', () => { + writeDoc('grids.mdx', '---\ntitle: Grids\n---\n'); + expect(buildLlmsMetaMap(tmp, sidebar()).size).toBe(0); + }); + + it('reads the root index file for the empty slug', () => { + writeDoc('index.mdx', '---\ntitle: Home\ndescription: The home page.\n---\n'); + + const map = buildLlmsMetaMap(tmp, [{ label: 'Home', slug: '' }]); + expect(map.get('')).toEqual({ description: 'The home page.' }); + }); + + it('takes metadata from the highest-precedence root', () => { + const overlay = path.join(tmp, 'overlay'); + const base = path.join(tmp, 'base'); + fs.mkdirSync(overlay, { recursive: true }); + fs.mkdirSync(base, { recursive: true }); + fs.writeFileSync(path.join(overlay, 'grids.mdx'), '---\ndescription: Overlay.\n---\n'); + fs.writeFileSync(path.join(base, 'grids.mdx'), '---\ndescription: Base.\n---\n'); + + const map = buildLlmsMetaMap([overlay, base], [{ label: 'Grids', slug: 'grids' }]); + expect(map.get('grids')).toEqual({ description: 'Overlay.' }); + }); +}); + +describe('toUrlSlug', () => { + it('lower-cases and hyphenates a plain label', () => { + expect(toUrlSlug('React Grids')).toBe('react-grids'); + }); + + it('collapses runs of punctuation into a single hyphen', () => { + expect(toUrlSlug('Grids & Lists')).toBe('grids-lists'); + }); + + it('strips a leading hyphen produced by leading punctuation', () => { + expect(toUrlSlug(' React')).toBe('react'); + }); + + it('keeps digits', () => { + expect(toUrlSlug('Chart 3D')).toBe('chart-3d'); + }); + + // Current behaviour: the trailing-hyphen strip is not global, so only the + // first of a leading/trailing pair is removed. + it('leaves a trailing hyphen when the label both starts and ends with punctuation', () => { + expect(toUrlSlug(' React Grids ')).toBe('react-grids-'); + }); + + it.todo('should strip both the leading and the trailing hyphen (the replace lacks the /g flag)'); +}); + +describe('getBroadSectionsForPlatform', () => { + it.each(['angular', 'react', 'blazor', 'web-components'])( + 'returns the full broad-section set for %s', + platform => { + const sections = getBroadSectionsForPlatform(platform); + expect(sections.size).toBe(IGDOCS_BROAD_SECTIONS.length); + expect(sections.has('Grids & Lists')).toBe(true); + }, + ); + + it('returns an empty set for null', () => { + expect(getBroadSectionsForPlatform(null).size).toBe(0); + }); + + it('returns an empty set for a platform with no broad sections', () => { + expect(getBroadSectionsForPlatform('appbuilder').size).toBe(0); + }); +}); + +describe('buildLlmsTxt', () => { + const metaMap = (): Map => new Map([ + ['grids', { description: 'Every grid component.', keywords: ['grid', 'table'] }], + ['grids/data-grid/editing', { description: 'Editing cells in the grid.' }], + ]); + + it('opens with the title and the site description blockquote', () => { + const txt = buildLlmsTxt('/docs', 'Ignite UI', 'Docs for Ignite UI.', sidebar(), metaMap()); + + expect(txt.startsWith('# Ignite UI\n\n> Docs for Ignite UI.\n')).toBe(true); + }); + + it('uses the localized description when one is given', () => { + const txt = buildLlmsTxt('/docs', 'Ignite UI', 'English.', [], new Map(), [], new Set(), 'jp', '日本語。'); + + expect(txt).toContain('> 日本語。'); + expect(txt).toContain('## ドキュメント セット'); + }); + + it('emits a page line with the .md URL and the description', () => { + const txt = buildLlmsTxt('/docs', 'Ignite UI', 'Docs.', sidebar(), metaMap()); + + expect(txt).toContain('- [Grids & Lists Overview](/docs/grids.md): Every grid component.'); + expect(txt).toContain(' Tags: grid, table'); + }); + + it('emits a section heading for each group', () => { + const txt = buildLlmsTxt('/docs', 'Ignite UI', 'Docs.', sidebar(), metaMap()); + + expect(txt).toContain('## Grids & Lists'); + expect(txt).toContain('### Data Grid'); + }); + + it('adds the API reference link only when an API docs URL is given', () => { + const withApi = buildLlmsTxt('/docs', 'T', 'D', [], new Map(), [], new Set(), 'en', undefined, 'https://x/api/llms.txt'); + const without = buildLlmsTxt('/docs', 'T', 'D', [], new Map()); + + expect(withApi).toContain('- [API Reference](https://x/api/llms.txt): Full TypeDoc'); + expect(without).not.toContain('API Reference'); + }); + + it('lists each documentation set with its own .txt URL', () => { + const txt = buildLlmsTxt('/docs', 'T', 'D', [], new Map(), [ + { label: 'React Grids', paths: ['grids/**'], description: 'Grid docs only.' }, + { label: 'Charts', paths: ['charts/**'] }, + ]); + + expect(txt).toContain('- [React Grids](/docs/_llms-txt/react-grids.txt): Grid docs only.'); + expect(txt).toContain('- [Charts](/docs/_llms-txt/charts.txt)'); + }); + + it('does not prefix a label whose ancestor is a broad section', () => { + const txt = buildLlmsTxt( + '/docs', + 'T', + 'D', + sidebar(), + metaMap(), + [], + getBroadSectionsForPlatform('angular'), + ); + + // "Grids & Lists" is a navigation bucket, so the Overview page under it + // keeps its bare label instead of inheriting a prefix. + expect(txt).toContain('- [Overview](/docs/grids.md)'); + }); + + it('matches the recorded manifest for a small sidebar', async () => { + const txt = buildLlmsTxt( + '/docs', + 'Ignite UI', + 'Docs for Ignite UI.', + sidebar(), + metaMap(), + [{ label: 'React Grids', paths: ['grids/**'], description: 'Grid docs only.' }], + new Set(), + 'en', + undefined, + 'https://example.test/api/angular/llms.txt', + ); + + await expect(txt).toMatchFileSnapshot('./__snapshots__/llms-txt.txt'); + }); +}); diff --git a/src/llms.ts b/src/llms.ts index ec2842a839..260a0a48bf 100644 --- a/src/llms.ts +++ b/src/llms.ts @@ -24,6 +24,7 @@ import fs from 'node:fs'; import path from 'node:path'; import matter from 'gray-matter'; +import { findFirstInRoots, toRootList, type DocsContentRoot } from './lib/doc-roots.ts'; import type { SidebarEntry, SidebarGroup, SidebarLink } from './lib/sidebar/types'; import type { NavLang } from './platform.ts'; @@ -117,20 +118,21 @@ export function collectSlugs(items: SidebarEntry[]): string[] { * it must happen before the build because the rendered HTML does not expose * LLM-specific frontmatter fields like `llms.description` or `llms.keywords`. */ -export function buildLlmsMetaMap(docsDir: string, items: SidebarEntry[]): Map { +export function buildLlmsMetaMap(docsDir: DocsContentRoot | DocsContentRoot[], items: SidebarEntry[]): Map { const map = new Map(); + const roots = toRootList(docsDir); for (const slug of collectSlugs(items)) { const candidates = slug ? [`${slug}.md`, `${slug}.mdx`, path.join(slug, 'index.md'), path.join(slug, 'index.mdx')] : ['index.md', 'index.mdx']; - for (const candidate of candidates) { - try { - const raw = fs.readFileSync(path.join(docsDir, candidate), 'utf-8'); - const meta = extractLlmsMeta(raw); - if (meta.description || meta.keywords?.length) map.set(slug, meta); - break; - } catch { /* try next candidate */ } - } + // Roots are searched highest precedence first, so the metadata comes + // from the same file that supplies the rendered page. + const source = findFirstInRoots(roots, candidates); + if (!source) continue; + try { + const meta = extractLlmsMeta(fs.readFileSync(source, 'utf-8')); + if (meta.description || meta.keywords?.length) map.set(slug, meta); + } catch { /* unreadable source — leave the slug without metadata */ } } return map; } diff --git a/src/platform.test.ts b/src/platform.test.ts new file mode 100644 index 0000000000..3e71cd8a08 --- /dev/null +++ b/src/platform.test.ts @@ -0,0 +1,118 @@ +import { describe, expect, it, vi } from 'vitest'; +import { getNavConfig, getPlatformHead, IGDOCS_PLATFORMS, PLATFORM_DEFS, type PlatformKey } from './platform.ts'; + +const PLATFORM_KEYS = Object.keys(PLATFORM_DEFS) as PlatformKey[]; +const IG_PLATFORMS = PLATFORM_KEYS.filter(key => key !== 'appbuilder'); + +describe('getNavConfig', () => { + it.each(IG_PLATFORMS)('points %s at the Infragistics nav endpoint', platform => { + expect(getNavConfig(platform)).toEqual({ + navType: 'infragistics', + navUrl: 'https://www.infragistics.com/navigation', + }); + }); + + it.each(IG_PLATFORMS)('uses the Japanese host for %s in jp', platform => { + expect(getNavConfig(platform, 'jp')).toEqual({ + navType: 'infragistics', + navUrl: 'https://jp.infragistics.com/navigation', + }); + }); + + it.each(IG_PLATFORMS)('falls back to the English host for %s in kr', platform => { + expect(getNavConfig(platform, 'kr').navUrl).toBe('https://www.infragistics.com/navigation'); + }); + + it.each(['en', 'jp', 'kr'])('keeps the AppBuilder endpoint locale-independent in %s', lang => { + expect(getNavConfig('appbuilder', lang)).toEqual({ + navType: 'appbuilder', + navUrl: 'https://www.appbuilder.dev/header-footer-export', + }); + }); + + it.each(['en', 'jp', 'kr'])('returns no nav for a null platform in %s', lang => { + expect(getNavConfig(null, lang)).toEqual({ navType: 'none', navUrl: null }); + }); + + it('returns no nav for an unknown platform', () => { + expect(getNavConfig('mystery')).toEqual({ navType: 'none', navUrl: null }); + }); + + it('defaults to the English host when no locale is given', () => { + expect(getNavConfig('angular').navUrl).toBe('https://www.infragistics.com/navigation'); + }); +}); + +describe('getPlatformHead', () => { + it.each(PLATFORM_KEYS)('opens the head of %s with the platform meta tag', platform => { + const head = getPlatformHead(platform); + + expect(Array.isArray(head)).toBe(true); + expect(head[0]).toEqual({ tag: 'meta', attrs: { property: 'docs:platform', content: platform } }); + }); + + it.each(IG_PLATFORMS)('includes the shared Infragistics navigation assets for %s', platform => { + const head = getPlatformHead(platform); + const hrefs = head.map(entry => entry.attrs?.['href']); + const srcs = head.map(entry => entry.attrs?.['src']); + + expect(hrefs).toContain('https://www.infragistics.com/css/navigation.css'); + expect(srcs).toContain('https://www.infragistics.com/assets/modern/scripts/navigation.js'); + }); + + it('includes the AppBuilder mega-menu assets instead for appbuilder', () => { + const head = getPlatformHead('appbuilder'); + const hrefs = head.map(entry => entry.attrs?.['href']); + const srcs = head.map(entry => entry.attrs?.['src']); + + expect(hrefs).toContain('https://staging.appbuilder.dev/wp-includes/css/dashicons.min.css'); + expect(srcs).toContain('https://staging.appbuilder.dev/wp-content/plugins/megamenu/js/maxmegamenu.js?ver=3.3.1'); + expect(hrefs).not.toContain('https://www.infragistics.com/css/navigation.css'); + }); + + it('carries the bootstrap cascade layer as an inline style', () => { + const head = getPlatformHead('angular'); + const styles = head.filter(entry => entry.tag === 'style'); + + expect(styles).toHaveLength(1); + expect(styles[0].content).toContain('layer(bootstrap)'); + }); + + it('warns and returns nothing for an unknown platform', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}); + try { + expect(getPlatformHead('mystery')).toEqual([]); + expect(warn).toHaveBeenCalledOnce(); + } finally { + warn.mockRestore(); + } + }); + + it('ignores the locale argument', () => { + expect(getPlatformHead('angular', 'jp')).toEqual(getPlatformHead('angular', 'en')); + }); +}); + +describe('IGDOCS_PLATFORMS', () => { + it('pairs every English entry with a Japanese one on the same platform key', () => { + for (const [name, meta] of Object.entries(IGDOCS_PLATFORMS)) { + if (meta.lang !== 'en') continue; + const jp = IGDOCS_PLATFORMS[`${name}JP`]; + expect(jp, `${name}JP`).toBeDefined(); + expect(jp.key).toBe(meta.key); + expect(jp.lang).toBe('jp'); + } + }); + + it('gives every entry its own dev port', () => { + const ports = Object.values(IGDOCS_PLATFORMS).map(meta => meta.devPort); + + expect(new Set(ports).size).toBe(ports.length); + }); + + it('uses a platform key that the head registry knows', () => { + for (const meta of Object.values(IGDOCS_PLATFORMS)) { + expect(PLATFORM_DEFS[meta.key]).toBeDefined(); + } + }); +}); diff --git a/src/plugins/rehype-api-references-grid.test.ts b/src/plugins/rehype-api-references-grid.test.ts new file mode 100644 index 0000000000..96a7220f17 --- /dev/null +++ b/src/plugins/rehype-api-references-grid.test.ts @@ -0,0 +1,86 @@ +import { markdownToHtml } from 'satteri'; +import { describe, expect, it } from 'vitest'; +import { rehypeApiReferencesGrid } from './rehype-api-references-grid.ts'; + +/** Compiles `source` through the plugin under test. */ +async function render(source: string): Promise { + const { html } = await markdownToHtml(source, { hastPlugins: [rehypeApiReferencesGrid] }); + return html; +} + +/** Contents of the generated grid nav, or `''` when the plugin did not wrap anything. */ +function nav(html: string): string { + return /