diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..90f3f76 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,92 @@ +name: Build & Test + +on: + pull_request: + paths-ignore: + - '_archive-vitepress/**' + - 'TODO.astro/**' + - 'TODO.improve-website/**' + - '**/*.md' + - '!src/content/**/*.md' + push: + branches: [main, feat/astro-migration] + +jobs: + build: + name: Build & Test + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Type check + run: npx astro check + + - name: Build (must succeed before tests can check dist/) + run: npm run build + + - name: Tests (unit + integration) + run: npx vitest run + + - name: Verify page count + run: | + PAGE_COUNT=$(find dist -name "*.html" | wc -l) + echo "HTML pages built: $PAGE_COUNT" + if [ "$PAGE_COUNT" -lt 250 ]; then + echo "::error::Expected ≥250 pages, got $PAGE_COUNT — content collections may be empty" + exit 1 + fi + + - name: Verify content collections produced pages + run: | + # These files only exist if the content layer loaded successfully. + for f in concepts/anatomy/index.html blog/2024-01-15-what-is-pubid/index.html specs/iso-urn/index.html library/api/index.html adopt/guide/index.html; do + if [ ! -f "dist/$f" ]; then + echo "::error::Missing dist/$f — content collection is empty" + exit 1 + fi + done + + - name: Link Checker (lychee) + uses: lycheeverse/lychee-action@v2 + with: + args: --config lychee.toml --root-dir ./dist "dist/**/*.html" + fail: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + name: dist + path: dist/ + retention-days: 14 + + deploy: + name: Deploy to GitHub Pages + needs: build + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/download-artifact@v4 + with: + name: dist + path: dist + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index b03168b..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,101 +0,0 @@ -name: Deploy VitePress site to Pages - -on: - push: - branches: [main] - workflow_dispatch: - inputs: - pubid_ref: - description: 'PubID library branch/ref to export from' - required: false - default: 'rt-new-lutaml-model' - repository_dispatch: - types: [pubid-library-update] - -permissions: - contents: read - pages: write - id-token: write - -concurrency: - group: pages - cancel-in-progress: false - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: npm - - - uses: ruby/setup-ruby@v1 - with: - ruby-version: '3.4' - - - name: Determine pubid ref - id: pubid-ref - run: | - if [ -n "${{ github.event.client_payload.ref }}" ]; then - echo "ref=${{ github.event.client_payload.ref }}" >> "$GITHUB_OUTPUT" - elif [ -n "${{ inputs.pubid_ref }}" ]; then - echo "ref=${{ inputs.pubid_ref }}" >> "$GITHUB_OUTPUT" - else - echo "ref=rt-new-lutaml-model" >> "$GITHUB_OUTPUT" - fi - - - name: Checkout pubid library - uses: actions/checkout@v4 - with: - repository: metanorma/pubid - ref: ${{ steps.pubid-ref.outputs.ref }} - path: _pubid - - - name: Install pubid dependencies - working-directory: _pubid - run: bundle install --jobs 4 --retry 3 - - - name: Export library data - run: | - cd _pubid - bundle exec ruby -e ' - require "pubid" - require "pubid/export" - - data = Pubid::Export::Exporter.export_all - metadata = { - pubid_version: Pubid::VERSION, - git_commit: `git rev-parse HEAD`.strip, - git_branch: `git rev-parse --abbrev-ref HEAD`.strip, - exported_at: Time.now.utc.iso8601, - total_identifier_types: data.values.sum { |f| f[:identifier_types]&.size || 0 }, - total_flavors: data.size, - } - output = { "_metadata" => metadata }.merge(data) - dest = File.expand_path("../.vitepress/data/generated/website-data.json", __dir__) - File.write(dest, JSON.pretty_generate(output)) - puts "Exported #{metadata[:total_identifier_types]} types across #{metadata[:total_flavors]} flavors" - puts "PubID version: #{metadata[:pubid_version]}" - puts "Git ref: #{metadata[:git_branch]} @ #{metadata[:git_commit][0..7]}" - ' - - - run: npm ci - - run: npm run build - - - uses: actions/upload-pages-artifact@v3 - with: - path: .vitepress/dist - - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/links.yml b/.github/workflows/links.yml deleted file mode 100644 index 689a1c1..0000000 --- a/.github/workflows/links.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: links - -on: - push: - branches: - - main - pull_request: - -jobs: - link_checker: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: npm - - - name: Install dependencies - run: npm ci - - - name: Build VitePress site - run: npm run build - - - name: Link Checker - uses: lycheeverse/lychee-action@v2 - with: - args: --verbose --no-progress .vitepress/dist/**/*.html - fail: true - env: - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.gitignore b/.gitignore index 35345b9..98dab51 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,36 @@ +# Build output +dist/ +.output/ + +# Dependencies node_modules/ -.vitepress/dist/ -.vitepress/cache/ -_site/ -.sass-cache/ -.jekyll-cache/ -.jekyll-metadata -vendor/ + +# Astro generated +.astro/ + +# Env +.env +.env.production +.env.local + +# OS .DS_Store -Gemfile.lock + +# Logs +*.log +npm-debug.log* + +# Editor +.vscode/ +.idea/ + +# Archived VitePress build artifacts (if anyone builds them locally) +_archive-vitepress/.vitepress/dist/ +_archive-vitepress/.vitepress/cache/ +_archive-vitepress/_site/ +_archive-vitepress/.jekyll-cache/ + +# Legacy (preserved for reference) TODO* +!TODO.astro/ +!TODO.improve-website/ diff --git a/.lycheeignore b/.lycheeignore index 673be85..228cdf5 100644 --- a/.lycheeignore +++ b/.lycheeignore @@ -1,6 +1,34 @@ +# URLs excluded from lychee link checking. Each entry MUST have an explanatory comment. +# Format: one PCRE2 regex per line; comments start with #. + +# Pubid repo is being moved to github.com/pubid/ org; URL is correct but not +# yet resolvable. +^https://github\.com/pubid/pubid/?$ +^https://github\.com/pubid/pubid/issues/?$ + +# Metanorma blog post being restored; URL is the canonical target. +^https://www\.metanorma\.org/posts/2022-01-09-nist-pubid/?$ + +# Relaton blog post being restored; URL is the canonical target. +^https://www\.relaton\.org/posts/2023-08-23-nist-cswp-pubid/?$ + +# Adobe.com — HTTP/2 protocol error from lychee's HTTP client; the link is +# valid for browsers. Excluded until upstream lychee/rustls supports the +# Adobe TLS configuration cleanly. +^https://www\.adobe\.com/?$ + +# Publisher WAFs that block GitHub Actions IP ranges (links are valid for +# real browsers). 403 from CI does not indicate a broken link. +^https://www\.ansi\.org/?$ +^https://www\.astm\.org/?$ +^https://www\.csagroup\.org/?$ +^https://www\.iec\.ch/?$ + +# Local-asset patterns from VitePress era (not used by Astro, but harmless). assets javascript:.* -https://twitter.com/RiboseUS .*@.*example.com (ht|f)tps?://.*\.?example\.(com|org).* -https://.*\.?pubid\.(com|net|org).* +^https://www\.w3c\.org/?$ +^https://www\.w3\.org/?$ +^https://www\.3gpp\.org/?$ diff --git a/TODO.astro/01-scaffold-and-config.md b/TODO.astro/01-scaffold-and-config.md new file mode 100644 index 0000000..19e424d --- /dev/null +++ b/TODO.astro/01-scaffold-and-config.md @@ -0,0 +1,78 @@ +# 01 — Scaffold & Config + +**Status:** started (this session) +**Branch:** `feat/astro-migration` +**Working dir:** `astro-site/` (new subdir; VitePress at root is untouched) + +## Goal + +A runnable Astro 7 project with Starlight, Tailwind 4, React, and SSG output configured. `astro dev` boots, `astro build` produces `.html` files, and a placeholder home page renders with Tailwind classes applied. + +## Acceptance criteria + +- [ ] `astro-site/package.json` exists with these deps (versions ≥ the floor listed): + - `astro@^7.0.7` + - `vite@^8.1.4` + - `@astrojs/starlight@^0.41.3` + - `@astrojs/react@latest`, `@astrojs/sitemap@latest`, `@astrojs/mdx@latest` + - `tailwindcss@^4.3.2`, `@tailwindcss/vite@^4.3.2` + - `react@^19`, `react-dom@^19`, `@types/react@^19` + - `@fontsource-variable/fraunces`, `@fontsource-variable/inter-tight` (or chosen pair) +- [ ] `astro-site/astro.config.mjs` configured with: + - `site: 'https://www.pubid.com'` + - `output: 'static'` + - integrations: `starlight()`, `react()`, `mdx()`, `sitemap()` + - `vite.plugins: [tailwindcss()]` (the `@tailwindcss/vite` plugin) + - `markdown.shikiConfig` matching the brand palette +- [ ] `astro-site/tsconfig.json` extends `astro/tsconfigs/strict` +- [ ] `astro-site/src/styles/global.css` does `@import "tailwindcss";` and imports the design tokens from TODO 02 +- [ ] `astro-site/src/pages/index.astro` renders a hero with the PubID logo and headline +- [ ] `npm run dev` boots on a free port, returns 200 for `/` +- [ ] `npm run build` produces `astro-site/dist/index.html` + +## Implementation notes + +### Astro 7 specifics + +- Astro 7 stable was released after Starlight 0.34. Starlight 0.41 supports Astro 7 — verified via `npm view @astrojs/starlight peerDependencies`. +- Use the Content Layer API (`src/content.config.ts`) for collections — replaces `getStaticPaths`-style content fetching for MD/MDX. + +### Starlight layout strategy + +Starlight ships its own layout. We use it for the docs-shaped sections (Concepts, Library, Specs, Adopt) under route prefixes like `/concepts/*`, `/library/*`, etc. — each gets its own Starlight sidebar via `StarlightRoute` overrides, or we run multiple Starlight instances. + +The homepage and publisher pages (which have heavily custom UI) live OUTSIDE Starlight, using our own `BaseLayout.astro`. + +### Tailwind 4 via Vite plugin + +Tailwind 4 uses the Vite plugin directly — **no `tailwind.config.js` needed**, no PostCSS config. Tokens are declared in CSS via `@theme { --color-accent: ...; }`. Custom utilities via `@utility`. + +```css +@import "tailwindcss"; +@theme { + --color-pubid: #2978a1; + --font-display: "Fraunces Variable", serif; +} +``` + +### Don't do in this task + +- Don't port the actual VitePress components yet (TODO 05–09). +- Don't migrate content collections yet (TODO 10–15). +- Don't touch VitePress files at the repo root. + +## Inputs / references + +- Versions verified via `npm view` (see README.md) +- Existing VitePress config: `.vitepress/config.ts` +- Existing custom CSS tokens: `.vitepress/theme/custom.css` lines 7–48 + +## Outputs + +- `astro-site/` directory tree +- First commit on `feat/astro-migration` +- A dev server URL the user can open + +## Next + +→ TODO 02 (design system tokens) diff --git a/TODO.astro/02-tailwind-design-system.md b/TODO.astro/02-tailwind-design-system.md new file mode 100644 index 0000000..b1c4a40 --- /dev/null +++ b/TODO.astro/02-tailwind-design-system.md @@ -0,0 +1,111 @@ +# 02 — Tailwind 4 Design System + +**Status:** pending +**Depends on:** 01 + +## Goal + +A Tailwind 4 design system that reproduces and refines the existing PubID visual identity. Light + dark themes, typography pairing, elevation, motion tokens — all declarable as Tailwind utilities. + +## Acceptance criteria + +- [ ] `astro-site/src/styles/global.css` declares all tokens via `@theme` (light) and `@theme.dark` / `[data-theme="dark"]` overrides +- [ ] All tokens from `.vitepress/theme/custom.css` lines 7–48 are present: + - `--color-bg`, `--color-bg-raised`, `--color-bg-inset`, `--color-bg-dark` + - `--color-border`, `--color-border-subtle` + - `--color-text`, `--color-text-2`, `--color-text-3`, `--color-text-inv` + - `--color-accent` (`#2978a1`), `--color-accent-hover`, `--color-accent-soft`, `--color-accent-warm` (`#da9d76`) +- [ ] Typography: + - Display: **Fraunces Variable** (or alternative approved by user) loaded via `@fontsource-variable/fraunces` + - Body: **Inter Tight** (or alternative) loaded via `@fontsource-variable/inter-tight` + - Mono: **JetBrains Mono** or **IBM Plex Mono** for inline code +- [ ] Custom utilities via `@utility`: + - `.gradient-text` — the hero gradient (135deg accent → brand-2 → brand-3) + - `.card-elevated` — soft long shadow + - `.hairline` — 1px divider with `border-subtle` + - `.chip` — small pill component +- [ ] Dark mode: `html.dark` class OR `data-theme="dark"` attribute (pick one; document in code) +- [ ] View Transitions: `html { view-transition-name: root; }` and per-element names where useful + +## Implementation notes + +### Tailwind 4 token mapping + +```css +@import "tailwindcss"; + +@theme { + /* Colors — light defaults */ + --color-bg: #ffffff; + --color-bg-raised: #f4f4f5; + --color-bg-inset: #fafafa; + --color-bg-dark: #09090b; + --color-border: #e4e4e7; + --color-border-subtle: #f0f0f2; + --color-text: #09090b; + --color-text-2: #52525b; + --color-text-3: #a1a1aa; + --color-text-inv: #fafafa; + + --color-accent: #2978a1; + --color-accent-hover: #1f6a8e; + --color-accent-soft: rgba(41, 120, 161, 0.08); + --color-accent-warm: #da9d76; + --color-brand-2: #4193ac; + --color-brand-3: #1a4d6d; + + /* Typography */ + --font-display: "Fraunces Variable", ui-serif, Georgia, serif; + --font-sans: "Inter Tight", ui-sans-serif, system-ui, sans-serif; + --font-mono: "JetBrains Mono", ui-monospace, monospace; +} + +[data-theme="dark"] { + --color-bg: #111113; + --color-bg-raised: #1a1a1e; + --color-bg-inset: #141416; + --color-border: rgba(255, 255, 255, 0.08); + --color-border-subtle: rgba(255, 255, 255, 0.04); + --color-text: #fafafa; + --color-text-2: #a1a1aa; + --color-text-3: #71717a; + --color-accent-hover: #7ea7b2; + --color-accent-warm: #e8b48a; +} +``` + +### Custom utilities + +```css +@utility gradient-text { + background: linear-gradient(135deg, #2978a1, #4193ac, #4590cd); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; +} + +@utility card-elevated { + background: var(--color-bg-raised); + border: 1px solid var(--color-border); + border-radius: 0.75rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04), + 0 12px 32px -8px rgba(41, 120, 161, 0.08); +} +``` + +### Hero background mesh + +Refine the existing radial-gradient hero mesh with a subtle grain overlay (SVG noise) for depth. See `.vitepress/theme/custom.css` lines 65–80 for the current mesh. + +### Don't do in this task + +- Component-level styles (those live with each component TODO) +- Replace existing VitePress CSS in place (the old CSS stays put for the VitePress site until cutover) + +## Verification + +Create a temporary `/style-test` page that uses every token + utility, screenshot it in light + dark, manually verify the palette matches the existing site. + +## Next + +→ TODO 03 (data layer) diff --git a/TODO.astro/03-data-layer.md b/TODO.astro/03-data-layer.md new file mode 100644 index 0000000..475129a --- /dev/null +++ b/TODO.astro/03-data-layer.md @@ -0,0 +1,65 @@ +# 03 — Data Layer Migration + +**Status:** pending +**Depends on:** 01 + +## Goal + +All TypeScript data files from `.vitepress/data/` are migrated to `astro-site/src/data/` with identical types, plus a thin Astro-flavored loading API for use in `.astro` and `.tsx` files. + +## Files to migrate + +| Source | Destination | Notes | +|--------|-------------|-------| +| `.vitepress/data/types.ts` | `astro-site/src/data/types.ts` | verbatim copy | +| `.vitepress/data/publishers.ts` | `astro-site/src/data/publishers.ts` | verbatim (already updated with IALA/IHO/Adobe + NIST/OIML doc types) | +| `.vitepress/data/component-data.ts` | `astro-site/src/data/component-data.ts` | verbatim | +| `.vitepress/data/syntax-data.ts` | `astro-site/src/data/syntax-data.ts` | verbatim | +| `.vitepress/data/loader.ts` | `astro-site/src/data/loader.ts` | verbatim | +| `.vitepress/data/component-data.ts` | `astro-site/src/data/component-data.ts` | verbatim | + +## Acceptance criteria + +- [ ] All 5 data files copied to `astro-site/src/data/` +- [ ] `astro-site/src/data/index.ts` exports a typed public API: + ```ts + export { publishers, getPublisher, getPublishersByCategory, + internationalPublishers, regionalPublishers, + nationalPublishers, industryPublishers } from './publishers' + export type { Publisher, DocType, FlavorComponent, + AlgebraRelation, PubIDStyle, Stage, Category } from './types' + export { categoryLabels, categoryOrder } from './types' + export { getComponentMeta } from './component-data' + ``` +- [ ] `publishers.length === 26` (assertion test) +- [ ] `getPublisher('iala')?.docTypes.length === 11` +- [ ] `getPublisher('iho')?.docTypes.length === 5` +- [ ] `getPublisher('adobe')?.docTypes.length === 2` +- [ ] TypeScript `astro check` passes cleanly +- [ ] No VitePress imports remain (`grep -r 'vitepress' astro-site/src/data/` → empty) + +## Implementation notes + +These files are pure TypeScript with no Vue/VitePress runtime deps. They should copy cleanly. The only change is path adjustments if any relative imports exist. + +### Don't do in this task + +- Don't add Astro Content Collections schema yet — those come in TODO 10–15 per content type +- Don't write zod schemas for publishers (the types.ts is sufficient and publishers.ts is hand-curated) + +## Verification + +```ts +// astro-site/src/data/__test__/smoke.ts +import { publishers, getPublisher } from '../index' +console.assert(publishers.length === 26, `expected 26 publishers, got ${publishers.length}`) +console.assert(getPublisher('iala')?.docTypes.length === 11) +console.assert(getPublisher('iho')?.docTypes.length === 5) +console.assert(getPublisher('adobe')?.docTypes.length === 2) +``` + +Run via `astro-site/node --import tsx src/data/__test__/smoke.ts` or as an Astro script. + +## Next + +→ TODO 04 (layout shell) diff --git a/TODO.astro/04-layout-shell-and-navigation.md b/TODO.astro/04-layout-shell-and-navigation.md new file mode 100644 index 0000000..4fd80cc --- /dev/null +++ b/TODO.astro/04-layout-shell-and-navigation.md @@ -0,0 +1,97 @@ +# 04 — Layout Shell & Navigation + +**Status:** pending +**Depends on:** 02, 03 + +## Goal + +A `BaseLayout.astro` that wraps every custom (non-Starlight) page: header with nav + theme toggle + GitHub link, footer, mobile drawer, scroll progress bar, and `` for client-side view transitions. + +## Acceptance criteria + +- [ ] `astro-site/src/layouts/BaseLayout.astro` accepts: + - `title: string` + - `description?: string` + - `ogImage?: string` + - `noindex?: boolean` + - `slots: default` (page content) +- [ ] `astro-site/src/components/Header.astro`: + - PubID logo (left) → links to `/` + - Nav: Publishers, Concepts, Docs (dropdown: Library + Specs), Adopt, About + - GitHub icon link + - Theme toggle button (sun/moon) + - Mobile: hamburger → drawer with same links +- [ ] `astro-site/src/components/Footer.astro`: + - "An open source project of Ribose" + copyright `2024–2026` + - Small links: Privacy, TOS, GitHub +- [ ] `astro-site/src/components/ThemeToggle.tsx` (React island): + - Reads localStorage on mount + - Falls back to `prefers-color-scheme` + - Toggles `data-theme="dark"` on `` +- [ ] `astro-site/src/components/ScrollProgress.astro`: + - 2px fixed top bar, accent gradient, width tied to scroll % +- [ ] View transitions via `` from `astro:transitions` +- [ ] Light + dark mode persists across pages + +## Implementation notes + +### Header layout + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ [≡] ▼PubID Publishers Concepts Docs ▾ Adopt About [☀] [⌥]│ +└──────────────────────────────────────────────────────────────────┘ +``` + +- Logo: `/pubid-logo.svg` (existing file, copy to `astro-site/public/`) +- Sticky top, blurred backdrop (`backdrop-filter: blur(12px)`) +- Hairline bottom border + +### Theme toggle + +Persist to `localStorage.pubid-theme`. On mount, apply before paint (inline ` +``` + +### Mobile drawer + +Use a small React island or pure CSS (`:target` / `details`). Pure CSS preferred — zero JS payload. + +### Active nav state + +Use `Astro.url.pathname` to highlight active top-level section. + +### Don't do in this task + +- Don't build the homepage (TODO 05) +- Don't build Starlight integration (TODO 10 sets up Starlight for Concepts) +- Don't replicate the VitePress search bar (TODO 16 covers Pagefind) + +## Inputs + +- Existing nav structure: `.vitepress/config.ts` lines 49–58 +- Existing footer: `.vitepress/config.ts` lines 60–65 + +## Outputs + +- One layout, three components (Header, Footer, ThemeToggle) +- A blank `/` page that just calls `` for visual verification + +## Verification + +- `npm run dev` → `/` shows header, blank content, footer +- Toggle persists across reload +- Mobile breakpoint shows drawer +- View transitions feel smooth between two stub pages + +## Next + +→ TODO 05 (homepage) diff --git a/TODO.astro/05-home-page.md b/TODO.astro/05-home-page.md new file mode 100644 index 0000000..ab0a760 --- /dev/null +++ b/TODO.astro/05-home-page.md @@ -0,0 +1,96 @@ +# 05 — Home Page + +**Status:** pending +**Depends on:** 02, 03, 04 + +## Goal + +Reimplement `index.md` (which renders ``) as `astro-site/src/pages/index.astro` with a React island for the interactive parts. This is the largest single component in the codebase (749 Vue lines). + +## Source + +- `.vitepress/theme/components/HomePage.vue` (749 lines) + +## Sections to reproduce + +1. **Hero** — eyebrow, gradient headline, sub-headline, inline demo input +2. **Inline Demo** — input field, preset chips, parsed-result visualization (component chips, nested groups, URN) +3. **Architecture Diagram** — interactive switcher between `simple` / `supplement` / `corrigendum` / `adoption` examples, each showing nested identifier composition +4. **Stats** — 26 publishers, N+ doc types, round-trip fidelity, URN-mappable +5. **Publisher Filter Preview** — category tabs (international/regional/national/industry), grid of cards (link to /publishers/) +6. **CTA** — "Get started" / "Browse publishers" / "Read the spec" + +## Acceptance criteria + +- [ ] `astro-site/src/pages/index.astro` exists, uses `BaseLayout` +- [ ] `astro-site/src/components/home/HeroDemo.tsx` — React island, identical preset chips + parsing visualization +- [ ] `astro-site/src/components/home/ArchitectureDiagram.tsx` — interactive nested-group diagram, all 4 modes +- [ ] `astro-site/src/components/home/StatsSection.astro` — static, with on-scroll stagger reveal +- [ ] `astro-site/src/components/home/PublisherPreview.astro` — reuses `PublisherCard.astro` from TODO 06 (or a simplified inline version if 06 not done) +- [ ] All animations: CSS-driven staggered reveals via `animation-delay` + `IntersectionObserver` to add `.visible` class +- [ ] Lighthouse: ≥ 95 performance, ≥ 95 accessibility (hero text contrast) +- [ ] Hero headline uses the display font (`font-display`) with `gradient-text` utility +- [ ] Dark mode looks correct + +## Implementation notes + +### Migration approach: Vue → React + +The Vue SFC uses ` + +**Data pipeline:** Publisher schema data on this site is exported directly from the [pubid-ruby](https://github.com/metanorma/pubid) reference implementation. The export version is: + +
+ +
+ +## NIST: The First Adopter + +
+ +In 2021, NIST published the [Publication Identifier Syntax for NIST Technical Series Publications](https://www.nist.gov/system/files/documents/2022/04/01/PubID_Syntax_NIST_TechPubs.pdf) — a formal scheme for uniquely identifying every document across the 53 publication series and 19,333+ documents in the NIST Library, dating back to 1901. + +NIST was the first standards organization to adopt a multi-style, round-trippable PubID scheme with four defined rendering styles: + +| Style | Usage | Example | +|-------|-------|---------| +| **Full** | Title page and bibliography | National Institute of Standards and Technology Special Publication 800-53, Revision 5 | +| **Abbreviated** | Authority section | Natl. Inst. Stand. Technol. Spec. Publ. 800-53 Rev. 5 | +| **Short** | Inline citations | NIST SP 800-53 Rev. 5 | +| **Machine-Readable** | DOI suffix | NIST.SP.800-53r5 | + +[Ribose](https://www.ribose.com) was involved from the conception phase alongside the NIST Information Services Office and CSRC teams in conceptualizing the universal PubID scheme — acknowledged in both the original 2020 draft and the final PubID 1.0 document. Ribose submitted [formal comments](https://riboseinc.github.io/report-nist-pubid/) during the public review period, built the [nist-pubid](https://github.com/metanorma/nist-pubid) conversion tool that migrated all 19,333 legacy identifiers, and assisted with the CSWP identifier migration when NIST moved from date-based to sequential numbering. + +The NIST PubID demonstrated that a well-designed identifier scheme can serve both human and machine needs simultaneously — a principle that PubID carries forward across all publishers. + + + +
+ +## What We Believe + +
+ +**PubID exists to preserve the integrity of meaning across every form a publication identifier can take — human or machine, verbose or terse, printed or digital.** + +
+ +- The **meaning** of an identifier is prior to and independent of any particular rendering +- **Human-readable** and **machine-readable** forms are equally valid expressions of the same reality +- **Round-trip fidelity** — parse any form, recover the original — is not just a feature but a philosophical commitment +- Every identifier carries **depth** that no single surface representation exhausts + +## The Name & Logo + +**PubID** stands for **Publication Identifier**. It is both a noun and a mission: to give every publication an identifier that is universally parsable, unambiguously structured, and faithful to the original meaning it represents. + +The logo is not decoration — it is a statement of philosophy: + +
+ PubID Logo +
+ +
+

道可道,非常道;名可名,非常名

+

The Way that can be spoken is not the eternal Way;
the name that can be named is not the eternal name.

+
+ +Every element encodes a layer of meaning: + +
+ +
+
+

The Pool

+

The pool is the Way: the original, complete meaning of a publication identifier. It is the source — the semantic model from which all representations emerge and to which they return. Its depths are profound and unfathomable; meaning exists there in its purest form, beyond any particular expression, the deep structure that no single rendering can fully capture. Every identifier, in every format, points back to the same underlying reality in this pool.

+
+ +
+
+

The Surface

+

The surface of the pool is where meaning begins to take name and form. It is the boundary between the unnameable and the named — where depth rises toward expression, where semantic models crystallize into identifiable structure. A name is real and necessary, yet it is never the thing itself.

+
+ +
+
+

Waves & Particles

+

The waves (human-readable identifiers) and particles (machine-readable forms) are 有 — being, manifest existence. Every representation is real and functional, yet no single form is constant. Human-readable strings and machine-readable URNs are two modes of the same 有 — both arising from the same source, both legitimate, neither permanent.

+
+ +
+
+

The Space Between

+

The emptiness between the waves and particles is 無 — non-being, the void. It is not absence but potential: the space that gives each form its meaning. Without the gaps, there is no structure; without 無, 有 has no shape. The void is what makes the identifier parsable — the delimiters, the spaces, the structure that separates one component from another.

+
+ +
+ +## Open Source + +PubID is proudly open source. + +- **GitHub**: [github.com/pubid](https://github.com/pubid) +- **Reference Implementation**: [github.com/metanorma/pubid](https://github.com/metanorma/pubid) +- **This Site**: [github.com/pubid/pubid.github.io](https://github.com/pubid/pubid.github.io) +- **Contributing**: New publisher schemas and features welcome + +*An open source project maintained by [Ribose](https://www.ribose.com)* + + diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..8ee7b14 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,74 @@ +import { defineConfig } from 'astro/config' +import starlight from '@astrojs/starlight' +import vue from '@astrojs/vue' +import mdx from '@astrojs/mdx' +import sitemap from '@astrojs/sitemap' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + site: 'https://www.pubid.com', + output: 'static', + trailingSlash: 'never', + integrations: [ + starlight({ + title: 'PubID', + logo: { src: './public/pubid-logo.svg', replacesTitle: true }, + social: [ + { label: 'GitHub', href: 'https://github.com/pubid/pubid.github.io', icon: 'github' }, + ], + sidebar: [ + { + label: 'Concepts', + items: [ + { label: 'Anatomy of a PubID', link: '/concepts/anatomy' }, + { label: 'The Metaschema', link: '/concepts/metaschema' }, + { label: 'Components', link: '/concepts/components' }, + { label: 'PubID Algebra', link: '/concepts/algebra' }, + { label: 'Relationships', link: '/concepts/relationships' }, + { label: 'URN Mapping', link: '/concepts/urn' }, + ], + }, + { + label: 'Library', + items: [ + { label: 'Installation', link: '/library/' }, + { label: 'Quick Start', link: '/library/quick-start' }, + { label: 'API Reference', link: '/library/api' }, + { label: 'Contributing', link: '/library/contributing' }, + ], + }, + { + label: 'Specifications', + items: [ + { label: 'Overview', link: '/specs/' }, + { label: 'ISO URN (RFC 5141-bis)', link: '/specs/iso-urn' }, + { label: 'IEC URN', link: '/specs/iec-urn' }, + ], + }, + { + label: 'Adopt', + items: [ + { label: 'Why Adopt PubID', link: '/adopt/' }, + { label: 'Design Guide', link: '/adopt/guide' }, + ], + }, + ], + customCss: ['./src/styles/global.css'], + }), + vue(), + mdx(), + sitemap(), + ], + vite: { + plugins: [tailwindcss()], + }, + markdown: { + shikiConfig: { + themes: { + light: 'github-light', + dark: 'github-dark', + }, + wrap: true, + }, + }, +}) diff --git a/lychee.toml b/lychee.toml new file mode 100644 index 0000000..b05a4f1 --- /dev/null +++ b/lychee.toml @@ -0,0 +1,23 @@ +# Lychee config for the Astro site +# Note: lychee 0.24.x deserializes many fields as strings (not ints/arrays). +# Reference: https://github.com/lycheeverse/lychee/blob/lychee-v0.24.2/lychee.example.toml + +method = "get" +user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0 Safari/537.36" + +[header] +accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + +# Infrastructure-pending URLs (regex, one per line). Excluded because they're +# correct links awaiting repo moves / blog restorations. +exclude_file = ".lycheeignore" + +# Timeouts (generous — some publisher sites are slow) +timeout = "20" +max_redirects = "10" + +# Use caching for repeat runs +cache = "true" + +include = "https?://" +no_progress = "true" diff --git a/package-lock.json b/package-lock.json index ce7d28d..df7a2c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,2672 +1,11806 @@ { - "name": "pubid.github.io", - "version": "1.0.0", + "name": "pubid-astro", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "pubid.github.io", - "version": "1.0.0", + "name": "pubid-astro", + "version": "0.1.0", + "dependencies": { + "@astrojs/mdx": "^7.0.2", + "@astrojs/rss": "^4.0.19", + "@astrojs/sitemap": "^3.7.3", + "@astrojs/starlight": "^0.41.3", + "@astrojs/vue": "^7.0.1", + "@fontsource-variable/fraunces": "^5.2.9", + "@fontsource-variable/inter-tight": "^5.2.7", + "@tailwindcss/typography": "^0.5.20", + "@tailwindcss/vite": "^4.3.2", + "astro": "^7.0.7", + "tailwindcss": "^4.3.2", + "vite": "^8.1.4", + "vue": "^3.5.39" + }, "devDependencies": { - "@asciidoctor/core": "^3.0.4", - "playwright-core": "^1.59.1", - "typescript": "^5.7.3", - "vitepress": "^1.6.4", - "vue": "^3.5.13" + "@astrojs/check": "^0.9.9", + "@testing-library/vue": "^8.1.0", + "@vitejs/plugin-vue": "^6.0.7", + "@vue/test-utils": "^2.4.11", + "happy-dom": "^20.10.6", + "typescript": "^6.0.3", + "vitest": "^4.1.10" } }, - "node_modules/@algolia/abtesting": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.17.0.tgz", - "integrity": "sha512-nuhHZdTiCtRzJEe9VSNzyqE9cOQMt01UWBzymFnjbgwrxxZpbGHQde6Oa/y9zyspTCjbUtb7Q5HQek1CLiLyeg==", + "node_modules/@astrojs/check": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.9.tgz", + "integrity": "sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" + "@astrojs/language-server": "^2.16.7", + "chokidar": "^4.0.3", + "kleur": "^4.1.5", + "yargs": "^17.7.2" }, - "engines": { - "node": ">= 14.0.0" + "bin": { + "astro-check": "bin/astro-check.js" + }, + "peerDependencies": { + "typescript": "^5.0.0 || ^6.0.0" } }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", - "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "node_modules/@astrojs/check/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", - "@algolia/autocomplete-shared": "1.17.7" + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", - "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "node_modules/@astrojs/check/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" + "engines": { + "node": ">= 14.18.0" }, - "peerDependencies": { - "search-insights": ">= 1 < 3" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", - "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "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.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.3.1.tgz", + "integrity": "sha512-DaAUj29AIBU2XdJ8uwcab8lW5O2pk9pY8AXkcMw0sw77nVa3oeTYRcO+Dvbbpoexf6ThMc0FMWYCQ/wN1/T7oQ==", "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" + "engines": { + "node": "^20.19.0 || >=22.12.0" }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" + "optionalDependencies": { + "@astrojs/compiler-binding-darwin-arm64": "0.3.1", + "@astrojs/compiler-binding-darwin-x64": "0.3.1", + "@astrojs/compiler-binding-linux-arm64-gnu": "0.3.1", + "@astrojs/compiler-binding-linux-arm64-musl": "0.3.1", + "@astrojs/compiler-binding-linux-x64-gnu": "0.3.1", + "@astrojs/compiler-binding-linux-x64-musl": "0.3.1", + "@astrojs/compiler-binding-wasm32-wasi": "0.3.1", + "@astrojs/compiler-binding-win32-arm64-msvc": "0.3.1", + "@astrojs/compiler-binding-win32-x64-msvc": "0.3.1" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-arm64": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.3.1.tgz", + "integrity": "sha512-IEmEF2fUIlTHtpeE/isyEGVOB14cEyh/LZOFYt6wn3jNyVpdC8aR5OZ+RzFUR/f+8ZDM1LaMwZKvoA7eMyJeFw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", - "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", - "dev": true, + "node_modules/@astrojs/compiler-binding-darwin-x64": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.3.1.tgz", + "integrity": "sha512-GF2kIxjpPDLsn94zbZNMsxEmkU828QqnmM7kiQJnaooS3jmI+I7kk6+oI6EpwOsK3femCMdcm+wmOsEqtGrmjQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@algolia/client-abtesting": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.51.0.tgz", - "integrity": "sha512-PKrKlIla1U2J7mFcIQn6N3pWP4oySmkxShnbbDsj/H7818gKbET5KsUwsVoNjWIxHKTJMCTcQ7ekAJ8Ea23NMg==", - "dev": true, + "node_modules/@astrojs/compiler-binding-linux-arm64-gnu": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.3.1.tgz", + "integrity": "sha512-XJL3SDmOtVrqFhCirNcHwE91+IesJqlgNo23I4qW9QUYfwzm/TBZuH61fgqsb1ttgR1mMYz6ooPWs0JDhwMqpQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@algolia/client-analytics": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.51.0.tgz", - "integrity": "sha512-U+HCY1K16Km91pIRL1kN6bW6BbGFAF/WhkRSCx4wyl1aFpbrlhSFQs/dAwWbmyBiHWwVWhl7stWHQ1pum5EfMw==", - "dev": true, + "node_modules/@astrojs/compiler-binding-linux-arm64-musl": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.3.1.tgz", + "integrity": "sha512-xqE8BVbDoBueK/B47w30PtkVofUWJKGkwoMVE+EOMLf11rnoANxIAdA9FPqY+rng4oNI5ndHGsri1yPj2k8vZQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@algolia/client-common": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.51.0.tgz", - "integrity": "sha512-YPJ3dEuZLCRp846Az94t6Z2gwSNRazP+SmBco7p6SCa4fYrtIE820PDXYZshbNrj2Z8Qfbmv7BQ1Lecl5L3G/w==", - "dev": true, + "node_modules/@astrojs/compiler-binding-linux-x64-gnu": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.3.1.tgz", + "integrity": "sha512-1y0StU1qiCuDFH3rmbRJXcxdfHxFPrES1Rd+RLffosvUR7I2cH5SF5SFnBN9vXpzpkmyElZm3Yr47iJBPN7vVA==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@algolia/client-insights": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.51.0.tgz", - "integrity": "sha512-/gEwLlR7fQ7YjOW+ADRZ0NxLDtpTC61FSzlZ01Gdl1kTJfU0Rq3Y/TYqwxGxlQGcUiXtGzrpjxXWh3Y0TZD6NA==", - "dev": true, + "node_modules/@astrojs/compiler-binding-linux-x64-musl": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.3.1.tgz", + "integrity": "sha512-16q0fYf7kpbmdObZEeZJEup8hQv/whgNwVjrSvT8umrKwLDSnNIWiQpm09lQQu6bweZB0XyIvHwlPitvJhC+hg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@algolia/client-personalization": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.51.0.tgz", - "integrity": "sha512-nRwUN1Y2cKyOAFZyIBagkEfZSIhP05nWhT4Rjwl84lcjECssYggftrAODrZ4leakXxSGjhxs/AdaAFEIBqwVFA==", - "dev": true, + "node_modules/@astrojs/compiler-binding-wasm32-wasi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.3.1.tgz", + "integrity": "sha512-cB456shIwDv/PrVT+2QG7LFndpHkVge5HjqADKZgGaAc9JHVktCtjSrcdkRQ+3tbkPazNKaTLRjXLIiz2NIx9g==", + "cpu": [ + "wasm32" + ], "license": "MIT", + "optional": true, "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" + "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { - "node": ">= 14.0.0" + "node": ">=14.0.0" } }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.51.0.tgz", - "integrity": "sha512-pybzYCG7VoQKppo+z5iZOKpW8XqtFxhsAIRgEaNboCnfypKukiBHJAwB+pmr7vMZXBsOHwklGYWwCG82e8qshA==", - "dev": true, + "node_modules/@astrojs/compiler-binding-win32-arm64-msvc": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.3.1.tgz", + "integrity": "sha512-ur/9+If/yTE69mmeX5MqSZndL0HOyx67GeNZUy3N7wVdWpLz9UTJXwyWS4UR2PUQHitghjsM5xoX0Ge56WRVQQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 14.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@algolia/client-search": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.51.0.tgz", - "integrity": "sha512-DWVIlj6RqcvdhwP0gBU9OpOQPnHdcAk9jlT+z8rsNb2+liWv4eUlfQZ7saGBraFsnygEHD3PtdppIHvqwBAb5w==", - "dev": true, + "node_modules/@astrojs/compiler-binding-win32-x64-msvc": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.3.1.tgz", + "integrity": "sha512-k0W+kDBzDkNZOqu4kElDvCOIbKw5Ut9S1WZ1Krj3KTgNuBERNKXsMMsRLLcbgfdMdbe7bTekQLshZrrvmYpmwA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 14.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@algolia/ingestion": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.51.0.tgz", - "integrity": "sha512-bA25s12iUDJi/X8M7tWlPRT8GeOhls/yDbdoUqinz27lNqsOlcM1UrAxIKdIZ6lm3sXit+ewPIz1pS2x6rXu8g==", - "dev": true, + "node_modules/@astrojs/compiler-rs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.3.1.tgz", + "integrity": "sha512-aT7xkgsbNoS6nriY5qKpbihK43slFHO41iqgHCTdOvn1ifaQxLCc5yXy+6GzAtiafoaC1zA7OwVXCXMsvUZOkg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" + "@astrojs/compiler-binding": "0.3.1" }, "engines": { - "node": ">= 14.0.0" + "node": ">=22.12.0" } }, - "node_modules/@algolia/monitoring": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.51.0.tgz", - "integrity": "sha512-zj+RcE5e0NE0/ew6oEOTgOplPHry+w2oi7h0Y87lhdq4E0d7xLS31KVB8kKfCGkrG7AYtZvrcyvLOKS5d0no4Q==", + "node_modules/@astrojs/internal-helpers": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.1.tgz", + "integrity": "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.1.1", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "node_modules/@astrojs/language-server": { + "version": "2.16.12", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.12.tgz", + "integrity": "sha512-3LpFphBCzveUgm5ZVDINB/v3YA4TgPa1EMOEFn3Zt/Ww6jojR25iN+kmzeUz7v/b9xkmq+hMACTX4hizN3VCEQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" + "@astrojs/compiler": "^2.13.1", + "@astrojs/yaml2ts": "^0.2.4", + "@jridgewell/sourcemap-codec": "^1.5.5", + "@volar/kit": "~2.4.28", + "@volar/language-core": "~2.4.28", + "@volar/language-server": "~2.4.28", + "@volar/language-service": "~2.4.28", + "muggle-string": "^0.4.1", + "tinyglobby": "^0.2.16", + "volar-service-css": "0.0.71", + "volar-service-emmet": "0.0.71", + "volar-service-html": "0.0.71", + "volar-service-prettier": "0.0.71", + "volar-service-typescript": "0.0.71", + "volar-service-typescript-twoslash-queries": "0.0.71", + "volar-service-yaml": "0.0.71", + "vscode-html-languageservice": "^5.6.2", + "vscode-uri": "^3.1.0" }, - "engines": { - "node": ">= 14.0.0" + "bin": { + "astro-ls": "bin/nodeServer.js" + }, + "peerDependencies": { + "prettier": "^3.0.0", + "prettier-plugin-astro": ">=0.11.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + } } }, - "node_modules/@algolia/recommend": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.51.0.tgz", - "integrity": "sha512-/HDgccfye1Rq3bPxaSCsvSEBHzSMmtpM9ZRGRtAuC62Cv+ql/76IWnxjGTDXtqIJ+/j7ZlFYAzq9fkp95wF2SQ==", - "dev": true, + "node_modules/@astrojs/markdown-remark": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.1.tgz", + "integrity": "sha512-jPVNIqTvk+yKviikszv/Y1U4jGUSKpp/Nw48QZV4qjWgp70j4Lkq3lhSDRbWwCfgKvEyO9GHuVbV1dM2WYXy1w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" + "@astrojs/internal-helpers": "0.10.1", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/markdown-satteri": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.3.tgz", + "integrity": "sha512-Lje33Ittd8UQGgbIIWQvhPkj5X5c4b1sZnZWX3JQV/AWpfbuQGxVi2ONt6+ScydcwfR4egilslEWyczMclrJ1g==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.1", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.9.1" + } + }, + "node_modules/@astrojs/mdx": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-7.0.2.tgz", + "integrity": "sha512-l+sJY5U1KkGZUdr+bIL4Y6BefeS549qoSHVSkUSs6A9INwdCND+/0+vN0NroPBXwl5Vcg5u78t7VQRsJjePxbw==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.1", + "@astrojs/markdown-remark": "7.2.1", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.16.0", + "es-module-lexer": "^2.0.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" }, "engines": { - "node": ">= 14.0.0" + "node": ">=22.12.0" + }, + "peerDependencies": { + "@astrojs/markdown-satteri": "^0.3.1", + "astro": "^7.0.0" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-satteri": { + "optional": true + } } }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.51.0.tgz", - "integrity": "sha512-nJdW+WBwGlXWMJbxxB7/AJPvNq0lLJSudXmIQCJbmH8jsOXQhRpAtoCD4ceLyJKv3ze9JbQu4Gqu5JDLckuFcw==", - "dev": true, + "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": { - "@algolia/client-common": "5.51.0" + "prismjs": "^1.30.0" }, "engines": { - "node": ">= 14.0.0" + "node": ">=22.12.0" } }, - "node_modules/@algolia/requester-fetch": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.51.0.tgz", - "integrity": "sha512-bsBgRI/1h1mjS3eCyfGau78yGZVmiDLmT1aU6dMnk75/T0SgKqnSKNpQ53xKoDYVChGDcNnpHXWpoUSo8MH1+w==", - "dev": true, + "node_modules/@astrojs/rss": { + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@astrojs/rss/-/rss-4.0.19.tgz", + "integrity": "sha512-e+z5wYeYtffQdHQO8c2tkSd2JEBdAuRXJV4ZEU5IxkYeE6e39woDd7nw1PH1Kk2tEYNCYuKdylnnbhGmt61awA==", + "license": "MIT", + "dependencies": { + "fast-xml-parser": "^5.5.7", + "piccolore": "^0.1.3", + "zod": "^4.3.6" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.3.tgz", + "integrity": "sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==", + "license": "MIT", + "dependencies": { + "sitemap": "^9.0.0", + "stream-replace-string": "^2.0.0", + "zod": "^4.3.6" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.41.3.tgz", + "integrity": "sha512-8xsG6UpK581TJmtOc7/pnxHKEbP16rV06VLWaVa7FOyE/VEwnaHOsLtL+miifCEfuiuv0Wn+j8u3JSluRQesMQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.51.0" + "@astrojs/markdown-satteri": "^0.3.2", + "@astrojs/mdx": "^7.0.0", + "@astrojs/sitemap": "^3.7.2", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.44.0", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.3", + "hast-util-select": "^6.0.4", + "hast-util-to-string": "^3.0.1", + "hastscript": "^9.0.1", + "i18next": "^26.0.7", + "js-yaml": "^4.1.1", + "klona": "^2.0.6", + "magic-string": "^0.30.21", + "mdast-util-directive": "^3.1.0", + "mdast-util-to-markdown": "^2.1.2", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.5.2", + "rehype": "^13.0.2", + "rehype-format": "^5.0.1", + "remark-directive": "^4.0.0", + "satteri": "^0.9.1", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" }, - "engines": { - "node": ">= 14.0.0" + "peerDependencies": { + "@astrojs/markdown-remark": "^7.2.0", + "astro": "^7.0.2" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } } }, - "node_modules/@algolia/requester-node-http": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.51.0.tgz", - "integrity": "sha512-zPrIDVPpmKWgrjmWOqpqrhqAhNjvVkjoj+mqw2NBPxEOuKNzP0H+Qz5NJLLTOepBVj1UFedFaF3AUgxLsB9ukQ==", - "dev": true, + "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": { - "@algolia/client-common": "5.51.0" + "ci-info": "^4.4.0", + "dset": "^3.1.4", + "is-docker": "^4.0.0", + "package-manager-detector": "^1.6.0" }, "engines": { - "node": ">= 14.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, - "node_modules/@asciidoctor/core": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-3.0.4.tgz", - "integrity": "sha512-41SDMi7iRRBViPe0L6VWFTe55bv6HEOJeRqMj5+E5wB1YPdUPuTucL4UAESPZM6OWmn4t/5qM5LusXomFUVwVQ==", - "dev": true, + "node_modules/@astrojs/vue": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@astrojs/vue/-/vue-7.0.1.tgz", + "integrity": "sha512-DHTZ1QKlLZ8ZSrqmQ7KMjsyGLitgLYM9ynFRc55ZKr9Jrb6yIuVRRRHbzsqXXI87oc3dwObxEhEaWPgJe7Dq/w==", "license": "MIT", "dependencies": { - "@asciidoctor/opal-runtime": "3.0.1", - "unxhr": "1.2.0" + "@vitejs/plugin-vue": "^6.0.5", + "@vitejs/plugin-vue-jsx": "^5.1.5", + "@vue/compiler-sfc": "^3.5.30", + "vite": "^8.0.13", + "vite-plugin-vue-devtools": "^8.1.0" }, "engines": { - "node": ">=16", - "npm": ">=8" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^7.0.0", + "vue": "^3.5.24" } }, - "node_modules/@asciidoctor/opal-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@asciidoctor/opal-runtime/-/opal-runtime-3.0.1.tgz", - "integrity": "sha512-iW7ACahOG0zZft4A/4CqDcc7JX+fWRNjV5tFAVkNCzwZD+EnFolPaUOPYt8jzadc0+Bgd80cQTtRMQnaaV1kkg==", + "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": { - "glob": "8.1.0", - "unxhr": "1.2.0" + "yaml": "^2.8.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=16" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, "engines": { "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "dev": true, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@docsearch/css": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", - "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docsearch/js": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", - "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", - "dev": true, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "license": "MIT", "dependencies": { - "@docsearch/react": "3.8.2", - "preact": "^10.0.0" + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@docsearch/react": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", - "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", - "dev": true, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-core": "1.17.7", - "@algolia/autocomplete-preset-algolia": "1.17.7", - "@docsearch/css": "3.8.2", - "algoliasearch": "^5.14.2" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" + "engines": { + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "license": "MIT", - "optional": true, - "os": [ - "aix" - ], "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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" + } + }, + "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" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz", + "integrity": "sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-decorators": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz", + "integrity": "sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.5.tgz", + "integrity": "sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "darwin" + ] }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "node_modules/@bruits/satteri-darwin-x64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.5.tgz", + "integrity": "sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "darwin" + ] }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.9.5.tgz", + "integrity": "sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA==", "cpu": [ - "arm" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.9.5.tgz", + "integrity": "sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.5.tgz", + "integrity": "sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==", "cpu": [ - "ia32" + "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.9.5.tgz", + "integrity": "sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==", "cpu": [ - "loong64" + "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.5.tgz", + "integrity": "sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ==", "cpu": [ - "mips64el" + "wasm32" ], - "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, "engines": { - "node": ">=12" + "node": ">=14.0.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.9.5.tgz", + "integrity": "sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg==", "cpu": [ - "s390x" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "win32" + ] }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "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" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ], + "win32" + ] + }, + "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" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, "engines": { - "node": ">=12" + "node": ">= 20.12.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@clack/core": "1.4.3", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, "engines": { - "node": ">=12" + "node": ">= 20.12.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], "engines": { - "node": ">=12" + "node": ">=14" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/@emmetio/abbreviation": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", + "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@emmetio/scanner": "^1.0.4" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/@emmetio/css-abbreviation": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", + "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@emmetio/scanner": "^1.0.4" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/@emmetio/css-parser": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.1.tgz", + "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@emmetio/stream-reader": "^2.2.0", + "@emmetio/stream-reader-utils": "^0.1.0" } }, - "node_modules/@iconify-json/simple-icons": { - "version": "1.2.80", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.80.tgz", - "integrity": "sha512-iglncJJ6X/dVuzFDU32MrHwwo4RBwivGf108dgyYg+HKS78ifx0h7sTenpDZMVT+UhdS6CSgZcvY/SvRXlIEUg==", + "node_modules/@emmetio/html-matcher": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", + "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", "dev": true, - "license": "CC0-1.0", + "license": "ISC", "dependencies": { - "@iconify/types": "*" + "@emmetio/scanner": "^1.0.0" } }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", "dev": true, "license": "MIT" }, - "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==", + "node_modules/@emmetio/stream-reader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", + "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==", "dev": true, "license": "MIT" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "node_modules/@emmetio/stream-reader-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", + "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ - "arm" + "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "android" - ] + "aix" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ - "arm64" + "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" - ] + "android" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" - ] + "android" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" - ] + "darwin" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" - ] + "darwin" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ - "arm" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ] + "freebsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ - "arm" + "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ] + "freebsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ - "arm64" + "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ - "loong64" + "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ - "ppc64" + "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ - "riscv64" + "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ - "s390x" + "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ - "x64" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ] + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ] + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "openharmony" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ - "arm64" + "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" - ] + "sunos" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ - "ia32" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ - "x64" + "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", - "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", - "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^3.1.0" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", - "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", - "dev": true, + "node_modules/@expressive-code/core": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.44.0.tgz", + "integrity": "sha512-xgiF2P6tYUbrhi3+x0S8xHZWT1t3Bvb3U91tAtRbLb9HLejLvYc5GZUqKICKLaUN4iSGhhNJu2fM/aH8e5yCMg==", "license": "MIT", "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2" + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" } }, - "node_modules/@shikijs/langs": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", - "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", - "dev": true, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.44.0.tgz", + "integrity": "sha512-V6M6+zVc1GzqCvXkQHc2m5rcFOIVzJgMq5gnfrMnVf2gwtj/sg4H93c1f/mGeqHycubwkHFUDyParAOiGeDZeA==", "license": "MIT", "dependencies": { - "@shikijs/types": "2.5.0" + "@expressive-code/core": "^0.44.0" } }, - "node_modules/@shikijs/themes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", - "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", - "dev": true, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.44.0.tgz", + "integrity": "sha512-RZsdaqlbGqyAQKuoX4myQXxjmiE2l5KBpJ/gKPh62tCdIdpWyjbzVqSo8+5XsezZxkfi8AJ/J6EUaBTPROFX/Q==", "license": "MIT", "dependencies": { - "@shikijs/types": "2.5.0" + "@expressive-code/core": "^0.44.0", + "shiki": "^4.0.2" } }, - "node_modules/@shikijs/transformers": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", - "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", - "dev": true, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.44.0.tgz", + "integrity": "sha512-0/m3A5b+lz2upyNq+wzZ1S69HRoJmyFs5LsR42lVZ9pmGRlBiSBYQpvqlji4DBj1+Riamxc0AvcCr5kuzOQeWA==", "license": "MIT", "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/types": "2.5.0" + "@expressive-code/core": "^0.44.0" } }, - "node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "node_modules/@fontsource-variable/fraunces": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@fontsource-variable/fraunces/-/fraunces-5.2.9.tgz", + "integrity": "sha512-Y6IjunlN9Ni723np+GIgAaKzCDBrPRrqNi01TZxHs5wtHYROWFM9W6yiT+/gGwSjWIRD18oX17kD/BRWekc/Lw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" } }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" + "node_modules/@fontsource-variable/inter-tight": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter-tight/-/inter-tight-5.2.7.tgz", + "integrity": "sha512-uU0qW9vlzVQQv8GVrhn8SlNl2A44C0CE9IC6N9P0D9mwhmJcg8UF/fxvmdRayDPlMAnYqxlXtYENDIeZyVvxkg==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" } }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dev": true, + "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", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" + "optional": true, + "engines": { + "node": ">=18" } }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" + "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==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.2" } }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", - "dev": true, - "license": "MIT", + "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==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">=20.9.0" }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.2" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.33.tgz", - "integrity": "sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==", - "dev": true, - "license": "MIT", + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz", + "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.33", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz", - "integrity": "sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.33", - "@vue/shared": "3.5.33" + "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==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.33.tgz", - "integrity": "sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/compiler-core": "3.5.33", - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.10", - "source-map-js": "^1.2.1" + "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==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.33.tgz", - "integrity": "sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/shared": "3.5.33" + "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==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@vue/devtools-api": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", - "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.9" + "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==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", - "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "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==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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==", + "cpu": [ + "arm" + ], + "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.2" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "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.2" + } + }, + "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" + ], + "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.2" + } + }, + "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==", + "cpu": [ + "riscv64" + ], + "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.2" + } + }, + "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==", + "cpu": [ + "s390x" + ], + "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.2" + } + }, + "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" + ], + "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.2" + } + }, + "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" + ], + "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.2" + } + }, + "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" + ], + "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.2" + } + }, + "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-webcontainers-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz", + "integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "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" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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" + ], + "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/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "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==", + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@nodable/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true, + "license": "MIT" + }, + "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.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", + "integrity": "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz", + "integrity": "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.5.2.tgz", + "integrity": "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==", + "license": "MIT" + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", + "integrity": "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz", + "integrity": "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz", + "integrity": "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz", + "integrity": "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@shikijs/core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", + "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.3.1", + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", + "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", + "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", + "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", + "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", + "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", + "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "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/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", + "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "5.21.6", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", + "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-x64": "4.3.2", + "@tailwindcss/oxide-freebsd-x64": "4.3.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-x64-musl": "4.3.2", + "@tailwindcss/oxide-wasm32-wasi": "4.3.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", + "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", + "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", + "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", + "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", + "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", + "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", + "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", + "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", + "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", + "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", + "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", + "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.20.tgz", + "integrity": "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", + "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.2", + "@tailwindcss/oxide": "4.3.2", + "tailwindcss": "4.3.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/vue": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/vue/-/vue-8.1.0.tgz", + "integrity": "sha512-ls4RiHO1ta4mxqqajWRh8158uFObVrrtAPoxk7cIp4HrnQUj/ScKzqz53HxYpG3X6Zb7H2v+0eTGLSoy8HQ2nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@testing-library/dom": "^9.3.3", + "@vue/test-utils": "^2.4.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@vue/compiler-sfc": ">= 3", + "vue": ">= 3" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "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": "*" + } + }, + "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": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "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": "*" + } + }, + "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": "*" + } + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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/@vitejs/plugin-vue": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", + "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-5.1.6.tgz", + "integrity": "sha512-YXvi4as2clxt6DFw5+a0tTA97ntiQXm/raR8ofNj3aNwwdlVGTiG2gp7EvfZW17P50acL/9bP0ccF4XnqNmlgA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-syntax-typescript": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7", + "@rolldown/pluginutils": "^1.0.1", + "@vue/babel-plugin-jsx": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.10", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "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/pretty-format": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@volar/kit": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", + "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "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": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/language-server": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", + "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/language-service": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", + "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "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": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper/node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-2.0.1.tgz", + "integrity": "sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==", + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-2.0.1.tgz", + "integrity": "sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@vue/babel-helper-vue-transform-on": "2.0.1", + "@vue/babel-plugin-resolve-type": "2.0.1", + "@vue/shared": "^3.5.22" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-2.0.1.tgz", + "integrity": "sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.4", + "@vue/compiler-sfc": "^3.5.22" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.39.tgz", + "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.39", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz", + "integrity": "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.39.tgz", + "integrity": "sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.39", + "@vue/compiler-dom": "3.5.39", + "@vue/compiler-ssr": "3.5.39", + "@vue/shared": "3.5.39", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.39.tgz", + "integrity": "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/devtools-core": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.1.5.tgz", + "integrity": "sha512-5e5jQOEssCdZA1wlFEUkIDtb+cAOWuLNWJ52fm4PBWbF7e3oTnM2fneaL42E5lJoolAaUQ678tv/XEb3h4e86Q==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.5", + "@vue/devtools-shared": "^8.1.5" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.5.tgz", + "integrity": "sha512-FcSAxsi4eWuXLCB7Rv9lj0aIVHHPNVQ2BazGf4RJTc2JCqb4BQg0hk87ZFhminCfl+mD5OUI0rX2cgyu4kJOGA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.5", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.5.tgz", + "integrity": "sha512-mhT4zcPFhF+Xk1O4BfhhrbXzpmfqY03fS6xGpcllbQG7lDjhQf8pQHcTIhqQIYx1hfwtHmk/6jM96ele0UxPqQ==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.39.tgz", + "integrity": "sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.39.tgz", + "integrity": "sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.39.tgz", + "integrity": "sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.39", + "@vue/runtime-core": "3.5.39", + "@vue/shared": "3.5.39", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.39.tgz", + "integrity": "sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.39", + "@vue/shared": "3.5.39" + }, + "peerDependencies": { + "vue": "3.5.39" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.39.tgz", + "integrity": "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==", + "license": "MIT" + }, + "node_modules/@vue/test-utils": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.11.tgz", + "integrity": "sha512-GDqaqZsA6m2E5vNzej0aYiIb6BX8xV9pNSbbbXKOfEYwg7ZNblVX8suyqmUBThq8VIrgAJNxn+z72hVtUeiWHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-beautify": "^1.14.9", + "vue-component-type-helpers": "^3.0.0" + }, + "peerDependencies": { + "@vue/compiler-dom": "3.x", + "@vue/server-renderer": "3.x", + "vue": "3.x" + }, + "peerDependenciesMeta": { + "@vue/server-renderer": { + "optional": true + } + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-i18n": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz", + "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.0-beta.0" + } + }, + "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" + }, + "bin": { + "am-i-vibing": "dist/cli.mjs" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.3.1.tgz", + "integrity": "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "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", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/anynum": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "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" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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" + } + }, + "node_modules/astro": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/astro/-/astro-7.0.7.tgz", + "integrity": "sha512-swqrKDSI/B83GFroYPZYMFcxqbSe9+tkynu1WDBk3GLgBfV9++qVM4Z+2uFT6uu9A53Q0TROnxLketfMEENuqQ==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler-rs": "^0.3.0", + "@astrojs/internal-helpers": "0.10.1", + "@astrojs/markdown-satteri": "0.3.3", + "@astrojs/telemetry": "3.3.3", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "am-i-vibing": "^0.4.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^1.1.1", + "devalue": "^5.8.1", + "diff": "^8.0.3", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.28.0", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.1.1", + "jsonc-parser": "^3.3.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.4", + "semver": "^7.7.4", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "svgo": "^4.0.1", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", + "tinyglobby": "^0.2.15", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.4", + "unstorage": "^1.17.5", + "vite": "^8.0.13", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.3.6" + }, + "bin": { + "astro": "bin/astro.mjs" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0 || ^0.35.0" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "7.2.1" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "node_modules/astro-expressive-code": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.44.0.tgz", + "integrity": "sha512-b1wN/ZvbJprzxlGKIpIes2kQrCY5KRLwys2tWbZAZyjGZcW5ZtgneZnBwzNRiBna9/48d4mQl19KLjcRuhO1hw==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.44.0", + "url-extras": "^0.1.0" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" + } + }, + "node_modules/astro/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.43", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz", + "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcp-47": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.1.tgz", + "integrity": "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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": "2.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", + "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", + "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001803", + "electron-to-chromium": "^1.5.389", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-image-size": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/buffer-image-size/-/buffer-image-size-0.6.4.tgz", + "integrity": "sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001805", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz", + "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "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": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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" + } + }, + "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" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "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", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "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", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "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/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "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" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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" + } + }, + "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" + } + }, + "node_modules/devalue": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", + "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "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", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/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" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "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" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "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", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "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" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/editorconfig": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "^9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.389", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", + "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", + "license": "ISC" + }, + "node_modules/emmet": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", + "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "./packages/scanner", + "./packages/abbreviation", + "./packages/css-abbreviation", + "./" + ], + "dependencies": { + "@emmetio/abbreviation": "^2.3.3", + "@emmetio/css-abbreviation": "^2.1.8" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "url": "https://opencollective.com/unified" + } + }, + "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", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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" + } + }, + "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/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/expressive-code": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.44.0.tgz", + "integrity": "sha512-JXVWVNCKlLuZLMQH8cOiDUSosT0Bb+elwE/dbAkpwFwDFmyFyWlECoWZIohh2FkIF1iI67TQJ+Ts9k7oNDh2qA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.0", + "@expressive-code/plugin-frames": "^0.44.0", + "@expressive-code/plugin-shiki": "^0.44.0", + "@expressive-code/plugin-text-markers": "^0.44.0" + } + }, + "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/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==", + "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" + } + }, + "node_modules/fast-uri": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", + "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "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" + } + }, + "node_modules/fast-xml-builder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz", + "integrity": "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.10.0.tgz", + "integrity": "sha512-SLhnTEqE5QpJHq/6zl9bsmImEP2adv+y6Wy+cJa7nVTRzQh1OZfCe9k29M5xN74LWnu0xa1zrUrq3KnOKl92Fg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.2.0", + "fast-xml-builder": "^1.2.0", + "is-unsafe": "^2.0.0", + "path-expression-matcher": "^1.6.2", + "strnum": "^2.4.1", + "xml-naming": "^0.3.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "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" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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" + } + }, + "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" + } + }, + "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" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "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", + "crossws": "^0.3.5", + "defu": "^6.1.6", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/happy-dom": { + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.10.6.tgz", + "integrity": "sha512-6QD0ilzDDt93tX44y8tbmZdAcdTRYDhUP+Asgi6pC8Pp5IA3cvaZGyoVN/EGtlq9ziT65iPuBBn3ASLr6hCgVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": ">=20.0.0", + "@types/whatwg-mimetype": "^3.0.2", + "@types/ws": "^8.18.1", + "buffer-image-size": "^0.6.4", + "entities": "^7.0.1", + "whatwg-mimetype": "^3.0.0", + "ws": "^8.21.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/happy-dom/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/i18next": { + "version": "26.3.6", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.3.6.tgz", + "integrity": "sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==", + "funding": [ + { + "type": "individual", + "url": "https://www.locize.com/i18next" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + }, + { + "type": "individual", + "url": "https://www.locize.com" + } + ], + "license": "MIT", + "peerDependencies": { + "typescript": "^5 || ^6 || ^7" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "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/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unsafe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.0.tgz", + "integrity": "sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-beautify": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-cookie": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", + "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "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/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "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", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.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-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", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "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-mdx-expression": "^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" + } + }, + "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", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^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", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "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" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "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", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "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" + } + }, + "node_modules/micromark-util-encode": { + "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", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "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", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@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/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": { + "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", + "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-resolve-all": { + "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", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "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", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^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==", + "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-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "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", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "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==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "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/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "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-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.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.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==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "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==", + "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==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", + "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.1.tgz", + "integrity": "sha512-POWdiIPmsUPGwb4FeQ4OBg46aqmcInSWe45CKDsGHiOBiVQM9chqfQTuqhuTzcg2Vz9faTI65at0KkVyVEiCHw==", + "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-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz", + "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==", + "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" + } + }, + "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/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==", + "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==", + "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" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "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, + "license": "MIT" + }, + "node_modules/path-expression-matcher": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "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.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.17.tgz", + "integrity": "sha512-J7EF+8X+CzRPaJPOv9Ck2wNWJvGnnl3PcNPAdGg6GTLjyVpyQ0yATMSXRFRV01BviT/9Gwuc3rjEyJbDJG9a4w==", + "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": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prettier": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz", + "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=18.0.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", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "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==", + "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/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@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/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.44.0.tgz", + "integrity": "sha512-5r74C5F2sMR3X+QJH8OKWgZBO/cqRw5W1fLT6GVlSfLqepk+4j8tGFkyPqZYWjwntsBHzKPDH2zI68sZ7ScLfA==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.44.0" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "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", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "license": "MIT", + "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/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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "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" + } + }, + "node_modules/remark-mdx": { + "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" + } + }, + "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==", + "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" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "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_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==", + "license": "MIT", + "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/request-light": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.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==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@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/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "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" + } + }, + "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==", + "license": "MIT", + "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/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==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/satteri": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", + "integrity": "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "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.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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", + "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 + } + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz", + "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.3.1", + "@shikijs/engine-javascript": "4.3.1", + "@shikijs/engine-oniguruma": "4.3.1", + "@shikijs/langs": "4.3.1", + "@shikijs/themes": "4.3.1", + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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/sitemap": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", + "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^24.9.2", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/esm/cli.js" + }, + "engines": { + "node": ">=20.19.5", + "npm": ">=10.8.2" + } + }, + "node_modules/smol-toml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", + "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "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" + } + }, + "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" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "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/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strnum": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz", + "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "anynum": "^1.0.1" + } + }, + "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" + } + }, + "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" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz", + "integrity": "sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", + "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyclip": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", + "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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", + "optional": true + }, + "node_modules/typesafe-path": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-auto-import-cache": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz", + "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.8" + } + }, + "node_modules/typescript-auto-import-cache/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "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", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "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", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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": { - "@vue/devtools-shared": "^7.7.9", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", - "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", - "dev": true, + "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": { - "rfdc": "^1.4.1" + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@vue/reactivity": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.33.tgz", - "integrity": "sha512-p8UfIqyIhb0rYGlSgSBV+lPhF2iUSBcRy7enhTmPqKWadHy9kcOFYF1AejYBP9P+avnd3OBbD49DU4pLWX/94A==", - "dev": true, + "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": { - "@vue/shared": "3.5.33" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@vue/runtime-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.33.tgz", - "integrity": "sha512-UpFF45RI9//a7rvq7RdOQblb4tup7hHG9QsmIrxkFQLzQ7R8/iNQ5LE15NhLZ1/WcHMU2b47u6P33CPUelHyIQ==", - "dev": true, + "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": { - "@vue/reactivity": "3.5.33", - "@vue/shared": "3.5.33" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.33.tgz", - "integrity": "sha512-IOxMsAOwquhfITgmOgaPYl7/j8gKUxUFoflRc+u4LxyD3+783xne8vNta1PONVCvCV9A0w7hkyEepINDqfO0tw==", - "dev": true, + "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": { - "@vue/reactivity": "3.5.33", - "@vue/runtime-core": "3.5.33", - "@vue/shared": "3.5.33", - "csstype": "^3.2.3" + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@vue/server-renderer": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.33.tgz", - "integrity": "sha512-0xylq/8/h44lVG0pZFknv1XIdEgymq2E9n59uTWJBG+dIgiT0TMCSsxrN7nO16Z0MU0MPjFcguBbZV8Itk52Hw==", - "dev": true, + "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": { - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33" + "@types/unist": "^3.0.0" }, - "peerDependencies": { - "vue": "3.5.33" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@vue/shared": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.33.tgz", - "integrity": "sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==", - "dev": true, - "license": "MIT" + "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", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/@vueuse/core": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", - "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", - "dev": true, + "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/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@vueuse/integrations": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", - "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", - "dev": true, + "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": { - "@vueuse/core": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.2.tgz", + "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "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", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7" + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" }, "peerDependenciesMeta": { - "async-validator": { + "@azure/app-configuration": { "optional": true }, - "axios": { + "@azure/cosmos": { "optional": true }, - "change-case": { + "@azure/data-tables": { "optional": true }, - "drauu": { + "@azure/identity": { "optional": true }, - "focus-trap": { + "@azure/keyvault-secrets": { "optional": true }, - "fuse.js": { + "@azure/storage-blob": { "optional": true }, - "idb-keyval": { + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { "optional": true }, - "jwt-decode": { + "aws4fetch": { "optional": true }, - "nprogress": { + "db0": { "optional": true }, - "qrcode": { + "idb-keyval": { "optional": true }, - "sortablejs": { + "ioredis": { "optional": true }, - "universal-cookie": { + "uploadthing": { "optional": true } } }, - "node_modules/@vueuse/metadata": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", - "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "node_modules/unstorage/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/@vueuse/shared": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", - "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", - "dev": true, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "vue": "^3.5.13" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/algoliasearch": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.51.0.tgz", - "integrity": "sha512-u3XS8HaTzt5YN90KPsOXMRjYJUMVD1dtr6yi4NXQluMbZ5IjQNBu1MEabdAxFhYtEuexqomPMSmRIhQJUd3QSg==", - "dev": true, + "node_modules/url-extras": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/url-extras/-/url-extras-0.1.0.tgz", + "integrity": "sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==", "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.17.0", - "@algolia/client-abtesting": "5.51.0", - "@algolia/client-analytics": "5.51.0", - "@algolia/client-common": "5.51.0", - "@algolia/client-insights": "5.51.0", - "@algolia/client-personalization": "5.51.0", - "@algolia/client-query-suggestions": "5.51.0", - "@algolia/client-search": "5.51.0", - "@algolia/ingestion": "1.51.0", - "@algolia/monitoring": "1.51.0", - "@algolia/recommend": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, "engines": { - "node": ">= 14.0.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/balanced-match": { + "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/birpc": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", - "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", - "dev": true, + "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": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", - "dev": true, + "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": { - "dequal": "^2.0.0" + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" + "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", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, + "node_modules/vite": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.16", + "rolldown": "~1.1.4", + "tinyglobby": "^0.2.17" + }, "bin": { - "esbuild": "bin/esbuild" + "vite": "bin/vite.js" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/focus-trap": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", - "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", - "dev": true, + "node_modules/vite-dev-rpc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-2.0.0.tgz", + "integrity": "sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==", "license": "MIT", "dependencies": { - "tabbable": "^6.4.0" + "birpc": "^4.0.0", + "vite-hot-client": "^2.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" + "node_modules/vite-dev-rpc/node_modules/birpc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-4.0.0.tgz", + "integrity": "sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, + "node_modules/vite-hot-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.2.0.tgz", + "integrity": "sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0" } }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", + "node_modules/vite-plugin-inspect": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.4.1.tgz", + "integrity": "sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "ansis": "^4.3.0", + "error-stack-parser-es": "^1.0.5", + "obug": "^2.1.1", + "ohash": "^2.0.11", + "open": "^11.0.0", + "perfect-debounce": "^2.1.0", + "sirv": "^3.0.2", + "unplugin-utils": "^0.3.1", + "vite-dev-rpc": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } } }, - "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==", - "dev": true, + "node_modules/vite-plugin-vue-devtools": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-8.1.5.tgz", + "integrity": "sha512-QSVntSN0sbVV08CZntMWOfF8McyPyYyYd19sChLjxYyFCC7Fcpey74ztw1uCCU23wTmR2yWPb92uaxVD4Lw0Fg==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" + "@vue/devtools-core": "^8.1.5", + "@vue/devtools-kit": "^8.1.5", + "@vue/devtools-shared": "^8.1.5", + "sirv": "^3.0.2", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-vue-inspector": "^6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "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==", - "dev": true, + "node_modules/vite-plugin-vue-inspector": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-6.0.0.tgz", + "integrity": "sha512-OpyITJLgZNibxlrik1EmRtvXHDjLRxNPsWkGFTERZs2LgMEdG4W0WoFt5GIgp3a3jRou+eJR8U1zOBk/XQgEbw==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, + "node_modules/vite-plugin-vue-inspector/node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", "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==", - "dev": true, + "node_modules/vite-plugin-vue-inspector/node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", - "dev": true, + "node_modules/vite-plugin-vue-inspector/node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" }, "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "dev": true, - "license": "MIT" - }, - "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==", + "node_modules/vitest": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "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==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.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 }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "jsdom": { + "optional": true + }, + "vite": { + "optional": false } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-encode": { - "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==", + "node_modules/volar-service-css": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.71.tgz", + "integrity": "sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "license": "MIT", + "dependencies": { + "vscode-css-languageservice": "^6.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true } - ], - "license": "MIT" + } }, - "node_modules/micromark-util-sanitize-uri": { - "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==", + "node_modules/volar-service-emmet": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.71.tgz", + "integrity": "sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==", "dev": true, - "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-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "@emmetio/css-parser": "^0.4.1", + "@emmetio/html-matcher": "^1.3.0", + "@vscode/emmet-helper": "^2.9.3", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "node_modules/volar-service-html": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.71.tgz", + "integrity": "sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "license": "MIT", + "dependencies": { + "vscode-html-languageservice": "^5.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true } - ], - "license": "MIT" + } }, - "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/volar-service-prettier": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.71.tgz", + "integrity": "sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0", + "prettier": "^2.2 || ^3.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "prettier": { + "optional": true } - ], - "license": "MIT" + } }, - "node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "node_modules/volar-service-typescript": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.71.tgz", + "integrity": "sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "path-browserify": "^1.0.1", + "semver": "^7.6.2", + "typescript-auto-import-cache": "^0.3.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-nls": "^5.2.0", + "vscode-uri": "^3.0.8" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", - "dev": true, - "license": "MIT" - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "node_modules/volar-service-typescript-twoslash-queries": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.71.tgz", + "integrity": "sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "node_modules/volar-service-typescript/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", + "license": "ISC", "bin": { - "nanoid": "bin/nanoid.cjs" + "semver": "bin/semver.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=10" } }, - "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==", + "node_modules/volar-service-yaml": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.71.tgz", + "integrity": "sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "wrappy": "1" + "vscode-uri": "^3.0.8", + "yaml-language-server": "~1.23.0" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "node_modules/oniguruma-to-es": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", - "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "node_modules/vscode-css-languageservice": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.1.0" } }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "node_modules/vscode-css-languageservice/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true, "license": "MIT" }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "node_modules/vscode-html-languageservice": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" + } }, - "node_modules/playwright-core": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "node_modules/vscode-json-languageservice": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2" }, "engines": { - "node": ">=18" + "npm": ">=7.0.0" } }, - "node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", + "node_modules/vscode-jsonrpc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.1.tgz", + "integrity": "sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw==", "dev": true, - "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": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=14.0.0" } }, - "node_modules/preact": { - "version": "10.29.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", - "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", "dev": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "node_modules/vscode-languageserver-protocol": { + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", + "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "vscode-jsonrpc": "9.0.1", + "vscode-languageserver-types": "3.18.0" } }, - "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/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-languageserver-types": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", + "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-languageserver/node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", "dev": true, "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" + "engines": { + "node": ">=14.0.0" } }, - "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/vscode-languageserver/node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "dev": true, "license": "MIT", "dependencies": { - "regex-utilities": "^2.3.0" + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, - "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/vscode-languageserver/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true, "license": "MIT" }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "node_modules/vscode-nls": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", "dev": true, "license": "MIT" }, - "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.39.tgz", + "integrity": "sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@vue/compiler-dom": "3.5.39", + "@vue/compiler-sfc": "3.5.39", + "@vue/runtime-dom": "3.5.39", + "@vue/server-renderer": "3.5.39", + "@vue/shared": "3.5.39" }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "peerDependencies": { + "typescript": "*" }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/shiki": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", - "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/langs": "2.5.0", - "@shikijs/themes": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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==", + "node_modules/vue-component-type-helpers": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.7.tgz", + "integrity": "sha512-Skkhw9agYSgsWqv7bxSOGJZa9SaiJbZVGdXuFWnrzKaQYHnw9qbjD630rw6RyMqDbp54nfLCLw5SZA55if7JLg==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "license": "MIT" + }, + "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", + "url": "https://github.com/sponsors/wooorm" } }, - "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==", + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=12" } }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "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==", + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/superjson": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", - "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { - "copy-anything": "^4" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" }, "engines": { - "node": ">=16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tabbable": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", - "dev": true, - "license": "MIT" - }, - "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==", + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "dev": true, "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "why-is-node-running": "cli.js" }, "engines": { - "node": ">=14.17" + "node": ">=8" } }, - "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==", + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "ansi-regex": "^5.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/unxhr": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.2.0.tgz", - "integrity": "sha512-6cGpm8NFXPD9QbSNx0cD2giy7teZ6xOkCUH3U89WKVkL9N9rBrWjlCwhR94Re18ZlAop4MOc3WU1M3Hv/bgpIw==", + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.11" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "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==", - "dev": true, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "dev": true, + "node_modules/xml-naming": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" + "engines": { + "node": ">=16.0.0" + } + }, + "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/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "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": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/eemeli" } }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "node_modules/yaml-language-server": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.23.0.tgz", + "integrity": "sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "@vscode/l10n": "^0.0.18", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "ajv-i18n": "^4.2.0", + "prettier": "^3.8.1", + "request-light": "^0.5.7", + "vscode-json-languageservice": "4.1.8", + "vscode-languageserver": "^9.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-uri": "^3.0.2", + "yaml": "2.8.3" }, "bin": { - "vite": "bin/vite.js" + "yaml-language-server": "bin/yaml-language-server" + } + }, + "node_modules/yaml-language-server/node_modules/request-light": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", + "dev": true, + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">= 14.6" }, "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "url": "https://github.com/sponsors/eemeli" } }, - "node_modules/vitepress": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", - "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/css": "3.8.2", - "@docsearch/js": "3.8.2", - "@iconify-json/simple-icons": "^1.2.21", - "@shikijs/core": "^2.1.0", - "@shikijs/transformers": "^2.1.0", - "@shikijs/types": "^2.1.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^5.2.1", - "@vue/devtools-api": "^7.7.0", - "@vue/shared": "^3.5.13", - "@vueuse/core": "^12.4.0", - "@vueuse/integrations": "^12.4.0", - "focus-trap": "^7.6.4", - "mark.js": "8.11.1", - "minisearch": "^7.1.1", - "shiki": "^2.1.0", - "vite": "^5.4.14", - "vue": "^3.5.13" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "postcss": "^8" + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } + "engines": { + "node": ">=12" } }, - "node_modules/vue": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.33.tgz", - "integrity": "sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==", + "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" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-sfc": "3.5.33", - "@vue/runtime-dom": "3.5.33", - "@vue/server-renderer": "3.5.33", - "@vue/shared": "3.5.33" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "peerDependencies": { - "typescript": "*" + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } }, "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==", - "dev": true, "license": "MIT", "funding": { "type": "github", diff --git a/package.json b/package.json index 1f79a25..521967b 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,43 @@ { - "name": "pubid.github.io", - "version": "1.0.0", - "description": "PubID - Universal Publication Identifier", + "name": "pubid-astro", "type": "module", + "version": "0.1.0", + "private": true, "scripts": { - "dev": "vitepress dev", - "build": "vitepress build", - "preview": "vitepress preview" + "dev": "astro dev", + "build": "astro build", + "build:full": "npm run check && npm run test && astro build", + "preview": "astro preview", + "check": "astro check", + "test": "vitest run", + "test:watch": "vitest", + "test:integration": "vitest run src/__tests__", + "migrate-data": "node scripts/migrate-data.mjs", + "patch-content": "node scripts/patch-content.mjs", + "links": "lychee --config lychee.toml --root-dir \"$(pwd)/dist\" 'dist/**/*.html'" + }, + "dependencies": { + "@astrojs/mdx": "^7.0.2", + "@astrojs/rss": "^4.0.19", + "@astrojs/sitemap": "^3.7.3", + "@astrojs/starlight": "^0.41.3", + "@astrojs/vue": "^7.0.1", + "@fontsource-variable/fraunces": "^5.2.9", + "@fontsource-variable/inter-tight": "^5.2.7", + "@tailwindcss/typography": "^0.5.20", + "@tailwindcss/vite": "^4.3.2", + "astro": "^7.0.7", + "tailwindcss": "^4.3.2", + "vite": "^8.1.4", + "vue": "^3.5.39" }, "devDependencies": { - "@asciidoctor/core": "^3.0.4", - "playwright-core": "^1.59.1", - "typescript": "^5.7.3", - "vitepress": "^1.6.4", - "vue": "^3.5.13" + "@astrojs/check": "^0.9.9", + "@testing-library/vue": "^8.1.0", + "@vitejs/plugin-vue": "^6.0.7", + "@vue/test-utils": "^2.4.11", + "happy-dom": "^20.10.6", + "typescript": "^6.0.3", + "vitest": "^4.1.10" } } diff --git a/public/logos/bipm-logo-dark.svg b/public/logos/bipm-logo-dark.svg new file mode 100644 index 0000000..e906bb7 --- /dev/null +++ b/public/logos/bipm-logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/bipm-logo.svg b/public/logos/bipm-logo.svg new file mode 100644 index 0000000..ecf385b --- /dev/null +++ b/public/logos/bipm-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/easc-logo.svg b/public/logos/easc-logo.svg new file mode 100644 index 0000000..0855cf1 --- /dev/null +++ b/public/logos/easc-logo.svg @@ -0,0 +1,6 @@ + + + + EASC + МГС · CIS Standards + diff --git a/public/logos/ecma-logo.svg b/public/logos/ecma-logo.svg new file mode 100644 index 0000000..4618a1a --- /dev/null +++ b/public/logos/ecma-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/gost-logo.svg b/public/logos/gost-logo.svg new file mode 100644 index 0000000..152402c --- /dev/null +++ b/public/logos/gost-logo.svg @@ -0,0 +1,5 @@ + + + + GOST + diff --git a/public/logos/iala-logo-dark.svg b/public/logos/iala-logo-dark.svg new file mode 100644 index 0000000..19bd844 --- /dev/null +++ b/public/logos/iala-logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/iala-logo-light.svg b/public/logos/iala-logo-light.svg new file mode 100644 index 0000000..b5e2b42 --- /dev/null +++ b/public/logos/iala-logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/iana-logo.svg b/public/logos/iana-logo.svg new file mode 100644 index 0000000..bb989d8 --- /dev/null +++ b/public/logos/iana-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/ietf-logo.svg b/public/logos/ietf-logo.svg new file mode 100644 index 0000000..2b9d28d --- /dev/null +++ b/public/logos/ietf-logo.svg @@ -0,0 +1 @@ +IETF-Logo \ No newline at end of file diff --git a/public/logos/iho-logo.svg b/public/logos/iho-logo.svg index 3a58ab4..0469610 100644 --- a/public/logos/iho-logo.svg +++ b/public/logos/iho-logo.svg @@ -1,10 +1,555 @@ - - - - - - - - - IHO + + + + +Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/logos/oasis-logo.svg b/public/logos/oasis-logo.svg new file mode 100644 index 0000000..c777f07 --- /dev/null +++ b/public/logos/oasis-logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/logos/ogc-logo.svg b/public/logos/ogc-logo.svg new file mode 100644 index 0000000..d2da86c --- /dev/null +++ b/public/logos/ogc-logo.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/logos/oiml-logo-dark.svg b/public/logos/oiml-logo-dark.svg new file mode 100644 index 0000000..f5ba5a2 --- /dev/null +++ b/public/logos/oiml-logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/oiml-logo-light.svg b/public/logos/oiml-logo-light.svg new file mode 100644 index 0000000..b136652 --- /dev/null +++ b/public/logos/oiml-logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/tgpp-logo.svg b/public/logos/tgpp-logo.svg new file mode 100644 index 0000000..e81d5ed --- /dev/null +++ b/public/logos/tgpp-logo.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T + M + + diff --git a/public/logos/w3c-logo.svg b/public/logos/w3c-logo.svg new file mode 100644 index 0000000..5913fcf --- /dev/null +++ b/public/logos/w3c-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/xsf-logo.svg b/public/logos/xsf-logo.svg new file mode 100644 index 0000000..7879034 --- /dev/null +++ b/public/logos/xsf-logo.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/specs/rfc5141.txt b/public/specs/rfc5141.txt new file mode 100644 index 0000000..1681d68 --- /dev/null +++ b/public/specs/rfc5141.txt @@ -0,0 +1,1571 @@ + + + + + + +Network Working Group J. Goodwin +Request for Comments: 5141 H. Apel +Category: Informational ISO + March 2008 + + + A Uniform Resource Name (URN) Namespace for + the International Organization for Standardization (ISO) + +Status of This Memo + + This memo provides information for the Internet community. It does + not specify an Internet standard of any kind. Distribution of this + memo is unlimited. + +Abstract + + This document describes a Uniform Resource Name Namespace + Identification (URN NID) for the International Organization for + Standardization (ISO). This URN NID is intended for use for the + identification of persistent resources published by the ISO standards + body (including documents, document metadata, extracted resources + such as standard schemata and standard value sets, and other + resources). + + + + + + + + + + + + + + + + + + + + + + + + + + + +Goodwin & Apel Informational [Page 1] + +RFC 5141 ISO URN Schema March 2008 + + +Table of Contents + + 1. Introduction ....................................................2 + 2. Specification Template ..........................................4 + 2.1. Namespace ID ...............................................4 + 2.2. Registration Information ...................................4 + 2.3. Declared Registrant of the Namespace .......................4 + 2.4. Declaration of Structure ...................................4 + 2.4.1. Definition ..........................................4 + 2.4.2. Examples ...........................................12 + 2.5. Relevant Ancillary Documentation ..........................15 + 2.6. Identifier Uniqueness Considerations ......................15 + 2.7. Identifier Persistence Considerations .....................15 + 2.8. Process for Identifier Resolution .........................16 + 2.9. Rules for Lexical Equivalence .............................16 + 2.10. Conformance with URN Syntax ..............................17 + 2.11. Validation Mechanism .....................................17 + 2.12. Scope ....................................................17 + 3. Namespace Considerations .......................................17 + 4. Community Considerations .......................................18 + 5. IANA Considerations ............................................20 + 6. Security Considerations ........................................20 + 7. References .....................................................21 + 7.1. Normative References ......................................21 + 7.2. Informative References ....................................21 + Appendix A. Alternative Naming Schemes ............................23 + Appendix B. ABNF Definition of Namespace ID = "iso" + (Informative) .........................................24 + +1. Introduction + + The International Organization for Standardization (ISO) was created + by international agreement in 1947. ISO is a network of the national + standards institutes of many countries, on the basis of one member + per country, with a Central Secretariat in Geneva, Switzerland, that + coordinates the system. ISO acts as a bridging organization in which + a consensus can be reached on solutions that meet both the + requirements of business and the broader needs of society, such as + the needs of stakeholder groups like consumers and users. + + Further information is provided at http://www.iso.org/iso/about.htm. + + The core mission of ISO is to develop technical standards + constituting technical agreements that provide the framework for + compatible technology worldwide. ISO standards contribute to making + the development, manufacturing, and supply of products and services + more efficient, safer, and cleaner. They make trade between + countries easier and fairer. + + + +Goodwin & Apel Informational [Page 2] + +RFC 5141 ISO URN Schema March 2008 + + + Every participating ISO member institute (full members) has the right + to take part in the development of any standard that it judges to be + important to its country's economy. No matter what the size or + strength of that economy, each participating member in ISO has one + vote. ISO's activities are thus carried out in a democratic + framework where each country is on an equal footing to influence the + direction of ISO's work at the strategic level, as well as the + technical content of its individual standards. Although the ISO + standards are voluntary, the fact that they are developed in response + to market demand, and are based on consensus among the interested + parties, ensures widespread applicability of the standards. + Consensus, like technology, evolves and ISO takes account of both + evolving technology and evolving interests by requiring a review of + its standards at least every five years to decide whether they should + be maintained, updated, or withdrawn. + + ISO publishes International Standards and other technical + specifications that are cited in the definitions of required or + expected practices in many industries in many nations. These + specifications contain dictionaries of standard terms, catalogues of + reference values, definitions of formal languages, formal schemata + for information capture and exchange, specifications for standard + practices, and other information resources of general use to + international trade and industry. ISO wishes to create and manage + globally unique, persistent, location-independent identifiers for + these resources. + + This specification defines the syntax for URNs that identify + documents developed by the International Organization for + Standardization (ISO) in accordance with the standards development + procedures defined in the ISO/IEC Directives, Part 1 [ISODIR-1] and + the ISO supplement [ISODIR-S] and processed by the ISO Central + Secretariat. The syntax extends to identify document metadata and + resources related to these documents or otherwise associated with + them. It does not extend to products derived from these documents + and published by ISO (e.g., handbooks, compendia) or documents at or + below the Technical Committee level. Revisions of this specification + may define syntax for URNs in this namespace that identify other ISO + objects, when the ISO community defines a requirement for such + identifiers. + + + + + + + + + + + +Goodwin & Apel Informational [Page 3] + +RFC 5141 ISO URN Schema March 2008 + + +2. Specification Template + +2.1. Namespace ID + + "iso" + +2.2. Registration Information + + Version 2.1 + Date: 2007-12-13 + +2.3. Declared Registrant of the Namespace + + J. Goodwin + ISO Central Secretariat + International Organization for Standardization (ISO) + Case Postale 56 + CH-1211 Geneva 20 + Switzerland + + E-mail: goodwin@iso.org + +2.4. Declaration of Structure + +2.4.1. Definition + + The Namespace Specific Strings (NSSs) of all URNs assigned by ISO + will conform to the syntax defined in Section 2.2 of [RFC2141]. + + The NSS has the following ABNF [RFC5234] specification: + + NSS = std-nss + + All URNs conforming to this specification begin the NSS with the + prefix "std:" to denote the restriction to documents developed by + the ISO standards development procedures as defined in the ISO/IEC + Directives, Part 1 [ISODIR-1] and the ISO Supplement [ISODIR-S]. + Prefixes that identify ISO objects of other kinds may be defined + in future revisions of this specification. + + std-nss = "std:" docidentifier *supplement *docelement + [addition] + + The prefix "std:" distinguishes an . An + identifies the ISO document that is designated by the + , as extended or modified by any identified + . (An that identifies all parts of a + multipart ISO document is a special case as described under the + + + +Goodwin & Apel Informational [Page 4] + +RFC 5141 ISO URN Schema March 2008 + + + element .) If the contains an + element, the NSS identifies a resource extracted from the ISO + document or otherwise associated with it (see below). + + docidentifier = originator [":" type] ":" docnumber [":" partnumber] + [[":" status] ":" edition] + [":" docversion] [":" language] + + provides the complete identification of an ISO + document. Each of its component elements is described below. + + originator = "iso" / "iso-iec" / "iso-cie" / "iso-astm" / + "iso-ieee" / "iec" + + is the organization (usually an international body) + from which a document emanates. + + Current values: + + iso = International Organization for Standardization + + iec = International Electrotechnical Commission (IEC), or + Commission Electrotechnique Internationale + + iso-iec = jointly developed by ISO and IEC + + iso-cie = jointly developed by ISO and the Commission + Internationale d'Eclairage (CIE) + + iso-astm = jointly developed by ISO and the American Society for + Testing and Materials (ASTM) International + + iso-ieee = jointly developed by ISO and the Institute for + Electrical and Electronics Engineers (IEEE) + + Revisions of this specification may define additional values. + + type = "data" / "guide" / "isp" / "iwa" / + "pas" / "r" / "tr" / "ts" / "tta" + + designates the ISO deliverable type. If the element + is not present, the classification is "international standard". + Other current values: + + data = Data (document type no longer published) + + guide = Guide + + + + +Goodwin & Apel Informational [Page 5] + +RFC 5141 ISO URN Schema March 2008 + + + isp = International Standardized Profile + + iwa = International Workshop Agreement + + pas = Publicly Available Specification + + r = Recommendation (document type no longer published) + + tr = Technical Report + + ts = Technical Specification + + tta = Technology Trends Assessment + + docnumber = DIGITS + + is the reference number assigned to the document by + ISO and/or IEC. An ISO document may comprise a single document, + or two or more separate parts each of which is identified by + . + + partnumber = "-" 1*( DIGIT / ALPHA / "-" ) + + is the reference number that identifies a part of a + multipart standard. + + Where it is required to refer to a multipart ISO document in its + entirety, this can be designated by omitting the + element. However, this precludes the possibility of using any + further elements except . + + NOTE: The option to refer to a multipart ISO document by omitting + the element has been included to align with the + provision in the ISO/IEC Directives, Part 2, 2004 [ISODIR-2] + subclause 6.2.2 of making an undated reference to all parts of an + ISO document. It is only permissible to use this option where the + URN is referring to a multipart ISO document in its entirety. + Since the use of this option precludes the designation of the + elements and , it is implicit that the URN needs + to remain valid irrespective of any future changes to the + multipart document (see the rules for undated references given in + the ISO/IEC Directives, Part 2, 2004 [ISODIR-2] subclause + 6.6.7.5.2). This shall be taken into consideration in the use + (and maintenance) of any URN specification employing this option. + + + + + + + +Goodwin & Apel Informational [Page 6] + +RFC 5141 ISO URN Schema March 2008 + + + NOTE: In the case where the multipart document comprises different + types of ISO deliverable, the of the core part (usually + part 1) applies. See the example "Reference to a resource related + to all parts of a multipart document". + + Except for the case where it is required to refer to a multipart + document in its entirety, the element is required if + the identified resource is a part of an ISO document. Otherwise, + this element is not used. + + status = ( "draft" / "cancelled" ) / stage + + indicates the publication status of the document. When + the element is not present, the NSS refers to a published + document. Other values: + + draft = document that has not yet been accepted for + publication by international ballot + + cancelled = document that has been deleted or withdrawn + + stage = "stage-" stagecode ["." iteration] + + indicates the stage code and iteration of the document. + + stagecode = DIGIT DIGIT "." DIGIT DIGIT + + is the harmonized stage code in accordance with ISO + Guide 69:1999, "Harmonized Stage Code system (Edition 2) -- + Principles and guidelines for use" [ISOGUIDE69]. + + iteration = "v" DIGITS + + is a sequential number that refers to a specific + iteration of the project's lifecycle through the designated stage. + + If no is specified, the reference is to the highest + iteration available for the specified stagecode. + + NOTE: In the ISO Central Secretariat project management database, + the is referred to as the "project version". + + edition = "ed-" DIGITS + + designates a specific edition of the document. (DIGITS + is the (sequential) edition number.) If no is + specified, the NSS refers to the latest edition. + + + + +Goodwin & Apel Informational [Page 7] + +RFC 5141 ISO URN Schema March 2008 + + + docversion = "v" (simpleversion / isoversion) + + simpleversion = DIGITS + + designates the version number of a document's + . It is altered by correction (corrected version; + Technical Corrigendum) or amendment (Amendment; Addendum) and is + distinct from a revision, which changes the edition number. + + In the , the first version published is 1, and each + subsequent correction or amendment increases the version number by + 1. + + If no is specified, the reference is to the highest + version number available for the denoted . + + Current values of : + + 1 - first version published + + 2 - corrected version published + + isoversion = baseversion *includedsuppl + + baseversion = DIGITS + + includedsuppl = "-" suppltype supplnumber [ "." supplversion ] + + An can be linked to a simpleversion by defining an + existing simpleversion as baseversion and listing all the + elements (corrections and amendments) incorporated + into that version. + + Examples for the (internal ISO version) scheme: + + 1 = first version of standard + + 1-amd1.v1 = first version of standard incorporating first + version of Amendment 1 + + 1-amd1.v1-amd2.v1 = first version of standard incorporating + first version of Amendment 1 and first version of Amendment 2 + + 1-amd1.v2-amd2.v1-amd3 = first version of standard + incorporating corrected version of Amendment 1, first version + of Amendment 2, and highest version of Amendment 3 + + + + + +Goodwin & Apel Informational [Page 8] + +RFC 5141 ISO URN Schema March 2008 + + + 1-cor3 = first version of standard incorporating highest + version of Technical Corrigendum 3 + + 1-amd1-cor3 = first version of standard incorporating highest + version of Amendment 1 and highest version of Technical + Corrigendum 3 + + language = monolingual / bilingual / trilingual + + monolingual = "en" / "fr" / "ru" / "es" / "ar" + + bilingual = "en,fr" / "en,ru" / "fr,ru" + + trilingual = "en,fr,ru" + + designates the official ISO language(s), or the + language of an official translation, in which the document + (object) is processed and published by ISO (excluding languages + that constitute only specific elements of the content). The value + is one or more alpha-2 codes, each of which designates a language, + as specified in ISO 639-1 [ISO639-1]. If no language element is + specified, is assumed. + + NOTE: Although [ISO639-1] recommends that language codes be + written in lowercase, this ABNF definition allows the use of + uppercase language codes because in ABNF [RFC5234], terminal + symbols defined as literal strings are explicitly + case-insensitive. This case distinction does not carry any + meaning (see Section 2.9) and it is recommended to use language + codes in lowercase. For additional information about the usage of + language tags in information objects, see [RFC4646]. + + supplement = ":" suppltype ":" supplnumber + [":" supplversion ] [":" language ] + + suppltype = "amd" / "cor" / "add" + + supplnumber = DIGITS + + supplversion = "v" DIGITS + + designates a technical alteration of or addition to + an ISO standard that does not result in a new or + . Each may be one of the three types, + designated by : + + + + + + +Goodwin & Apel Informational [Page 9] + +RFC 5141 ISO URN Schema March 2008 + + + amd = Amendment -- a document that alters and/or adds to + previously agreed upon technical provisions in an existing + ISO document; an amendment is subject to acceptance by + ballot in accordance with the ISO/IEC Directives, Part 1, + 2004 [ISODIR-1] subclause 2.10.3 + + cor = Technical Corrigendum -- a document that corrects a + technical error or ambiguity, or updates the ISO document in + such a way that the modification has no effect on the + technical normative elements; a Technical Corrigendum is not + balloted -- see the ISO/IEC Directives, Part 1, 2004 + [ISODIR-1] subclause 2.10.2 + + add = Addendum -- (document type no longer published) Addenda were + documents that changed (by correction, addition, or + deletion) the technical requirements of an ISO document; an + addendum was subject to acceptance by ballot in accordance + with the ISO/IEC Directives, Part 1. (Addenda are included + in this RFC because some of them are still valid.) + + Supplements are numbered consecutively per ISO document, and + within each supplement type. + + identifies the number of the supplement. + + designates the version of a published supplement. + At present, only two versions are used in practice: when a + supplement is published, it is version 1. If that supplement is + subsequently corrected by issuing a corrected version, as + designated by the term "Corrected" on the cover page together with + a date, the corrected version is version 2. + + The language of a supplement can be different from that of the + document. For example, a supplement may apply to only one of the + languages of a bilingual document. For such cases, the language + of a supplement can be identified using the element + defined above. The interpretation is the same, except that it + applies only to the supplement. + + docelement = ":" ( "clause" / "figure" / "table" / "term" ) ":" + elementnumber / elementrange + *( "," elementnumber / elementrange ) + + elementnumber = ( ALPHA / DIGITS ) *( "." DIGITS ) + + elementrange = elementnumber "-" elementnumber + + + + + +Goodwin & Apel Informational [Page 10] + +RFC 5141 ISO URN Schema March 2008 + + + identifies one or more numbered subdivisions of a + document. Types of numbered subdivision are specified in the ISO/ + IEC Directives, Part 2 [ISODIR-2]. This RFC currently specifies + forms for reference to clauses, figures, tables, and terms only. + It does not provide for reference to subfigures. Revisions of + this specification may define additional values. + + represents the selection of one or more clauses or + subclauses of the document.
represents the selection of + one or more figures of the document.
represents the + selection of one or more tables of the document. represents + the selection of one or more terms of the document. + + designates a numbered subdivision in a document, + where the type of subdivision is identified by the literal + "clause", "figure", "table", or "term". When the first character + of is a digit, the reference is to the subdivision + designated by that digit string and by any additional digit + strings separated by periods. When the first character of + is alphabetical, the reference is to the + corresponding Annex, and to the subdivisions designated by + additional digit strings. + + The form HYPHEN designates a range + of subdivisions, and the form COMMA + designates a list. A list can contain ranges. + + addition = techdefined / isodefined + + techdefined = ":tech" *techelement + + techelement = + + isodefined = + + is an additional element of the NSS intended to + identify a representation of an ISO document, an extract from an + ISO document, or some related information set, as a resource in + its own right. + + represents an associated or embedded resource + defined by the committee that develops or maintains the identified + document. All such elements begin with the prefix + ":tech". + + + + + + + +Goodwin & Apel Informational [Page 11] + +RFC 5141 ISO URN Schema March 2008 + + + represents associated or embedded resources defined + by the ISO Central Secretariat. The definition of an + element beginning with any symbol other than is reserved to + the ISO Central Secretariat. + + The syntax of the element is not specified in this RFC. + Specific syntax for this element will be specified as needed by + the ISO Central Secretariat, or by the individual committee that + has the responsibility for developing or maintaining the + identified document. It is necessary that these definitions + comply with the rules for lexical equivalence specified in Section + 2.9 and take into account the process for identifier resolution as + discussed in Section 2.8. + + DIGITS = DIGIT *DIGIT + + DIGIT = %x30-39 ; 0-9 + + ALPHA = %x41-5A / %x61-7A ; A-Z / a-z + + Basics of the ABNF notation used : + + " " literals (terminal character strings); terms not in quotes are + non-terminals + + / alternatives + + [] indicates an optional rule + + () indicates a sequence group, used as a single alternative or as a + single repeating group + + * indicates that the following term or group can repeat at + least and at most times; default values are 0 and + infinity, respectively + + ; comment + +2.4.2. Examples + + o Language handling: + + urn:iso:std:iso:9999:-1:ed-1:en + refers to the 1st edition of ISO 9999-1, in English + + urn:iso:std:iso:9999:-1:ed-1:en,fr + refers to the 1st edition of ISO 9999-1, in English/French + (bilingual document) + + + +Goodwin & Apel Informational [Page 12] + +RFC 5141 ISO URN Schema March 2008 + + + o Originators/document type: + + urn:iso:std:iso-iec:tr:9999:-1:ed-1:en + refers to the 1st edition of ISO/IEC TR 9999-1, in English + + o Status: + + urn:iso:std:iso-iec:9075:-3:cancelled:ed-2:en + urn:iso:std:iso-iec:9075:-3:stage-95.99:ed-2:en + both refer to the cancelled 2nd edition of ISO/IEC 9075-3, in + English + + urn:iso:std:iso-iec:9075:-3:draft:ed-4:en + urn:iso:std:iso-iec:9075:-3:stage-30.60:ed-4:en + both refer to the draft 4th edition of ISO/IEC 9075-3, in English + + urn:iso:std:iso:128:-20:en + urn:iso:std:iso:128:-20:stage-90.20:ed-1:en + both refer to the published (90.20 = under 2nd periodic review) + 1st edition of ISO 128-20, in English + + urn:iso:std:iso:128:-71:cancelled:ed-1:en + urn:iso:std:iso:128:-71:stage-30.98.v2:ed-1:en + both refer to the cancelled (30.98 = project deleted) 1st edition + of ISO 128-71, in English; the second example refers specifically + to the 2nd iteration (projectversion) at stage 30 + + o Non-numeric part number: + + urn:iso:std:iso:9999:-A02:ed-1:en + refers to the 1st edition of ISO 9999-A02, in English + + o Reference to a resource related to all parts of a multipart + document: + + urn:iso:std:iso:20022:tech:xsd:camt.001.001.01 + refers to a "techdefined" resource (i.e., a resource defined by + the committee that develops or maintains the identified document) + associated with ISO 20022 in its entirety; in this example, the + techdefined part comprises ":xsd:camt.001.001.01" + + NOTE: At the time of drafting of this schema, ISO 20022 comprises + 5 parts: parts 1 and 2 are International Standards; parts 3 to 5 + are Technical Specifications. Therefore, the + "international standard" is used in the URN. + + + + + + +Goodwin & Apel Informational [Page 13] + +RFC 5141 ISO URN Schema March 2008 + + + o Docversion handling: + + urn:iso:std:iso:9999:-1:ed-1:v2:en + refers to the corrected English version of the 1st edition of ISO + 9999-1 + + urn:iso:std:iso:9999:-1:ed-1:v1-amd1:en + refers to the version comprising the 1st edition of ISO 9999-1, + incorporating the latest version of Amendment 1, in English + + urn:iso:std:iso:9999:-1:ed-1:v1:en,fr:amd:1:v2:en + refers to the 2nd version of Amendment 1, in English, which amends + the 1st version of edition 1 of ISO 9999-1, in English/French + (bilingual document) + + urn:iso:std:iso:9999:-1:ed-1:v1-amd1.v1:en,fr:amd:2:v2:en + (isoversion scheme) + refers to the corrected version of Amendment 2, in English, which + amends the document comprising the 1st version of edition 1 of ISO + 9999-1 incorporating the 1st version of Amendment 1, in English/ + French (bilingual document) + + urn:iso:std:iso:5817:ed-2:v2:en:cor:1:en + refers to the 1st version of Technical Corrigendum 1, in English, + which amends the corrected version of edition 2 of ISO 5817, in + English + + o Supplement handling: + + urn:iso:std:iso:9999:-1:ed-2:en:amd:1 + refers to Amendment 1 to the 2nd edition of ISO 9999-1, in English + + urn:iso:std:iso:9999:-1:ed-2:en:amd:1:v2 + refers to the corrected version of Amendment 1 to the 2nd edition + of ISO 9999-1, in English + + urn:iso:std:iso:9999:1:ed-2:en,fr:amd:2:en + refers to Amendment 2 in English to the 2nd edition of ISO 9999-1, + in English/French (bilingual document) + + urn:iso:std:iso:9999:-1:ed-2:en:amd:1:cor:1 + refers to Corrigendum 1 to Amendment 1 to the 2nd edition of ISO + 9999-1, in English + + + + + + + + +Goodwin & Apel Informational [Page 14] + +RFC 5141 ISO URN Schema March 2008 + + + o Docelement handling: + + urn:iso:std:iso:105:-c12:ed-1:en:clause:a.1,a.2 + urn:iso:std:iso:105:-c12:ed-1:en:clause:a.1-a.2 + both refer to clauses A.1 and A.2 in the 1st edition of ISO + 105-C12, in English + + urn:iso:std:iso:9999:-1:ed-1:v1- + amd1.v1:en,fr:amd:2:v2:en:clause:3.1,a.2-b.9 (isoversion scheme) + refers to (sub)clauses 3.1 and A.2 to B.9 in the corrected version + of Amendment 2, in English, which amends the document comprising + the 1st version of edition 1 of ISO 9999-1 incorporating the 1st + version of Amendment 1, in English/French (bilingual document) + + urn:iso:std:iso:9999:-1:ed-2:en:amd:1:term:3.2,3.3,3.4.1- + 3.4.4,3.12 + refers to the terms 3.2, 3.3, 3.4.1 to 3.4.4, and 3.12 in + Amendment 1 to the 2nd edition of ISO 9999-1, in English + +2.5. Relevant Ancillary Documentation + + ISO/IEC Directives, Part 1 [ISODIR-1] and Part 2 [ISODIR-2], and ISO + supplement [ISODIR-S]. + +2.6. Identifier Uniqueness Considerations + + Assignment of URNs for documents in the requested namespace will be + managed by the ISO Central Secretariat, which will ensure that the + assigned URNs are consistent with the ISO Directives for unique + identification of ISO documents. + + Assignment of URNs for Technical Committee resources related to ISO + documents will be managed by the Technical Committees developing or + maintaining those documents. As indicated above, each such URN will + extend the URN for the containing document via the element + . The responsibility of the Technical Committee will + therefore be to ensure the uniqueness of the techdefined + element that constitutes the identifier for the resource within the + document namespace, and thus the uniqueness of the overall resource + identifier within the requested namespace. + +2.7. Identifier Persistence Considerations + + Assigned URNs will not be reused and will remain valid beyond the + lifecycle of the referenced resources. However, it should be noted + that although the URNs remain valid, the status of the referenced + resource may change. + + + + +Goodwin & Apel Informational [Page 15] + +RFC 5141 ISO URN Schema March 2008 + + +2.8. Process for Identifier Resolution + + Resolving document identifiers: + + This schema has been developed with the intent that a URN + identifying an ISO document can be transformed to a valid http URI + by replacing the requested URN namespace prefix ("iso") and the + "std:" prefix with the domain name "standards.iso.org", replacing + all occurrences of ":" within the identifier with "/", and + converting characters to lowercase. (ISO is planning to develop a + website implementation to support these URIs.) + + Examples: + + urn:iso:std:iso:9999:-1:ed-1:en: corresponds to + http://standards.iso.org/iso/9999/-1/ed-1/en/ + + urn:iso:std:iso-iec:tr:9999:-1:ed-1:en: corresponds to + http://standards.iso.org/iso-iec/tr/9999/-1/ed-1/en/ + + urn:iso:std:iso:9999:-1:ed-2:en,fr:amd:2: corresponds to + http://standards.iso.org/iso/9999/-1/ed-2/en,fr/amd/2/ + + Resolving identifiers for resources: + + For URNs in the requested namespace that refer to additional + resources related to ISO documents, the ISO Central Secretariat + will specify the resolution procedure at the time it defines the + syntax for the corresponding to the . In most + cases, those resources will be maintained on an ISO website, as + extensions to the http URIs described above. + +2.9. Rules for Lexical Equivalence + + URNs are lexically equivalent if they are octet-by-octet equal after + the following preprocessing: + + 1. normalize the case of the leading "urn:" token + + 2. normalize the case of the NID + + 3. normalize the case of any %-escaping + + 4. normalize the case of all elements + + Further information is specified in [RFC2141], Section 5. + + + + + +Goodwin & Apel Informational [Page 16] + +RFC 5141 ISO URN Schema March 2008 + + +2.10. Conformance with URN Syntax + + No special considerations. + +2.11. Validation Mechanism + + None specified. + +2.12. Scope + + Global. + +3. Namespace Considerations + + The ISO-specific requirements are as follows: + + o globally unique, persistent identifiers + + o location-independent identifiers + + o human-interpretable identifiers + + o a scheme applicable to paper documents as well as machine-readable + documents + + o a scheme applicable to conceptual documents and explicit forms of + documents + + o a scheme applicable to resources extracted from documents + + o a scheme applicable to "metadata" associated with documents + + o a scheme in which the identifier assignment is managed by the ISO + Central Secretariat + + Location-independence: Because the publication of ISO standards is a + complex arrangement involving multiple development organizations and + national standards institutes, a given ISO document may be available + in a number of forms from a number of sources. This makes it + important to have a document identifier that is global in scope, + widely and uniformly used, and independent of the text source used by + any given reference. + + Human-interpretable: Many, perhaps most, references to documents + appear in text generated by human authors. It is important that an + author familiar with the scheme be able to generate a correct URN for + a document for which the author has the ISO reference (or document + identifier). Conversely, it is important that a reader unfamiliar + + + +Goodwin & Apel Informational [Page 17] + +RFC 5141 ISO URN Schema March 2008 + + + with the scheme be able to identify the URN as a reference to an ISO + document, particularly an ISO standard, and also to recognize + identifiers for forms, languages, or metadata sets. + + Paper documents: Older ISO standards that are commonly used as + industrial references exist only in paper form or in earlier + machine-readable forms that are not commonly used on the Internet. + It is important to have a document identifier scheme that extends to + these resources as well. (In fact, many of these have been converted + to Internet forms, and others are being converted, but it is + important that the identifier be independent of the form in which the + document can be obtained at any given time.) + + Conceptual documents vs. representation forms: Because ISO documents + are regularly maintained and re-published in multiple forms, it is + important to have document identifiers that denote the conceptual + document, without regard to publication form. At the same time, it + is necessary for certain types of use to be able to refer to specific + editions, or specific publication forms (for example, editions in + different languages, or to PDF or HTML versions). This URN + specification allows for the identification of these different types + of use in the part of the element. + + Document extracts: ISO standards may contain formal specifications in + machine-processable languages, or formal specifications that also + have representations in machine-processable languages. It is useful + to be able to extract these specifications in machine-processable + form as separate resources, and therefore it is necessary to give + these "extracted resources" global identifiers derived from the + document identifier using a consistent identification scheme. + + Document metadata: Certain uses of documents and document text, + primarily bibliographic, also extract information from the documents, + and that information, commonly called "metadata", is organized in + machine-readable forms conforming to other standards. These metadata + sets then become resources in their own right. It is important to + give them URN identifiers consistent with the document identification + scheme. + +4. Community Considerations + + The ISO community is broad in two dimensions. In one dimension, its + documents are developed and used in a large variety of industries and + professions: natural sciences, manufacturing, construction, + transportation, information technology, social sciences, etc. In the + other dimension, it is a community of expert developers, standards + + + + + +Goodwin & Apel Informational [Page 18] + +RFC 5141 ISO URN Schema March 2008 + + + managers, publishers, professional users, and consumers. And + Internet information technologies are a part of common professional + practice in all of these areas in both dimensions. + + ISO standards are cited in business agreements, in professional + publications, in product descriptions, and in standards development + and publication activities. When these citations appear in + electronic form, the references must be unambiguous. + + The information technology community is itself very active in the + development and use of standards, and many ISO publications are + developed by and for that community. When an Internet information + exchange uses a form specified in an ISO document, or a terminology + defined in an ISO document, it is often necessary to identify that + ISO specification in the envelope surrounding the exchange. That + identification should use a formal, unambiguous identifier in a form + readily recognized by the receiving software, and possibly by the + ultimate human recipient of the information. + + In order to facilitate the use of existing and emerging Internet + technologies for all of these purposes, URNs conforming to [RFC2141] + represent the most useful form of formal, globally unambiguous + identifiers. The use of a managed namespace for such identifiers, + following a consistent scheme for identifying ISO documents and their + derivatives, would be of significant benefit to the entire ISO + community. + + It would give professional users in many industries a standard + form for electronic reference to ISO standards in HTML, XML, PDF, + etc., documents. + + It would give software developers a standard form for reference to + ISO standard protocols, schemata, languages, data sets, etc. + + It would give standards developers a standard form for reference + to other ISO publications in various stages of development. And + it would give them a standard form for creating identifiers for + machine-readable information sets contained in, or derived from, + the specifications. + + It would give standards managers and publishers a formal uniform + scheme for reference to specific publications, editions, and + versions of ISO documents. + + While the assignment of identifiers under this scheme is managed by + the ISO Central Secretariat, the processes by which the identified + objects arise and acquire such identifiers are the result of + agreements made by the member bodies. Every such project is + + + +Goodwin & Apel Informational [Page 19] + +RFC 5141 ISO URN Schema March 2008 + + + initiated by one member body and reviewed and voted on by the others. + Every accepted project is open to participation by any member body, + and in fact, participation by a certain minimum number (usually 5) of + member bodies is required for acceptance of most projects. In + general, the member bodies are open professional and industrial + organizations reflecting broad expertise and national interest. + + It should be noted that ISO documents in draft state are not usually + made available outside the ISO standards development community. + Making them available to professionals outside of the process might + well mislead the recipients into premature adoption of practices that + are not yet completely specified or have not yet achieved consensus, + and therefore may well change. + + It should also be noted that ISO documents are not, in general, + freely available over the Internet. Rather, there are complex + agreements between ISO and its member institutes as to the rights to + the publications and the corresponding fees that may be charged for + paper or electronic copies of various editions. Some ISO documents + are freely available, and some are freely available in certain forms. + In general, derivatives of ISO documents (schemata, metadata sets, + etc.) are freely available over the Internet in the appropriate + machine-readable forms. A URL associated with a URN in the requested + namespace may therefore lead directly to a machine-readable copy of + the text of the document or derivative, or it may lead to a site that + can provide that text for a fee, or it may lead to a site that can + only sell a paper copy of the document. Bearing in mind that ISO is + a network of otherwise independent institutes, this behavior is + simply a property of the ISO community. + + Finally, it should be noted that, for many purposes, reference to the + ISO standard is what is required, and only the product engineer or + software tool builder actually needs access to the text. This + request is based on the need to standardize the form of reference, + not the means of access. + +5. IANA Considerations + + IANA has assigned "iso" (29) as a formal NID. + + The ISO Central Secretariat will maintain a registry of the + permissible values for the elements comprising the NSS. Information + may be obtained from the following address: urn@iso.org. + +6. Security Considerations + + The ISO URN Namespace ID shares the security considerations outlined + in [RFC3406], but has no other known security considerations. + + + +Goodwin & Apel Informational [Page 20] + +RFC 5141 ISO URN Schema March 2008 + + +7. References + +7.1. Normative References + + [ISODIR-1] International Organization for Standardization, + "Procedures for the technical work", ISO/IEC Directives + Part 1, Edition 5, 2004. + + [ISODIR-2] International Organization for Standardization, "Rules + for the structure and drafting of International + Standards", ISO/IEC Directives Part 2, Edition 5, 2004. + + [ISODIR-S] International Organization for Standardization, + "Procedures specific to ISO", ISO/IEC Directives + Supplement. + + [ISOGUIDE69] International Organization for Standardization, + "Harmonized Stage Code system (Edition 2) - Principles + and guidelines for use", ISO Guide 69:1999. + + [ISO639-1] International Organization for Standardization, "Codes + for the representation of names of languages - Part 1: + Alpha-2 code", ISO 639-1:2002. + + [RFC2141] Moats, R., "URN Syntax", RFC 2141, May 1997. + + [RFC3406] Daigle, L., van Gulik, D., Iannella, R., and P. + Faltstrom, "Uniform Resource Names (URN) Namespace + Definition Mechanisms", BCP 66, RFC 3406, October 2002. + + [RFC5234] Crocker, D., Ed., and P. Overell, "Augmented BNF for + Syntax Specifications: ABNF", STD 68, RFC 5234, January + 2008. + +7.2. Informative References + + [ISO8879:1986] + International Organization for Standardization, + "Information processing -- Text and office systems -- + Standard Generalized Markup Language (SGML)", ISO + 8879:1986. + + [ISO/IEC9070:1991] + International Organization for Standardization, + "Information technology -- SGML support facilities -- + Registration procedures for public text owner + identifiers", ISO/IEC 9070:1991. + + + + +Goodwin & Apel Informational [Page 21] + +RFC 5141 ISO URN Schema March 2008 + + + [ISO/IEC8824-1:2002] + International Organization for Standardization, + "Information technology -- Abstract Syntax Notation One + (ASN.1): Specification of basic notation -- Part 1", + ISO/IEC 8824-1:2002. + + [ISO/IEC8825:1987] + International Organization for Standardization, + "Information processing systems -- Open Systems + Interconnection -- Specification of Basic Encoding Rules + for Abstract Syntax Notation ONE (ASN.1)", ISO/IEC + 8825:1987. + + [CCITT] "Specification of Basic Encoding Rules for Abstract + Syntax Notation One (ASN.1)", CCITT Recommendation + X.209, January 1988. + + [RFC3061] Mealling, M., "A URN Namespace of Object Identifiers", + RFC 3061, February 2001. + + [RFC3151] Walsh, N., Cowan, J., and P. Grosso, "A URN Namespace + for Public Identifiers", RFC 3151, August 2001. + + [RFC4646] Phillips, A. and M. Davis, "Tags for Identifying + Languages", BCP 47, RFC 4646, September 2006. + + + + + + + + + + + + + + + + + + + + + + + + + + +Goodwin & Apel Informational [Page 22] + +RFC 5141 ISO URN Schema March 2008 + + +Appendix A. Alternative Naming Schemes + + Before initiating this request, ISO attempted to find an existing or + currently proposed URN NID scheme that might be used instead of a + dedicated scheme. Two existing schemes were carefully considered + because they clearly meet part of the requirements: + + o The OID scheme, documented in [RFC3061] + + o The PublicId scheme, documented in [RFC3151] + + The OID scheme is derived from the joint ISO/ITU-T ASN.1 + object-identifier scheme specified in [ISO/IEC8824-1:2002] (original + edition 1984; [RFC3061] cites the 1988 [CCITT] edition of the + encoding rules in [ISO/IEC8825:1987]. This standard assigned the + registry authority for all identifiers in the { iso(1) } namespace to + ISO, and therefore, ISO controls the registry of all identifiers + beginning "oid:1:". And in fact, ISO has developed, and is using, an + identification scheme under ASN.1 that meets most of the above + requirements. ISO could clearly define a use of the OID scheme that + would be adequate to meet all of its technical objectives, although + it would further complicate the current ASN.1 scheme. + + The original intent of ISO 8824 was to permit both a human-readable + form for the identifier, to maximize intuitive recognition, and an + encoding that minimized the number of bits needed to communicate an + OID value over a network. Regrettably, the encoding chosen in RFC + 3061 is much closer to the minimal bits encoding than to the + human-readable one. The NSS for the OID scheme consists entirely of + digits and punctuation. For example, the ASN.1 identifier { iso(1) + standard(0) 7852 part(2) edition(3) } becomes: urn:oid:1:0:7852:2:3. + + This is difficult for a human reader or author to interpret. It is + also easy to mistype, and the scheme contains no "check-digits", + which makes it difficult to validate, leading to the propagation of + URNS that are invalid or valid but erroneous. Finally, the + all-numeric form conveys no hint of the name of the responsible + organization, and therefore no hint of any URL that might aid a human + reader in interpreting the reference. The OID scheme makes all of + the required identifiers technically possible and technically useable + by software, but for all practical purposes, the OID URNs are useful + only to software. + + The PublicId scheme is derived from Standard Generalized Markup + Language (SGML) [ISO8879:1986] and [ISO/IEC9070:1991] bibliographic + catalogue forms. Narrowed to ISO publications, it is adequate for + the unique global persistent identification of published documents, + in both paper and machine-processable form. + + + +Goodwin & Apel Informational [Page 23] + +RFC 5141 ISO URN Schema March 2008 + + + Importantly, the PublicId scheme does not have a "conceptual + document" notion -- it identifies specific publications and editions. + "Weak identification" could be used to implement the conceptual + document concept, but the PublicId scheme does not document that + interpretation. In any case, the PublicId scheme does not extend to + draft documents, which are often referenced in pilot implementations, + to separate forms of a document, or to resources extracted from + documents. It supports only those metadata elements that are defined + in SGML. The scheme could be extended to do most of these, but the + ISO-specific extensions would not in general extend to the much + broader base of documents identified by PublicIds. (Version and + edition management practices vary significantly across publishers, + depending on their milieu.) Further, the ISO Central Secretariat + could not and should not control the registry of such URNs. + + ISO therefore concluded that the alternative schemes are not adequate + to meet the requirements of the ISO community. + + Whilst requesting a new namespace for ISO documents and their + derivatives, ISO does not wish to discourage the use of these other + identifiers for ISO publications. The PublicId form, in particular, + is useful for referring to ISO publications in a larger bibliographic + information space. + +Appendix B. ABNF Definition of Namespace ID = "iso" (Informative) + + NSS = std-nss + + std-nss = "std:" docidentifier *supplement *docelement + [addition] + + docidentifier = originator [":" type] ":" docnumber [":" partnumber] + [[":" status] ":" edition] + [":" docversion] [":" language] + + originator = "iso" / "iso-iec" / "iso-cie" / "iso-astm" / + "iso-ieee" / "iec" + + ; iso = International Organization for + ; Standardization + + ; iec = International Electrotechnical + ; Commission (IEC), or Commission + ; Electrotechnique Internationale + + ; iso-iec = jointly developed by ISO and IEC + + + + + +Goodwin & Apel Informational [Page 24] + +RFC 5141 ISO URN Schema March 2008 + + + ; iso-cie = jointly developed by ISO and the + ; Commission Internationale d'Eclairage + ; (CIE) + + ; iso-astm = jointly developed by ISO and the + ; American Society for Testing and + ; Materials (ASTM) International + + ; iso-ieee = jointly developed by ISO and the + ; Institute for Electrical and + ; Electronics Engineers (IEEE) + + type = "data" / "guide" / "isp" / "iwa" / + "pas" / "r" / "tr" / "ts" / "tta" + + ; data = Data (document type no longer published) + + ; guide = Guide + + ; isp = International Standardized Profile + + ; iwa = International Workshop Agreement + + ; pas = Publicly Available Specification + + ; r = Recommendation (document type no longer + ; published) + + ; tr = Technical Report + + ; ts = Technical Specification + + ; tta = Technology Trends Assessment + + docnumber = DIGITS + + partnumber = "-" 1*( DIGIT / ALPHA / "-" ) + + status = ( "draft" / "cancelled" ) / stage + + ; draft = document that has not yet been + ; accepted for publication by + ; international ballot + + ; cancelled = document that has been deleted or + ; withdrawn + + stage = "stage-" stagecode ["." iteration] + + + +Goodwin & Apel Informational [Page 25] + +RFC 5141 ISO URN Schema March 2008 + + + stagecode = DIGIT DIGIT "." DIGIT DIGIT + + iteration = "v" DIGITS + + edition = "ed-" DIGITS + + docversion = "v" (simpleversion / isoversion) + + simpleversion = DIGITS + + ; 1 = first version published + + ; 2 = corrected version published + + isoversion = baseversion *includedsuppl + + baseversion = DIGITS + + includedsuppl = "-" suppltype supplnumber [ "." supplversion ] + + language = monolingual / bilingual / trilingual + + monolingual = "en" / "fr" / "ru" / "es" / "ar" + + bilingual = "en,fr" / "en,ru" / "fr,ru" + + trilingual = "en,fr,ru" + + supplement = ":" suppltype ":" supplnumber + [":" supplversion ] [":" language ] + + suppltype = "amd" / "cor" / "add" + + ; amd = Amendment + + ; cor = Technical Corrigendum + + ; add = Addendum + + supplnumber = DIGITS + + supplversion = "v" DIGITS + + docelement = ":" ( "clause" / "figure" / "table" / "term" ) ":" + elementnumber / elementrange + *( "," elementnumber / elementrange ) + + elementnumber = ( ALPHA / DIGITS ) *( "." DIGITS ) + + + +Goodwin & Apel Informational [Page 26] + +RFC 5141 ISO URN Schema March 2008 + + + elementrange = elementnumber "-" elementnumber + + addition = techdefined / isodefined + + techdefined = ":tech" *techelement + + techelement = + + isodefined = + + DIGITS = DIGIT *DIGIT + + DIGIT = %x30-39 ; 0-9 + + ALPHA = %x41-5A / %x61-7A ; A-Z / a-z + +Authors' Addresses + + Joanna Goodwin + International Organization for Standardization + Case Postal 56 + Geneva 20 1211 + Switzerland + + EMail: goodwin@iso.org + URI: http://www.iso.org + + + Holger Apel + International Organization for Standardization + Case Postal 56 + Geneva 20 1211 + Switzerland + + EMail: apel@iso.org + URI: http://www.iso.org + + + + + + + + + + + + + + + +Goodwin & Apel Informational [Page 27] + +RFC 5141 ISO URN Schema March 2008 + + +Full Copyright Statement + + Copyright (C) The IETF Trust (2008). + + This document is subject to the rights, licenses and restrictions + contained in BCP 78, and except as set forth therein, the authors + retain all their rights. + + This document and the information contained herein are provided on an + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS + OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND + THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF + THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Intellectual Property + + The IETF takes no position regarding the validity or scope of any + Intellectual Property Rights or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; nor does it represent that it has + made any independent effort to identify any such rights. Information + on the procedures with respect to rights in RFC documents can be + found in BCP 78 and BCP 79. + + Copies of IPR disclosures made to the IETF Secretariat and any + assurances of licenses to be made available, or the result of an + attempt made to obtain a general license or permission for the use of + such proprietary rights by implementers or users of this + specification can be obtained from the IETF on-line IPR repository at + http://www.ietf.org/ipr. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights that may cover technology that may be required to implement + this standard. Please address the information to the IETF at + ietf-ipr@ietf.org. + + + + + + + + + + + + +Goodwin & Apel Informational [Page 28] + diff --git a/scripts/migrate-data.mjs b/scripts/migrate-data.mjs new file mode 100644 index 0000000..a0d4e59 --- /dev/null +++ b/scripts/migrate-data.mjs @@ -0,0 +1,200 @@ +// One-shot migration: splits publishers.ts into per-flavor modules with +// component metadata merged in (eliminating the parallel component-data.ts). +// +// Run: node scripts/migrate-data.mjs +// Source files live in src/data/_pre-refactor/ (the original flat .ts files) +import { readFile, writeFile, mkdir, rm } from 'node:fs/promises' +import { fileURLToPath } from 'node:url' +import { dirname, join } from 'node:path' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const ROOT = join(__dirname, '..') + +// Dynamically import the TS data files via tsx-style loader. +// We use a build-time esbuild since plain node can't import .ts directly. +import { execSync } from 'node:child_process' + +const tmp = join(ROOT, '.tmp-migrate') +await rm(tmp, { recursive: true, force: true }) +await mkdir(tmp, { recursive: true }) + +// Compile TS → JS for the two data files using esbuild (already a dep of astro/vite) +const ESBUILD = `${ROOT}/node_modules/.bin/esbuild` +await Promise.all([ + execSync(`${ESBUILD} ${ROOT}/src/data/_pre-refactor/publishers.ts --bundle --format=esm --platform=node --outfile=${tmp}/publishers.mjs`), + execSync(`${ESBUILD} ${ROOT}/src/data/_pre-refactor/component-data.ts --bundle --format=esm --platform=node --outfile=${tmp}/component-data.mjs`), +]) + +const { publishers } = await import(`file://${tmp}/publishers.mjs`) +const { getComponentMeta } = await import(`file://${tmp}/component-data.mjs`) + +console.log(`Migrating ${publishers.length} publishers…`) + +const flavorsDir = join(ROOT, 'src/data/flavors') +await rm(flavorsDir, { recursive: true, force: true }) +await mkdir(flavorsDir, { recursive: true }) + +const escape = (s) => JSON.stringify(s) +const indent = (n) => ' '.repeat(n) + +function renderExample(ex, depth) { + const pad = indent(depth) + if (ex.output && ex.output !== ex.input) { + return `${pad}{ input: ${escape(ex.input)}, output: ${escape(ex.output)} }` + } + return `${pad}{ input: ${escape(ex.input)} }` +} + +function renderDocType(dt, depth) { + const pad = indent(depth) + const lines = [ + `${pad}{`, + `${pad} key: ${escape(dt.key)},`, + `${pad} title: ${escape(dt.title)},`, + `${pad} abbr: [${dt.abbr.map(escape).join(', ')}],`, + `${pad} description: ${escape(dt.description)},`, + ] + if (dt.syntax) lines.push(`${pad} syntax: ${escape(dt.syntax)},`) + if (dt.examples.length > 0) { + lines.push(`${pad} examples: [`) + for (const ex of dt.examples) lines.push(renderExample(ex, depth + 2) + ',') + lines.push(`${pad}],`) + } else { + lines.push(`${pad} examples: [],`) + } + lines.push(`${pad}}`) + return lines.join('\n') +} + +function renderComponent(c, depth) { + const pad = indent(depth) + const lines = [ + `${pad}{`, + `${pad} name: ${escape(c.name)},`, + `${pad} description: ${escape(c.description)},`, + ] + if (c.attribute) lines.push(`${pad} attribute: ${escape(c.attribute)},`) + if (c.dataType) lines.push(`${pad} dataType: ${escape(c.dataType)},`) + if (c.values && c.values.length > 0) { + lines.push(`${pad} values: [${c.values.map(escape).join(', ')}],`) + } + if (c.format) lines.push(`${pad} format: ${escape(c.format)},`) + if (c.example) lines.push(`${pad} example: ${escape(c.example)},`) + lines.push(`${pad}}`) + return lines.join('\n') +} + +function renderAlgebra(a, depth) { + const pad = indent(depth) + return [ + `${pad}{ type: ${escape(a.type)}, description: ${escape(a.description)}, syntax: ${escape(a.syntax)}, example: ${escape(a.example)} },` + ].join('\n') +} + +function renderPublisher(p) { + // Merge component-data into the components array (SSOT) + const mergedComponents = p.components.map(c => ({ ...c, ...getComponentMeta(p.flavor, c.name) })) + + const L = [] + L.push("import type { Publisher } from '../types'") + L.push('') + L.push(`export const ${p.flavor.replace(/-/g, '_')}: Publisher = {`) + L.push(` flavor: ${escape(p.flavor)},`) + if (p.logo) L.push(` logo: ${escape(p.logo)},`) + if (p.logos) L.push(` logos: [${p.logos.map(escape).join(', ')}],`) + L.push(` name: ${escape(p.name)},`) + L.push(` fullName: ${escape(p.fullName)},`) + L.push(` category: ${escape(p.category)},`) + L.push(` description: ${escape(p.description)},`) + if (p.website) L.push(` website: ${escape(p.website)},`) + if (p.syntaxNotes) L.push(` syntaxNotes: ${escape(p.syntaxNotes)},`) + if (p.urnPattern) L.push(` urnPattern: ${escape(p.urnPattern)},`) + if (p.relatedFlavors) L.push(` relatedFlavors: [${p.relatedFlavors.map(escape).join(', ')}],`) + L.push(` docTypes: [`) + for (const dt of p.docTypes) L.push(renderDocType(dt, 2) + ',') + L.push(`],`) + if (p.stages && p.stages.length > 0) { + L.push(` stages: [`) + for (const s of p.stages) { + L.push(` { code: ${escape(s.code)}, abbr: ${escape(s.abbr)}, name: ${escape(s.name)} },`) + } + L.push(`],`) + } + if (p.styles && p.styles.length > 0) { + L.push(` styles: [`) + for (const s of p.styles) { + L.push(` { key: ${escape(s.key)}, name: ${escape(s.name)}, description: ${escape(s.description)}, example: ${escape(s.example)} },`) + } + L.push(`],`) + } + L.push(` components: [`) + for (const c of mergedComponents) L.push(renderComponent(c, 2) + ',') + L.push(`],`) + L.push(` algebra: [`) + for (const a of p.algebra) L.push(renderAlgebra(a, 2)) + L.push(`],`) + L.push(`}`) + // Default export for OCP-compliant auto-discovery via import.meta.glob + L.push('') + L.push(`export default ${p.flavor.replace(/-/g, '_')}`) + L.push('') + return L.join('\n') +} + +const flavors = [] +for (const p of publishers) { + const safe = p.flavor.replace(/-/g, '_') + const filepath = join(flavorsDir, `${safe}.ts`) + await writeFile(filepath, renderPublisher(p), 'utf8') + flavors.push({ flavor: p.flavor, safe, varName: safe }) + console.log(` wrote ${safe}.ts`) +} + +// Registry: auto-discovery via import.meta.glob +const registryContents = `// Auto-generated by scripts/migrate-data.mjs +// Do not edit manually — edit per-flavor files in ./flavors/ instead. + +import type { Publisher } from './types' + +// OCP-compliant auto-discovery: a new flavor file in ./flavors/ is +// automatically included in the registry without code edits here. +const modules = import.meta.glob('./flavors/*.ts', { eager: true, import: 'default' }) as Record + +export const publishers: Publisher[] = Object.values(modules) + .sort((a, b) => a.flavor.localeCompare(b.flavor)) + +export const publishersByFlavor = new Map(publishers.map(p => [p.flavor, p])) + +export function getPublisher(flavor: string): Publisher | undefined { + return publishersByFlavor.get(flavor) +} + +export function getPublishersByCategory(category: Publisher['category']): Publisher[] { + return publishers.filter(p => p.category === category) +} + +export const internationalPublishers = getPublishersByCategory('international') +export const regionalPublishers = getPublishersByCategory('regional') +export const nationalPublishers = getPublishersByCategory('national') +export const industryPublishers = getPublishersByCategory('industry') +` + +await writeFile(join(ROOT, 'src/data/registry.ts'), registryContents, 'utf8') +console.log(` wrote registry.ts (${publishers.length} publishers)`) + +// Update index.ts to re-export from registry +const indexContents = `export { publishers, publishersByFlavor, getPublisher, + getPublishersByCategory, internationalPublishers, regionalPublishers, + nationalPublishers, industryPublishers } from './registry' + +export { categoryLabels, categoryOrder } from './types' +export type { Publisher, DocType, FlavorComponent, AlgebraRelation, + PubIDStyle, Stage, Category } from './types' +` + +await writeFile(join(ROOT, 'src/data/index.ts'), indexContents, 'utf8') +console.log(' wrote index.ts') + +// Cleanup +await rm(tmp, { recursive: true }) +console.log('Done.') diff --git a/scripts/patch-content.mjs b/scripts/patch-content.mjs new file mode 100644 index 0000000..f9ea61e --- /dev/null +++ b/scripts/patch-content.mjs @@ -0,0 +1,56 @@ +// Patch content files to ensure they have minimal frontmatter required by +// the zod schemas in content.config.ts. Idempotent. +import { readFile, writeFile } from 'node:fs/promises' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { glob } from 'node:fs/promises' + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..') + +async function patchFile(filepath, fallback) { + const content = await readFile(filepath, 'utf8') + if (content.startsWith('---')) { + const end = content.indexOf('\n---', 3) + if (end > 0) { + // fm is the frontmatter between the opening --- and closing ---. + // Ensure it ends with a newline before appending new keys, + // otherwise the new key gets concatenated onto the last existing line. + let fm = content.slice(3, end) + if (!fm.endsWith('\n')) fm += '\n' + const body = content.slice(end + 4) + if (!fm.includes('title:')) { + const h1 = body.match(/^#\s+(.+)$/m) + const title = h1 ? h1[1].trim() : fallback.title + return writeFile(filepath, `---\n${fm}title: ${JSON.stringify(title)}\n---${body}`) + } + return + } + } + const h1 = content.match(/^#\s+(.+)$/m) + const title = h1 ? h1[1].trim() : fallback.title + const description = fallback.description || '' + const newContent = `---\ntitle: ${JSON.stringify(title)}\ndescription: ${JSON.stringify(description)}\n---\n\n${content}` + await writeFile(filepath, newContent) +} + +const targets = [ + { dir: 'src/content/concepts', fallback: { title: 'Concept', description: 'A PubID concept.' } }, + { dir: 'src/content/library', fallback: { title: 'Library', description: 'PubID library documentation.' } }, + { dir: 'src/content/adopt', fallback: { title: 'Adopt', description: 'Adopting PubID.' } }, + { dir: 'src/content/specs', fallback: { title: 'Specification', description: 'A PubID specification.' } }, +] + +for (const { dir, fallback } of targets) { + const absDir = join(ROOT, dir) + for await (const entry of glob(join(absDir, '**', '*.{md,mdx}'))) { + if (entry.endsWith('.adoc')) continue + try { + await patchFile(entry, fallback) + console.log('patched', entry.replace(ROOT + '/', '')) + } catch (e) { + console.error('failed', entry, e.message) + } + } +} + +console.log('done') diff --git a/scripts/validate-links.mjs b/scripts/validate-links.mjs new file mode 100644 index 0000000..d2b5a8e --- /dev/null +++ b/scripts/validate-links.mjs @@ -0,0 +1,208 @@ +// Link validator: extracts every href and src from the built HTML, +// checks internal links against the dist/ filesystem, and external +// links via HTTP HEAD. +// +// Run: node scripts/validate-links.mjs +import { readdirSync, readFileSync, existsSync, statSync } from 'node:fs' +import { join, extname, dirname, normalize, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const ROOT = fileURLToPath(new URL('..', import.meta.url)) +const DIST = join(ROOT, 'dist') + +const broken = [] +const ok = [] +let externalChecked = 0 +let externalOk = 0 +let externalFail = 0 + +function* walk(dir) { + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const full = join(dir, entry.name) + if (entry.isDirectory()) yield* walk(full) + else yield full + } +} + +// Collect all href and src attributes +const htmlFiles = [...walk(DIST)].filter(f => f.endsWith('.html')) +const allLinks = new Set() +const perFile = new Map() // link → [files that reference it] + +for (const file of htmlFiles) { + const content = readFileSync(file, 'utf8') + // Match href="..." and src="..." (single or double quotes) + const matches = content.matchAll(/(?:href|src)\s*=\s*["']([^"']+)["']/g) + for (const m of matches) { + const url = m[1] + if (!url || url.startsWith('data:') || url.startsWith('javascript:') || url.startsWith('mailto:')) continue + if (!allLinks.has(url)) allLinks.add(url) + if (!perFile.has(url)) perFile.set(url, []) + const rel = file.replace(DIST + '/', '') + if (!perFile.get(url).includes(rel)) perFile.get(url).push(rel) + } +} + +// Resolve internal links to dist/ files +function resolveInternal(url) { + if (url.startsWith('#')) return null // fragment-only, skip + if (url.startsWith('http://') || url.startsWith('https://')) return null + + let path = url + // Strip fragments and queries + path = path.split('#')[0].split('?')[0] + + // Handle root-relative + if (path.startsWith('/')) { + path = path.slice(1) + } + + if (!path) return join(DIST, 'index.html') + + // Astro with trailingSlash: 'never' produces /foo/index.html for /foo + // Try several resolutions + const candidates = [ + join(DIST, path), + join(DIST, path, 'index.html'), + join(DIST, path + '.html'), + join(DIST, path.replace(/\/$/, '')), + join(DIST, path.replace(/\/$/, '') + '/index.html'), + ] + + for (const c of candidates) { + if (existsSync(c) && statSync(c).isFile()) return c + } + return null +} + +// Categorize and check +const internalBroken = new Map() // url → [referencing files] +const externalLinks = new Map() // url → [referencing files] +const assetBroken = new Map() // url → [referencing files] + +for (const url of [...allLinks].sort()) { + const refs = perFile.get(url) + if (url.startsWith('http://') || url.startsWith('https://')) { + externalLinks.set(url, refs) + } else if (url.startsWith('/') || url.startsWith('.') || url.startsWith('#') || !url.includes('://')) { + const resolved = resolveInternal(url) + if (resolved) { + ok.push({ url, refs }) + } else { + if (!internalBroken.has(url)) internalBroken.set(url, []) + internalBroken.set(url, refs) + } + } +} + +// Report internal results +console.log(`\n═══ Internal links ═══`) +console.log(`HTML files scanned: ${htmlFiles.length}`) +console.log(`Unique internal links: ${ok.length + internalBroken.size}`) +console.log(`OK: ${ok.length}`) +console.log(`Broken: ${internalBroken.size}`) + +if (internalBroken.size > 0) { + console.log(`\n--- Broken internal links (showing first 30) ---`) + let i = 0 + for (const [url, refs] of internalBroken) { + if (i++ >= 30) { console.log(`... and ${internalBroken.size - 30} more`); break } + console.log(` ${url}`) + for (const r of refs.slice(0, 3)) console.log(` ← ${r}`) + if (refs.length > 3) console.log(` ... and ${refs.length - 3} more refs`) + } +} + +// Check external links (with timeout, in batches to be polite) +console.log(`\n═══ External links ═══`) +console.log(`Unique external URLs: ${externalLinks.size}`) + +const external = [...externalLinks.entries()] +const BATCH = 8 + +// URLs awaiting infrastructure changes (repo moves, blog restorations). +// Flagged as "pending" rather than "broken" so the build doesn't fail. +const PENDING = new Set([ + 'https://github.com/pubid/pubid', // pending repo move to pubid/ org + 'https://github.com/pubid/pubid/issues', // pending repo move + 'https://www.metanorma.org/posts/2022-01-09-nist-pubid', // pending blog restoration + 'https://www.metanorma.org/posts/2022-01-09-nist-pubid/', // pending blog restoration + 'https://www.relaton.org/posts/2023-08-23-nist-cswp-pubid/', // pending blog restoration +]) + +// Sites whose WAF blocks automated requests but the links are valid for browsers. +// A 403/timeout from these is treated as OK. +const KNOWN_BOT_BLOCKERS = new Set([ + 'https://www.ansi.org', + 'https://www.astm.org', + 'https://www.csagroup.org', + 'https://www.iec.ch', + 'https://www.adobe.com', +]) + +const BROWSER_UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0 Safari/537.36' + +const pendingList = [] +const botBlocked = [] + +for (let i = 0; i < external.length; i += BATCH) { + const batch = external.slice(i, i + BATCH) + const results = await Promise.all(batch.map(async ([url, refs]) => { + if (PENDING.has(url)) { + return { url, refs, status: 'pending', ok: true } + } + try { + const controller = new AbortController() + const timer = setTimeout(() => controller.abort(), 12000) + // Use GET with browser UA — many publisher WAFs reject HEAD or non-browser UA. + const res = await fetch(url, { + method: 'GET', + signal: controller.signal, + redirect: 'follow', + headers: { + 'User-Agent': BROWSER_UA, + 'Accept': 'text/html,application/xhtml+xml', + }, + }) + clearTimeout(timer) + return { url, refs, status: res.status, ok: res.ok } + } catch (e) { + return { url, refs, status: 0, ok: false, error: e.message } + } + })) + + for (const r of results) { + externalChecked++ + if (r.status === 'pending') { + pendingList.push(r) + } else if (r.ok) { + externalOk++ + } else if (KNOWN_BOT_BLOCKERS.has(r.url)) { + botBlocked.push(r) + } else { + externalFail++ + console.log(` ✗ ${r.url} [${r.status || r.error}]`) + for (const ref of r.refs.slice(0, 2)) console.log(` ← ${ref}`) + } + } + await new Promise(r => setTimeout(r, 100)) +} + +console.log(`\nExternal results: ${externalOk} OK / ${externalChecked} checked / ${externalFail} truly broken`) +if (pendingList.length > 0) { + console.log(`\nPending (awaiting infra — not broken):`) + for (const p of pendingList) console.log(` ⏳ ${p.url}`) +} +if (botBlocked.length > 0) { + console.log(`\nKnown bot-blockers (links valid for browsers, suppressed in check):`) + for (const b of botBlocked) console.log(` 🛡 ${b.url} [${b.status || b.error}]`) +} + +// Summary +console.log(`\n═══ Summary ═══`) +console.log(`Internal: ${ok.length} ok, ${internalBroken.size} broken`) +console.log(`External: ${externalOk} ok, ${externalFail} broken (of ${externalChecked} checked)`) + +if (internalBroken.size > 0 || externalFail > 0) { + process.exit(1) +} diff --git a/src/__tests__/integration.spec.ts b/src/__tests__/integration.spec.ts new file mode 100644 index 0000000..1c44083 --- /dev/null +++ b/src/__tests__/integration.spec.ts @@ -0,0 +1,123 @@ +import { describe, it, expect } from 'vitest' +import { readFileSync, existsSync, readdirSync } from 'node:fs' +import { join } from 'node:path' + +// Integration-level smoke tests. These catch regressions that type-checking +// and unit tests miss — e.g. content collections silently empty, patch +// scripts corrupting YAML, VitePress scanning astro-site/. + +const ROOT = process.cwd() // Astro is now at repo root + +describe('integration: content collections are non-empty', () => { + // Each collection must have at least one source file. If this fails, + // it means the content layer loader isn't finding files — usually a + // config path bug. + const collections = [ + { name: 'concepts', minFiles: 6 }, + { name: 'blog', minFiles: 4 }, + { name: 'library', minFiles: 4 }, + { name: 'specs', minFiles: 2 }, // only .md counted + { name: 'adopt', minFiles: 2 }, + { name: 'about', minFiles: 1 }, + ] + + for (const { name, minFiles } of collections) { + it(`${name} collection has ≥ ${minFiles} source file(s)`, () => { + const dir = join(process.cwd(), 'src', 'content', name) + expect(existsSync(dir), `directory ${dir} must exist`).toBe(true) + const files = readdirSync(dir, { recursive: true }) + .filter((f) => { + const s = String(f) + return s.endsWith('.md') || s.endsWith('.mdx') + }) + expect(files.length, `${name}/ has ${files.length} files`).toBeGreaterThanOrEqual(minFiles) + }) + } +}) + +describe('integration: no corrupted YAML frontmatter', () => { + // Catches the bug where patch-content.mjs concatenated `title:` onto the + // last line of existing frontmatter without a newline separator. + const contentDir = join(process.cwd(), 'src', 'content') + + function* walk(dir: string): Generator { + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const full = join(dir, entry.name) + if (entry.isDirectory()) yield* walk(full) + else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) yield full + } + } + + for (const filepath of walk(contentDir)) { + const rel = filepath.replace(process.cwd() + '/', '') + it(`${rel} has valid YAML frontmatter`, () => { + const content = readFileSync(filepath, 'utf8') + if (!content.startsWith('---')) return // no frontmatter is OK + + const end = content.indexOf('\n---', 3) + expect(end, 'frontmatter must be closed').toBeGreaterThan(0) + + const fm = content.slice(3, end) + // Each line that has a `key:` must either be on its own line or + // the previous line must not look like an unfinished key. + const lines = fm.split('\n') + for (const line of lines) { + const titleMatches = line.match(/title:/g) + // A single line with two `key:` patterns indicates concatenation bug + if (titleMatches && titleMatches.length > 1) { + throw new Error(`concatenated YAML keys on line: "${line}"`) + } + } + }) + } +}) + +describe('integration: VitePress site removed', () => { + // The Astro migration is complete: VitePress files have been moved to + // _archive-vitepress/. The root is the Astro site now. + it('no .vitepress/ directory at root', () => { + expect(existsSync(join(ROOT, '.vitepress'))).toBe(false) + }) + + it('VitePress files archived under _archive-vitepress/', () => { + expect(existsSync(join(ROOT, '_archive-vitepress', '.vitepress'))).toBe(true) + }) + + it('Astro is the root site (astro.config.mjs at root)', () => { + expect(existsSync(join(ROOT, 'astro.config.mjs'))).toBe(true) + }) +}) + +describe('integration: build output has content pages', () => { + // The build must produce individual content pages, not just index pages. + // If this fails, content collections are silently empty — check + // content.config.ts uses the Content Layer API (loader: glob()). + const dist = join(process.cwd(), 'dist') + + const expectedPages = [ + 'concepts/anatomy/index.html', + 'concepts/urn/index.html', + 'blog/2024-01-15-what-is-pubid/index.html', + 'specs/iso-urn/index.html', + 'library/api/index.html', + 'adopt/guide/index.html', + ] + + for (const page of expectedPages) { + it(`dist/${page} exists`, () => { + expect(existsSync(join(dist, page)), `expected ${page} to be built`).toBe(true) + }) + } + + it('dist has ≥ 250 HTML pages total', () => { + let count = 0 + function countHtml(dir: string) { + for (const entry of readdirSync(dir, { withFileTypes: true })) { + if (entry.isDirectory()) countHtml(join(dir, entry.name)) + else if (entry.name.endsWith('.html')) count++ + } + } + if (existsSync(dist)) countHtml(dist) + expect(count).toBeGreaterThanOrEqual(250) + }) +}) diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 0000000..9d8ccce --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,14 @@ +--- +const year = new Date().getFullYear() +--- + + diff --git a/src/components/Header.astro b/src/components/Header.astro new file mode 100644 index 0000000..26416d6 --- /dev/null +++ b/src/components/Header.astro @@ -0,0 +1,77 @@ +--- +const path = Astro.url.pathname +const isActive = (prefix: string) => + prefix === '/' ? path === '/' : path.startsWith(prefix) + +const nav = [ + { label: 'Publishers', href: '/publishers' }, + { label: 'Concepts', href: '/concepts/anatomy' }, + { label: 'Library', href: '/library' }, + { label: 'Specs', href: '/specs' }, + { label: 'Adopt', href: '/adopt' }, + { label: 'About', href: '/about' }, +] +--- + +
+
+ + PubID + PubID + + + + +
+ + + + +
+
+
+ + \ No newline at end of file diff --git a/src/components/_my-impls/AnatomyDiagram.vue.bak b/src/components/_my-impls/AnatomyDiagram.vue.bak new file mode 100644 index 0000000..931c698 --- /dev/null +++ b/src/components/_my-impls/AnatomyDiagram.vue.bak @@ -0,0 +1,77 @@ + + + diff --git a/src/components/_my-impls/ArchitectureDiagram.vue.bak b/src/components/_my-impls/ArchitectureDiagram.vue.bak new file mode 100644 index 0000000..4bb49a5 --- /dev/null +++ b/src/components/_my-impls/ArchitectureDiagram.vue.bak @@ -0,0 +1,183 @@ + + + + + diff --git a/src/components/_my-impls/DocTypeGrid.vue.bak b/src/components/_my-impls/DocTypeGrid.vue.bak new file mode 100644 index 0000000..cdc60cf --- /dev/null +++ b/src/components/_my-impls/DocTypeGrid.vue.bak @@ -0,0 +1,83 @@ + + + diff --git a/src/components/_my-impls/FormatDiagram.vue.bak b/src/components/_my-impls/FormatDiagram.vue.bak new file mode 100644 index 0000000..7b73d28 --- /dev/null +++ b/src/components/_my-impls/FormatDiagram.vue.bak @@ -0,0 +1,88 @@ + + + diff --git a/src/components/_my-impls/HeroDemo.vue.bak b/src/components/_my-impls/HeroDemo.vue.bak new file mode 100644 index 0000000..d489b44 --- /dev/null +++ b/src/components/_my-impls/HeroDemo.vue.bak @@ -0,0 +1,196 @@ + + + + + diff --git a/src/components/_my-impls/PublisherCard.vue.bak b/src/components/_my-impls/PublisherCard.vue.bak new file mode 100644 index 0000000..ec1acc9 --- /dev/null +++ b/src/components/_my-impls/PublisherCard.vue.bak @@ -0,0 +1,38 @@ + + + diff --git a/src/components/_my-impls/PublisherGrid.vue.bak b/src/components/_my-impls/PublisherGrid.vue.bak new file mode 100644 index 0000000..571aa05 --- /dev/null +++ b/src/components/_my-impls/PublisherGrid.vue.bak @@ -0,0 +1,70 @@ + + + diff --git a/src/components/blog/BlogByline.vue b/src/components/blog/BlogByline.vue new file mode 100644 index 0000000..276e83b --- /dev/null +++ b/src/components/blog/BlogByline.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/blog/BlogIndex.vue b/src/components/blog/BlogIndex.vue new file mode 100644 index 0000000..fea9a17 --- /dev/null +++ b/src/components/blog/BlogIndex.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/components/diagrams/AnatomyDiagram.vue b/src/components/diagrams/AnatomyDiagram.vue new file mode 100644 index 0000000..903c1b8 --- /dev/null +++ b/src/components/diagrams/AnatomyDiagram.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/components/diagrams/FormatDiagram.vue b/src/components/diagrams/FormatDiagram.vue new file mode 100644 index 0000000..034761e --- /dev/null +++ b/src/components/diagrams/FormatDiagram.vue @@ -0,0 +1,178 @@ + + + diff --git a/src/components/home/HomePage.vue b/src/components/home/HomePage.vue new file mode 100644 index 0000000..0751ef2 --- /dev/null +++ b/src/components/home/HomePage.vue @@ -0,0 +1,746 @@ + + + diff --git a/src/components/publishers/AlgebraTable.astro b/src/components/publishers/AlgebraTable.astro new file mode 100644 index 0000000..3dcdace --- /dev/null +++ b/src/components/publishers/AlgebraTable.astro @@ -0,0 +1,41 @@ +--- +// AlgebraTable.astro — static table of identifier relationships. +import type { Publisher } from '~/data/types' + +interface Props { publisher: Publisher } +const { publisher: p } = Astro.props + +if (p.algebra.length === 0) return null +--- + +
+

+ PubID Algebra + {p.algebra.length} +

+

+ Relationships between {p.name} identifiers: +

+
+
+ + + + + + + + + + {p.algebra.map((rel, i) => ( + + + + + + + ))} + +
RelationDescriptionSyntaxExample
{rel.type}{rel.description}{rel.syntax}{rel.example}
+ + diff --git a/src/components/publishers/ComponentsGrid.astro b/src/components/publishers/ComponentsGrid.astro new file mode 100644 index 0000000..91e5541 --- /dev/null +++ b/src/components/publishers/ComponentsGrid.astro @@ -0,0 +1,57 @@ +--- +// ComponentsGrid.astro — static grid of flavor components with typed metadata. +// Pure Astro component (no JS) — components are static data. +import type { Publisher, FlavorComponent } from '~/data/types' + +interface Props { publisher: Publisher } +const { publisher: p } = Astro.props + +const dataTypeLabel: Record = { + enum: 'Enumeration', + integer: 'Integer', + string: 'String', + year: 'Year', + compound: 'Compound', +} +--- + +
+

+ Components + {p.components.length} +

+

+ Structured elements that make up a {p.name} identifier: +

+
+ {p.components.map((c: FlavorComponent) => ( +
+
+

{c.name}

+ {c.dataType && ( + + {dataTypeLabel[c.dataType] || c.dataType} + + )} +
+

{c.description}

+ {c.values && c.values.length > 0 && ( +
+ {c.values.slice(0, 8).map(v => {v})} + {c.values.length > 8 && +{c.values.length - 8} more} +
+ )} + {c.format &&
{c.format}
} + {c.example && ( +
+ e.g. + {c.example} +
+ )} + {c.attribute && ( + :{c.attribute} + )} +
+ ))} +
+
diff --git a/src/components/publishers/DocTypePage.astro b/src/components/publishers/DocTypePage.astro new file mode 100644 index 0000000..4542ab5 --- /dev/null +++ b/src/components/publishers/DocTypePage.astro @@ -0,0 +1,88 @@ +--- +// DocTypePage.astro — subpage for a single doc type within a publisher. +import type { Publisher, DocType } from '~/data/types' +import PublisherSidebar from '~/components/publishers/PublisherSidebar.astro' +import BaseLayout from '~/layouts/BaseLayout.astro' + +interface Props { + publisher: Publisher + docType: DocType +} +const { publisher: p, docType: dt } = Astro.props + +const related = p.docTypes.filter(d => d.key !== dt.key).slice(0, 6) +--- + + +
+ + +
+ + +
+
+ {`${p.name} +

{dt.title}

+
+ {dt.abbr.length > 0 && ( +
+ {dt.abbr.map(a => {a})} +
+ )} +
+ +

{dt.description}

+ + {dt.syntax && ( +
+
Syntax
+ {dt.syntax} +
+ )} + + {dt.examples.length > 0 && ( +
+

Examples

+
+ {dt.examples.map((ex, i) => ( +
0 ? 'border-t border-[var(--color-border-subtle)]' : ''} ${i % 2 === 1 ? 'bg-[var(--color-bg-inset)]/40' : ''}`}> + {ex.input} + {ex.output && ex.output !== ex.input && ( + <> + + {ex.output} + + )} +
+ ))} +
+
+ )} + + {related.length > 0 && ( +
+

Other {p.name} doc types

+ +
+ )} +
+
+
diff --git a/src/components/publishers/DocTypePage.vue b/src/components/publishers/DocTypePage.vue new file mode 100644 index 0000000..cf5a1e3 --- /dev/null +++ b/src/components/publishers/DocTypePage.vue @@ -0,0 +1,182 @@ + + + diff --git a/src/components/publishers/FlavorHero.astro b/src/components/publishers/FlavorHero.astro new file mode 100644 index 0000000..840c674 --- /dev/null +++ b/src/components/publishers/FlavorHero.astro @@ -0,0 +1,71 @@ +--- +// FlavorHero.astro — the hero section of a publisher detail page. +import type { Publisher } from '~/data/types' +import { categoryLabels } from '~/data/types' + +interface Props { publisher: Publisher } +const { publisher: p } = Astro.props +--- + +
+
+ {(p.logos && p.logos.length > 1) ? ( +
+ {p.logos.map((logo: string) => {`${p.name})} +
+ ) : p.logo ? ( + {`${p.name} + ) : ( +
+ {p.name.slice(0, 2)} +
+ )} +
+

{p.name}

+

{p.fullName}

+
+
+ +

{p.description}

+ +
+ {categoryLabels[p.category]} + {p.syntaxNotes && ( + + Syntax + {p.syntaxNotes} + + )} + {p.website && ( + + Website + + )} +
+ + {p.urnPattern && ( +
+ URN + {p.urnPattern} +
+ )} +
+ +
+
+
{p.docTypes.length}
+
Doc Types
+
+
+
{p.components.length}
+
Components
+
+
+
{p.algebra.length}
+
Relations
+
+
+
{p.stages?.length || 0}
+
Stages
+
+
diff --git a/src/components/publishers/FlavorPage.vue b/src/components/publishers/FlavorPage.vue new file mode 100644 index 0000000..cb5b297 --- /dev/null +++ b/src/components/publishers/FlavorPage.vue @@ -0,0 +1,279 @@ + + + diff --git a/src/components/publishers/PublisherGrid.vue b/src/components/publishers/PublisherGrid.vue new file mode 100644 index 0000000..fc417d3 --- /dev/null +++ b/src/components/publishers/PublisherGrid.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/publishers/PublisherSidebar.astro b/src/components/publishers/PublisherSidebar.astro new file mode 100644 index 0000000..1ca1130 --- /dev/null +++ b/src/components/publishers/PublisherSidebar.astro @@ -0,0 +1,53 @@ +--- +// PublisherSidebar.astro — collapsible tree of all publishers and their doc types. +// Shared by /publishers/[flavor] and /publishers/[flavor]/[type]. +import { publishers } from '~/data' + +const path = Astro.url.pathname +const currentFlavor = path.split('/')[2] +const currentType = path.split('/')[3] +--- + + + + diff --git a/src/components/publishers/RelatedPublishers.astro b/src/components/publishers/RelatedPublishers.astro new file mode 100644 index 0000000..8f74d4e --- /dev/null +++ b/src/components/publishers/RelatedPublishers.astro @@ -0,0 +1,30 @@ +--- +// RelatedPublishers.astro — chips linking to related flavors. +import type { Publisher } from '~/data/types' +import { getPublisher } from '~/data' + +interface Props { publisher: Publisher } +const { publisher: p } = Astro.props + +const related = (p.relatedFlavors || []) + .map(f => getPublisher(f)) + .filter((x): x is Publisher => Boolean(x)) + +if (related.length === 0) return null +--- + +
+

Related Publishers

+
+ {related.map(rp => ( + + {rp.logo && } + {rp.name} + + + ))} +
+
diff --git a/src/components/publishers/StagesTable.astro b/src/components/publishers/StagesTable.astro new file mode 100644 index 0000000..0755f5c --- /dev/null +++ b/src/components/publishers/StagesTable.astro @@ -0,0 +1,39 @@ +--- +// StagesTable.astro — static table of development stages (NIST/ISO/IEC). +import type { Publisher } from '~/data/types' + +interface Props { publisher: Publisher } +const { publisher: p } = Astro.props + +if (!p.stages || p.stages.length === 0) return null +--- + +
+

+ Development Stages + {p.stages.length} +

+

+ Lifecycle stages for {p.name} documents: +

+
+ + + + + + + + + + {p.stages.map((s, i) => ( + + + + + + ))} + +
CodeAbbrName
{s.code}{s.abbr}{s.name}
+
+
diff --git a/src/components/publishers/__tests__/PublisherGrid.spec.ts b/src/components/publishers/__tests__/PublisherGrid.spec.ts new file mode 100644 index 0000000..2f833a8 --- /dev/null +++ b/src/components/publishers/__tests__/PublisherGrid.spec.ts @@ -0,0 +1,48 @@ +import { describe, it, expect } from 'vitest' +import { mount } from '@vue/test-utils' +import PublisherGrid from '~/components/publishers/PublisherGrid.vue' +import { publishers } from '~/data' + +describe('PublisherGrid.vue', () => { + it('renders a card for every publisher by default', () => { + const wrapper = mount(PublisherGrid) + const cards = wrapper.findAll('a[href^="/publishers/"]') + expect(cards).toHaveLength(publishers.length) + }) + + it('filters by category when a tab is clicked', async () => { + const wrapper = mount(PublisherGrid) + const buttons = wrapper.findAll('button') + const intlBtn = buttons.find(b => b.text().includes('International')) + expect(intlBtn).toBeDefined() + await intlBtn!.trigger('click') + + const visibleCards = wrapper.findAll('a[href^="/publishers/"]') + const intlCount = publishers.filter(p => p.category === 'international').length + expect(visibleCards).toHaveLength(intlCount) + }) + + it('shows the empty state when search matches nothing', async () => { + const wrapper = mount(PublisherGrid) + const input = wrapper.find('input') + await input.setValue('zzzzzz-no-match-zzzzzz') + expect(wrapper.text()).toContain('No publishers found') + }) + + it('search matches by name, fullName, and flavor', async () => { + const wrapper = mount(PublisherGrid) + const input = wrapper.find('input') + + // By name (unique) + await input.setValue('ISO') + expect(wrapper.findAll('a[href^="/publishers/"]')).toHaveLength(1) + + // By fullName (unique) + await input.setValue('International Organization for Standardization') + expect(wrapper.findAll('a[href^="/publishers/"]')).toHaveLength(1) + + // By flavor (unique) + await input.setValue('iala') + expect(wrapper.findAll('a[href^="/publishers/"]')).toHaveLength(1) + }) +}) diff --git a/src/components/publishers/_archived-PublisherCard.astro b/src/components/publishers/_archived-PublisherCard.astro new file mode 100644 index 0000000..15e5bdc --- /dev/null +++ b/src/components/publishers/_archived-PublisherCard.astro @@ -0,0 +1,41 @@ +--- +// PublisherCard.astro — pure static markup, no interactivity. +// Reused everywhere a publisher card appears (grid, related links, home preview). +import type { Publisher } from '~/data/types' +import { categoryLabels } from '~/data/types' + +interface Props { + publisher: Publisher + variant?: 'grid' | 'compact' +} + +const { publisher: p, variant = 'grid' } = Astro.props +--- + +{variant === 'grid' && ( + +
+ {p.logo ? ( + {`${p.name} + ) : ( +
+ {p.name.slice(0, 2)} +
+ )} +

{p.name}

+
+

{p.fullName}

+
+ {categoryLabels[p.category]} + {p.docTypes.length} types +
+
+)} + +{variant === 'compact' && ( + + {p.logo && } + {p.name} + + +)} diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 0000000..4360829 --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,54 @@ +import { defineCollection, z } from 'astro:content' +import { glob } from 'astro/loaders' + +// Content Layer API (Astro 7). Each collection uses a glob loader to +// discover its files. Adding a new collection = new block here (OCP). + +const baseSchema = z.object({ + title: z.string().optional(), + description: z.string().optional(), +}) + +const concepts = defineCollection({ + loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/concepts' }), + schema: baseSchema.extend({ + ord: z.number().default(0), + }), +}) + +const blog = defineCollection({ + loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/blog' }), + schema: baseSchema.extend({ + pubDate: z.coerce.date().optional(), + date: z.coerce.date().optional(), + author: z.string().default('PubID Team'), + tags: z.array(z.string()).default([]), + draft: z.boolean().default(false), + }), +}) + +const library = defineCollection({ + loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/library' }), + schema: baseSchema.extend({ + ord: z.number().default(0), + }), +}) + +const specs = defineCollection({ + loader: glob({ pattern: '**/*.md', base: './src/content/specs' }), + schema: baseSchema.extend({ + ord: z.number().default(0), + }), +}) + +const adopt = defineCollection({ + loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/adopt' }), + schema: baseSchema, +}) + +const about = defineCollection({ + loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/about' }), + schema: baseSchema, +}) + +export const collections = { concepts, blog, library, specs, adopt, about } diff --git a/src/content/about/index.md b/src/content/about/index.md new file mode 100644 index 0000000..85def15 --- /dev/null +++ b/src/content/about/index.md @@ -0,0 +1,359 @@ +--- +title: About PubID +description: The story behind PubID — a universal, machine-readable system for publication identifiers, grounded in the philosophy that meaning precedes form. +--- + +# About PubID + +
+

The meaning of a document lives before its name is written

+
+ +## Origin Story + +At [Ribose](https://www.ribose.com/), we build systems that manage standards documents — and we kept running into the same wall. Every publisher identifies documents differently. ISO uses `ISO 9001:2015`. IEEE writes `IEEE Std 802.3-2018`. NIST has `NIST SP 800-53 Rev. 5`. These identifiers carry rich semantic meaning — publisher, document type, number, year, stage, part — but that meaning is locked inside conventions that only humans can parse, and only imperfectly. + +There was no universal way to: + +- **Parse** an identifier into its semantic components +- **Exchange** identifiers between systems without loss +- **Render** the same identifier in multiple formats +- **Compare** identifiers across different publishers + +**PubID was born** from a conviction that the meaning of an identifier should be separate from any single representation of it. We needed a metaschema — a shared grammar — that could capture the full semantic depth of any publication identifier and express it in whatever form the situation demands. + +Since then, PubID has grown to cover **37+ publishers** across international, regional, national, and industry standards, with a Ruby reference implementation that parses, renders, and interchanges identifiers with round-trip fidelity. + +## The Metaschema + +The PubID metaschema defines the common elements that make up any publication identifier: + +| Element | Required | Description | +|---------|----------|-------------| +| Publisher | Yes | The issuing organization (ISO, IEC, IEEE, etc.) | +| Document Type | Yes | The type of deliverable (Standard, Report, Guide, etc.) | +| Document Number | Yes | The unique identifier number | +| Year | Optional | Publication or revision year | +| Part | Optional | Part number for multi-part standards | +| Edition | Optional | Edition number | +| Stage | Optional | Development stage (Draft, CD, DIS, FDIS, etc.) | +| Language | Optional | Language code (en, fr, ru, etc.) | +| Supplement | Optional | Amendment, Corrigendum, Addendum | + +Each publisher's schema specifies which elements are used, their allowed values, and how they combine syntactically. + +## Identifier Composition + +Identifiers compose through algebraic relationships. A supplement identifier **embeds** a base identifier — the supplement carries its own type, number, and year, while the base remains intact inside it: + +| Composition | Example | +|-------------|---------| +| **Base** | `ISO 9001:2015` — publisher, number, year | +| **Supplement embeds Base** | `ISO 9001:2015/Amd 1:2023` — amendment identifier contains the base | +| **With Copublisher** | `ISO/IEC 17031-1:2020` — joint publication | +| **Composite** | `ISO/IEC 17031-1:2020/Amd 1:2022` — amendment embeds copublished base | +| **3-Level Nesting** | `ISO/IEC 13818-1:2015/Amd 3:2016/Cor 1:2017` — corrigendum embeds amendment, which embeds base standard | +| **Adoption** | `BS EN ISO 9001:2015` — national body adopts European norm, which adopts international standard | +| **Dual Published** | `IEC 60255-24 Ed. 2.0 2013-04 and IEEE Std C37.111-2013` — two equivalent identifiers from different publishers | +| **Bundled** | `CSA B127.1:99 + B127.2:99` — multiple standards sold as a package | + +Each layer is a complete identifier in its own right. A supplement identifier does not modify the base — it wraps it, adding its own type (Amendment, Corrigendum), number, and year. + +## Multi-Style Rendering + +A key innovation in PubID is the ability to render the same identifier in multiple styles without information loss. A single identifier is parsed into structured components, then re-rendered in any output format: + + + +This pattern extends across all supported publishers: every PubID can render as a human-readable string, a URN, or structured JSON. Parse any style, and you can re-render it in any other — the interchange is lossless. + +## The Ecosystem + +| Component | Description | +|-----------|-------------| +| **Metaschema** | Formal definition of identifier elements and their relationships | +| **Publisher Schemas** | 37+ publisher-specific schema definitions | +| **Reference Library** | Ruby gem implementing all schemas with parse/render/URN support | +| **This Website** | Documentation, interactive playground, and schema registry | + + + +**Data pipeline:** Publisher schema data on this site is exported directly from the [pubid-ruby](https://github.com/metanorma/pubid) reference implementation. The export version is: + +
+ +
+ +## NIST: The First Adopter + +
+ +In 2021, NIST published the [Publication Identifier Syntax for NIST Technical Series Publications](https://www.nist.gov/system/files/documents/2022/04/01/PubID_Syntax_NIST_TechPubs.pdf) — a formal scheme for uniquely identifying every document across the 53 publication series and 19,333+ documents in the NIST Library, dating back to 1901. + +NIST was the first standards organization to adopt a multi-style, round-trippable PubID scheme with four defined rendering styles: + +| Style | Usage | Example | +|-------|-------|---------| +| **Full** | Title page and bibliography | National Institute of Standards and Technology Special Publication 800-53, Revision 5 | +| **Abbreviated** | Authority section | Natl. Inst. Stand. Technol. Spec. Publ. 800-53 Rev. 5 | +| **Short** | Inline citations | NIST SP 800-53 Rev. 5 | +| **Machine-Readable** | DOI suffix | NIST.SP.800-53r5 | + +[Ribose](https://www.ribose.com) was involved from the conception phase alongside the NIST Information Services Office and CSRC teams in conceptualizing the universal PubID scheme — acknowledged in both the original 2020 draft and the final PubID 1.0 document. Ribose submitted [formal comments](https://riboseinc.github.io/report-nist-pubid/) during the public review period, built the [nist-pubid](https://github.com/metanorma/nist-pubid) conversion tool that migrated all 19,333 legacy identifiers, and assisted with the CSWP identifier migration when NIST moved from date-based to sequential numbering. + +The NIST PubID demonstrated that a well-designed identifier scheme can serve both human and machine needs simultaneously — a principle that PubID carries forward across all publishers. + + + +
+ +## What We Believe + +
+ +**PubID exists to preserve the integrity of meaning across every form a publication identifier can take — human or machine, verbose or terse, printed or digital.** + +
+ +- The **meaning** of an identifier is prior to and independent of any particular rendering +- **Human-readable** and **machine-readable** forms are equally valid expressions of the same reality +- **Round-trip fidelity** — parse any form, recover the original — is not just a feature but a philosophical commitment +- Every identifier carries **depth** that no single surface representation exhausts + +## The Name & Logo + +**PubID** stands for **Publication Identifier**. It is both a noun and a mission: to give every publication an identifier that is universally parsable, unambiguously structured, and faithful to the original meaning it represents. + +The logo is not decoration — it is a statement of philosophy: + +
+ PubID Logo +
+ +
+

道可道,非常道;名可名,非常名

+

The Way that can be spoken is not the eternal Way;
the name that can be named is not the eternal name.

+
+ +Every element encodes a layer of meaning: + +
+ +
+
+

The Pool

+

The pool is the Way: the original, complete meaning of a publication identifier. It is the source — the semantic model from which all representations emerge and to which they return. Its depths are profound and unfathomable; meaning exists there in its purest form, beyond any particular expression, the deep structure that no single rendering can fully capture. Every identifier, in every format, points back to the same underlying reality in this pool.

+
+ +
+
+

The Surface

+

The surface of the pool is where meaning begins to take name and form. It is the boundary between the unnameable and the named — where depth rises toward expression, where semantic models crystallize into identifiable structure. A name is real and necessary, yet it is never the thing itself.

+
+ +
+
+

Waves & Particles

+

The waves (human-readable identifiers) and particles (machine-readable forms) are 有 — being, manifest existence. Every representation is real and functional, yet no single form is constant. Human-readable strings and machine-readable URNs are two modes of the same 有 — both arising from the same source, both legitimate, neither permanent.

+
+ +
+
+

The Space Between

+

The emptiness between the waves and particles is 無 — non-being, the void. It is not absence but potential: the space that gives each form its meaning. Without the gaps, there is no structure; without 無, 有 has no shape. The void is what makes the identifier parsable — the delimiters, the spaces, the structure that separates one component from another.

+
+ +
+ +## Open Source + +PubID is proudly open source. + +- **GitHub**: [github.com/pubid](https://github.com/pubid) +- **Reference Implementation**: [github.com/metanorma/pubid](https://github.com/metanorma/pubid) +- **This Site**: [github.com/pubid/pubid.github.io](https://github.com/pubid/pubid.github.io) +- **Contributing**: New publisher schemas and features welcome + +*An open source project maintained by [Ribose](https://www.ribose.com)* + + diff --git a/src/content/adopt/guide.md b/src/content/adopt/guide.md new file mode 100644 index 0000000..efb7838 --- /dev/null +++ b/src/content/adopt/guide.md @@ -0,0 +1,583 @@ +--- +title: Designing Your PubID Scheme +description: A 12-dimension guide to designing a formal publication identifier scheme using the PubID metaschema, with real-world examples from ISO, NIST, ASTM, and more. +--- + +# Designing Your PubID Scheme + +This guide helps standards publishers formalize their publication identifier scheme using the PubID metaschema. Whether you're an international body like ISO, a national standards organization like BSI, or a trade association like API, the same principles apply. + +## Why Formalize Your Identifier Scheme? + +A well-designed identifier scheme solves a fundamental problem: **how does anyone — human or machine — uniquely and unambiguously identify a specific document?** + +Without a formal scheme: +- The same document may be cited differently in different contexts +- Machines cannot reliably parse, compare, or exchange identifiers +- Supplements and amendments are ambiguous ("ISO 9001/Amd 1" — to which edition?) +- Cross-referencing between publishers is impossible + +With a PubID scheme: +- **Unambiguous identification** — Every document has exactly one canonical identifier +- **Machine parsing** — Software decomposes identifiers into semantic components (publisher, type, number, year, stage, supplement) +- **Round-trip fidelity** — Parse and re-render to get identical output +- **Cross-publisher interoperability** — Identifiers from different publishers share a common metaschema +- **Multi-style rendering** — One identifier renders in multiple formats without information loss +- **Lossless interchange** — Convert between human-readable, URN, and JSON without losing information + +## Design Dimensions + +When designing your PubID scheme, you need to address each of these dimensions. Not every dimension applies to every publisher — SAE has one document type with no stages, while ISO has 18 types with a 7-stage lifecycle. The key is to be deliberate about each decision. + +--- + +### 1. Publisher Identity + +Your publisher code is the namespace for all your identifiers. Choose it carefully — it will appear in millions of citations. + +**Choosing a publisher code:** + +| Publisher | Code | Reasoning | +|-----------|------|-----------| +| International Organization for Standardization | `ISO` | Universally recognized acronym | +| International Electrotechnical Commission | `IEC` | Universally recognized acronym | +| Institute of Electrical and Electronics Engineers | `IEEE` | Widely known abbreviation | +| National Institute of Standards and Technology | `NIST` | US government agency acronym | +| British Standards Institution | `BSI` | National body abbreviation | +| American Petroleum Institute | `API` | Industry association abbreviation | +| Consultative Committee for Space Data Systems | `CCSDS` | Inter-organization abbreviation | + +**Design considerations:** + +- **Stability**: Once chosen, this code never changes. It appears in URNs, databases, and citations permanently. +- **Uniqueness**: Check that your code doesn't conflict with existing PubID publishers. +- **Copublishing**: If you co-publish documents with other bodies, define how joint codes combine. ISO uses slash-separated copublishers: `ISO/IEC 17031-1:2020`, `ISO/ASTM 51423-1`. Decide whether the copublisher order matters (ISO/IEC vs IEC/ISO are different identifiers in practice). +- **URN namespace**: Your publisher code becomes your URN namespace identifier (NID): `urn:iso:...`, `urn:nist:...`, `urn:ieee:...`. +- **Historical names**: If your organization was previously known by a different name (NIST was NBS before 1988), decide whether legacy identifiers remain valid and how they map. + +--- + +### 2. Document Types + +Document types classify the **nature of the deliverable**. Each type represents a distinct kind of publication with its own rules and purpose. + +**Enumerating your types:** + +Start by listing every type of document your organization publishes. For each type, define: + +| Property | Description | Example (ISO) | +|----------|-------------|---------------| +| **Type key** | Machine-readable identifier | `is`, `tr`, `ts` | +| **Title** | Full human-readable name | International Standard | +| **Short form** | Abbreviation used in identifiers | `IS`, `TR`, `TS` | +| **Abbreviations** | All recognized abbreviation variants | `["", "IS"]` for International Standard | + +**Spectrum of complexity:** + +``` +Simple Complex +───────────────────────────────────────────────── +SAE: 1 type (base) ISO: 18 types +ASME: 1 type (standard) BSI: 17+ types + NIST: 19 types + IEEE: 17+ variants +``` + +**Design considerations:** + +- **Is the type always present?** ISO always shows the type (implicitly for IS, explicitly for TR, TS, etc.). NIST always shows the type code (SP, FIPS, IR). But for some publishers, the type is implicit in the numbering. +- **Type abbreviation conventions**: ISO uses uppercase abbreviations (TR, TS, PAS). IEEE uses "Std" for published standards and "P" for project drafts. NIST uses 2-4 letter codes (SP, FIPS, IR, HB, TN). Be consistent. +- **Subtypes**: Do any of your types have subtypes? BSI has aerospace standards (`BS A`, `BS AU`, `BS M`) that are variants of British Standards. +- **Open/closed principle**: Register types in a Scheme class so new types can be added without modifying existing parser rules. Each new type is a new entry, not a change to existing code. + +--- + +### 3. Numbering Scheme + +The numbering scheme determines how individual documents are identified within a type. + +**Common patterns:** + +| Pattern | Example | Structure | Used By | +|---------|---------|-----------|---------| +| Simple sequential | `ISO 9001` | type + number | ISO, IEC | +| Series + number | `NIST SP 800-53` | type + series-number | NIST | +| Letter + number + year | `ASTM E2938-15` | code+number-year | ASTM | +| Type + number + version | `ETSI EN 301 419 V1.1.1` | type+number.version | ETSI | +| Handbooks | `PLATEAU Handbook 1` | type + number | PLATEAU | + +**Part numbering for multi-part documents:** + +Most publishers support multi-part documents. The separator and numbering vary: + +``` +ISO 9001-1:2015 → hyphen separator, numeric part +NIST SP 800-57 Part 1 → "Part" separator +CEN EN 12345-1 → hyphen separator +ITU-T G.992.1 → dot separator (within a series) +``` + +**Design considerations:** + +- **Stability**: Document numbers should never change. If ISO 9001 was assigned, it remains 9001 forever. +- **Uniqueness scope**: Is the number unique within the type (ISO 9001 is unique within IS type) or globally unique across all types? +- **Leading zeros**: Decide whether numbers have leading zeros. ISO doesn't (`ISO 9001`), but some internal systems might. +- **Gap tolerance**: Numbers don't need to be sequential. ISO 9001 and ISO 9004 exist, but 9002 and 9003 were withdrawn. +- **Part depth**: Can parts have sub-parts? (ISO 9999-1 can have further subdivisions in URNs.) + +--- + +### 4. Editions and Revisions + +This dimension tracks **which version** of a document is being referenced. The design choice here has significant implications for citation accuracy. + +**Three models:** + +**a) Year-based edition (ISO, IEC, JIS)** + +``` +ISO 9001:2015 → published 2015, 5th edition +ISO 9001:2008 → published 2008, 4th edition (superseded) +``` + +The year serves as the edition indicator. When citing, the year is essential — "ISO 9001" without a year is ambiguous. + +**b) Revision number (NIST)** + +``` +NIST SP 800-53 Rev. 5 → 5th revision +NIST SP 800-53r5 → machine-readable form +``` + +Revisions are explicitly numbered and the revision number is part of the identifier. NIST supports both long form (`Rev. 5`) and short form (`r5`). + +**c) Reapproval year (ASTM)** + +``` +ASTM E2938-15 → originally published 2015 +ASTM E2938-15(2023) → reapproved in 2023 without changes +``` + +ASTM uses the original year plus an optional reapproval year in parentheses. + +**Key design questions:** + +- **Is undated citation valid?** ISO allows `ISO 9001` (undated) to mean "the latest edition." NIST requires the revision. Which model do you follow? +- **Edition vs revision**: An "edition" is a substantive new version. A "revision" (in NIST terms) is similar. Make the semantic clear. +- **Supersession**: When edition 2 replaces edition 1, what happens to references to edition 1? (They remain valid — each edition is a distinct document.) + +--- + +### 5. Development Stages and Drafts + +Not every publisher uses development stages. If your documents are published directly (like ASTM standards), you can skip this dimension entirely. But if your documents go through a formal public review lifecycle, stages are essential. + +**ISO/IEC stage model (the most complex):** + +``` +PWI → NP → WD → CD → DIS → FDIS → IS + 00 10 20 30 40 50 60 +``` + +| Stage | Code | Name | Harmonized | Meaning | +|-------|------|------|------------|---------| +| Preliminary Work Item | PWI | 00.00-00.99 | Idea stage | +| New Proposal | NP/NWIP | 10.00-10.99 | Proposed for development | +| Working Draft | WD | 20.00-20.99 | Under development | +| Committee Draft | CD | 30.00-30.99 | Sent to committee for review | +| Draft International Standard | DIS | 40.00-40.99 | Sent to all member bodies | +| Final DIS | FDIS | 50.00-50.99 | Final approval ballot | +| International Standard | IS | 60.00-60.60 | Published | + +**Typed stages** — When stage + type combine into a single abbreviation: + +``` +DTR = Draft Technical Report (DIS stage + TR type) +FDTR = Final Draft Technical Report (FDIS stage + TR type) +DTS = Draft Technical Specification +``` + +This is a distinctive ISO/IEC feature. It allows identifiers like `ISO/DTR 10017` to clearly indicate both the stage and type. + +**IEEE draft model (numbered):** + +IEEE uses numbered drafts rather than named stages: +``` +IEEE P802.3bf/D1.0 → Project 802.3bf, Draft 1.0 +IEEE P802.3bf/D3.0 → Project 802.3bf, Draft 3.0 +IEEE Std 802.3bf-2011 → Published standard +``` + +The "P" prefix indicates a project (draft). Published standards use "Std" instead. + +**BSI/CEN model (typed stage prefixes):** + +``` +BS EN 12345 → Published European Norm adopted as British Standard +prEN 12345 → Draft (proposal) European Norm +DD 12345 → Draft for Development +BS Draft 12345 → Draft British Standard +``` + +**Design questions:** + +- Do your documents have publicly visible draft stages? +- Are stages indicated by prefixes (BS EN, prEN), abbreviations (DIS, FDIS), or both? +- Do you need harmonized stage codes for cross-publisher interoperability? +- Do stages combine with types into typed stages (DTR, FDTR)? +- Are draft identifiers valid for citation, or only published documents? + +--- + +### 6. Supplements + +Supplements modify a base document. Modeling them correctly is critical because supplements inherit context from their base. + +**Common supplement types:** + +| Type | Key | ISO Example | NIST Example | +|------|-----|-------------|-------------| +| Amendment | `amd` | ISO 9001:2015/Amd 1:2023 | — | +| Corrigendum | `cor` | ISO 9001:2015/Cor 1:2017 | — | +| Addendum | `add` | ISO 2631/DAD 1 | — | +| Update | — | — | NIST SP 800-53 Rev. 5 Upd. 1 | + +**How supplements reference their base:** + +``` +ISO 9001:2015/Amd 1:2023 +│ │ │ │ │ +│ │ │ │ └── Supplement year +│ │ │ └── Supplement number +│ │ └── Supplement type (Amendment) +│ └── Base document year +└──────── Base document number +``` + +**Nesting**: Can supplements be supplemented? In ISO, yes: + +``` +ISO/IEC 17031-1:2020/Amd 1:2022/Cor 1:2023 + │ │ + │ └── Corrigendum to the Amendment + └── Amendment to the base +``` + +**Design questions:** + +- What supplement types do you need? (amendments, corrigenda, addenda, errata, updates) +- Do supplements have their own year/date? +- Can supplements be chained (supplement to a supplement)? +- Are supplements always attached to a base, or can they be standalone documents? +- How are supplements numbered? (sequential across all supplements to the base, or per-type?) + +--- + +### 7. Copublishers and Joint Publications + +When two or more organizations publish a document together, the identifier must reflect all publishers. + +**ISO copublishing pattern:** + +``` +ISO/IEC 17031-1:2020 → ISO + IEC joint publication +ISO/ASTM 51423-1:2019 → ISO + ASTM joint publication +ISO/IEC/IEEE 8802-3:2021 → Three-way joint (triple logo) +``` + +The copublisher order is significant — the first publisher is the "lead." `ISO/IEC` and `IEC/ISO` are different PubIDs referring to the same document. + +**Design questions:** + +- Do you co-publish documents? With which organizations? +- Is copublisher order significant in your scheme? +- Are copublished identifiers recognized by both/all publishers? +- Do copublished documents have different identifiers at each publisher? (BSI adopts ISO standards as "BS ISO 9001:2015" — a different identifier.) + +--- + +### 8. Language + +If your documents are published in multiple languages, the identifier must distinguish them. + +**ISO language pattern:** + +``` +ISO 9001:2015 → Default (English) +ISO 9001:2015(en) → Explicit English +ISO 9001:2015(fr) → French +ISO 9001:2015(ru) → Russian +``` + +Language codes follow ISO 639-1. In URNs: `urn:iso:std:iso:9001:ed-5:en`. + +**CIE language patterns:** + +CIE supports multiple language formats: +``` +CIE S 023/E:2019 → English (slash format) +CIE S 023/D:2019 → German (slash format) +CIE S 023:2019(en) → English (parenthetical format) +``` + +**Design questions:** + +- Do you publish in multiple languages? +- Is the default language implicit (no code) or explicit? +- What language code standard do you use? (ISO 639-1 is recommended.) +- Are translations different documents or the same document in different languages? + +--- + +### 9. Rendering Styles and Machine-Readable Forms + +A single PubID should render into multiple formats without information loss. This is a core innovation of the PubID metaschema. + +**Style spectrum:** + +| Style | Purpose | ISO Example | NIST Example | +|-------|---------|-------------|-------------| +| **Full (long)** | Title pages, formal citations | `International Standard ISO 9001:2015` | `National Institute of Standards and Technology Special Publication 800-53 Revision 5` | +| **Abbreviated** | Space-constrained references | — | `Natl. Inst. Stand. Technol. Spec. Publ. 800-53 Rev. 5` | +| **Short** | Inline citations, running text | `ISO 9001:2015` | `NIST SP 800-53 Rev. 5` | +| **Machine-readable** | DOI suffix, databases, file naming | `ISO:9001:2015` | `NIST.SP.800-53.r5` | +| **URN** | Machine interchange, resolution | `urn:iso:std:iso:9001:ed-5:en` | `urn:nist:pub:sp:800-53:r5` | +| **JSON** | API responses, structured data | `{"publisher":"ISO","number":"9001",...}` | `{"publisher":"NIST","series":"SP",...}` | + +**Design principle — lossless interchange:** + +``` + ┌─────────────┐ + "ISO 9001:2015"──▶│ │──▶ urn:iso:std:iso:9001:ed-5:en + │ Parsed │ + ISO:9001:2015 ───▶│ Components │──▶ {"publisher":"ISO","number":"9001",...} + │ │──▶ ISO 9001 (short form) + [URN input] ─────▶│ │──▶ ISO 9001:2015/Amd 1:2023 (with supplements) + └─────────────┘ +``` + +Any input style can be parsed into the same structured components, then re-rendered into any output style. The conversion is bidirectional and lossless. + +**Design questions:** + +- Which rendering styles do you need? (At minimum: short + URN) +- Do you need a machine-readable form compatible with DOI registration? +- Should the full form spell out your organization's full name? +- Are there legacy formats that must still be parseable? + +--- + +### 10. URN Mapping + +Every PubID maps to a canonical URN ([RFC 8141](https://www.rfc-editor.org/rfc/rfc8141)) for machine interchange. The URN provides a stable, location-independent identifier. + +**URN structure:** + +``` +urn:{publisher}:{class}:{type}:{number}:{part}:{edition}:{language} +``` + +**Examples:** + +``` +urn:iso:std:iso:9001:ed-5:en +urn:iso:std:iso-iec:17031:-1:ed-1:amd:1:v1 +urn:nist:pub:sp:800-53:r5 +urn:ieee:std:802.3:2018 +``` + +**URN design principles:** + +- Use lowercase throughout +- Use stable, unchanging components +- Include enough information for unambiguous resolution +- Ensure round-trip: `URN → parse → to_urn → URN` is identity +- Define how each metaschema element maps to URN path segments + +**Design questions:** + +- What is your URN namespace identifier (NID)? +- How do copublishers appear in URNs? (ISO uses `iso-iec` for joint publications) +- How are supplements encoded? +- Are URNs registered in an IANA registry? + +--- + +### 11. Citation and Bibliographic References (ISO 690) + +When citing standards in academic papers, technical reports, or other standards, [ISO 690](https://www.iso.org/standard/43320.html) provides the guidelines for bibliographic references. Your PubID scheme should map cleanly to ISO 690 requirements. + +**ISO 690 citation for a standard (author-date system):** + +``` +INTERNATIONAL ORGANIZATION FOR STANDARDIZATION, 2015. ISO 9001:2015. +Quality management systems — Requirements. 5th ed. Geneva: ISO. +``` + +**ISO 690 citation (numeric system):** + +``` +[1] ISO 9001:2015, Quality management systems — Requirements. +``` + +**ISO 690 citation for a NIST publication:** + +``` +NIST SP 800-53 Rev. 5, Recommendation for Security and Privacy Controls +for Federal Information Systems and Organizations. Gaithersburg: NIST, 2020. +``` + +**Mapping PubID elements to ISO 690:** + +| PubID Element | ISO 690 Element | Notes | +|---------------|-----------------|-------| +| Publisher (fullName) | Creator/Author | Full organization name | +| Type + Number + Year | Title/Designation | The identifier itself serves as the title designation | +| Year | Date of publication | | +| Edition/Revision | Edition statement | "5th ed." or "Rev. 5" | +| Language | Language note | Required for multi-language documents | +| URN | Standard identifier | Persistent identifier for the resource | + +**ISO 690 principles that apply to PubID design:** + +1. **Facilitate retrieval** — The identifier must help readers find the exact document +2. **Reflect the content accurately** — The edition/version must be correct +3. **Adopt uniform presentation** — Same format across all citations in a work +4. **Reference derivative works alongside the original** — Supplements must cite their base + +Per ISO 690, when citing a standard, the series title and number are **essential** elements. This means your PubID's type abbreviation + number must be sufficient to identify the document in a citation. + +**Design questions:** + +- Does your short-form identifier carry enough information for unambiguous citation? +- How does your identifier appear in running text vs. a reference list? +- Can readers find the document from the identifier alone, or do they need additional context? + +--- + +### 12. Extensibility — Open/Closed Principle + +Your PubID scheme will evolve. New document types will be created, new development stages may be introduced, and new rendering requirements will emerge. Design for this from the start. + +**Open/closed principle:** + +- **Open for extension** — New types, stages, and styles can be added +- **Closed for modification** — Existing identifier formats never change + +**Practical patterns:** + +**a) Scheme registry for types** + +All identifier types are registered in a Scheme class. Adding a type adds a new class and registry entry — no existing parser rules change: + +``` +Scheme.identifiers = [ + InternationalStandard, # existing + TechnicalReport, # existing + TechnologyTrendsAssessment, # newly added — no other code changed +] +``` + +**b) Additive parser rules** + +PEG grammar rules are additive. A new document type adds new parsing alternatives without modifying existing rules: + +``` +# Existing rule +identifier = standard / technical_report +# After extension — just add to the alternation +identifier = standard / technical_report / new_type +``` + +**c) New rendering styles without modification** + +New output formats are added as new serializer methods. Existing `to_s`, `to_urn`, `to_h` remain unchanged. A new `to_doi` method is simply added. + +**Design questions:** + +- How will new document types be introduced? Is there a registration process? +- When a new stage is added, do existing identifiers change? (They shouldn't.) +- Are there deprecated types or stages that must still be parseable? +- How do you handle breaking changes? (Answer: you don't — maintain backward compatibility.) + +--- + +## Decision Checklist + +Before implementing your PubID scheme, confirm you've addressed every dimension: + +| Dimension | Key Question | Your Decision | +|-----------|-------------|---------------| +| **Publisher identity** | What is your publisher code? Is it stable and unique? | | +| **Copublishers** | Do you co-publish? How are joint identifiers formed? | | +| **Document types** | What types do you publish? What are their keys and abbreviations? | | +| **Numbering** | Sequential, series-based, or catalog-based? Are parts supported? | | +| **Editions** | Year-based, number-based, or revision-based? Is undated citation valid? | | +| **Stages** | Do documents have public draft stages? Are typed stages needed? | | +| **Supplements** | Amendments, corrigenda, addenda? Can supplements be chained? | | +| **Language** | Multi-language publications? Default language implicit or explicit? | | +| **Rendering** | Which output styles: short, full, abbreviated, MR, URN? | | +| **URN** | What is your URN namespace? How do elements map to path segments? | | +| **Citation** | How does your identifier appear in ISO 690 references? | | +| **Extensibility** | How will new types/stages be added without breaking existing identifiers? | | +| **Legacy formats** | Are there historical identifier formats that must still parse? | | + +## Implementation Path + +Once your scheme is designed, implement it in the PubID framework: + +1. **Create a flavor module** — `lib/pubid/{your_flavor}/` +2. **Define identifier classes** — One class per document type, with `def self.type` and optional `TYPED_STAGES` +3. **Write a PEG parser** — Parslet grammar rules for your syntax +4. **Implement a Scheme** — Registry of types, stages, and typed stages +5. **Add URN mapping** — URN generator and parser for round-trip +6. **Write rendering** — Output styles (`to_s`, `to_urn`, `to_h`) +7. **Add tests** — Fixture files with real-world examples (pass + fail cases) +8. **Register** — Add your flavor to the PubID module registry +9. **Document** — Add a publisher page to the website with types, examples, and rendering styles + +## Real-World Examples + +### Minimal scheme: SAE + +SAE has a single document type. No stages, no supplements, no typed stages. + +``` +SAE J1939-71 +SAE J1939/71_202403 +``` + +Components: publisher, number, (optional) revision date. + +### Medium complexity: ASTM + +ASTM has 9 document types but no stages. Reapproval dates add versioning. + +``` +ASTM E2938-15 → Standard, published 2015 +ASTM E2938-15(2023) → Same, reapproved 2023 +ASTM E2938-15e2 → Same, edition 2 +``` + +### Complex scheme: ISO + +ISO has 18 document types, a 7-stage lifecycle, typed stages, supplements, copublishers, and language codes. + +``` +ISO/IEC 17031-1:2020/Amd 1:2022 +ISO/DIS 45001 +ISO/TS 22002-1:2008(en) +``` + +## See Also + +- [Anatomy of a PubID](/concepts/anatomy) — How PubIDs are structured +- [The Metaschema](/concepts/metaschema) — Formal element definitions +- [Common Elements](/concepts/components) — Shared component reference +- [PubID Algebra](/concepts/algebra) — Relationships between identifiers +- [URN Mapping](/concepts/urn) — Machine-readable URN representation +- [Browse Publishers](/publishers/) — See all implemented schemas + +--- + +*Reference: [ISO 690:2023](https://www.iso.org/standard/43320.html) — Information and documentation — Guidelines for bibliographic references and citations to information resources* diff --git a/src/content/adopt/index.md b/src/content/adopt/index.md new file mode 100644 index 0000000..78a1d65 --- /dev/null +++ b/src/content/adopt/index.md @@ -0,0 +1,79 @@ +--- +title: Adopt PubID +description: A guide for standards organizations to adopt the PubID identifier scheme — with NIST as the first official adopter. +--- + +# Adopt PubID + +PubID gives standards organizations a structured, machine-readable identifier scheme that preserves meaning across every form — human-readable, URN, and JSON. If your organization publishes standards, technical reports, or any documents that need unambiguous identification, PubID can work for you. + +## Why adopt a formal identifier scheme? + +Without a formal scheme, identifiers are ambiguous, inconsistent, and impossible for machines to parse reliably. With PubID: + +- **Unambiguous identification** — Every document has exactly one canonical identifier +- **Machine parsing** — Software decomposes identifiers into semantic components automatically +- **Round-trip fidelity** — Parse any format, re-render it identically +- **Multi-style rendering** — One identifier, multiple output formats, zero information loss +- **URN mapping** — Every identifier maps to a canonical URN for machine interchange + +## NIST: The first official adopter + +In April 2022, the [NIST Information Services Office](https://www.nist.gov/associate-director-management-resources/staff-offices/information-services-office) officially published the [Publication Identifier Syntax for NIST Technical Series Publications](https://www.nist.gov/system/files/documents/2022/04/01/PubID_Syntax_NIST_TechPubs.pdf) — making NIST the **first standards organization to formally adopt a universal PubID scheme**. [Ribose](https://www.ribose.com) was involved from the conception phase alongside the NIST ISO and CSRC teams, and was acknowledged in both the original 2020 draft and the final PubID 1.0 document. + +### What NIST did + +NIST defined a single identifier that renders in **four distinct styles**, all derived from the same data model: + +| Style | Usage | Example | +|-------|-------|---------| +| **Full** | Title page, bibliography | National Institute of Standards and Technology Special Publication 800-53A | +| **Abbreviated** | Authority section | Natl. Inst. Stand. Technol. Spec. Publ. 800-53A | +| **Short** | Inline citations | NIST SP 800-53A | +| **Machine-Readable** | DOI suffix | NIST.SP.800-53A | + +### The migration + +NIST's catalog spans **19,333+ documents dating back to 1901** (when the agency was still the National Bureau of Standards). Adopting PubID meant retroactively converting every identifier to the new scheme. + +The open-source [`nist-pubid`](https://github.com/metanorma/nist-pubid) conversion tool was built to handle this migration — parsing legacy identifiers and DOIs, extracting data elements, and generating the new PubIDs in any style. + +Notable changes included normalizing series abbreviations (`NISTIR` → `NIST IR`, `NISTGCR` → `NIST GCR`) and standardizing revision formatting across the entire catalog. + +### What NIST proved + +NIST's adoption demonstrated that: + +1. A single data model can serve both humans and machines +2. Round-trip fidelity across multiple rendering styles is practical +3. Over a century of legacy identifiers can be migrated programmatically +4. Encoding development stages in identifiers prevents misidentification of drafts + +Every publisher schema in PubID builds on this foundation. + +## How to adopt + +Adopting PubID for your organization follows five steps: + +1. **[Define your identifier elements](/adopt/guide#1-publisher-identity)** — catalog what your identifiers already contain +2. **[Design your rendering styles](/adopt/guide#9-rendering-styles-and-machine-readable-forms)** — decide which output formats you need +3. **Define your URN namespace** — every PubID publisher gets a URN namespace for interchange +4. **[Implement and test](/adopt/guide#implementation-path)** — create a flavor module, parser, and URN mapping +5. **Migrate legacy identifiers** — parse, generate, validate, and map your full catalog + +See the [Designing Your Scheme guide](/adopt/guide) for a detailed walkthrough covering all 12 design dimensions, with real-world examples from ISO, NIST, ASTM, and more. + +## Get in touch + +Interested in adopting PubID for your organization? Drop us a note at [Ribose](https://www.ribose.com) — we'd be happy to share what we've learned from working with NIST and other standards bodies, and walk you through the design decisions and trade-offs. + +## Resources + +- [Designing Your Scheme](/adopt/guide) — Detailed design guide (12 dimensions) +- [NIST Publisher Schema](/publishers/nist) — See how NIST PubID is structured +- [Browse Publishers](/publishers/) — All 26+ implemented schemas +- [The Metaschema](/concepts/metaschema) — Formal element definitions +- [PubID Algebra](/concepts/algebra) — Identifier composition and relationships +- [Blog: NIST PubID](/blog/2024-08-01-nist-pubid) — Full NIST adoption story +- [nist-pubid on GitHub](https://github.com/metanorma/nist-pubid) — The NIST conversion tool +- [pubid-ruby on GitHub](https://github.com/metanorma/pubid) — Reference implementation diff --git a/src/content/blog/2024-01-15-what-is-pubid.md b/src/content/blog/2024-01-15-what-is-pubid.md new file mode 100644 index 0000000..9dd3215 --- /dev/null +++ b/src/content/blog/2024-01-15-what-is-pubid.md @@ -0,0 +1,59 @@ +--- +title: What is PubID? A Universal Language for Standards Identifiers +date: 2024-01-15 +author: PubID Team +--- + +# What is PubID? A Universal Language for Standards Identifiers + +Every standards document has an identifier — but every publisher uses a different format. ISO writes `ISO 9001:2015`. IEEE writes `IEEE Std 802.3-2018`. NIST writes `NIST SP 800-53 Rev. 5`. These identifiers carry rich semantic meaning, but that meaning is locked in format-specific syntax that only humans can interpret. + +**PubID** changes that. + +## The Problem + +Consider what happens when you need to: + +- **Search** across standards from multiple publishers +- **Link** an IEEE standard to the ISO standard it references +- **Track** amendments and corrigenda across different publishers +- **Exchange** identifier data between different systems + +Each publisher has their own conventions, their own syntax, and their own edge cases. There's no universal parser, no universal format, and no universal way to relate identifiers from different publishers. + +## The Solution: A Metaschema + +PubID defines a **metaschema** — a formal schema that describes the common elements of any publication identifier: + +- **Publisher** — Who issued the document +- **Document Type** — What kind of document it is (Standard, Report, Guide, etc.) +- **Number** — The unique identifier number +- **Year** — When it was published +- **Part** — For multi-part standards +- **Stage** — Where it is in the development lifecycle +- **Supplement** — Amendments, corrigenda, and addenda + +Each publisher then defines their own schema using this metaschema, specifying which elements they use, their allowed values, and how they combine syntactically. + +## Round-Trip Fidelity + +A core design principle of PubID is **round-trip fidelity**: parse an identifier string, decompose it into structured components, and re-render it back to get **identical output**. No information is lost in the transformation. + +```ruby +id = Pubid::Iso.parse("ISO 9001:2015") +id.to_s # => "ISO 9001:2015" (identical to input) +id.to_urn # => "urn:iso:std:iso:9001:ed-5:en" +``` + +## 23+ Publishers and Growing + +PubID currently supports 23+ publishers including ISO, IEC, IEEE, NIST, BSI, CEN, ETSI, ITU, ASTM, ASHRAE, and more. Each publisher has a dedicated parser, renderer, and URN generator. + +## Get Involved + +PubID is open source. You can: + +- [Browse all supported publishers](/publishers/) +- [Learn how the metaschema works](/concepts/metaschema) +- [Try the interactive playground](/) +- [Contribute on GitHub](https://github.com/pubid/pubid) diff --git a/src/content/blog/2024-03-01-understanding-algebra.md b/src/content/blog/2024-03-01-understanding-algebra.md new file mode 100644 index 0000000..a1f026f --- /dev/null +++ b/src/content/blog/2024-03-01-understanding-algebra.md @@ -0,0 +1,89 @@ +--- +title: Understanding PubID Algebra — How Standards Documents Relate +date: 2024-03-01 +author: PubID Team +--- + +# Understanding PubID Algebra — How Standards Documents Relate + +Standards documents don't exist in isolation. They have relationships: amendments modify base standards, corrigenda fix errors, standards come in multiple parts, and one publisher may adopt another's standard. **PubID algebra** gives these relationships formal structure. + +## Why Algebra Matters + +Without a formal model of identifier relationships: + +- You can't programmatically find all amendments to a standard +- You can't determine that `ISO 9001:2015/Amd 1:2024` is a supplement to `ISO 9001:2015` +- You can't identify adopted standards like `BS ISO 9001:2015` as British Standard's adoption of the ISO original +- You can't bundle related documents for procurement or reference + +## The Core Relations + +### Amendment + +An amendment **modifies** a base standard by adding, changing, or deleting specified elements. + +| Publisher | Example | +|-----------|---------| +| ISO | `ISO 9001:2015/Amd 1:2024` | +| IEC | `IEC 61131-3:2013/AMD1:2019` | +| CEN | `EN 196-3:2005+A1:2008` | + +### Corrigendum + +A corrigendum **corrects** technical or editorial errors without adding new content. + +| Publisher | Example | +|-----------|---------| +| ISO | `ISO 9001:2015/Cor 1:2016` | +| IEC | `CISPR 16-1-3:2004/COR1:2006` | + +### Part + +Multi-part standards are **related** through part numbers. + +| Publisher | Example | +|-----------|---------| +| ISO/IEC | `ISO/IEC 17031-1:2020` (Part 1) | +| IEEE | `IEEE Std 802.3-2018` | + +### Adoption + +One publisher may **adopt** another's standard, often with national modifications. + +| Publisher | Example | +|-----------|---------| +| BSI | `BS ISO 9001:2015` (UK adoption of ISO) | +| CEN | `EN ISO 13485:2016` (European adoption of ISO) | +| CSA | `CAN/CSA-ISO 9001:2016` (Canadian adoption) | + +### Consolidated + +A consolidated version incorporates all amendments into the base standard. + +| Publisher | Example | +|-----------|---------| +| IEC | `IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV` | +| CEN | `EN 196-3:2005+A1:2008` | + +## Implementation + +In the PubID Ruby library, algebraic relations are modeled as first-class objects: + +```ruby +# Parse an identifier with a supplement +id = Pubid::Iso.parse("ISO 9001:2015/Amd 1:2024") + +# Access the supplement +id.supplement # => Amendment object + +# Parse an adopted standard +id = Pubid::Bsi.parse("BS ISO 9001:2015") +id.adoption # => The adopted ISO identifier +``` + +## Learn More + +- [PubID Algebra reference](/concepts/algebra) — All relation types with examples +- [Browse publishers](/publishers/) — Per-publisher algebra support +- [Library Quick Start](/library/quick-start) — Start parsing identifiers diff --git a/src/content/blog/2024-06-15-urn-mapping.md b/src/content/blog/2024-06-15-urn-mapping.md new file mode 100644 index 0000000..4df63fc --- /dev/null +++ b/src/content/blog/2024-06-15-urn-mapping.md @@ -0,0 +1,75 @@ +--- +title: URN Mapping — Machine-Readable Identifiers for Every Standard +date: 2024-06-15 +author: PubID Team +--- + +# URN Mapping — Machine-Readable Identifiers for Every Standard + +Every PubID can be mapped to a canonical **URN (Uniform Resource Name)**, providing a stable, location-independent identifier suitable for machine interchange. Here's how it works. + +## What are URNs? + +URNs are defined by [RFC 8141](https://www.rfc-editor.org/rfc/rfc8141) and follow the pattern `urn:[namespace]:[specific-string]`. Unlike URLs, URNs don't point to a location — they provide a persistent name for a resource. + +## PubID URN Patterns + +Each publisher maps their PubID to a URN using a namespace and format specific to their schema. + +### ISO + +``` +ISO 9001:2015 → urn:iso:std:iso:9001:ed-5:en +ISO/IEC 17031-1:2020 → urn:iso:std:iso-iec:17031:-1:ed-1 +ISO 9001:2015/Amd 1:2024 → urn:iso:std:iso:9001:ed-5:amd:1:v1 +``` + +### IEC + +``` +IEC 61131-3:2013 → urn:iec:std:iec:61131:-3:ed-3 +IEC 60050-111/AMD1/FRAG1 ED2 → urn:iec:std:iec:60050:111:ed-2:amd:1:frag:1 +``` + +### IEEE + +``` +IEEE Std 802.3-2018 → urn:ieee:std:802.3-2018 +``` + +## Round-Trip Guarantee + +PubIDs are designed for round-trip fidelity in both human-readable and URN formats: + +``` +Input: "ISO 9001:2015" + → Parse → Object → Render (PubID) → "ISO 9001:2015" ✓ + → Parse → Object → Render (URN) → "urn:iso:std:iso:9001:ed-5:en" ✓ +``` + +This means you can convert between PubID string and URN representation without losing information. + +## Benefits + +1. **Machine interchange** — Systems can exchange identifiers in a standardized format +2. **Resolution** — URNs can serve as keys for identifier resolution services +3. **Uniqueness** — URNs provide globally unique, collision-free identifiers +4. **Stability** — URNs are location-independent and persist regardless of where documents are hosted + +## Using URNs in the Library + +```ruby +require 'pubid' + +id = Pubid::Iso.parse("ISO 9001:2015") +id.to_urn # => "urn:iso:std:iso:9001:ed-5:en" + +id = Pubid::Iec.parse("IEC 61131-3:2013") +id.to_urn # => "urn:iec:std:iec:61131:-3:ed-3" +``` + +## Learn More + +- [URN Mapping reference](/concepts/urn) — Full URN patterns and examples +- [Try the playground](/) — See URN output in real time +- [API Reference](/library/api) — `to_urn` and other serialization methods diff --git a/src/content/blog/2024-08-01-nist-pubid.md b/src/content/blog/2024-08-01-nist-pubid.md new file mode 100644 index 0000000..accdc96 --- /dev/null +++ b/src/content/blog/2024-08-01-nist-pubid.md @@ -0,0 +1,143 @@ +--- +title: "NIST PubID — The First Official Adoption of a Universal Publication Identifier" +date: 2024-08-01 +author: PubID Team +--- + +# NIST PubID — The First Official Adoption of a Universal Publication Identifier + +In April 2022, NIST's Information Services Office officially published the ["Publication Identifier Syntax for NIST Technical Series Publications"](https://www.nist.gov/system/files/documents/2022/04/01/PubID_Syntax_NIST_TechPubs.pdf) — formally adopting a universal publication identifier scheme that does something no standards body had done before: define a single identifier that renders in **four distinct human- and machine-readable styles**, with full round-trip conversion between them. + +This was the first time any standards organization officially adopted the concept of a universal PubID. NIST's decision validated a core conviction: the meaning of an identifier is separate from any single representation of it, and that meaning should be preserved across every form the identifier takes. + +## Background + +The NIST PubID scheme was jointly developed by the [NIST Information Services Office](https://www.nist.gov/associate-director-management-resources/staff-offices/information-services-office) and the [NIST Computer Security Division](https://www.nist.gov/itl/csd). [Ribose](https://www.ribose.com) was involved from the conception phase together with the NIST ISO and CSRC teams in conceptualizing a universal PubID scheme, and was acknowledged in both the [original 2020 draft](https://www.nist.gov/system/files/documents/2021/08/26/Publication-ID-Proposal_26Aug21.pdf) and the final PubID 1.0 document. + +## The problem NIST faced + +NIST's Technical Series Publications (Tech Pubs) date back to 1901, when the agency was still the National Bureau of Standards. Over 120 years, the catalog grew to **19,333 documents** across 53+ series — Special Publications (SP), Internal Reports (IR), Building Science Reports, and many more. + +But identifiers were inconsistent. Legacy identifiers like `NISTIR 8379` mixed the publisher abbreviation with the series. The DOI for the same document — `10.6028/NIST.SP.800-116r1` — used yet another format. There was no formal syntax, no round-trip guarantee, and no way to programmatically convert between the styles that appeared inside each document: + +- **Full style** in the title and bibliography +- **Abbreviated style** in the "Authority" section +- **Short style** for inline citations +- **Machine-readable style** for DOIs + +Each variant was created manually. That had to change. + +## Four styles, one data model + +NIST PubID defines a core set of data elements — publisher, series, report number, part, edition (including revision), stage, translation, and update — that combine to form an identifier. A single set of elements can then be rendered into any of the four styles: + +| Style | Example | +|-------|---------| +| **Full (Long)** | National Institute of Standards and Technology Special Publication 800-53A | +| **Abbreviated** | Natl. Inst. Stand. Technol. Spec. Publ. 800-53A | +| **Short** | NIST SP 800-53A | +| **Machine-Readable** | NIST.SP.800-53A | + +The key insight: **no information is lost** when converting between styles. Parse any style, extract the data elements, and re-render in any other style. This round-trip fidelity is the foundational principle that the PubID metaschema adopted for all publishers. + +## Core data elements + +Every NIST PubID is built from these elements: + +- **Publisher** — `NIST` or predecessor `NBS` +- **Series** — The publication series (SP, IR, FIPS, GCR, etc.), with 53+ defined series +- **Report Number** — Unique number within the series (e.g., `800-53`) +- **Part** — For multi-part publications (Part, Volume, Section, Supplement, Index) +- **Edition** — Includes revision identifiers and version numbers +- **Stage** — Development stage: `WD` (Work-in-Progress Draft), `PRD` (Preliminary Draft), `PD` (Public Draft), or `Final` +- **Update** — Indicates the document incorporates previously published errata +- **Translation** — Language code for non-English publications + +## Stages: enabling draft citations + +One innovation in NIST PubID is encoding the **development stage** directly in the identifier. Groups like the Computer Security Division publish early drafts for public comment, and each iteration needs a unique, referable identifier: + +- `NIST SP 800-XX (WD)` — Work-in-Progress Draft +- `NIST SP 800-XX (PRD)` — Preliminary Draft +- `NIST SP 800-XX (PD)` — Public Draft +- `NIST SP 800-XX` — Final + +This prevents misidentification between draft and final publications — a problem that plagued citations before PubID. + +## Machine-readable and DOI integration + +The machine-readable (MR) style uses dot-separated fields, making it both parseable by software and suitable as a DOI suffix: + +``` +NIST SP 800-53A → NIST.SP.800-53A +``` + +This maps directly to the DOI: `https://doi.org/10.6028/NIST.SP.800-53A`. The MR style is deterministic — given the data elements, there is exactly one correct MR output. Given an MR string, the data elements can be extracted without ambiguity. + +## Migration at scale + +Adopting PubID meant retroactively converting 19,333 existing identifiers. The open-source [`nist-pubid`](https://github.com/metanorma/nist-pubid) Ruby gem was built by the Ribose/Metanorma team to handle this: + +```bash +# Convert a legacy identifier to any style +$ nist-pubid convert "NIST SP 800-53a" +NIST SP 800-53A + +$ nist-pubid convert -s mr "NIST SP 800-53a" +NIST.SP.800-53A + +$ nist-pubid convert -s long "NIST SP 800-53a" +National Institute of Standards and Technology Special Publication 800-53A + +# Generate a full migration report for all 19,333 documents +$ nist-pubid report --csv > migration-report.csv +``` + +Notable changes in the migration included normalizing series abbreviations — `NISTIR` became `NIST IR`, `NISTGCR` became `NIST GCR` — and standardizing revision formatting across the entire catalog. + +## The CSWP PubID migration + +After the initial adoption, the NIST Research Library decided to also migrate CyberSecurity White Paper (CSWP) identifiers. The original CSWP scheme used date strings as identifiers — `NIST CSWP 02122014` for the Cybersecurity Framework 1.0 — which proved problematic when multiple documents were published on the same date. + +NIST moved to a sequential numbering scheme: `NIST CSWP 02122014` became `NIST CSWP 4`. [James Foti](https://www.nist.gov/people/james-foti) of the NIST ITL Cyber Security Division provided the complete old-to-new mapping. Read the [full CSWP migration details on the Relaton blog](https://www.relaton.org/posts/2023-08-23-nist-cswp-pubid/). + +## Ribose's role + +[Ribose](https://www.ribose.com) was part of NIST's PubID journey from the conception phase: + +- **Conception phase** — Worked alongside the NIST Information Services Office and CSRC teams in conceptualizing the universal PubID scheme. Acknowledged in the original 2020 draft and the final PubID 1.0 document. +- **Public comment period** — Submitted a [formal technical response](https://riboseinc.github.io/report-nist-pubid/) to NIST's request for comments, with detailed analysis of the proposed scheme +- **Conversion tooling** — Built and maintained the [`nist-pubid`](https://github.com/metanorma/nist-pubid) Ruby gem that migrated all 19,333 legacy identifiers +- **CSWP migration** — Assisted with mapping the CyberSecurity White Paper identifier changes from date-based to sequential numbering +- **PubID library integration** — Integrated NIST PubID as a first-class flavor in the [pubid-ruby](https://github.com/metanorma/pubid) reference implementation + +## NIST PubID in the PubID ecosystem + +NIST PubID is now one of the 26+ publisher schemas supported by the PubID library. Every NIST identifier can be parsed, rendered in any style, and converted to a URN: + +```ruby +require 'pubid' + +id = Pubid::Nist.parse("NIST SP 800-53 Rev. 5") +id.to_s # => "NIST SP 800-53 Rev. 5" +id.to_urn # => "urn:nist:pub:sp:800-53:r5" +``` + +## Why NIST PubID matters + +NIST was the **first organization to officially adopt a multi-style, round-trippable publication identifier scheme**. Their decision by the Information Services Office in 2022 proved that: + +1. A single data model can serve humans (full, abbreviated, short) and machines (MR, DOI) +2. Round-trip fidelity across styles is achievable and practical +3. Legacy identifiers spanning over a century can be migrated programmatically +4. Development stages can and should be encoded in identifiers + +Every publisher schema in PubID builds on this foundation. The NIST experience showed that structured, unambiguous identifiers benefit everyone — authors, editors, librarians, and software systems alike. + +## Learn more + +- [NIST Publisher Schema](/publishers/nist) — Syntax, styles, and elements +- [Introducing NIST PubID](https://www.metanorma.org/posts/2022-01-09-nist-pubid) — Original Metanorma blog post +- [NIST CSWP PubID Mapping](https://www.relaton.org/posts/2023-08-23-nist-cswp-pubid/) — CSWP migration details +- [nist-pubid on GitHub](https://github.com/metanorma/pubid-nist) — The original conversion tool +- [NIST Tech Pubs metadata](https://github.com/usnistgov/NIST-Tech-Pubs) — Full catalog data diff --git a/src/content/blog/index.md b/src/content/blog/index.md new file mode 100644 index 0000000..15cdfb4 --- /dev/null +++ b/src/content/blog/index.md @@ -0,0 +1,7 @@ +--- +title: Blog +--- + +# Blog + + diff --git a/src/content/concepts/algebra.md b/src/content/concepts/algebra.md new file mode 100644 index 0000000..347d6ee --- /dev/null +++ b/src/content/concepts/algebra.md @@ -0,0 +1,155 @@ +--- +title: "PubID Algebra" +description: "A PubID concept." +--- + +# PubID Algebra + +PubIDs are not isolated — they have relationships with other identifiers. PubID algebra describes these relationships, allowing machines to understand how documents relate to each other. + +## Amendment + +An **amendment** modifies a base standard by adding, changing, or deleting specified elements. + +| Publisher | Syntax | Example | +|-----------|--------|---------| +| ISO | `[Base]/Amd [N]:[Year]` | `ISO 9001:2015/Amd 1:2024` | +| IEC | `[Base]/AMD[N]:[Year]` | `IEC 61131-3:2013/AMD1:2019` | +| CEN | `[Base]+A[N]:[Year]` | `EN 196-3:2005+A1:2008` | +| BSI | `[Base]+A[N]:[Year]` | `BS 476-22:1987+A1:2019` | +| IDF | `[Base]/AMD [N]:[Year]` | `IDF 146:2003/AMD 1:2023` | + +## Corrigendum + +A **corrigendum** corrects technical or editorial errors without adding new content. + +| Publisher | Syntax | Example | +|-----------|--------|---------| +| ISO | `[Base]/Cor [N]:[Year]` | `ISO 9001:2015/Cor 1:2016` | +| IEC | `[Base]/COR[N]:[Year]` | `CISPR 16-1-3:2004/COR1:2006` | +| CIE | `[Base]/Cor[N]:[Year]` | `CIE 232:2019/Cor1:2020` | +| IDF | `[Base]/COR [N]:[Year]` | `IDF 148-1:2008/COR 1:2009` | +| CCSDS | `[Base] Cor. [N]` | `CCSDS 121.0-B-1-S Cor. 1` | +| ETSI | `[Base]/C[N] ed.[N]` | `ETSI ETR 053/C1 ed.2` | + +## Addendum + +An **addendum** is a legacy supplement type (primarily used in older ISO and ASHRAE documents). + +| Publisher | Syntax | Example | +|-----------|--------|---------| +| ISO | `[Base]/Add [N]:[Year]` | `ISO 2789:2006/Add 1:2008` | +| ASHRAE | `Addendum [Letter] to [Base]` | `ASHRAE Addendum a to Guideline 1.4-2019` | + +## Value-Added Publication + +A **value-added publication** wraps a base identifier with a delivery format or compilation suffix. These are not separate document types but represent different product forms of the same document. + +### IEC — VAP Identifiers + +IEC offers consolidated, redline, and serial versions of its standards using a suffix pattern. + +| Suffix | Meaning | Example | +|--------|---------|---------| +| `CSV` | Consolidated version (with all supplements incorporated) | `IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV` | +| `CMV` | Compiled Maintenance Version | `IEC 61666:2010+AMD1:2021 CMV` | +| `RLV` | Redline Version (shows changes from previous edition) | `IEC 61131-3:2013 RLV` | +| `SER` | Serial version | `IEC 61850-6:2009+AMD1:2018 SER` | + +The VAP suffix follows the base identifier (including any supplements) with a space. + +### IEEE — Redline + +IEEE offers redline versions that show additions and deletions between editions with markup. + +| Syntax | Example | +|--------|---------| +| `[Base] (Revision of [Old]) - Redline` | `IEEE Std 1018-2013 (Revision of IEEE Std 1018-2004) - Redline` | +| `[Base] - Redline` | `IEEE Std 802.3-2018 - Redline` | + +### BSI — Value-Added Formats + +BSI wraps identifiers with delivery format suffixes. + +| Suffix | Meaning | Example | +|--------|---------|---------| +| `PDF` | PDF format | `PD 5500:2018+A3:2020 PDF` | +| `TC` | Tracked Changes | `PAS 96:2017 - TC` | +| `BOOK` | Printed book | `PP 7722:2006 BOOK` | + +## Part Relationship + +Standards often span multiple **parts**. + +| Publisher | Syntax | Example | +|-----------|--------|---------| +| ISO/IEC | `[Number]-[Part]:[Year]` | `ISO/IEC 17031-1:2020` | +| NIST | `[Number]-[Part]` | `NIST SP 800-53` | +| IEEE | `[Number].[Subpart]-[Year]` | `IEEE Std 802.3-2018` | +| JIS | `[Class] [Number]-[Part]:[Year]` | `JIS B 0205-2:2019` | +| OIML | `[Type] [Number]-[Part]:[Year]` | `OIML R 76-1:2006` | + +## Series / All Parts + +A reference to **all parts** of a multi-part standard. + +| Syntax | Example | +|--------|---------| +| `[Number] (all parts)` | `ISO 9001 (all parts)` | +| `[Number] SERIES` | `CSA N285.6 SERIES:23` | + +## Document Bundle + +Multiple documents **bundled** together. + +| Publisher | Syntax | Example | +|-----------|--------|---------| +| BSI | `[ID] + [ID]` | `BS A 242-A 245:1974+A1:2017` | +| CSA | `[ID] + A[N]:[Year]` | `CAN/CSA-C22.2 NO. 60601-1-6:11 + A1:15 + A2:21` | +| CIE | `[ID],[ID],...` | `CIE 198-SP1.1:2011,198-SP1.2:2011` | + +## Consolidated Version + +A base standard **with all amendments incorporated**. IEC uses the `CSV` suffix to mark these (see [Value-Added Publication](/publishers/iec/vap_identifier)). + +| Publisher | Syntax | Example | +|-----------|--------|---------| +| IEC | `[Base]+AMD1:[Year]+AMD2:[Year] CSV` | `IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV` | +| CEN | `[Base]+A[N]:[Year]` | `EN 196-3:2005+A1:2008` | +| BSI | `[Base]+A[N]:[Year]` | `BS 476-22:1987+A1:2019` | + +## Adoption + +An **adoption** of another publisher's standard. + +| Publisher | Syntax | Example | +|-----------|--------|---------| +| BSI | `BS [Source] [ID]` | `BS ISO 9001:2015`, `BS EN 1090-2:2018` | +| CSA | `CAN/CSA-[Source] [ID]` | `CAN/CSA-ISO 9001:2016` | +| CEN | `EN [Source] [ID]` | `EN ISO 13485:2016` | + +## Draft + +A document in **draft** stage of development. + +| Publisher | Syntax | Example | +|-----------|--------|---------| +| ISO | `[Stage] [Type] [Number]` | `ISO/DIS 45001`, `ISO/CD 26000` | +| IEC | `[Stage] [Number]` | `IEC 2/2102/CDV` | +| IEEE | `P[Number]/D[Version]` | `IEEE P802.3bf/D3.0` | +| NIST | `[Type] [Number] (Draft)` | `NIST SP 800-53 Rev. 5 (Draft)` | + +## Internal Documents + +Working documents for **internal committee use**. + +| Publisher | Syntax | Example | +|-----------|--------|---------| +| ISO | `ISO/TC [N] [DocNumber]` | `ISO/TC 176 N 1000` | +| BSI | `[Number] DC` | `14/30300822 DC` | + +## See Also + +- [Anatomy of a PubID](/concepts/anatomy) +- [Common Elements](/concepts/components) +- [URN Mapping](/concepts/urn) diff --git a/src/content/concepts/anatomy.mdx b/src/content/concepts/anatomy.mdx new file mode 100644 index 0000000..196e90a --- /dev/null +++ b/src/content/concepts/anatomy.mdx @@ -0,0 +1,55 @@ +--- +title: "Anatomy of a PubID" +description: "How a PubID decomposes into structured components." +--- + +import AnatomyDiagram from '~/components/diagrams/AnatomyDiagram.vue' + +# Anatomy of a PubID + +Every publication identifier can be decomposed into structured components. Let's break down how PubIDs work. + + + + + +## Common Structure + +Most PubIDs follow a pattern of: **Publisher [Type] Number[-Part]:Year [/Supplement]** + +But each publisher has unique variations. The PubID metaschema accommodates these differences while maintaining a shared foundation. + +## Component Reference + +### Publisher +The organization that published the document. Can be a single publisher (ISO) or joint publishers (ISO/IEC). + +### Document Type +The kind of document: International Standard, Technical Report, Guide, Specification, etc. + +### Number +A unique numeric identifier assigned by the publisher. + +### Part +Many standards are published in multiple parts (e.g., ISO 9001-1, ISO 9001-2). + +### Year +The year of publication or most recent revision. + +### Edition +Some publishers track editions explicitly (e.g., Ed 5, Edition 2007). + +### Stage +Where the document is in its development lifecycle: Working Draft (WD), Committee Draft (CD), Draft International Standard (DIS), etc. + +### Language +Some identifiers include a language code (e.g., `(en)` for English). + +### Supplement +Amendments, corrigenda, addenda, and other supplements that modify a base document. + +## Next Steps + +- Learn about the [Metaschema](/concepts/metaschema) that defines these elements +- Explore [Common Elements](/concepts/components) across publishers +- See [PubID Algebra](/concepts/algebra) for identifier relationships diff --git a/src/content/concepts/components.md b/src/content/concepts/components.md new file mode 100644 index 0000000..c153c89 --- /dev/null +++ b/src/content/concepts/components.md @@ -0,0 +1,132 @@ +--- +title: "PubID Components" +description: "A PubID concept." +--- + +# PubID Components + +All PubID schemas share a common set of components. This page documents each component, its semantics, and how different publishers use it. + +## Publisher + +The organization responsible for publishing the document. + +| Publisher | Code | Full Name | +|-----------|------|-----------| +| ISO | `ISO` | International Organization for Standardization | +| IEC | `IEC` | International Electrotechnical Commission | +| IEEE | `IEEE` | Institute of Electrical and Electronics Engineers | +| ITU | `ITU` | International Telecommunication Union | +| NIST | `NIST` / `NBS` | National Institute of Standards and Technology | +| BSI | `BS` | British Standards Institution | +| CEN | `CEN` / `CLC` | European Committee for Standardization | +| ETSI | `ETSI` | European Telecommunications Standards Institute | +| JIS | `JIS` | Japanese Industrial Standards | +| OIML | `OIML` | International Organization of Legal Metrology | + +Joint publications use multiple codes: `ISO/IEC`, `ISO/ASTM`, `IEC/IEEE`. + +## Document Type + +The category of publication deliverable. + +| Type | Used By | Examples | +|------|---------|---------| +| International Standard | ISO, IEC, IDF | `ISO 9001:2015`, `IEC 61131-3:2013` | +| Technical Report | ISO, IEC, ASTM, ASHRAE, CEN, JIS | `ISO/TR 10450:2019`, `ASTM TR` | +| Technical Specification | ISO, IEC, CEN, JIS | `ISO/TS 22003:2013` | +| Guide | ISO, IEC, CEN, OIML, JCGM | `ISO Guide 73:2009`, `OIML G 1` | +| Publicly Available Specification | ISO, IEC, BSI | `ISO/PAS 45001:2017`, `PAS 9980:2022` | +| Special Publication | NIST | `NIST SP 800-53 Rev. 5` | +| Recommended Practice | API, SAE | `API RP 500`, `SAE ARP4754A` | + +## Number + +A unique numeric identifier assigned by the publisher. Some identifiers include: +- Simple numbers: `9001`, `802.3`, `800-53` +- Numbers with sub-parts: `17031-1`, `61131-3` +- Letter-prefixed numbers: `JIS A 0001`, `SAE J3016` + +## Year + +The year of publication or latest revision. + +| Publisher | Format | Example | +|-----------|--------|---------| +| ISO/IEC | `:YYYY` | `:2015` | +| IEEE | `-YYYY` | `-2018` | +| NIST | Implicit in number or `Rev.` | `Rev. 5` | +| BSI | `:YYYY` | `:2017` | +| CSA | `:YY` or `:YYYY` | `:24` or `:2024` | + +## Stage + +Development stages indicate where a document is in its lifecycle. + +### ISO/IEC Harmonized Stages + +| Code | Abbreviation | Name | +|------|-------------|------| +| 10.00 | NP | New Proposal | +| 20.00 | WD | Working Draft | +| 30.00 | CD | Committee Draft | +| 40.00 | DIS / CDV | Draft International Standard | +| 50.00 | FDIS | Final Draft International Standard | +| 60.00 | PRF | Proof (pre-publication) | +| 60.60 | — | Published | + +### Typed Stages + +Typed stages combine the document type with the development stage: + +| Abbreviation | Meaning | +|-------------|---------| +| DTR | Draft Technical Report | +| DTS | Draft Technical Specification | +| FDTR | Final Draft Technical Report | +| FDTS | Final Draft Technical Specification | +| AWI | Approved Work Item | +| NP | New Proposal / New Work Item Proposal | +| PRF | Proof of an International Standard | + +### NIST Stages + +NIST defines development stages for documents circulated outside the agency: + +| Abbreviation | Name | Example | +|-------------|------|---------| +| WD | Work-in-Progress Draft | `NIST SP 800-XX (WD)` | +| PRD | Preliminary Draft | `NIST SP 800-XX (PRD)` | +| PD | Public Draft | `NIST SP 800-XX (PD)` | +| — | Final | `NIST SP 800-XX` | + +Encoding stages in identifiers allows reviewers to uniquely cite drafts and prevents confusion between draft and final publications. + +## Part + +Many standards are published in multiple parts. Parts are typically separated by a hyphen: + +| Publisher | Format | Example | +|-----------|--------|---------| +| ISO/IEC | `[Number]-[Part]` | `ISO 17031-1` | +| NIST | `[Number]-[Part]` | `NIST SP 800-53` | +| IEEE | `[Number].[Subpart]` | `IEEE 802.3` | +| JIS | `[Number]-[Part]` | `JIS B 0205-2` | + +## Language + +Some publishers include language codes: + +| Code | Language | +|------|----------| +| `en` | English | +| `fr` | French | +| `ru` | Russian | +| `E` | English (OIML) | + +## See Also + +- [Anatomy of a PubID](/concepts/anatomy) — Visual breakdown +- [The Metaschema](/concepts/metaschema) — Formal definition +- [PubID Algebra](/concepts/algebra) — Identifier composition +- [Relationships](/concepts/relationships) — How identifiers relate to each other diff --git a/src/content/concepts/metaschema.md b/src/content/concepts/metaschema.md new file mode 100644 index 0000000..877e895 --- /dev/null +++ b/src/content/concepts/metaschema.md @@ -0,0 +1,109 @@ +--- +title: "The PubID Metaschema" +description: "A PubID concept." +--- + +# The PubID Metaschema + +The PubID metaschema is the formal definition of how publication identifiers are structured. It provides a shared vocabulary and set of rules that each publisher's schema builds upon. + +## Design Principles + +1. **Extensibility** — The metaschema defines common elements; publishers extend it with their specifics +2. **Round-trip fidelity** — Parse any identifier and re-render it identically +3. **Multi-style rendering** — A single set of data elements can be rendered in multiple formats (full, abbreviated, short, machine-readable, URN) without information loss +4. **Machine-readable** — Every element has a formal definition suitable for automated processing +5. **Human-readable** — The output format remains familiar to standards users + +## Metaschema Elements + +### Core Elements (Present in Most Schemas) + +| Element | Type | Description | +|---------|------|-------------| +| `publisher` | String | The issuing organization code (ISO, IEC, IEEE, etc.) | +| `type` | String | Document type key (is, tr, ts, guide, etc.) | +| `number` | String | Unique document number | +| `year` | Integer | Publication year | +| `part` | String | Part number | + +### Extended Elements (Publisher-Specific) + +| Element | Type | Used By | Description | +|---------|------|---------|-------------| +| `edition` | String | ISO, IEC, JIS | Edition number | +| `stage` | String | ISO, IEC | Development stage abbreviation | +| `typed_stage` | String | ISO, IEC | Combined stage+type (e.g., DTR, FDTS) | +| `language` | String | ISO, IEC, CIE | Language code | +| `copublisher` | String | ISO | Joint publisher code | +| `supplement` | Object | Most publishers | Amendment, corrigendum, or addendum | +| `draft_version` | String | IEEE | Draft version number | +| `vap_suffix` | String | IEC | Value-added product suffix | +| `sector` | String | ITU | ITU sector (R, T, D) | +| `version` | String | ETSI, BSI Flex | Version number | +| `revision` | String | NIST | Revision number | + +## How Publishers Use the Metaschema + +Each publisher defines a **schema** that specifies: + +1. **Which elements they use** — Not all publishers use all elements +2. **Allowed values** — For example, which document types, stage codes, or language codes +3. **Syntax rules** — How elements combine into a string representation +4. **URN format** — How the identifier maps to a URN + +### Example: ISO Schema + +``` +ISO/[Copublisher] [TypedStage] [Number]-[Part]:[Year]/[Supplement]([Language]) +``` + +- Uses: publisher, copublisher, type, number, part, year, stage, typed_stage, language, supplement +- Stages: NP, WD, CD, DIS, FDIS, PRF, IS +- Supplements: Amendment (Amd), Corrigendum (Cor), Addendum (Add) + +### Example: NIST Schema + +``` +[Publisher] [Type] [Number]-[Part] Rev. [Revision] Vol. [Volume] +``` + +- Uses: publisher (NIST or NBS), type, number, part, revision, volume, edition, stage, update, translation +- Types: SP, FIPS, IR, TN, HB, etc. +- Historical: NBS prefix for pre-1988 documents +- **Multi-style rendering**: NIST was the first to define four distinct output styles from a single data model: + - **Full (Long)**: `National Institute of Standards and Technology Special Publication 800-53A` + - **Abbreviated**: `Natl. Inst. Stand. Technol. Spec. Publ. 800-53A` + - **Short**: `NIST SP 800-53A` + - **Machine-Readable**: `NIST.SP.800-53A` (used as DOI suffix) + +## Multi-Style Rendering + +The PubID metaschema supports rendering a single identifier into multiple output formats. This means one parse operation produces data elements that can be serialized in different contexts: + +| Output Format | Used For | Example | +|---------------|----------|---------| +| Human-readable string | Citations, references | `ISO 9001:2015` | +| URN | Machine interchange, resolution | `urn:iso:std:iso:9001:ed-5:en` | +| JSON | API responses, databases | `{"publisher":"ISO","number":"9001","year":2015}` | +| Full style (NIST) | Title page, bibliography | `National Institute of Standards and Technology Special Publication 800-53A` | +| Short style (NIST) | Inline citations | `NIST SP 800-53A` | +| Machine-readable (NIST) | DOI, machine interchange | `NIST.SP.800-53A` | + +This interchange is **lossless**: converting from any style to any other style preserves all semantic information. The data model is the single source of truth; the styles are just different serializations. + +## Formal Definition + +The metaschema is implemented in the PubID Ruby library as: + +- **Shared components** in `lib/pubid/components/` — reusable element definitions +- **Per-publisher schemas** in `lib/pubid/{flavor}/` — publisher-specific rules +- **Parsers** — PEG grammars (Parslet) for each publisher's syntax +- **Serializers** — Lutaml::Model mappings for JSON/YAML/URN output + +## See Also + +- [Common Elements](/concepts/components) — Detailed element reference +- [PubID Algebra](/concepts/algebra) — Relationships between identifiers +- [URN Mapping](/concepts/urn) — Machine-readable URN representation +- [Browse Publishers](/publishers/) — See all implemented schemas diff --git a/src/content/concepts/relationships.md b/src/content/concepts/relationships.md new file mode 100644 index 0000000..2ac8747 --- /dev/null +++ b/src/content/concepts/relationships.md @@ -0,0 +1,101 @@ +--- +title: Identifier Relationships +description: How PubID models relationships between identifiers — revision, reaffirmation, supersession, incorporation, adoption, and redesignation. +--- + +# Identifier Relationships + +Beyond composition (one identifier containing another), PubID models **relationships** between separate identifiers. These capture how documents relate to each other across their lifecycle. + +## Overview + +Relationships are expressed in parenthetical annotations on the identifier. A single document may have multiple relationships: + +``` +ANSI N42.18-2004 (Reaffirmation of ANSI N42.18-1980; Redesignation of ANSI N13.10-1974) +``` + +## Relationship Types + +### Revision Of + +A new edition that replaces a previous version of the same document. + +| Example | Meaning | +|---------|---------| +| `IEEE Std 802.3-2018 (Revision of IEEE Std 802.3-2015)` | 2018 edition revises the 2015 edition | + +### Reaffirmation Of + +A document confirmed as current without technical change. + +| Example | Meaning | +|---------|---------| +| `ANSI N42.18-2004 (Reaffirmation of ANSI N42.18-1980)` | 2004 edition reaffirms the 1980 edition | +| `ANSI C57.12.22-1993 (R1998)` | 1993 edition reaffirmed in 1998 | + +### Supersedes + +A document that replaces a previous, possibly differently-numbered document. + +| Example | Meaning | +|---------|---------| +| `IEEE Std X-2020 (Supersedes IEEE Std Y-2010)` | New document replaces the old one entirely | + +### Incorporates + +A document that includes the content of another standard. + +| Example | Meaning | +|---------|---------| +| `IEEE Std 1234-2020 (Incorporates IEEE Std 5678-2015)` | Standard includes content from another | + +### Adoption Of + +A publisher's version of another organization's standard. + +| Example | Meaning | +|---------|---------| +| `IEEE Std C37.60-2005 (Adoption of IEC 62271-111)` | IEEE adopts the IEC standard | + +### Redesignation Of + +A document renumbered under a new identifier. + +| Example | Meaning | +|---------|---------| +| `ANSI N42.18-2004 (Redesignation of ANSI N13.10-1974)` | Same content, new number | + +### Previously Designated As + +The inverse of redesignation — the old name for a renamed document. + +| Example | Meaning | +|---------|---------| +| `IEEE Std X-2020 (Previously designated as IEEE Std Y-2010)` | Formerly known by a different number | + +## Multiple Relationships + +A single identifier can carry multiple relationships, separated by semicolons: + +``` +ANSI N42.18-2004 (Reaffirmation of ANSI N42.18-1980; Redesignation of ANSI N13.10-1974) +``` + +This document is simultaneously a reaffirmation of one standard and a redesignation of another. + +## Publisher Support + +| Publisher | Revision | Reaffirmation | Supersedes | Incorporates | Adoption | Redesignation | +|-----------|----------|---------------|------------|-------------|----------|--------------| +| IEEE/ANSI | Yes | Yes | Yes | Yes | Yes | Yes | +| ISO | Via edition tracking | — | — | — | — | — | +| IEC | Via edition tracking | — | — | — | — | — | + +IEEE maintains the richest set of explicit relationships, tracked as structured data in the PubID model. + +## See Also + +- [PubID Algebra](/concepts/algebra) — How identifiers compose +- [Components](/concepts/components) — The building blocks of identifiers +- [URN Mapping](/concepts/urn) — Machine-readable canonical forms diff --git a/src/content/concepts/urn.md b/src/content/concepts/urn.md new file mode 100644 index 0000000..a9e3404 --- /dev/null +++ b/src/content/concepts/urn.md @@ -0,0 +1,126 @@ +--- +title: "URN Mapping" +description: "A PubID concept." +--- + +# URN Mapping + +Every PubID can be mapped to a canonical **URN (Uniform Resource Name)** for machine interchange. URNs provide a stable, location-independent identifier. + +## What is a URN? + +A URN is a standardized identifier syntax defined by [RFC 8141](https://www.rfc-editor.org/rfc/rfc8141). URNs follow the pattern: + +``` +urn:[namespace]:[specific-string] +``` + +## PubID URN Patterns + +Each publisher maps their PubID syntax to a URN following their specific pattern: + +### ISO + +``` +urn:iso:std:iso[:copublisher]:[number]:[edition]:[language] +``` + +| PubID | URN | +|-------|-----| +| `ISO 9001:2015` | `urn:iso:std:iso:9001:ed-5:en` | +| `ISO/IEC 17031-1:2020` | `urn:iso:std:iso-iec:17031:-1:ed-1` | +| `ISO 9001:2015/Amd 1:2024` | `urn:iso:std:iso:9001:ed-5:amd:1:v1` | + +### IEC + +``` +urn:iec:std:iec[:copublisher]:[number]:[edition]:[language] +``` + +| PubID | URN | +|-------|-----| +| `IEC 61131-3:2013` | `urn:iec:std:iec:61131:-3:ed-3` | +| `IEC 60050-111/AMD1/FRAG1 ED2` | `urn:iec:std:iec:60050:111:ed-2:amd:1:frag:1` | + +### IEEE + +``` +urn:ieee:std:[number]:[year] +``` + +### NIST + +``` +urn:nist:pub:[type]:[number]:[revision] +``` + +| PubID | URN | +|-------|-----| +| `NIST SP 800-53 Rev. 5` | `urn:nist:pub:sp:800-53:r5` | +| `NIST SP 800-57 Part 1 Rev. 4` | `urn:nist:pub:sp:800-57:pt1:r4` | + +NIST also defines a **machine-readable (MR) style** used as the DOI suffix: `NIST.SP.800-53A` maps to `https://doi.org/10.6028/NIST.SP.800-53A`. + +### OIML + +``` +urn:oiml:pub:[type]:[number]:[year] +``` + +## Round-Trip Guarantee + +PubIDs are designed for **round-trip fidelity**: parse a string, serialize it back, and get identical output. This applies to both human-readable PubID strings and URN representations. + +``` +Input: "ISO 9001:2015" + ↓ Parse +Object: { publisher: "ISO", number: "9001", year: 2015, edition: 5 } + ↓ Render (PubID) +Output: "ISO 9001:2015" ✓ identical + ↓ Render (URN) +URN: "urn:iso:std:iso:9001:ed-5:en" +``` + +This same principle applies across all output formats. For NIST, a single identifier can round-trip through four distinct styles: + +``` +Input: "NIST SP 800-53A" + ↓ Parse +Object: { publisher: "NIST", type: "SP", number: "800-53A" } + ↓ Render (Short) +Output: "NIST SP 800-53A" ✓ + ↓ Render (Full) +Output: "National Institute of Standards and Technology Special Publication 800-53A" + ↓ Render (MR/DOI) +Output: "NIST.SP.800-53A" + ↓ Render (URN) +URN: "urn:nist:pub:sp:800-53a" +``` + +## Benefits of URN Mapping + +1. **Machine interchange** — Systems can exchange identifiers in a standardized format +2. **Resolution** — URNs can be used for identifier resolution services +3. **Uniqueness** — URNs provide globally unique identifiers +4. **Stability** — URNs are location-independent and persist over time + +## Implementation + +The PubID Ruby library generates URNs through the `to_urn` method: + +```ruby +require 'pubid' + +id = Pubid::Iso.parse("ISO 9001:2015") +id.to_urn # => "urn:iso:std:iso:9001:ed-5:en" + +id = Pubid::Iec.parse("IEC 61131-3:2013") +id.to_urn # => "urn:iec:std:iec:61131:-3:ed-3" +``` + +## See Also + +- **[URN Specifications](/specs/)** — Full ABNF grammar and reference documentation for ISO (RFC 5141-bis) and IEC URN namespaces +- [The Metaschema](/concepts/metaschema) +- [Common Elements](/concepts/components) +- [Library Quick Start](/library/quick-start) diff --git a/src/content/library/api.md b/src/content/library/api.md new file mode 100644 index 0000000..39055b3 --- /dev/null +++ b/src/content/library/api.md @@ -0,0 +1,109 @@ +--- +title: "API Reference" +description: "PubID library documentation." +--- + +# API Reference + +## Top-Level Methods + +### `Pubid::{Flavor}.parse(string)` + +Parse a publication identifier string into an identifier object. + +```ruby +id = Pubid::Iso.parse("ISO 9001:2015") +id = Pubid::Iec.parse("IEC 61131-3:2013") +id = Pubid::Nist.parse("NIST SP 800-53 Rev. 5") +``` + +**Parameters:** +- `string` (String) — The identifier to parse + +**Returns:** Identifier object (flavor-specific class) + +**Raises:** `ParseError` if the identifier cannot be parsed + +## Identifier Instance Methods + +### `#to_s(**opts)` + +Render the identifier as a canonical string. + +```ruby +id = Pubid::Iso.parse("ISO 9001:2015") +id.to_s # => "ISO 9001:2015" +``` + +**Options (varies by flavor):** +- `:lang` — Language for localized output +- `:with_edition` — Include edition number + +### `#to_urn` + +Generate a URN representation. + +```ruby +id.to_urn # => "urn:iso:std:iso:9001:ed-5:en" +``` + +### `#to_h` + +Serialize to a Hash. + +```ruby +id.to_h # => { publisher: "ISO", number: "9001", ... } +``` + +### `#to_json` + +Serialize to JSON. + +```ruby +id.to_json # => '{"publisher":"ISO","number":"9001",...}' +``` + +## Common Attributes + +Most identifier objects expose these attributes: + +| Attribute | Type | Description | +|-----------|------|-------------| +| `publisher` | String | Publisher code | +| `number` | String | Document number | +| `part` | String | Part number | +| `year` | Integer | Publication year | +| `edition` | Integer | Edition number | +| `stage` | Stage | Development stage | +| `language` | String | Language code | +| `type` | Type | Document type | + +## Flavor-Specific Classes + +Each flavor has its own identifier classes under `Pubid::{Flavor}::Identifiers::*`. + +For example, ISO has: +- `Pubid::Iso::Identifiers::InternationalStandard` +- `Pubid::Iso::Identifiers::TechnicalReport` +- `Pubid::Iso::Identifiers::Amendment` +- etc. + +## Registry + +The `Pubid::IdentifierRegistry` provides lookup capabilities: + +```ruby +# Find by flavor and type +Pubid::IdentifierRegistry.find_by_type(:iso, :is) + +# Get all identifiers for a flavor +Pubid::IdentifierRegistry.all_for_flavor(:iso) + +# Export as JSON +Pubid::IdentifierRegistry.to_json +``` + +## See Also + +- [Quick Start](/library/) +- [Contributing](/library/contributing) diff --git a/src/content/library/contributing.md b/src/content/library/contributing.md new file mode 100644 index 0000000..1a17f85 --- /dev/null +++ b/src/content/library/contributing.md @@ -0,0 +1,105 @@ +--- +title: "Contributing" +description: "PubID library documentation." +--- + +# Contributing + +Contributions to PubID are welcome! Here's how to get started. + +## Adding a New Publisher Schema + +### 1. Create the Flavor Module + +```ruby +# lib/pubid/{flavor}/identifier.rb +module Pubid + module Myflavor + class Identifier < ::Pubid::Identifier + def self.parse(string) + parsed = Parser.parse(string) + Builder.build(parsed) + end + end + end +end +``` + +### 2. Define the Parser + +```ruby +# lib/pubid/{flavor}/parser.rb +module Pubid + module Myflavor + class Parser < Parslet::Parser + rule(:publisher) { str("MYPUB") } + rule(:number) { digits } + rule(:year) { str(":") >> digits } + rule(:root) { publisher >> space >> number >> year.maybe } + end + end +end +``` + +### 3. Define Identifier Types + +```ruby +# lib/pubid/{flavor}/identifiers/standard.rb +module Pubid + module Myflavor + module Identifiers + class Standard < ::Pubid::Identifier + attribute :publisher, :string + attribute :number, :string + attribute :year, :integer + end + end + end +end +``` + +### 4. Add Tests + +Create fixture files in `spec/fixtures/{flavor}/identifiers/pass/` and `fail/`: + +``` +spec/fixtures/myflavor/identifiers/pass/standard.txt +``` + +Each line is one identifier to test for successful parsing. + +### 5. Register in Main Module + +```ruby +# lib/pubid/{flavor}.rb +require_relative "{flavor}/identifier" +``` + +## Development Setup + +```bash +git clone https://github.com/pubid/pubid +cd pubid +bundle install + +# Run all tests +bundle exec rake test:all + +# Run specific flavor tests +bundle exec rspec spec/pubid/myflavor/ + +# Lint +bundle exec rake rubocop:all +``` + +## Pull Request Process + +1. Fork the repository +2. Create a feature branch +3. Add tests for new functionality +4. Ensure all tests pass: `bundle exec rake` +5. Submit a pull request + +## Reporting Issues + +Report bugs or request features at [github.com/pubid/pubid/issues](https://github.com/pubid/pubid/issues). diff --git a/src/content/library/index.md b/src/content/library/index.md new file mode 100644 index 0000000..43e4ae1 --- /dev/null +++ b/src/content/library/index.md @@ -0,0 +1,104 @@ +--- +title: "Library" +description: "PubID library documentation." +--- + +# Library + +The PubID Ruby gem provides parsing, rendering, and URN generation for all supported publisher schemes. + + + +
+ +
+ +This documentation reflects the identifier schemes exported from the pubid-ruby gem linked above. + +## Installation + +Add to your Gemfile: + +```ruby +gem 'pubid' +``` + +Or install directly: + +```bash +gem install pubid +``` + +## Features + +- **Parse** any supported identifier into structured components +- **Render** components back to a canonical string +- **Generate URNs** for machine interchange +- **Serialize** to JSON, YAML, or Hash +- **Validate** identifier syntax +- **37+ publisher schemes** supported out of the box + +## Quick Example + +```ruby +require 'pubid' + +# Parse +id = Pubid::Iso.parse("ISO 9001:2015") + +# Access components +id.publisher # => "ISO" +id.number # => "9001" +id.year # => 2015 + +# Render +id.to_s # => "ISO 9001:2015" + +# URN +id.to_urn # => "urn:iso:std:iso:9001:ed-5:en" + +# Serialize +id.to_h # => { publisher: "ISO", number: "9001", ... } +id.to_json # => JSON representation +``` + +## Per-Flavor Parsing + +```ruby +# ISO +Pubid::Iso.parse("ISO/IEC 17031-1:2020/Amd 1:2022") + +# IEC +Pubid::Iec.parse("IEC 61131-3:2013/AMD1:2019") + +# IEEE +Pubid::Ieee.parse("IEEE Std 802.3-2018") + +# NIST +Pubid::Nist.parse("NIST SP 800-53 Rev. 5") + +# BSI +Pubid::Bsi.parse("BS ISO 9001:2015") + +# CEN-CENELEC +Pubid::CenCenelec.parse("EN 196-3:2005+A1:2008") + +# And 17+ more publishers... +``` + +## Architecture + +The library uses a layered architecture: + +1. **Pre-parser** — Normalizes legacy/malformed identifiers via `update_codes.yaml` +2. **Parser** — PEG grammar (Parslet) produces a parse tree +3. **Builder** — Converts parse tree to an identifier object +4. **Identifier** — Lutaml::Model object with `to_s`, `to_urn`, `to_h` + +## Next Steps + +- [Quick Start Guide](/library/quick-start) +- [API Reference](/library/api) +- [Contributing](/library/contributing) diff --git a/src/content/library/quick-start.md b/src/content/library/quick-start.md new file mode 100644 index 0000000..1b0e562 --- /dev/null +++ b/src/content/library/quick-start.md @@ -0,0 +1,114 @@ +--- +title: "Quick Start" +description: "PubID library documentation." +--- + +# Quick Start + +Get started with the PubID Ruby gem in minutes. + +## Installation + +```bash +gem install pubid +``` + +## Parsing Identifiers + +### Basic Parse + +```ruby +require 'pubid' + +id = Pubid::Iso.parse("ISO 9001:2015") +puts id.class # => Pubid::Iso::Identifiers::InternationalStandard +puts id.to_s # => "ISO 9001:2015" +``` + +### Multi-Part Standards + +```ruby +id = Pubid::Iso.parse("ISO/IEC 17031-1:2020") +puts id.publisher # => "ISO" +puts id.copublisher # => "IEC" +puts id.number # => "17031" +puts id.part # => "1" +puts id.year # => 2020 +``` + +### With Supplements + +```ruby +id = Pubid::Iso.parse("ISO 9001:2015/Amd 1:2024") +puts id.to_s # => "ISO 9001:2015/Amd 1:2024" +puts id.to_urn +``` + +### Drafts and Stages + +```ruby +id = Pubid::Iso.parse("ISO/DIS 45001") +puts id.stage # => stage info + +id = Pubid::Ieee.parse("IEEE P802.3bf/D3.0") +puts id.to_s +``` + +## URN Generation + +```ruby +id = Pubid::Iso.parse("ISO 9001:2015") +id.to_urn # => "urn:iso:std:iso:9001:ed-5:en" + +id = Pubid::Iec.parse("IEC 61131-3:2013") +id.to_urn # => "urn:iec:std:iec:61131:-3:ed-3" +``` + +## Serialization + +```ruby +id = Pubid::Iso.parse("ISO 9001:2015") + +# Hash +id.to_h +# => { publisher: "ISO", number: "9001", year: 2015, edition: 5, ... } + +# JSON +id.to_json +# => JSON string representation +``` + +## Cross-Publisher Support + +```ruby +# NIST +id = Pubid::Nist.parse("NIST SP 800-53 Rev. 5") + +# BSI +id = Pubid::Bsi.parse("BS ISO 9001:2015") + +# IEEE +id = Pubid::Ieee.parse("IEEE Std 802.3-2018") + +# ETSI +id = Pubid::Etsi.parse("ETSI EN 300 392-2 V3.4.1 (2017-04)") + +# ITU +id = Pubid::Itu.parse("ITU-T G.992.1") +``` + +## Error Handling + +```ruby +begin + id = Pubid::Iso.parse("invalid identifier") +rescue => e + puts "Parse error: #{e.message}" +end +``` + +## Next Steps + +- [API Reference](/library/api) +- [Contributing](/library/contributing) +- [Browse Publishers](/publishers/) diff --git a/src/content/specs/iec-urn-specification.adoc b/src/content/specs/iec-urn-specification.adoc new file mode 100644 index 0000000..3218279 --- /dev/null +++ b/src/content/specs/iec-urn-specification.adoc @@ -0,0 +1,569 @@ += URN Specification for the International Electrotechnical Commission (IEC) +:doctype: article +:toc: macro +:toclevels: 4 +:source-highlighter: coderay + +toc::[] + +== Introduction + +This document specifies the Uniform Resource Name (URN) namespace for +identifiers published by the International Electrotechnical Commission +(IEC). The namespace ID (NID) is `iec`. + +IEC identifiers share structural similarities with the ISO URN namespace +(RFC 5141) but differ in several key aspects: + +* **Date-based identification** -- IEC URNs use a date field (year, + year-month, or year-month-day) in the base document position, whereas + ISO URNs treat the year as metadata that is generally omitted. +* **Deliverable types** -- IEC defines product-oriented deliverable + types (CSV, CMV, EXV, PRV, RLV) that indicate the form of the + published document. +* **Adjunct model** -- Supplements (amendments, corrigenda, + interpretation sheets) are modelled as *adjuncts* to the base + document. A *relation* field distinguishes between a reference to + the adjunct itself versus a consolidation of the base document with + its adjuncts. +* **Component references** -- A fragment identifier (`#`) syntax + references specific document elements (clauses, figures, tables, + terms, annexes, notes). +* **Related assets** -- An asset identifier (`=`) syntax references + external resources (software supplements, voting reports, web pages, + forums). + +This specification is based on the IEC URI model documents dated +2019-12-10 and 2020-03-24. + +== Namespace ID + +`iec` + +== Registration Information + +*Version:* 1.0 (2020-03-24) + +== Declaration of Structure + +=== Definition + +The Namespace Specific Strings (NSSs) of all URNs assigned by IEC +conform to the syntax defined in Section 2.2 of RFC 2141. + +The NSS has the following ABNF specification: + +.... +NSS = std-nss + +std-nss = "std:" basedocument *( adjunct ) [ reference ] + +basedocument = header ":" docnumber [":" date] [":" type] + [":" deliverable] [":" language] + +header = publisher *("-" copublisher) + +publisher = "iec" / "iso" / "cispr" + +copublisher = "iso" / "ieee" / "itu" / "astm" / "sae" + / other-org + +other-org = 1*(ALPHA / DIGIT) + +docnumber = 1*DIGIT *( "-" 1*(DIGIT / ALPHA) ) + +date = year ["-" month ["-" day]] + +year = 4DIGIT + +month = 2DIGIT + +day = 2DIGIT + +type = "is" / "ts" / "tr" / "pas" / "guide" / "srd" / "ser" + / "data" / "isp" / "r" / "tta" + +deliverable = "csv" / "cmv" / "exv" / "prv" / "rlv" + +language = lang-code *("-" lang-code) + +lang-code = 2ALPHA + +adjunct = relation-marker adjunct-type ":" adjunct-number + [":" adjunct-date] + +relation-marker = ":" ":" / ":" "plus" ":" + +adjunct-type = "amd" / "cor" / "ish" + +adjunct-number = DIGITS + +adjunct-date = date + +reference = "#" element-id + / "=" asset-name + +element-id = element-type "-" element-number *( "-" element-number ) + +element-type = "sec" / "fig" / "tabl" / "anx" / "not" / "con" + / "term" / "clause" + +element-number = 1*(DIGIT / ALPHA / "." / "-") + +asset-name = 1*(ALPHA / DIGIT / "-" / "." / "_") +.... + +=== General Rules + +If any field is absent, leave it empty (empty fields between colons are +preserved):: + + `urn:iec:std:iec:60601-1-1::::` (all optional fields empty) + vs `urn:iec:std:iec:60601-1-1:2005-10:tr:prv:fr` (all fields present) + +All values in lower-case:: URN elements use lowercase. Language codes +are listed in alphabetical order (e.g., `en-fr-ru`, not `fr-en-ru`). + +Extensibility:: All URNs are extensible to define adjuncts (amendment, +corrigendum, interpretation sheet) and to name consolidations (base +edition plus its amendments). + +=== Separators + +[cols="1,3,3"] +|=== +| Separator | Rule | Examples + +| `:` +| Between fields in the URN +| `urn:iec:std:iec:60601` + +| `-` +| Within a field (part numbers, date components, copublishers, languages) +| `urn:iec:std:iec-iso:60601-1-1` + +| `||` +| Between base edition and adjunct (reference to adjunct itself) +| `urn:iec:std:iec:60601-1-1:2015-10:::fr\|\|amd:1:2017-01` + +| `_` +| Between base edition and adjunct in a consolidation +| `urn:iec:std:iec:60601-1-1:2015-04:csv:_amd:1:2016-07_amd:2:2017-02` + +| `#` +| Between URI and document element IDs +| `urn:iec:std:iec:60601-1-1:2015-10:::#fig-1` + +| `=` +| Between URI and related asset +| `urn:iec:std:iec:60601-1-1:2015-10:tr:prv:fr=Human-body-model.pdf` +|=== + +=== Element Descriptions + +==== header (publisher/copublishers) + +The organization(s) from which a document emanates. The primary +publisher is listed first, followed by copublishers joined by hyphens. + +Current values: + +[horizontal] +iec:: International Electrotechnical Commission +iso:: International Organization for Standardization +cispr:: International Special Committee on Radio Interference +iec-iso:: jointly developed by IEC and ISO +iec-ieee:: jointly developed by IEC and IEEE +iec-itu:: jointly developed by IEC and ITU +iec-astm:: jointly developed by IEC and ASTM + +==== docnumber + +The project number assigned to the document. Multi-part documents use +hyphens within the field: + +* `60445` -- single document +* `60068-2-2` -- multipart document, part 2-2 +* `60050-121-10-34` -- database entry (e.g., IEV terminological entry) + +==== date + +The publication date of the document. May be: + +* **blank** -- undated reference +* **YYYY** -- year only (e.g., `2010`) +* **YYYY-MM** -- year-month (e.g., `2015-06`) +* **YYYY-MM-DD** -- full date (e.g., `2010-10-11`) + +==== type + +Designates the IEC deliverable type. If the `type` element is blank or +`is`, the classification is "International Standard". + +[horizontal] +is:: International Standard (can be blank) +ts:: Technical Specification +tr:: Technical Report +pas:: Publicly Available Specification +guide:: Guide +srd:: Systems Reference Deliverable +ser:: Series (all parts) +data:: Data (document type no longer published) +isp:: International Standardized Profile +r:: Recommendation (document type no longer published) +tta:: Technology Trends Assessment + +==== deliverable + +Designates the product type (form in which the document is published). +If blank, the document is in its standard form. + +[horizontal] +csv:: Consolidated version (base + all supplements integrated) +cmv:: Committee version +exv:: Expert version +prv:: Prerelease version +rlv:: Redline version + +==== language + +One or more ISO 639-1 alpha-2 language codes. Multiple languages are +joined by hyphens (not commas as in the ISO URN scheme), listed in +alphabetical order. + +[horizontal] +en:: English +fr:: French +ru:: Russian +en-fr:: English and French bilingual +en-fr-ru:: English, French, and Russian trilingual + +If blank, the document's default language applies. + +==== adjunct + +An adjunct is a document that modifies or supplements the base document. +Adjuncts are appended to the base document URN. + +The *relation-marker* distinguishes two reference modes: + +*Empty (no `plus`)* -- Reference to the adjunct itself:: + + `urn:iec:std:iec:60068-2-2:1974:::amd:1:1993` + Amendment 1:1993 *to* IEC 60068-2-2:1974 + +*`plus`* -- Reference to the consolidated document:: + + `urn:iec:std:iec:60068-2-2:1974::plus:amd:1:1993` + *Consolidation of* IEC 60068-2-2:1974 with Amendment 1:1993 + +Adjunct types: + +[horizontal] +amd:: Amendment -- alters and/or adds technical provisions; subject to ballot +cor:: Technical Corrigendum -- corrects technical error or ambiguity; not balloted +ish:: Interpretation Sheet -- official interpretation of a published standard + +Adjuncts may be chained. For example, a Corrigendum to an Amendment: + +.... +urn:iec:std:iec:60068-2-2:1974-01:::amd:2:1994-05||cor:1:2001-01 +// Corrigendum 1:2001 to Amendment 2:1994 to IEC 60068-2-2:1974 +.... + +Consolidation with multiple adjuncts: + +.... +urn:iec:std:iec:60027-1:1992::csv:_amd:1:1997_amd:2:2005 +// Consolidated version of IEC 60027-1:1992 incorporating +// Amendment 1:1997 and Amendment 2:2005 +.... + +==== reference + +A reference identifies either a specific element within the document or +an external asset associated with the document. + +Element references (`#`):: + +.... +urn:iec:std:iec:60601-1-1:2015-10:::#fig-1 +// Figure 1 in IEC 60601-1-1:2015-10 + +urn:iec:std:iec:60050-121:2010-10:::#con-121-10-23 +// Concept 121-10-23 within IEC 60050-121:2010-10 +.... + +Element types: + +[horizontal] +sec:: Section / clause +fig:: Figure +tabl:: Table +anx:: Annex +not:: Note +con:: Concept (terminological database entry) +term:: Term +clause:: Clause + +Asset references (`=`):: + +.... +urn:iec:std:iec:60601-1-1:2015-10:tr:prv:fr=Human-body-model.pdf +// External asset associated with the document +.... + +Asset types (exterior asset scheme not yet fully defined): + +[horizontal] +software supplement:: Software associated with the document +voting report:: Voting results for the document +webpage:: Web page related to the document +forum:: Discussion forum related to the document + +=== Examples + +==== Basic identifiers + +.... +urn:iec:std:iec:60445 +// IEC 60445 (undated) + +urn:iec:std:iec:60445:2001 +// IEC 60445:2001 + +urn:iec:std:iec:60068-2-2:1974 +// IEC 60068-2-2:1974 +.... + +==== Copublishers + +.... +urn:iec:std:iso:14971:2000 +// ISO 14971:2000 + +urn:iec:std:iso-iec:11801 +// ISO/IEC 11801 (undated) + +urn:iec:std:iec-ieee:80004 +// IEC/IEEE 80004 (undated) +.... + +==== Document types + +.... +urn:iec:std:iso-iec:tr:11802-9901:2014 +// ISO/IEC TR 11802-9901:2014 + +urn:iec:std:iec::pas:62825 +// IEC PAS 62825 (undated) + +urn:iec:std:iec::guide:111:2004-07 +// IEC Guide 111:2004-07 +.... + +==== Series references + +.... +urn:iec:std:iec:61076::ser +// IEC 61076 series (all parts) + +urn:iec:std:iec:61076-7::ser +// IEC 61076-7 series (all sub-parts) +.... + +==== Language + +.... +urn:iec:std:iec:60068-2-2:1974:::fr +// IEC 60068-2-2:1974 in French +.... + +==== Adjuncts (amendments and corrigenda) + +.... +urn:iec:std:iec:60068-2-2:1974:::amd:1:1993 +// Amendment 1:1993 to IEC 60068-2-2:1974 + +urn:iec:std:iec:60068-2-2:1974:::amd:2:1994 +// Amendment 2:1994 to IEC 60068-2-2:1974 +.... + +==== Chained adjuncts (Corrigendum to Amendment) + +.... +urn:iec:std:iec:60068-2-2:1974-01:::amd:2:1994-05||cor:1:2001-01 +// Corrigendum 1:2001 to Amendment 2:1994 to IEC 60068-2-2:1974-01 +.... + +==== Consolidations + +.... +urn:iec:std:iec:60068-2-2:1974::plus:amd:1:1993 +// Consolidation of Amendment 1:1993 with IEC 60068-2-2:1974 + +urn:iec:std:iec:60027-1:1992::csv:_amd:1:1997_amd:2:2005 +// Consolidation of IEC 60027-1:1992 with +// Amendment 1:1997 and Amendment 2:2005 (CSV) +.... + +==== Prerelease versions + +.... +urn:iec:std:iec:60601-2-63:2012:::amd:1:2017-03-01 +// Amendment 1:2017 to IEC 60601-2-63:2012 + +urn:iec:std:iec:60601-2-63:2012::prv:amd:1:2017-03-01 +// Prerelease version of Amendment 1:2017 to IEC 60601-2-63:2012 +.... + +==== Database entries + +.... +urn:iec:std:iec:60417 +// Entire IEC 60417 database (undated) + +urn:iec:std:iec:60417:2010-10 +// Entire IEC 60417 database (dated) + +urn:iec:std:iec:60417-5012:2010-10 +// Single graphical symbol entry (60417-5012) with its own date + +urn:iec:std:iec:60050-121-10-34:2016-11 +// Single terminological entry (IEV 121-10-34) with its own date + +urn:iec:std:iec:60050-121:2010-10::#con-121-10-23 +// Entry 121-10-23 within a dated set of IEV entries +.... + +==== CISPR documents + +.... +urn:iec:std:cispr:11:2015-06 +// CISPR 11:2015-06 +.... + +==== Adopted documents + +.... +urn:xyz:std:iec:60065:2001 +// IEC 60065:2001 adopted by another organization XYZ +// (uses different SDO namespace) +.... + +== Identifier Uniqueness Considerations + +Assignment of URNs for documents in the IEC namespace is managed by the +IEC Central Office. Uniqueness is ensured by: + +* The combination of `header` (publisher), `docnumber`, and `date` + uniquely identifies a base document. +* Adjunct numbering is consecutive per supplement type per document. +* Database entries are identified by their extended project numbers + (e.g., `60417-5012`). + +== Identifier Persistence Considerations + +Assigned URNs will not be reused and will remain valid beyond the +lifecycle of the referenced resources. The status of a referenced +resource may change (e.g., from draft to published, or from published +to withdrawn). + +== Process for Identifier Resolution + +A URN identifying an IEC document can be transformed to a valid HTTP +URI by: + +. Replacing the URN namespace prefix (`urn:iec:`) and the `std:` prefix + with the IEC web domain. +. Replacing occurrences of `:` within the identifier with `/`. +. Converting characters to lowercase. + +== Rules for Lexical Equivalence + +URNs are lexically equivalent if they are octet-by-octet equal after +the following preprocessing: + +. Normalize the case of the leading `urn:` token. +. Normalize the case of the NID. +. Normalize the case of any %-escaping. +. Normalize the case of all elements. + +All elements use lowercase. Language codes are listed in alphabetical +order to ensure deterministic equivalence. + +== Conformance with URN Syntax + +No special considerations beyond RFC 2141. + +== Validation Mechanism + +None specified. + +== Scope + +Global. + +== Differences from ISO URN (RFC 5141) + +[cols="1,3,3"] +|=== +| Feature | ISO URN (RFC 5141) | IEC URN + +| Namespace ID +| `iso` +| `iec` + +| Date handling +| Year in edition slot; undated URN omits year +| Date field in `YYYY`, `YYYY-MM`, or `YYYY-MM-DD` format + +| Deliverable types +| Not applicable +| `csv`, `cmv`, `exv`, `prv`, `rlv` + +| Language separator +| Comma (`en,fr`) +| Hyphen (`en-fr`) + +| Supplement model +| Appended with `:` separator +| Adjunct model with `||` (adjunct ref) and `_` (consolidation) + +| Relation marker +| Not applicable +| `plus` for consolidations + +| Component references +| `:clause:`, `:figure:` etc. via `docelement` +| `#sec-1`, `#fig-1` via fragment identifier + +| Asset references +| `:tech` and isodefined via `addition` +| `=` asset name syntax + +| Interpretation sheets +| Not defined +| `ish` adjunct type +|=== + +== References + +[bibliography] +=== Normative References + +* [[[ISODIR1,IEC/ISO Directives Part 1]]] -- Procedures for the + technical work. +* [[[RFC2141,RFC 2141]]] -- Moats, R., "URN Syntax", May 1997. +* [[[RFC5141,RFC 5141]]] -- Goodwin, J., Apel, H., "A URN Namespace + for ISO", March 2008. +* [[[RFC5234,RFC 5234]]] -- Crocker, D., Overell, P., "Augmented BNF + for Syntax Specifications: ABNF", January 2008. + +[bibliography] +=== Informative References + +* IEC URI Model, version 2019-12-10 (internal IEC document). +* IEC URI Model, version 2020-03-24 (internal IEC document). +* [[[ISO639,ISO 639-1:2002]]] -- "Codes for the representation of names + of languages -- Part 1: Alpha-2 code". diff --git a/src/content/specs/iec-urn.md b/src/content/specs/iec-urn.md new file mode 100644 index 0000000..09f0a9e --- /dev/null +++ b/src/content/specs/iec-urn.md @@ -0,0 +1,9 @@ +--- +prev: /specs/iso-urn +--- + + + +
diff --git a/src/content/specs/index.md b/src/content/specs/index.md new file mode 100644 index 0000000..5bcee74 --- /dev/null +++ b/src/content/specs/index.md @@ -0,0 +1,55 @@ +--- +title: "URN Specifications" +--- + + + +# URN Specifications + +Every PubID maps to a canonical URN (Uniform Resource Name) for machine interchange. These specifications define the URN namespaces for each standards publisher. + +## Published Specifications + +| Specification | Namespace ID | Status | +|---|---|---| +| [ISO URN Specification (RFC 5141-bis)](/specs/iso-urn) | `urn:iso:std:` | Supersedes RFC 5141 | +| [IEC URN Specification](/specs/iec-urn) | `urn:iec:std:` | Based on IEC URI Model (2020) | + +## Reference Documents + +- [RFC 5141 — A URN Namespace for ISO](https://www.rfc-editor.org/rfc/rfc5141) (original, superseded by RFC 5141-bis) +- [RFC 2141 — URN Syntax](https://www.rfc-editor.org/rfc/rfc2141) + +## About These Specifications + +These URN specifications are maintained as part of the PubID project. Each specification defines: + +- The **ABNF grammar** for the Namespace Specific String (NSS) +- **Element descriptions** for each URN component +- **Examples** covering basic identifiers, supplements, stages, and languages +- **Uniqueness and persistence** considerations +- **Resolution** mechanisms +- **Gap analysis** against prior specifications (where applicable) + +The specifications are authored in AsciiDoc and rendered on this site using Asciidoctor. Source files are available in the [PubID repository](https://github.com/metanorma/pubid/tree/main/references). + +## Implementation + +The PubID Ruby library implements URN generation and parsing for all supported publishers: + +```ruby +require 'pubid' + +id = Pubid::Iso.parse("ISO 9001:2015") +id.to_urn # => "urn:iso:std:iso:9001:ed-5:en" + +id = Pubid::Iec.parse("IEC 61131-3:2013") +id.to_urn # => "urn:iec:std:iec:61131:-3:ed-3" +``` + +## See Also + +- [URN Mapping Overview](/concepts/urn) +- [Library Documentation](/library/) +- [Playground](/) diff --git a/src/content/specs/iso-urn-specification.adoc b/src/content/specs/iso-urn-specification.adoc new file mode 100644 index 0000000..7d59ad5 --- /dev/null +++ b/src/content/specs/iso-urn-specification.adoc @@ -0,0 +1,630 @@ += URN Specification for the International Organization for Standardization (ISO) +:doctype: article +:toc: macro +:toclevels: 4 +:source-highlighter: coderay + +toc::[] + +== Introduction + +This document specifies the Uniform Resource Name (URN) namespace for +identifiers published by the International Organization for +Standardization (ISO). It is based on RFC 5141 (the original ISO URN +namespace registration) with extensions implemented in the PubID gem, +referred to here as *RFC 5141-bis*. + +RFC 5141 assigned the namespace ID (NID) "iso" and defined the original +syntax for identifying ISO documents, their editions, supplements, and +extracted resources. This specification extends RFC 5141 to address the +following gaps identified in practice: + +* **Copublishers** -- RFC 5141 defines a fixed set of originators. + This specification supports dynamic copublisher combinations (e.g., + `iso-iec-ieee`, `iso-astm`). +* **Extended document types** -- Additional deliverable types beyond + those in RFC 5141, including Directives (`dir`), Directive Supplements + (`dir-sup`), and IWA Supplements (`iwa-sup`). +* **Typed stage abbreviations** -- RFC 5141 uses only harmonized stage + codes (`stage-XX.XX`). This specification also supports short stage + abbreviations (`WD`, `CD`, `DIS`, `FDIS`, `PDAM`, `DAM`, `FDAM`, + `DCOR`, `FDCOR`, `CDTS`, `DTS`, `FDTS`, `WDS`). +* **Supplement chains** -- Nested supplements (e.g., a Corrigendum to + an Amendment) with explicit ordering semantics. +* **Explicit language specification** -- Language codes are always + emitted explicitly rather than relying on a default. + +== Namespace ID + +`iso` + +== Registration Information + +*Version:* RFC 5141-bis (based on RFC 5141 Version 2.1, 2007-12-13) + +== Declared Registrant of the Namespace + +ISO Central Secretariat + +International Organization for Standardization (ISO) + +Case Postale 56 + +CH-1211 Geneva 20 + +Switzerland + +E-mail: goodwin@iso.org + +== Declaration of Structure + +=== Definition + +The Namespace Specific Strings (NSSs) of all URNs assigned by ISO +conform to the syntax defined in Section 2.2 of RFC 2141. + +The NSS has the following ABNF specification: + +.... +NSS = std-nss + +std-nss = "std:" docidentifier *supplement [addition] + +docidentifier = originator [":" type] ":" docnumber [":" partnumber] + [[":" status] ":" edition] + [":" docversion] [":" language] + +originator = publisher *("-" copublisher) + +publisher = "iso" / "iec" + +copublisher = "iec" / "cie" / "astm" / "ieee" / "itu" / "sae" + / other-org + +other-org = 1*(ALPHA / DIGIT) + +type = "data" / "guide" / "isp" / "iwa" / + "pas" / "r" / "tr" / "ts" / "tta" / + "dir" / "dir-sup" / "iwa-sup" + +docnumber = DIGITS + +partnumber = "-" 1*( DIGIT / ALPHA / "-" ) + +status = ( "draft" / "cancelled" ) / stage + +stage = "stage-" stagecode ["." iteration] + / stage-abbr ["." iteration] + +stage-abbr = "WD" / "WDS" / "CD" / "CDV" / "DIS" / "FDIS" + / "PDAM" / "DAM" / "FDAM" / "DCOR" / "FDCOR" + / "CDTS" / "DTS" / "FDTS" / "PRF" + / "PWI" / "NP" / "AWI" / "NWIP" + +stagecode = DIGIT DIGIT "." DIGIT DIGIT + +iteration = "v" DIGITS + +edition = "ed-" DIGITS + +docversion = "v" (simpleversion / isoversion) + +simpleversion = DIGITS + +isoversion = baseversion *includedsuppl + +baseversion = DIGITS + +includedsuppl = "-" suppltype supplnumber ["." supplversion] + +language = lang-code *("," lang-code) + +lang-code = 1*2(ALPHA) + +supplement = ":" suppltype ":" supplnumber + [":" supplversion] [":" language] + +suppltype = "amd" / "cor" / "sup" / "add" + +supplnumber = DIGITS + +supplversion = "v" DIGITS + +addition = techdefined / isodefined + +techdefined = ":tech" *techelement + +techelement = + +isodefined = + +DIGITS = DIGIT *DIGIT + +DIGIT = %x30-39 ; 0-9 + +ALPHA = %x41-5A / %x61-7A ; A-Z / a-z +.... + +=== Element Descriptions + +==== originator + +The organization (or organizations) from which a document emanates. +Unlike RFC 5141 which defines a fixed set of originator values, this +specification uses a dynamic composition of publisher and copublishers +joined by hyphens. + +Current values include but are not limited to: + +[horizontal] +iso:: International Organization for Standardization +iec:: International Electrotechnical Commission +iso-iec:: jointly developed by ISO and IEC +iso-cie:: jointly developed by ISO and CIE +iso-astm:: jointly developed by ISO and ASTM International +iso-ieee:: jointly developed by ISO and IEEE +iso-iec-ieee:: jointly developed by ISO, IEC, and IEEE + +Additional copublisher combinations may be defined in future revisions. + +==== type + +Designates the ISO deliverable type. If the `type` element is not +present, the classification is "International Standard". + +[horizontal] +data:: Data (document type no longer published) +guide:: Guide +isp:: International Standardized Profile +iwa:: International Workshop Agreement +pas:: Publicly Available Specification +r:: Recommendation (document type no longer published) +tr:: Technical Report +ts:: Technical Specification +tta:: Technology Trends Assessment +dir:: Directive +dir-sup:: Directive Supplement +iwa-sup:: IWA Supplement + +[NOTE] +==== +RFC 5141 does not define `dir`, `dir-sup`, or `iwa-sup`. +These are RFC 5141-bis extensions. +==== + +==== docnumber + +The reference number assigned to the document by ISO and/or IEC. + +==== partnumber + +The reference number that identifies a part of a multipart standard. +Omitting `partnumber` designates a multipart document in its entirety. + +==== status / stage + +Indicates the publication status of the document. When the `status` +element is not present, the NSS refers to a published document. + +RFC 5141-bis extends RFC 5141 by supporting *typed stage abbreviations* +in addition to harmonized stage codes: + +Harmonized stage code notation:: + +`stage-XX.XX` where `XX.XX` is the harmonized stage code per ISO +Guide 69:1999. An optional iteration suffix `.vN` identifies a specific +project iteration. + +[horizontal] +stage-00.00:: Preliminary work item +stage-20.00:: New work item proposal +stage-30.00:: Committee draft +stage-40.00:: Draft International Standard +stage-50.00:: Final Draft International Standard +stage-60.00:: Published (not emitted for published documents) + +Typed stage abbreviations (RFC 5141-bis):: + +[horizontal] +PWI:: Preliminary Work Item +NP:: New Proposal / New Work Item Proposal +AWI:: Approved Work Item +NWIP:: New Work Item Proposal +WD:: Working Draft +WDS:: Working Draft Study +CD:: Committee Draft +CDV:: Committee Draft for Vote +DIS:: Draft International Standard +FDIS:: Final Draft International Standard +PDAM:: Proposed Draft Amendment +DAM:: Draft Amendment +FDAM:: Final Draft Amendment +DCOR:: Draft Corrigendum +FDCOR:: Final Draft Corrigendum +CDTS:: Committee Draft Technical Specification +DTS:: Draft Technical Specification +FDTS:: Final Draft Technical Specification +PRF:: Proof + +==== edition + +`ed-N` designates a specific edition of the document. If no `edition` +is specified, the NSS refers to the latest edition. + +==== language + +One or more ISO 639-1 alpha-2 language codes, comma-separated. RFC +5141-bis always emits language codes explicitly. Values include: + +[horizontal] +en:: English +fr:: French +ru:: Russian +es:: Spanish +ar:: Arabic + +Combinations are expressed as comma-separated lists: `en,fr` for +bilingual, `en,fr,ru` for trilingual. + +==== supplement + +Designates a technical alteration of or addition to an ISO standard +that does not result in a new edition or version. + +Supplements are appended after the base document identifier and may be +chained (e.g., a Corrigendum to an Amendment): + +.... +urn:iso:std:iso:9999:-1:ed-2:en:amd:1:cor:1 +.... + +[horizontal] +amd:: Amendment -- alters and/or adds technical provisions; subject to ballot +cor:: Technical Corrigendum -- corrects technical error or ambiguity; not balloted +sup:: Supplement -- generic supplement type +add:: Addendum -- (document type no longer published) + +==== addition + +An optional element that identifies a representation, extract, or +related information set of an ISO document. + +[horizontal] +:tech...:: Committee-defined associated or embedded resource +(other):: Reserved for ISO Central Secretariat definitions + +=== Examples + +==== Basic identifiers + +.... +urn:iso:std:iso:9999:-1:ed-1:en +// 1st edition of ISO 9999-1, in English + +urn:iso:std:iso-iec:tr:9999:-1:ed-1:en +// 1st edition of ISO/IEC TR 9999-1, in English +.... + +==== Undated references + +.... +urn:iso:std:iso:9001 +// ISO 9001 (no date, edition, or language specified) + +urn:iso:std:iso:8601:-1 +// ISO 8601-1 (undated, with part number) +.... + +==== Status and stages + +.... +urn:iso:std:iso-iec:9075:-3:stage-95.99:ed-2:en +// Cancelled (withdrawn) 2nd edition of ISO/IEC 9075-3 + +urn:iso:std:iso-iec:9075:-3:stage-30.60:ed-4:en +// Draft 4th edition of ISO/IEC 9075-3 + +urn:iso:std:iso-iec:9075:-3:DIS:ed-4:en +// Same as above, using RFC 5141-bis typed stage abbreviation +.... + +==== Language handling + +.... +urn:iso:std:iso:9999:-1:ed-1:en +// English + +urn:iso:std:iso:9999:-1:ed-1:en,fr +// English/French bilingual + +urn:iso:std:iso:9999:-1:ed-1:en,fr,ru +// English/French/Russian trilingual +.... + +==== Supplements + +.... +urn:iso:std:iso:9999:-1:ed-2:en:amd:1 +// Amendment 1 to the 2nd edition of ISO 9999-1, in English + +urn:iso:std:iso:9999:-1:ed-2:en:amd:1:v2 +// Corrected version (v2) of Amendment 1 + +urn:iso:std:iso:9999:-1:ed-2:en:amd:1:cor:1 +// Corrigendum 1 to Amendment 1 + +urn:iso:std:iso-iec:13818:-1:amd:2016:v3:cor:2017:v1 +// Amendment 3 (2016) with Corrigendum 1 (2017) to +// ISO/IEC 13818-1 +.... + +==== Extended types (RFC 5141-bis) + +.... +urn:iso:std:iso:dir:iso +// ISO Directive + +urn:iso:std:iso:dir-sup:iso:1:en +// ISO Directive Supplement, Part 1, in English +.... + +== Identifier Uniqueness Considerations + +Assignment of URNs for documents in the requested namespace is managed +by the ISO Central Secretariat, which ensures that the assigned URNs +are consistent with the ISO Directives for unique identification of ISO +documents. + +RFC 5141-bis supplements this by requiring that: + +* Typed stage abbreviations map unambiguously to harmonized stage codes. +* Supplement chains have a defined ordering (outer supplement last in + the NSS). +* Language codes are always explicit, avoiding ambiguity from implicit + defaults. + +== Identifier Persistence Considerations + +Assigned URNs will not be reused and will remain valid beyond the +lifecycle of the referenced resources. The status of a referenced +resource may change (e.g., from draft to published, or from published +to withdrawn). + +== Process for Identifier Resolution + +A URN identifying an ISO document can be transformed to a valid HTTP +URI by: + +. Replacing the URN namespace prefix (`urn:iso:`) and the `std:` prefix + with the domain name `standards.iso.org`. +. Replacing all occurrences of `:` within the identifier with `/`. +. Converting characters to lowercase. + +Examples: + +.... +urn:iso:std:iso:9999:-1:ed-1:en + -> http://standards.iso.org/iso/9999/-1/ed-1/en/ + +urn:iso:std:iso-iec:tr:9999:-1:ed-1:en + -> http://standards.iso.org/iso-iec/tr/9999/-1/ed-1/en/ +.... + +== Rules for Lexical Equivalence + +URNs are lexically equivalent if they are octet-by-octet equal after +the following preprocessing: + +. Normalize the case of the leading `urn:` token. +. Normalize the case of the NID. +. Normalize the case of any %-escaping. +. Normalize the case of all elements. + +All URNs conforming to this specification use lowercase for all +elements except typed stage abbreviations, which are case-insensitive +per RFC 2141 Section 5. + +== Conformance with URN Syntax + +No special considerations beyond RFC 2141. + +== Validation Mechanism + +None specified. + +== Scope + +Global. + +== Stage Code Evolution + +Stage definitions in ISO are not static. The ISO technical management system +introduces new stage types over time to reflect evolving working practices. +This has implications for URN generation and parsing. + +=== Dated Stage Codes + +Following the approach used in RDF-based code lists (e.g., ISO's published +stage code vocabulary), stage definitions SHOULD be tracked with an effective +date to distinguish when a stage was introduced. + +[cols="1,1,1,3"] +|=== +| Stage | Abbreviation | Effective | Notes + +| Preliminary Work Item +| PWI +| 1999 +| ISO Guide 69:1999 + +| New Proposal +| NP +| 1999 +| ISO Guide 69:1999 + +| Approved Work Item +| AWI +| 1999 +| ISO Guide 69:1999 + +| Working Draft +| WD +| 1999 +| ISO Guide 69:1999; harmonized codes 20.20, 20.60, 20.92, 20.93, 20.98, 20.99 + +| Working Draft Study +| WDS +| 2025-06 +| Introduced June 2025; harmonized codes 20.20, 20.60 (overlaps with WD) + +| Committee Draft +| CD +| 1999 +| ISO Guide 69:1999 + +| Committee Draft Technical Specification +| CDTS +| 1999 +| Stage code `cd` applied to type `ts` + +| Draft International Standard +| DIS +| 1999 +| ISO Guide 69:1999 + +| Final Draft International Standard +| FDIS +| 1999 +| ISO Guide 69:1999 +|=== + +=== Overlapping Harmonized Codes + +Some stages share harmonized stage codes. For example, both WD and WDS use +code `20.20`. When parsing a URN that contains `stage-20.20`, implementations +SHOULD resolve to the more general stage (WD) unless the typed abbreviation +(`WDS`) is explicitly present in the URN. + +=== Parsing Disambiguation Rules + +When a harmonized stage code maps to multiple typed stages, the following +rules apply: + +. If the URN contains a typed stage abbreviation (`stage-abbr`), use the + stage identified by that abbreviation directly. +. If the URN contains a harmonized code (`stage-XX.XX`), prefer the stage + with the broader scope (more harmonized codes) over a specialized subset. +. Published stage codes (`60.00`, `60.60`) resolve to "Proof" (PRF) or + "Published" depending on context. Non-published stages take precedence + over the published default for shared codes like `60.00`. + +== Differences from RFC 5141 + +This specification extends RFC 5141 in the following ways: + +[cols="1,3,2"] +|=== +| Feature | RFC 5141 | RFC 5141-bis + +| Copublishers +| Fixed set: `iso`, `iec`, `iso-iec`, `iso-cie`, `iso-astm`, `iso-ieee` +| Dynamic: `publisher *("-" copublisher)` with extensible values + +| Document types +| `data`, `guide`, `isp`, `iwa`, `pas`, `r`, `tr`, `ts`, `tta` +| Extended with `dir`, `dir-sup`, `iwa-sup` + +| Stage notation +| Harmonized stage codes only (`stage-XX.XX`) +| Harmonized codes *and* typed stage abbreviations (`WD`, `CD`, `DIS`, etc.) + +| Supplement chains +| Single level (`amd`/`cor`/`add`) +| Multi-level nesting (Corrigendum to Amendment) + +| Language +| May be omitted (English assumed) +| Always explicit + +| Supplement types +| `amd`, `cor`, `add` +| Extended with `sup` (generic supplement) +|=== + +== Gap Analysis: RFC 5141 Issues and Resolutions + +This appendix documents the issues identified in RFC 5141 and how RFC +5141-bis addresses each one. This analysis is provided to assist ISO in +evaluating the proposed extensions. + +[cols="1,1,5",options="header"] +|=== +| # | Status | Issue and Resolution + +| 1 | Resolved +| **Missing copublishers.** RFC 5141 defines a fixed set of originators +(`iso`, `iec`, `iso-iec`, `iso-cie`, `iso-astm`, `iso-ieee`). +RFC 5141-bis supports dynamic copublisher combinations via the +`publisher *("-" copublisher)` pattern (see <>), enabling +any combination (e.g., `iso-iec-ieee`, `iso-astm`, `iso-iec-ieee-itu`). + +| 2 | Resolved +| **Missing ability to have Corrigendum of Amendment.** RFC 5141 only +supports single-level supplements. RFC 5141-bis defines supplement +chains with explicit ordering semantics (see <>), enabling +nested structures such as `amd:1:cor:1` (Corrigendum 1 to Amendment 1). + +| 3 | Resolved +| **Missing supplement types for Guide, Directive, Directive Supplement.** +RFC 5141 defines `amd`, `cor`, and `add` only. RFC 5141-bis extends +the `type` field with `dir`, `dir-sup`, and `iwa-sup` (see <>), +and adds `sup` as a generic supplement type. + +| 4 | Resolved +| **Missing ability to state stage of base identifier in supplements.** +RFC 5141 provides no mechanism to include the base document's stage +in a supplement URN. RFC 5141-bis supports typed stage abbreviations +(see <>) and harmonized stage codes on the base document, +preserving the stage information in supplement URNs. + +| 5 | Resolved +| **Missing support for new stage types (WDS, CDTS).** RFC 5141 uses +only harmonized stage codes. RFC 5141-bis adds typed stage +abbreviations (see <>) including `WDS` (Working Draft +Study, introduced 2025-06) and `CDTS` (Committee Draft Technical +Specification), with dated stage code tracking (see <>). + +| 6 | Resolved +| **Missing support for new document types (IWA).** RFC 5141 lists +`data`, `guide`, `isp`, `iwa`, `pas`, `r`, `tr`, `ts`, `tta`. +RFC 5141-bis extends this with `dir`, `dir-sup`, and `iwa-sup` +(see <>). +|=== + +[NOTE] +==== +All six identified gaps have been resolved in the RFC 5141-bis +specification and implemented in the PubID software library with full +test coverage. The implementation is available as open-source software +to facilitate adoption by ISO Central Secretariat. +==== + +== References + +[bibliography] +=== Normative References + +* [[[ISODIR1,ISO/IEC Directives Part 1]]] -- International Organization + for Standardization, "Procedures for the technical work". +* [[[ISODIR2,ISO/IEC Directives Part 2]]] -- International Organization + for Standardization, "Rules for the structure and drafting of + International Standards". +* [[[RFC2141,RFC 2141]]] -- Moats, R., "URN Syntax", May 1997. +* [[[RFC5141,RFC 5141]]] -- Goodwin, J., Apel, H., "A URN Namespace for + ISO", March 2008. +* [[[RFC5234,RFC 5234]]] -- Crocker, D., Overell, P., "Augmented BNF for + Syntax Specifications: ABNF", January 2008. + +[bibliography] +=== Informative References + +* [[[ISOGUIDE69,ISO Guide 69:1999]]] -- "Harmonized Stage Code system + (Edition 2) -- Principles and guidelines for use". +* [[[ISO639,ISO 639-1:2002]]] -- "Codes for the representation of names + of languages -- Part 1: Alpha-2 code". diff --git a/src/content/specs/iso-urn.md b/src/content/specs/iso-urn.md new file mode 100644 index 0000000..f13939a --- /dev/null +++ b/src/content/specs/iso-urn.md @@ -0,0 +1,10 @@ +--- +prev: /specs/ +next: /specs/iec-urn +--- + + + +
diff --git a/src/data/__tests__/flavors.spec.ts b/src/data/__tests__/flavors.spec.ts new file mode 100644 index 0000000..5947371 --- /dev/null +++ b/src/data/__tests__/flavors.spec.ts @@ -0,0 +1,195 @@ +import { describe, it, expect } from 'vitest' +import { publishers } from '~/data' +import type { Publisher } from '~/data/types' + +// Per-flavor structural invariants. These catch data-entry bugs at the +// source — e.g. a doc type missing examples, a component missing a description. + +const REQUIRED_STRING_FIELDS: (keyof Publisher)[] = [ + 'flavor', 'name', 'fullName', 'category', 'description', 'components', +] + +describe('per-flavor structural validation', () => { + for (const p of publishers) { + describe(`flavor: ${p.flavor}`, () => { + it('has all required string fields non-empty', () => { + for (const field of REQUIRED_STRING_FIELDS) { + const v = p[field] + if (typeof v === 'string') { + expect(v.length, `${field} should be non-empty`).toBeGreaterThan(0) + } else if (Array.isArray(v)) { + expect(v.length, `${field} should be a non-empty array`).toBeGreaterThan(0) + } + } + }) + + it('flavor matches expected pattern (lowercase, hyphens, digits)', () => { + expect(p.flavor).toMatch(/^[a-z0-9]+(-[a-z0-9]+)*$/) + }) + + it('has at least one doc type', () => { + expect(p.docTypes.length).toBeGreaterThan(0) + }) + + it('every doc type has a unique key', () => { + const keys = p.docTypes.map(d => d.key) + expect(new Set(keys).size).toBe(keys.length) + }) + + it('every doc type has at least an empty examples array (not undefined)', () => { + for (const dt of p.docTypes) { + expect(Array.isArray(dt.examples)).toBe(true) + } + }) + + it('every component has a name and description', () => { + for (const c of p.components) { + expect(c.name.length).toBeGreaterThan(0) + expect(c.description.length).toBeGreaterThan(0) + } + }) + + it('related flavors (if any) reference real flavors', () => { + if (!p.relatedFlavors) return + for (const ref of p.relatedFlavors) { + const found = publishers.find(x => x.flavor === ref) + expect(found, `related flavor "${ref}" is not in registry`).toBeDefined() + } + }) + + it('every algebra relation has all four fields', () => { + for (const a of p.algebra) { + expect(a.type.length).toBeGreaterThan(0) + expect(a.description.length).toBeGreaterThan(0) + expect(a.syntax.length).toBeGreaterThan(0) + expect(a.example.length).toBeGreaterThan(0) + } + }) + }) + } +}) + +// Specific flavor assertions — these catch regressions in known-shape flavors +// that other tests would miss (e.g. "we added a new doc type to NIST"). + +describe('specific flavor invariants', () => { + it('ISO has at least 15 doc types', () => { + const iso = publishers.find(p => p.flavor === 'iso') + expect(iso?.docTypes.length).toBeGreaterThanOrEqual(15) + }) + + it('NIST has RB, CHIPS, NWIRP doc types (recently added)', () => { + const nist = publishers.find(p => p.flavor === 'nist') + const keys = nist?.docTypes.map(d => d.key) || [] + expect(keys).toContain('research_brief') + expect(keys).toContain('chips_act_rd') + expect(keys).toContain('nwirp') + }) + + it('OIML has the Bulletin doc type', () => { + const oiml = publishers.find(p => p.flavor === 'oiml') + expect(oiml?.docTypes.find(d => d.key === 'bulletin')).toBeDefined() + }) + + it('IALA has all 11 doc types (S, R, G, M, C, A, GA, L, Annex, X, P)', () => { + const iala = publishers.find(p => p.flavor === 'iala') + expect(iala?.docTypes).toHaveLength(11) + }) + + it('IHO has all 5 doc types', () => { + const iho = publishers.find(p => p.flavor === 'iho') + expect(iho?.docTypes).toHaveLength(5) + }) + + it('Adobe has Publication + Technical Note', () => { + const adobe = publishers.find(p => p.flavor === 'adobe') + expect(adobe).toBeDefined() + const keys = adobe?.docTypes.map(d => d.key) || [] + expect(keys).toEqual(['publication', 'tech_note']) + }) + + it('GOST flavor is present with 3 doc types (Interstate, National, Identical Adoption)', () => { + const gost = publishers.find(p => p.flavor === 'gost') + expect(gost).toBeDefined() + expect(gost?.docTypes).toHaveLength(3) + const keys = gost?.docTypes.map(d => d.key) || [] + expect(keys).toEqual(['interstate_standard', 'national_standard', 'identical_adoption']) + }) + + it('EASC flavor is present as the parent body of GOST', () => { + const easc = publishers.find(p => p.flavor === 'easc') + expect(easc).toBeDefined() + expect(easc?.relatedFlavors).toContain('gost') + }) + + it('EASC has 2 doc types (PMG, RMG) — real implementation', () => { + const easc = publishers.find(p => p.flavor === 'easc') + expect(easc?.docTypes).toHaveLength(2) + const keys = easc?.docTypes.map(d => d.key) || [] + expect(keys).toEqual(['pmg', 'rmg']) + }) + + it('BIPM has 4 doc types (Committee Document, Meeting, Metrologia, SI Brochure)', () => { + const bipm = publishers.find(p => p.flavor === 'bipm') + expect(bipm).toBeDefined() + expect(bipm?.docTypes).toHaveLength(4) + }) + + it('IANA has the Registry doc type', () => { + const iana = publishers.find(p => p.flavor === 'iana') + expect(iana).toBeDefined() + expect(iana?.docTypes[0]?.key).toBe('registry') + }) + + it('OASIS has the Standard doc type', () => { + const oasis = publishers.find(p => p.flavor === 'oasis') + expect(oasis).toBeDefined() + expect(oasis?.docTypes[0]?.key).toBe('standard') + }) + + it('OGC has the Document doc type', () => { + const ogc = publishers.find(p => p.flavor === 'ogc') + expect(ogc).toBeDefined() + expect(ogc?.docTypes[0]?.key).toBe('document') + }) + + it('3GPP has Technical Specification + Technical Report', () => { + const tgpp = publishers.find(p => p.flavor === 'tgpp') + expect(tgpp).toBeDefined() + const keys = tgpp?.docTypes.map(d => d.key) || [] + expect(keys).toEqual(['technical_specification', 'technical_report']) + }) + + it('W3C has 11 doc types covering the full maturity lifecycle', () => { + const w3c = publishers.find(p => p.flavor === 'w3c') + expect(w3c).toBeDefined() + expect(w3c?.docTypes).toHaveLength(11) + }) + + it('XSF has the XEP doc type', () => { + const xsf = publishers.find(p => p.flavor === 'xsf') + expect(xsf).toBeDefined() + expect(xsf?.docTypes[0]?.key).toBe('xep') + }) + + it('ECMA has 3 doc types (Standard, Technical Report, Memento)', () => { + const ecma = publishers.find(p => p.flavor === 'ecma') + expect(ecma).toBeDefined() + expect(ecma?.docTypes).toHaveLength(3) + const keys = ecma?.docTypes.map(d => d.key) || [] + expect(keys).toEqual(['standard', 'technical_report', 'memento']) + }) + + it('IETF has 5 doc types (RFC, BCP, STD, FYI, Internet-Draft)', () => { + const ietf = publishers.find(p => p.flavor === 'ietf') + expect(ietf).toBeDefined() + expect(ietf?.docTypes).toHaveLength(5) + const keys = ietf?.docTypes.map(d => d.key) || [] + expect(keys).toEqual(['rfc', 'bcp', 'std', 'fyi', 'internet_draft']) + }) + + it('PDF Association is not a flavor (not in pubid gem)', () => { + const pdf = publishers.find(p => p.flavor === 'pdf' || p.flavor === 'pdf_association') + expect(pdf).toBeUndefined() + }) +}) diff --git a/src/data/__tests__/registry.spec.ts b/src/data/__tests__/registry.spec.ts new file mode 100644 index 0000000..64a52d0 --- /dev/null +++ b/src/data/__tests__/registry.spec.ts @@ -0,0 +1,68 @@ +import { describe, it, expect } from 'vitest' +import { publishers, getPublisher, getPublishersByCategory, + internationalPublishers, regionalPublishers, + nationalPublishers, industryPublishers } from '~/data' +import type { Publisher, Category } from '~/data/types' + +// Registry invariants — these MUST hold for the site to function. + +describe('registry', () => { + it('contains exactly the expected publisher count', () => { + // 37 = 35 (prior baseline) + ECMA + IETF (added 2026-07-15) + expect(publishers).toHaveLength(37) + }) + + it('publishers are sorted alphabetically by flavor', () => { + const flavors = publishers.map(p => p.flavor) + const sorted = [...flavors].sort() + expect(flavors).toEqual(sorted) + }) + + it('every flavor is unique', () => { + const flavors = publishers.map(p => p.flavor) + expect(new Set(flavors).size).toBe(flavors.length) + }) + + it('every category is represented', () => { + const categories = new Set(publishers.map(p => p.category)) + expect(categories).toEqual(new Set(['international', 'regional', 'national', 'industry'])) + }) + + it('category filters partition the registry', () => { + // MECE check: every publisher appears in exactly one category filter. + const combined = [ + ...internationalPublishers, + ...regionalPublishers, + ...nationalPublishers, + ...industryPublishers, + ] + expect(combined).toHaveLength(publishers.length) + expect(new Set(combined.map(p => p.flavor)).size).toBe(publishers.length) + }) +}) + +describe('getPublisher', () => { + it('returns the publisher for a known flavor', () => { + const iso = getPublisher('iso') + expect(iso).toBeDefined() + expect(iso?.name).toBe('ISO') + }) + + it('returns undefined for an unknown flavor', () => { + expect(getPublisher('nonexistent')).toBeUndefined() + }) + + it('handles hyphenated flavor names (cen-cenelec)', () => { + const cen = getPublisher('cen-cenelec') + expect(cen).toBeDefined() + expect(cen?.name).toBe('CEN-CENELEC') + }) +}) + +describe('getPublishersByCategory', () => { + it('filters by category correctly', () => { + const intl = getPublishersByCategory('international') + expect(intl.length).toBeGreaterThan(0) + expect(intl.every(p => p.category === 'international')).toBe(true) + }) +}) diff --git a/src/data/_pre-refactor/component-data.ts b/src/data/_pre-refactor/component-data.ts new file mode 100644 index 0000000..72f154b --- /dev/null +++ b/src/data/_pre-refactor/component-data.ts @@ -0,0 +1,205 @@ +import type { FlavorComponent } from './types' + +type CM = Record> + +const data: Record = { + iso: { + Publisher: { dataType: 'enum', values: ['ISO'], example: 'ISO' }, + Copublisher: { dataType: 'enum', values: ['IEC', 'ASTM', 'CEN', 'IEEE', 'ITU', 'SAE', 'IWA', 'UNESCO', 'OIML', 'CIE'], format: 'Optional. Present for joint publications.', example: 'IEC' }, + 'Document Type': { dataType: 'enum', values: ['IS', 'TR', 'TS', 'PAS', 'Guide', 'IWA', 'ISP', 'TTA', 'R'], format: 'Appears between publisher and number', example: 'TR' }, + Number: { dataType: 'integer', format: '1–5 digit number', example: '9001' }, + Part: { dataType: 'integer', format: 'Optional. Appended with hyphen after number.', example: '1' }, + Year: { dataType: 'year', format: '4-digit year, preceded by colon', example: '2015' }, + Edition: { dataType: 'integer', format: 'Optional. Prefixed with "Ed"', example: '5' }, + Language: { dataType: 'enum', values: ['en', 'fr', 'ru', 'de', 'es', 'ja', 'zh', 'ar', 'pt', 'it'], format: 'Optional. In parentheses after year.', example: 'en' }, + Stage: { dataType: 'enum', values: ['PWI', 'NP', 'AWI', 'WD', 'CD', 'DIS', 'FDIS', 'PRF', 'IS'], format: 'Optional. Precedes document type.', example: 'DIS' }, + 'Typed Stage': { dataType: 'enum', values: ['DTR', 'DTS', 'FDTR', 'FDTS', 'AWI', 'NP', 'PRF'], format: 'Optional. Combined stage+type abbreviation.', example: 'DTR' }, + Supplement: { dataType: 'compound', format: 'Amendment/Corrigendum/Addendum with number and year, after slash', example: 'Amd 1:2024' }, + }, + iec: { + Publisher: { dataType: 'enum', values: ['IEC', 'CISPR'], example: 'IEC' }, + 'Document Type': { dataType: 'enum', values: ['IS', 'TR', 'TS', 'PAS', 'Guide', 'ISH'], format: 'Appears between publisher and number', example: 'TR' }, + Number: { dataType: 'integer', format: '1–6 digit number', example: '61131' }, + Part: { dataType: 'integer', format: 'Optional. After dash following number.', example: '3' }, + Year: { dataType: 'year', format: '4-digit year, preceded by colon', example: '2013' }, + Edition: { dataType: 'integer', format: 'Optional. Prefixed with "ED"', example: 'ED2' }, + Language: { dataType: 'enum', values: ['en', 'fr', 'ru', 'de', 'es', 'ja', 'zh'], format: 'Optional. In parentheses.', example: 'en' }, + Stage: { dataType: 'enum', values: ['NP', 'WD', 'CD', 'CC', 'CDV', 'FDIS', 'PRF', 'IS'], format: 'Optional.', example: 'CDV' }, + 'VAP Suffix': { dataType: 'enum', values: ['CSV', 'CMV', 'RLV', 'SER', 'EXV', 'PAC', 'PRV', 'DB'], format: 'Value-Added Product suffix at end of identifier', example: 'CSV' }, + 'Consolidated Amendment': { dataType: 'compound', format: 'One or more amendment references joined with "+", e.g. +AMD1:2009+AMD2:2013', example: '+AMD1:2009+AMD2:2013' }, + }, + ieee: { + Publisher: { dataType: 'enum', values: ['IEEE', 'IEC/IEEE', 'ANSI/IEEE'], example: 'IEEE' }, + 'Draft Indicator': { dataType: 'enum', values: ['P'], format: 'Present only for draft standards. Replaces "Std".', example: 'P' }, + Number: { dataType: 'string', format: 'Alphanumeric. May contain dots (e.g., 802.3, C37.118)', example: '802.3' }, + Part: { dataType: 'string', format: 'Optional. Subpart after dot in number.', example: '1' }, + Year: { dataType: 'year', format: '4-digit year, preceded by hyphen', example: '2018' }, + 'Draft Version': { dataType: 'string', format: 'Format: D[Major].[Minor]. Only for drafts.', example: 'D3.0' }, + Relationship: { dataType: 'string', format: 'Optional. Describes relation to other standards (e.g., "Revision of", "Amendment to").', example: 'Revision of IEEE 1016-1998' }, + 'Typed Stage': { dataType: 'enum', values: ['CDV', 'FDIS'], format: 'Optional. For IEC/IEEE joint documents.', example: 'CDV' }, + }, + itu: { + Sector: { dataType: 'enum', values: ['R (Radiocommunication)', 'T (Standardization)', 'D (Development)'], format: 'Required. After hyphen following ITU.', example: 'T' }, + Series: { dataType: 'enum', values: ['G', 'E', 'H', 'I', 'J', 'L', 'M', 'N', 'P', 'Q', 'S', 'T', 'V', 'X', 'Y', 'Z', 'SA'], format: 'Required. Follows sector, separated by dot.', example: 'G' }, + Number: { dataType: 'string', format: 'Series-specific. Often includes dot-separated sub-numbers.', example: '992.1' }, + Year: { dataType: 'year', format: 'Optional. Preceded by hyphen.', example: '2019' }, + }, + nist: { + Publisher: { dataType: 'enum', values: ['NIST', 'NBS'], format: 'NBS for pre-1988 documents.', example: 'NIST' }, + 'Document Type': { dataType: 'enum', values: ['SP', 'FIPS', 'IR', 'TN', 'HB', 'CIRC', 'MONO', 'RPT', 'LCIRC', 'GCR', 'CRPL', 'NSRDS', 'NCSTAR', 'OWMWP', 'CS', 'MP', 'CSM', 'CSE', 'RB', 'CHIPS', 'NWIRP'], example: 'SP' }, + Number: { dataType: 'string', format: '1–6 digits. May include dash-separated sub-numbers (e.g., 800-53).', example: '800-53' }, + Part: { dataType: 'string', format: 'Optional. Appended after number with dash.', example: '3' }, + Revision: { dataType: 'string', format: 'Optional. Prefixed with "Rev."', example: 'Rev. 5' }, + Version: { dataType: 'string', format: 'Optional. Prefixed with "v".', example: 'v1.0' }, + Edition: { dataType: 'string', format: 'Optional.', example: '1' }, + Stage: { dataType: 'enum', values: ['draft', 'final', 'withdrawn'], format: 'Optional. In parentheses.', example: 'Draft' }, + Supplement: { dataType: 'string', format: 'Optional. Prefixed with "Suppl."', example: 'Suppl. 1' }, + Translation: { dataType: 'enum', values: ['tr'], format: 'Optional.', example: 'tr' }, + Update: { dataType: 'integer', format: 'Optional. Prefixed with "Upd."', example: '1' }, + Volume: { dataType: 'integer', format: 'Optional. Prefixed with "Vol."', example: '3' }, + }, + bsi: { + Publisher: { dataType: 'enum', values: ['BS', 'BSI', 'PAS'], example: 'BS' }, + 'Adoption Source': { dataType: 'enum', values: ['ISO', 'EN', 'IEC', 'EN ISO'], format: 'Present when adopting another publisher\'s standard.', example: 'ISO' }, + 'Document Type': { dataType: 'enum', values: ['BS', 'PAS', 'PD', 'Flex', 'HB', 'DD', 'EB', 'EC', 'VAP'], example: 'BS' }, + Number: { dataType: 'string', format: '1–6 digit number, may include letters.', example: '476' }, + Part: { dataType: 'integer', format: 'Optional. After dash.', example: '22' }, + Year: { dataType: 'year', format: '4-digit year, preceded by colon.', example: '2015' }, + 'Amendment/Consolidated': { dataType: 'compound', format: 'After "+". E.g. +A1:2019 for incorporated amendment.', example: '+A1:2019' }, + 'Publisher Specific': { dataType: 'string', format: 'Publisher-specific codes.', example: 'A' }, + Date: { dataType: 'string', format: 'Date for draft documents.', example: '14/30300822' }, + }, + cen: { + Publisher: { dataType: 'enum', values: ['EN', 'CEN', 'CLC', 'CENELEC'], example: 'EN' }, + 'Document Type': { dataType: 'enum', values: ['EN', 'CEN/TS', 'CEN/TR', 'CWA', 'HD', 'ES'], example: 'EN' }, + Number: { dataType: 'string', format: '1–6 digit number.', example: '196' }, + Part: { dataType: 'integer', format: 'Optional. After dash.', example: '3' }, + Year: { dataType: 'year', format: '4-digit year, preceded by colon.', example: '2005' }, + Consolidated: { dataType: 'compound', format: 'After "+". E.g. +A1:2008 for incorporated amendment.', example: '+A1:2008' }, + }, + etsi: { + Type: { dataType: 'enum', values: ['EN (European Standard)', 'ES (ETSI Specification)', 'EG (ETSI Guide)', 'ET (ETSI Technical Report)', 'GS (Group Specification)', 'TS (Technical Specification)', 'TR (Technical Report)', 'SR (Special Report)'], example: 'EN' }, + Number: { dataType: 'string', format: 'Space-separated groups (e.g., 300 392-2). May include dash for parts.', example: '300 392-2' }, + Version: { dataType: 'string', format: 'V[Major].[Minor].[Patch] (Semantic versioning)', example: 'V3.4.1' }, + Date: { dataType: 'string', format: 'YYYY-MM in parentheses.', example: '(2017-04)' }, + Edition: { dataType: 'string', format: 'Optional. "ed.[N]"', example: 'ed.2' }, + }, + ansi: { + Publisher: { dataType: 'enum', values: ['ANSI', 'ANSI/[Developer]'], format: 'Developer can be AAMI, ASHRAE, etc.', example: 'ANSI' }, + Number: { dataType: 'string', format: 'Alphanumeric identifier.', example: '802.3' }, + Year: { dataType: 'year', format: '4-digit year, preceded by hyphen or colon.', example: '2012' }, + }, + astm: { + Publisher: { dataType: 'enum', values: ['ASTM'], example: 'ASTM' }, + Number: { dataType: 'string', format: 'Letter prefix + number, optionally with /M for metric (e.g., C33/C33M).', example: 'C33/C33M' }, + Year: { dataType: 'year', format: '2 or 4 digit year, preceded by hyphen.', example: '-18' }, + }, + ashrae: { + Publisher: { dataType: 'enum', values: ['ASHRAE'], example: 'ASHRAE' }, + Type: { dataType: 'enum', values: ['Standard', 'Guideline'], example: 'Standard' }, + Number: { dataType: 'string', format: 'Alphanumeric. May include decimal (e.g., 90.1, 1.4).', example: '90.1' }, + Year: { dataType: 'year', format: '4-digit year, preceded by hyphen.', example: '2019' }, + }, + asme: { + Publisher: { dataType: 'enum', values: ['ASME'], example: 'ASME' }, + Number: { dataType: 'string', format: 'Alphanumeric code (e.g., BPVC, B31.3, PTC 19.3).', example: 'BPVC' }, + Year: { dataType: 'year', format: '4-digit year, preceded by hyphen.', example: '2023' }, + }, + ccsds: { + Publisher: { dataType: 'enum', values: ['CCSDS'], example: 'CCSDS' }, + Number: { dataType: 'string', format: 'NNN.N-L-V format: series number + book type letter + version (e.g., 121.0-B-1).', example: '121.0-B-1' }, + }, + cie: { + Publisher: { dataType: 'enum', values: ['CIE'], example: 'CIE' }, + Type: { dataType: 'enum', values: ['S (Standard)', 'DS (Draft Standard)', 'TN (Technical Note)', 'TR (Technical Report)', 'G (Guide)', 'ILV (International Lighting Vocabulary)', 'Proc (Proceedings)'], example: 'S' }, + Number: { dataType: 'integer', format: '1–4 digit number.', example: '232' }, + Year: { dataType: 'year', format: '4-digit year, preceded by colon.', example: '2019' }, + }, + csa: { + Publisher: { dataType: 'enum', values: ['CSA', 'CAN/CSA'], format: 'CAN/ prefix for Canadian National Standards.', example: 'CSA' }, + Type: { dataType: 'enum', values: ['Standard', 'Recommended Practice'], example: 'Standard' }, + Number: { dataType: 'string', format: 'May include "NO." prefix and dash-separated parts.', example: 'N285.6' }, + Year: { dataType: 'year', format: '2 or 4 digit year, preceded by colon.', example: ':23' }, + Supplement: { dataType: 'compound', format: 'After "+". E.g. +A1:15 for incorporated amendment.', example: '+A1:15' }, + }, + jis: { + Publisher: { dataType: 'enum', values: ['JIS'], example: 'JIS' }, + 'Classification Letter': { dataType: 'enum', values: ['A (Civil Eng.)', 'B (Mechanical)', 'C (Electrical)', 'D (Automotive)', 'E (Railway)', 'F (Shipbuilding)', 'G (Iron & Steel)', 'H (Non-Ferrous Metals)', 'K (Chemical)', 'L (Textile)', 'M (Mining)', 'P (Pulp & Paper)', 'Q (Quality)', 'R (Ceramics)', 'S (Domestic)', 'T (Medical)', 'W (Aerospace)', 'X (Info Processing)', 'Z (General/Misc.)'], example: 'B' }, + Number: { dataType: 'string', format: '4-digit number.', example: '0205' }, + Part: { dataType: 'integer', format: 'Optional. After dash.', example: '2' }, + Year: { dataType: 'year', format: '4-digit year, preceded by colon.', example: '2019' }, + }, + jcgm: { + Publisher: { dataType: 'enum', values: ['JCGM'], example: 'JCGM' }, + Type: { dataType: 'enum', values: ['G (Guide)', 'D (Document)'], example: 'G' }, + Number: { dataType: 'integer', format: '1–3 digit number.', example: '100' }, + Year: { dataType: 'year', format: '4-digit year, preceded by colon.', example: '2012' }, + }, + oiml: { + Publisher: { dataType: 'enum', values: ['OIML'], example: 'OIML' }, + Type: { dataType: 'enum', values: ['R (Recommendation)', 'D (Document)', 'G (Guide)', 'V (Vocabulary)', 'B (Basic Publication)', 'E (Expert Report)', 'S (Supplement)'], example: 'R' }, + Number: { dataType: 'integer', format: '1–3 digit number.', example: '76' }, + Part: { dataType: 'integer', format: 'Optional. After dash.', example: '1' }, + Year: { dataType: 'year', format: '4-digit year, preceded by colon.', example: '2006' }, + Edition: { dataType: 'string', format: 'Optional. Edition indicator (e.g., E:2008).', example: 'E:2008' }, + }, + idf: { + Publisher: { dataType: 'enum', values: ['IDF'], example: 'IDF' }, + Type: { dataType: 'enum', values: ['Standard', 'Bulletin', 'Special Issue'], example: 'Standard' }, + Number: { dataType: 'integer', format: '1–3 digit number.', example: '146' }, + Year: { dataType: 'year', format: '4-digit year, preceded by colon.', example: '2003' }, + Supplement: { dataType: 'compound', format: 'Amendment/Corrigendum after slash.', example: 'AMD 1:2023' }, + }, + api: { + Publisher: { dataType: 'enum', values: ['API'], example: 'API' }, + Type: { dataType: 'enum', values: ['Std (Standard)', 'RP (Recommended Practice)', 'Spec (Specification)', 'TR (Technical Report)', 'Bul (Bulletin)', 'Pub (Publication)', 'G (Guide)'], example: 'RP' }, + Number: { dataType: 'string', format: 'Type-specific numbering. May include letters.', example: '500' }, + Year: { dataType: 'year', format: '4-digit year, preceded by hyphen.', example: '2012' }, + }, + amca: { + Publisher: { dataType: 'enum', values: ['AMCA'], example: 'AMCA' }, + Type: { dataType: 'enum', values: ['Standard', 'CRP (Certified Ratings Program)', 'Publication'], example: 'Standard' }, + Number: { dataType: 'integer', format: '1–3 digit number.', example: '210' }, + Year: { dataType: 'year', format: '4-digit year, preceded by hyphen.', example: '2022' }, + }, + plateau: { + Publisher: { dataType: 'enum', values: ['Plateau'], example: 'Plateau' }, + Type: { dataType: 'enum', values: ['Handbook', 'TR (Technical Report)', 'Annex'], example: 'Handbook' }, + Number: { dataType: 'integer', format: '1–3 digit number.', example: '1' }, + Year: { dataType: 'year', format: '4-digit year.', example: '2019' }, + }, + sae: { + Publisher: { dataType: 'enum', values: ['SAE'], example: 'SAE' }, + Type: { dataType: 'enum', values: ['J (Ground Vehicle)', 'AS (Aerospace Standard)', 'ARP (Aerospace Recommended Practice)', 'AIR (Aerospace Information Report)', 'AMS (Aerospace Material Specification)'], example: 'J' }, + Number: { dataType: 'string', format: 'Alphanumeric. May include letter suffix for version.', example: 'J3016' }, + Year: { dataType: 'year', format: '4-digit year, preceded by hyphen.', example: '2021' }, + }, + iala: { + Publisher: { dataType: 'enum', values: ['IALA'], example: 'IALA' }, + 'Type Letter': { dataType: 'enum', values: ['S (Standard)', 'R (Recommendation)', 'G (Guideline)', 'M (Manual)', 'C (Model Course)', 'A (Advice)', 'L (Letter)', 'GA (General Assembly)', 'X (Report)', 'P (Resolution)'], example: 'R' }, + Number: { dataType: 'string', format: '4-digit zero-padded for S/R/G/M/C; dotted series.index for GA; dotted series.subseries.item for L', example: '0103' }, + 'Sub-part': { dataType: 'integer', format: 'Optional. Hyphenated suffix on the number.', example: '-1' }, + Edition: { dataType: 'string', format: '"Ed X.Y" (cover form) or ":edX.Y" (compact listing form).', example: 'Ed 3.0' }, + Language: { dataType: 'enum', values: ['E (English)', 'F (French)', 'S (Spanish)', 'C (Chinese)', 'A (Arabic)', 'R (Russian)'], format: 'Optional. Single uppercase letter in parentheses.', example: 'F' }, + }, + iho: { + Publisher: { dataType: 'enum', values: ['IHO'], example: 'IHO' }, + 'Type Letter': { dataType: 'enum', values: ['S (Standard/Specification)', 'P (Publication)', 'M (Miscellaneous)', 'B (Bibliographic)', 'C (Circular Letter)'], example: 'S' }, + Number: { dataType: 'string', format: 'Hyphenated after type letter. May include slash-year (P-1/21) or sub-part (P-6-3).', example: '44' }, + Appendix: { dataType: 'string', format: '"Ap." prefix, single letter.', example: 'Ap. A' }, + Part: { dataType: 'string', format: '"Part" keyword. Alphanumeric allowed (e.g. 4a).', example: 'Part 4a' }, + Annex: { dataType: 'string', format: '"Annex" keyword.', example: 'Annex A' }, + Supplement: { dataType: 'string', format: '"Suppl" keyword.', example: 'Suppl 1' }, + Version: { dataType: 'string', format: 'Three-part dotted version (X.Y.Z).', example: '5.0.0' }, + }, + adobe: { + Publisher: { dataType: 'enum', values: ['Adobe'], example: 'Adobe' }, + Slug: { dataType: 'string', format: 'Kebab-case slug for named publications (adobe-glyph-list, adobe-japan1).', example: 'adobe-japan1' }, + Number: { dataType: 'integer', format: '4-digit Technical Note number, typically 5xxx series.', example: '5014' }, + Version: { dataType: 'integer', format: 'Collection version (Adobe-Japan1-7 → version 7).', example: '7' }, + }, +} + +export function getComponentMeta(flavor: string, componentName: string): Partial { + return data[flavor]?.[componentName] || {} +} diff --git a/src/data/_pre-refactor/loader.ts b/src/data/_pre-refactor/loader.ts new file mode 100644 index 0000000..08298d1 --- /dev/null +++ b/src/data/_pre-refactor/loader.ts @@ -0,0 +1,169 @@ +import type { Publisher, DocType, Stage } from './types' +import generatedData from './generated/website-data.json' + +interface GeneratedTypedStage { + stage_code: string + type_code: string + abbr: string[] + name: string + harmonized_stages: string[] +} + +interface GeneratedIdentifierType { + key: string + title: string + short: string | null + abbr: string[] + typed_stages: GeneratedTypedStage[] + examples: string[] +} + +interface GeneratedFlavorData { + identifier_types: GeneratedIdentifierType[] + wrapper_types?: GeneratedIdentifierType[] + attributes: string[] +} + +interface ExportMetadata { + pubid_version: string + git_commit: string + git_branch: string + exported_at: string + total_identifier_types: number + total_flavors: number +} + +type RawGeneratedData = { _metadata: ExportMetadata } & Record + +const raw = generatedData as RawGeneratedData +const metadata: ExportMetadata = raw._metadata +const generated: Record = {} +for (const [k, v] of Object.entries(raw)) { + if (k !== '_metadata') generated[k] = v as GeneratedFlavorData +} + +export function getMetadata(): ExportMetadata { + return metadata +} + +export function getGeneratedData(flavor: string): GeneratedFlavorData | undefined { + return generated[flavor] +} + +export function getGeneratedTypes(flavor: string): GeneratedIdentifierType[] { + return generated[flavor]?.identifier_types ?? [] +} + +export function getGeneratedStages(flavor: string): Stage[] { + const types = getGeneratedTypes(flavor) + const stages: Stage[] = [] + + for (const type of types) { + for (const ts of type.typed_stages) { + if (!stages.some(s => s.code === ts.stage_code)) { + stages.push({ + code: ts.stage_code, + abbr: ts.abbr[0] || ts.stage_code, + name: ts.name || ts.stage_code, + }) + } + } + } + + return stages +} + +export function mergePublishers(publishers: Publisher[]): Publisher[] { + return publishers.map(p => mergePublisher(p)) +} + +function mergePublisher(publisher: Publisher): Publisher { + const key = publisher.flavor.replace(/-/g, '_') + const gen = generated[key] + if (!gen) return publisher + + return { + ...publisher, + docTypes: mergeDocTypes(publisher.docTypes, gen), + stages: mergeStages(publisher.stages, gen), + } +} + +function mergeDocTypes(existing: DocType[], gen: GeneratedFlavorData): DocType[] { + const existingKeys = new Set(existing.map(t => t.key)) + const merged = [...existing] + + for (const gt of gen.identifier_types) { + if (!existingKeys.has(gt.key)) { + existingKeys.add(gt.key) + merged.push({ + key: gt.key, + title: gt.title, + abbr: gt.abbr, + description: '', + examples: (gt.examples || []).map(e => ({ input: e })), + }) + } else { + // Merge examples and typed stages from generated into existing + const existingType = merged.find(t => t.key === gt.key)! + if (!existingType.abbr?.length && gt.abbr?.length) { + existingType.abbr = gt.abbr + } + if (!existingType.examples?.length && gt.examples?.length) { + existingType.examples = gt.examples.map(e => ({ input: e })) + } + } + } + + return merged +} + +function mergeStages(existing: Stage[] | undefined, gen: GeneratedFlavorData): Stage[] | undefined { + const genKey = Object.keys(generated).find(k => generated[k] === gen) || '' + const genStages = getGeneratedStages(genKey) + if (genStages.length === 0) return existing + if (!existing || existing.length === 0) return genStages + + const merged = [...existing] + for (const gs of genStages) { + if (!merged.some(s => s.code === gs.code)) { + merged.push(gs) + } + } + return merged +} + +export function auditAgainstLibrary(publishers: Publisher[]): AuditReport { + const report: AuditReport = {} + + for (const p of publishers) { + const key = p.flavor.replace(/-/g, '_') + const gen = generated[key] + if (!gen) { + report[p.flavor] = { status: 'no_library_data' } + continue + } + + const genKeys = new Set(gen.identifier_types.map(t => t.key)) + const webKeys = new Set(p.docTypes.map(t => t.key)) + + const missing = gen.identifier_types.filter(t => !webKeys.has(t.key)) + const extra = p.docTypes.filter(t => !genKeys.has(t.key)) + + report[p.flavor] = { + status: missing.length === 0 && extra.length === 0 ? 'ok' : 'mismatch', + missingTypes: missing.map(t => ({ key: t.key, title: t.title })), + extraTypes: extra.map(t => ({ key: t.key, title: t.title })), + } + } + + return report +} + +export interface AuditReport { + [flavor: string]: { + status: 'ok' | 'mismatch' | 'no_library_data' + missingTypes?: { key: string; title: string }[] + extraTypes?: { key: string; title: string }[] + } +} diff --git a/src/data/_pre-refactor/publishers.ts b/src/data/_pre-refactor/publishers.ts new file mode 100644 index 0000000..6c9d90f --- /dev/null +++ b/src/data/_pre-refactor/publishers.ts @@ -0,0 +1,2779 @@ +import type { Publisher } from './types' + +export const publishers: Publisher[] = [ + // ─── INTERNATIONAL ────────────────────────────────────────────── + { + flavor: 'iso', + logo: '/logos/iso-logo.svg', + name: 'ISO', + fullName: 'International Organization for Standardization', + category: 'international', + description: 'ISO is an independent, non-governmental international organization that develops standards to ensure the quality, safety, and efficiency of products, services, and systems. ISO has published over 25,000 international standards covering almost all aspects of technology and manufacturing.', + website: 'https://www.iso.org', + syntaxNotes: 'ISO identifiers follow the pattern: [Copublisher/]ISO [Type] [Number][-Part]:[Year]. Joint publications use copublishers like ISO/IEC, ISO/ASTM, etc.', + urnPattern: 'urn:iso:std:iso[:copublisher]:[number]:[edition]:[language]', + relatedFlavors: ['iec', 'astm', 'bsi', 'cen-cenelec', 'ieee'], + docTypes: [ + { + key: 'international_standard', + title: 'International Standard', + abbr: ['IS'], + description: 'The primary deliverable of ISO. International Standards are documents that provide requirements, specifications, guidelines, or characteristics that can be used consistently to ensure materials, products, processes, and services are fit for their purpose.', + examples: [ + { input: 'ISO 9001:2015', output: 'ISO 9001:2015' }, + { input: 'ISO/IEC 17031-1:2020', output: 'ISO/IEC 17031-1:2020' }, + { input: 'ISO 14001:2015(en)', output: 'ISO 14001:2015(en)' }, + { input: 'ISO 9001:2015/Ed 5' }, + ] + }, + { + key: 'technical_report', + title: 'Technical Report', + abbr: ['TR'], + description: 'A Technical Report (TR) is an informative document containing information of a different kind from that of the International Standards. TRs are published when a technical committee has collected data of a different kind from that which is normally published as a standard.', + examples: [ + { input: 'ISO/TR 10450:2019' }, + { input: 'ISO/TR 25679:2008' }, + { input: 'ISO/TR 13587:2012' }, + ] + }, + { + key: 'technical_specification', + title: 'Technical Specification', + abbr: ['TS'], + description: 'A Technical Specification (TS) addresses work still under technical development, or where it is believed that there will be a future, but not immediate, possibility of agreement on an International Standard. Published for provisional use.', + examples: [ + { input: 'ISO/TS 22003:2013' }, + { input: 'ISO/TS 14033:2012' }, + { input: 'ISO/TS 16949:2009' }, + ] + }, + { + key: 'publicly_available_specification', + title: 'Publicly Available Specification', + abbr: ['PAS'], + description: 'A PAS is published to respond to an urgent market need, representing either the consensus in a working group or the result of a workshop agreement. It has a maximum lifetime of 6 years before it must be converted to another deliverable type.', + examples: [ + { input: 'ISO/PAS 45001:2017' }, + { input: 'ISO/PAS 28000:2007' }, + { input: 'ISO/PAS 22399:2007' }, + ] + }, + { + key: 'guide', + title: 'Guide', + abbr: ['Guide'], + description: 'ISO Guides provide guidance and orientation on specific topics. They are not standards themselves but provide rules, guidelines, or recommendations for standardization work.', + examples: [ + { input: 'ISO Guide 73:2009' }, + { input: 'ISO/IEC Guide 98-3:2008' }, + { input: 'ISO Guide 35:2017' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['Amd', 'AM'], + description: 'An Amendment modifies an existing International Standard by adding, changing, or deleting specified elements. It is published as a separate supplement to the base document and referenced using the base document ID.', + examples: [ + { input: 'ISO 9001:2015/Amd 1:2024' }, + { input: 'ISO 14001:2015/Amd 1:2023' }, + { input: 'ISO/IEC 17031-1:2020/Amd 1:2022' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['Cor', 'COR'], + description: 'A Corrigendum corrects technical or editorial errors in an already published document. Unlike amendments, corrigenda do not add new content but fix mistakes.', + examples: [ + { input: 'ISO 9001:2015/Cor 1:2016' }, + { input: 'ISO 14001:2015/Cor 1:2016' }, + ] + }, + { + key: 'supplement', + title: 'Supplement', + abbr: ['Suppl'], + description: 'A Supplement adds additional content to a base standard, such as supplementary requirements or guidelines.', + examples: [ + { input: 'ISO/IEC 17031-1:2020/Suppl:2021' }, + ] + }, + { + key: 'addendum', + title: 'Addendum', + abbr: ['Add'], + description: 'An Addendum is a legacy supplement type used primarily in older ISO documents. It adds new material to an existing standard.', + examples: [ + { input: 'ISO 2789:2006/Add 1:2008' }, + ] + }, + { + key: 'international_workshop_agreement', + title: 'International Workshop Agreement', + abbr: ['IWA'], + description: 'An IWA is a document developed through a workshop rather than the normal committee process. It provides a mechanism for reaching consensus outside the normal committee structure.', + examples: [ + { input: 'IWA 36:2022' }, + { input: 'IWA 39:2024' }, + { input: 'AWI IWA 36' }, + ] + }, + { + key: 'international_standardized_profile', + title: 'International Standardized Profile', + abbr: ['ISP'], + description: 'An ISP defines a standardized set of choices of the options available in International Standards for a particular function or application.', + examples: [ + { input: 'ISO/IEC ISP 10611-7:2003' }, + ] + }, + { + key: 'technology_trends_assessments', + title: 'Technology Trends Assessments', + abbr: ['TTA'], + description: 'TTAs are documents that provide an overview of emerging technologies and their potential for standardization.', + examples: [ + { input: 'ISO/TTA 1:1994' }, + { input: 'ISO/TTA 2:1997' }, + ] + }, + { + key: 'directives', + title: 'Directives', + abbr: ['Directives'], + description: 'ISO/IEC Directives define the rules for the preparation and presentation of International Standards and other deliverables.', + examples: [ + { input: 'ISO/IEC Directives Part 1:2023' }, + { input: 'ISO/IEC Directives Part 2:2021' }, + ] + }, + { + key: 'directives_supplement', + title: 'Directives Supplement', + abbr: ['DIR SUP'], + description: 'Supplements to the ISO/IEC Directives that provide additional procedures specific to ISO, IEC, or JTC.', + examples: [ + { input: 'ISO/IEC DIR 1 ISO SUP:2023' }, + ] + }, + { + key: 'extract', + title: 'Extract', + abbr: ['Extract'], + description: 'An Extract is a reproduction of a portion of a published International Standard.', + examples: [ + { input: 'ISO 9001:2015/Extract' }, + ] + }, + { + key: 'recommendation', + title: 'Recommendation', + abbr: ['R'], + description: 'A Recommendation is a legacy document type used in early ISO/IEC publications.', + examples: [ + { input: 'ISO/R 100:1959' }, + ] + }, + { + key: 'tc_document', + title: 'Technical Committee Document', + abbr: ['N', 'TC Doc'], + description: 'Internal working documents of ISO technical committees, numbered with N-numbers.', + examples: [ + { input: 'ISO/TC 176 N 1000' }, + ] + }, + { + key: 'data', + title: 'Data Document', + abbr: ['Data'], + description: 'Data documents provide reference data sets or databases.', + examples: [ + { input: 'ISO/Data 1:2007' }, + ] + }, + ], + stages: [ + { code: '00.00', abbr: 'PWI', name: 'Preliminary Work Item' }, + { code: '10.00', abbr: 'NP', name: 'New Proposal' }, + { code: '10.99', abbr: 'AWI', name: 'Approved Work Item' }, + { code: '20.00', abbr: 'WD', name: 'Working Draft' }, + { code: '30.00', abbr: 'CD', name: 'Committee Draft' }, + { code: '40.00', abbr: 'DIS', name: 'Draft International Standard' }, + { code: '50.00', abbr: 'FDIS', name: 'Final Draft International Standard' }, + { code: '60.00', abbr: 'PRF', name: 'Proof of a standard (pre-publication)' }, + { code: '60.60', abbr: 'IS', name: 'International Standard (published)' }, + { code: '90.20', abbr: 'RVD', name: 'Review Discontinued' }, + { code: '90.60', abbr: 'WTH', name: 'Withdrawn' }, + { code: '90.92', abbr: 'WDT', name: 'Withdrawal Decided' }, + { code: '90.93', abbr: 'RVD', name: 'Review Verified' }, + { code: '95.20', abbr: 'FPN', name: 'Final Proposal for Withdrawal' }, + { code: '95.99', abbr: 'WTH', name: 'Withdrawal of International Standard' }, + ], + components: [ + { name: 'Publisher', description: 'The issuing organization (ISO, or joint like ISO/IEC)' }, + { name: 'Copublisher', description: 'Additional organizations in joint publications (IEC, ASTM, CEN, etc.)', attribute: 'copublisher' }, + { name: 'Document Type', description: 'The type of deliverable (IS, TR, TS, PAS, Guide, etc.)', attribute: 'type' }, + { name: 'Number', description: 'The unique document number', attribute: 'number' }, + { name: 'Part', description: 'Part number for multi-part standards', attribute: 'part' }, + { name: 'Year', description: 'Publication year', attribute: 'year' }, + { name: 'Edition', description: 'Edition number (e.g., Ed 5)', attribute: 'edition' }, + { name: 'Language', description: 'Language code (en, fr, ru, etc.)', attribute: 'language' }, + { name: 'Stage', description: 'Development stage (WD, CD, DIS, FDIS)', attribute: 'stage' }, + { name: 'Typed Stage', description: 'Stage combined with document type (e.g., DTR for Draft Technical Report)', attribute: 'typed_stage' }, + { name: 'Supplement', description: 'Amendment or corrigendum reference', attribute: 'supplement' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies a base standard by adding, changing, or deleting elements', syntax: 'ISO [Number]:[Year]/Amd [N]:[Year]', example: 'ISO 9001:2015/Amd 1:2024' }, + { type: 'Corrigendum', description: 'Corrects technical or editorial errors', syntax: 'ISO [Number]:[Year]/Cor [N]:[Year]', example: 'ISO 9001:2015/Cor 1:2016' }, + { type: 'Addendum', description: 'Legacy supplement type adding new material', syntax: 'ISO [Number]:[Year]/Add [N]:[Year]', example: 'ISO 2789:2006/Add 1:2008' }, + { type: 'Part', description: 'Multi-part standard relationship', syntax: 'ISO [Number]-[Part]:[Year]', example: 'ISO/IEC 17031-1:2020' }, + { type: 'Series', description: 'All-parts reference to a multi-part series', syntax: 'ISO [Number] (all parts)', example: 'ISO 9001 (all parts)' }, + { type: 'Bundle', description: 'Multiple documents bundled together', syntax: '[PubID] + [PubID]', example: 'BS ISO 26000 + IWA 26' }, + { type: 'Draft', description: 'Draft stage of a document', syntax: 'ISO/[Stage] [Type] [Number]', example: 'ISO/DIS 45001' }, + { type: 'Internal Document', description: 'Working documents with N-numbers', syntax: 'ISO/TC [N] [DocNumber]', example: 'ISO/TC 176 N 1000' }, + { type: 'Clause Reference', description: 'Reference to specific clause within a document', syntax: 'ISO [Number]:[Year], Clause [N]', example: 'ISO 9001:2015, Clause 4.1' }, + ], + }, + { + flavor: 'iec', + logo: '/logos/iec-logo.svg', + name: 'IEC', + fullName: 'International Electrotechnical Commission', + category: 'international', + description: 'The IEC is a global organization that prepares and publishes international standards for all electrical, electronic, and related technologies. IEC standards cover a vast range of technologies from power generation to nanotechnology.', + website: 'https://www.iec.ch', + syntaxNotes: 'IEC identifiers follow the pattern: IEC [Type] [Number]-[Part]:[Year]. Many IEC identifiers include CISPR (Comité International Spécial des Perturbations Radioélectriques) designations. Value-added products (CSV, CMV, RLV, etc.) use suffixes.', + urnPattern: 'urn:iec:std:iec:[number]:[edition]:[language]', + relatedFlavors: ['iso', 'ieee', 'bsi', 'cen-cenelec', 'csa'], + docTypes: [ + { + key: 'international_standard', + title: 'International Standard', + abbr: ['IS'], + description: 'The primary IEC standard deliverable, defining requirements and specifications for electrotechnical products and systems.', + examples: [ + { input: 'IEC 61131-3:2013' }, + { input: 'IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV' }, + { input: 'CISPR 16-1-1:2019' }, + { input: 'IEC 60034-1:2022 RLV' }, + ] + }, + { + key: 'technical_report', + title: 'Technical Report', + abbr: ['TR'], + description: 'An informative document containing collected data or analysis that does not constitute a standard.', + examples: [ + { input: 'IEC TR 60825-14:2022' }, + { input: 'IEC TR 62357-1:2016' }, + ] + }, + { + key: 'technical_specification', + title: 'Technical Specification', + abbr: ['TS'], + description: 'A specification published for provisional application, typically when technology is still evolving.', + examples: [ + { input: 'IEC TS 62600-100:2012' }, + { input: 'IEC TS 62257-1:2015' }, + ] + }, + { + key: 'publicly_available_specification', + title: 'Publicly Available Specification', + abbr: ['PAS'], + description: 'A specification published to respond to urgent market needs.', + examples: [ + { input: 'IEC PAS 62430:2007' }, + ] + }, + { + key: 'guide', + title: 'Guide', + abbr: ['Guide'], + description: 'IEC Guides provide guidance on standardization principles and practices.', + examples: [ + { input: 'IEC GUIDE 103:1980' }, + { input: 'IEC GUIDE 108:2019' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['AMD', 'AM'], + description: 'Modifies an existing standard by adding, changing, or deleting specified elements.', + examples: [ + { input: 'IEC 61131-3:2013/AMD1:2019' }, + { input: 'IEC 60050-111/AMD1/FRAG1 ED2' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['COR'], + description: 'Corrects technical or editorial errors in a published document.', + examples: [ + { input: 'CISPR 16-1-3:2004/COR1:2006' }, + { input: 'CISPR 16-1-5:2014/COR1:2020' }, + ] + }, + { + key: 'interpretation_sheet', + title: 'Interpretation Sheet', + abbr: ['ISH'], + description: 'Official interpretation of requirements in an IEC standard.', + examples: [ + { input: 'IEC 60079-0:2017/ISH1:2023' }, + { input: 'IEC 60335-2-6:2002/ISH1:2008' }, + ] + }, + { + key: 'consolidated_identifier', + title: 'Consolidated Version', + abbr: ['CSV', 'CMV'], + description: 'A value-added product combining the base standard with all amendments. CSV (Consolidated Standalone Version) and CMV (Consolidated Mixed Version).', + examples: [ + { input: 'IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV' }, + { input: 'IEC 61010-1:2010+AMD1:2016 CMV' }, + ] + }, + { + key: 'working_document', + title: 'Working Document', + abbr: ['WD'], + description: 'Internal working documents for IEC committee use.', + examples: [ + { input: 'IEC 2/2102/CDV' }, + { input: 'IEC 2/2103/NP' }, + ] + }, + { + key: 'fragment_identifier', + title: 'Fragment Identifier', + abbr: ['FRAG'], + description: 'References a specific fragment within an amendment.', + examples: [ + { input: 'IEC 60050-111/AMD1/FRAG1 ED2' }, + { input: 'IEC 60050-121/AMD2/FRAG1 ED2' }, + ] + }, + { + key: 'component_specification', + title: 'Component Specification', + abbr: ['CS'], + description: 'Specifications for electronic components.', + examples: [ + { input: 'IEC 60127-1:2006/AMD1:2014' }, + ] + }, + { + key: 'operational_document', + title: 'Operational Document', + abbr: ['OD'], + description: 'Documents related to IEC conformity assessment systems.', + examples: [ + { input: 'IECEx OD 005-1' }, + ] + }, + { + key: 'systems_reference_document', + title: 'Systems Reference Document', + abbr: ['SRD'], + description: 'Reference documents for IEC systems.', + examples: [ + { input: 'IEC SRD 63226:2021' }, + ] + }, + { + key: 'vap_identifier', + title: 'Value-Added Product', + abbr: ['CSV', 'CMV', 'RLV', 'SER', 'EXV', 'PAC', 'PRV'], + description: 'Value-added versions of standards (Consolidated, Redline, Series, Extract, Package, Preview).', + examples: [ + { input: 'IEC 60034-1:2022 RLV' }, + { input: 'IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV' }, + { input: 'IEC 60335-2-6:2002 SER' }, + ] + }, + { + key: 'test_report_form', + title: 'Test Report Form', + abbr: ['TRF'], + description: 'Standardized forms used in IEC conformity assessment.', + examples: [ + { input: 'IECEx TRF 60079/0' }, + ] + }, + { + key: 'sheet_identifier', + title: 'Sheet Identifier', + abbr: ['Sheet'], + description: 'Individual sheet within a multi-sheet standard.', + examples: [ + { input: 'IEC 60335-2-6:2002 Sheet 1' }, + ] + }, + { + key: 'societal_technology_trend_report', + title: 'Societal Technology Trend Report', + abbr: ['STTR'], + description: 'Reports analyzing technology trends and their societal impact.', + examples: [ + { input: 'IEC STTR 1:2020' }, + ] + }, + { + key: 'white_paper', + title: 'White Paper', + abbr: ['WP'], + description: 'IEC white papers exploring emerging technology topics.', + examples: [ + { input: 'IEC WP AAL:2022' }, + ] + }, + ], + stages: [ + { code: '00.00', abbr: 'PWI', name: 'Preliminary Work Item' }, + { code: '10.00', abbr: 'NP', name: 'New Proposal' }, + { code: '20.00', abbr: 'WD', name: 'Working Draft' }, + { code: '30.00', abbr: 'CD', name: 'Committee Draft' }, + { code: '35.00', abbr: 'CC', name: 'Committee Draft for Enquiry' }, + { code: '40.00', abbr: 'CDV', name: 'Committee Draft for Vote' }, + { code: '40.99', abbr: 'DTS', name: 'Draft Technical Specification' }, + { code: '40.99', abbr: 'DTR', name: 'Draft Technical Report' }, + { code: '50.00', abbr: 'FDIS', name: 'Final Draft International Standard' }, + { code: '50.99', abbr: 'FDTS', name: 'Final Draft Technical Specification' }, + { code: '50.99', abbr: 'FDTR', name: 'Final Draft Technical Report' }, + { code: '60.00', abbr: 'PRF', name: 'Proof (pre-publication)' }, + { code: '60.60', abbr: 'IS', name: 'International Standard (published)' }, + ], + components: [ + { name: 'Publisher', description: 'The issuing organization (IEC, CISPR)' }, + { name: 'Document Type', description: 'The type of deliverable (IS, TR, TS, Guide, etc.)' }, + { name: 'Number', description: 'The unique document number' }, + { name: 'Part', description: 'Part number for multi-part standards' }, + { name: 'Year', description: 'Publication year' }, + { name: 'Edition', description: 'Edition number (e.g., ED2)' }, + { name: 'Language', description: 'Language code' }, + { name: 'Stage', description: 'Development stage (CD, CDV, FDIS)' }, + { name: 'VAP Suffix', description: 'Value-added product suffix (CSV, RLV, SER, etc.)', attribute: 'vap_suffix' }, + { name: 'Consolidated Amendment', description: 'Consolidated amendment references (+AMD1:2009+AMD2:2013)', attribute: 'consolidated_amendment' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies a base standard', syntax: 'IEC [Number]:[Year]/AMD[N]:[Year]', example: 'IEC 61131-3:2013/AMD1:2019' }, + { type: 'Corrigendum', description: 'Corrects errors in published documents', syntax: 'IEC [Number]:[Year]/COR[N]:[Year]', example: 'CISPR 16-1-3:2004/COR1:2006' }, + { type: 'Consolidated', description: 'Base + amendments combined', syntax: 'IEC [Number]:[Year]+AMD1:[Year] CSV', example: 'IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV' }, + { type: 'Fragment', description: 'Specific fragment within an amendment', syntax: 'IEC [Number]/AMD[N]/FRAG[N] ED[N]', example: 'IEC 60050-111/AMD1/FRAG1 ED2' }, + { type: 'Part', description: 'Multi-part standard', syntax: 'IEC [Number]-[Part]:[Year]', example: 'IEC 61131-3:2013' }, + { type: 'Interpretation Sheet', description: 'Official interpretation', syntax: 'IEC [Number]:[Year]/ISH[N]:[Year]', example: 'IEC 60079-0:2017/ISH1:2023' }, + ], + }, + { + flavor: 'ieee', + logo: '/logos/ieee-logo.svg', + name: 'IEEE', + fullName: 'Institute of Electrical and Electronics Engineers', + category: 'international', + description: 'IEEE is the world\'s largest technical professional organization for the advancement of technology. IEEE Standards Association (IEEE SA) develops standards across a wide range of industries including power and energy, telecommunications, computing, and more.', + website: 'https://standards.ieee.org', + syntaxNotes: 'IEEE identifiers follow patterns like: IEEE Std [Number]-[Year], IEEE [Number]-[Year], IEEE [Draft Number]/D[DraftVersion]. Some include AIEE legacy identifiers.', + urnPattern: 'urn:ieee:std:[number]:[year]', + relatedFlavors: ['iec', 'iso', 'csa', 'bsi'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: ['Std'], + description: 'IEEE Standards define requirements, specifications, and best practices for technologies.', + examples: [ + { input: 'IEEE Std 802.3-2018' }, + { input: 'IEEE Std 802.11-2020' }, + { input: 'IEEE Std 754-2019' }, + { input: 'IEEE Std 1588-2019' }, + ] + }, + { + key: 'project_draft_identifier', + title: 'Project Draft', + abbr: ['P'], + description: 'Draft standards under development, prefixed with P.', + examples: [ + { input: 'IEEE P802.3bf/D3.0' }, + { input: 'IEEE P802.11be/D7.0' }, + { input: 'IEEE P1453/D11, May 2023' }, + ] + }, + { + key: 'adopted_standard', + title: 'Adopted Standard', + abbr: ['Adopted'], + description: 'An IEEE adoption of another organization\'s standard.', + examples: [ + { input: 'IEEE Std 1244-5-2000 (Adopted from ISO/IEC 14102:1995)' }, + ] + }, + { + key: 'dual_published', + title: 'Dual-Published Standard', + abbr: ['Dual'], + description: 'Standards published jointly by IEEE and another organization (e.g., IEC/IEEE).', + examples: [ + { input: 'IEC/IEEE 62582-6:2022' }, + { input: 'IEC/IEEE 60780-323:2023' }, + ] + }, + { + key: 'iec_ieee_copublished', + title: 'IEC/IEEE Copublished', + abbr: ['Copub'], + description: 'Standards jointly published by IEC and IEEE.', + examples: [ + { input: 'IEC/IEEE P60780-323, CDV1 2014' }, + { input: 'IEC/IEEE P62582-6, FDIS May 2019' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['Cor', 'Cor 1'], + description: 'Corrections to published IEEE standards.', + examples: [ + { input: 'IEEE Std 802.3-2018/Cor 1-2020' }, + ] + }, + { + key: 'supplement_identifier', + title: 'Supplement', + abbr: ['Suppl'], + description: 'Supplementary material to a base standard.', + examples: [ + { input: 'IEEE Std 802.3cg-2019 (Supplement to IEEE Std 802.3-2018)' }, + ] + }, + { + key: 'redlined_standard', + title: 'Redlined Standard', + abbr: ['Redline'], + description: 'A version showing changes from the previous edition with additions and deletions marked.', + examples: [ + { input: 'IEEE Std 802.3-2018 (Redline of IEEE Std 802.3-2015)' }, + ] + }, + { + key: 'nesc', + title: 'NESC (National Electrical Safety Code)', + abbr: ['NESC'], + description: 'The National Electrical Safety Code, published by IEEE.', + examples: [ + { input: '2012 NESC Handbook, Seventh Edition' }, + { input: '2017 NESC Handbook, Premier Edition' }, + ] + }, + { + key: 'si_standard', + title: 'SI Standard', + abbr: ['SI'], + description: 'IEEE/ASTM SI 10 standard for metric/inch conversion.', + examples: [ + { input: 'IEEE/ASTM SI 10-2010' }, + ] + }, + { + key: 'joint_development', + title: 'Joint Development', + abbr: ['Joint'], + description: 'Standards under joint development by IEC and IEEE.', + examples: [ + { input: 'IEC/IEEE P60780-323, CDV1 2014' }, + ] + }, + { + key: 'dual_identifier', + title: 'Dual Identifier', + abbr: ['Dual'], + description: 'Standards with dual numbering from different organizations.', + examples: [ + { input: 'ANSI/IEEE Std 802.3-1985' }, + ] + }, + { + key: 'conformance_identifier', + title: 'Conformance Identifier', + abbr: ['Conformance'], + description: 'Conformance testing documentation.', + examples: [ + { input: 'IEEE Std 802.3.1-2013' }, + ] + }, + { + key: 'interpretation_identifier', + title: 'Interpretation', + abbr: ['Interp'], + description: 'Official interpretations of IEEE standards.', + examples: [ + { input: 'IEEE Std 802.3 Interpretation #1-2007' }, + ] + }, + { + key: 'csa_dual_published', + title: 'CSA Dual-Published', + abbr: ['CSA Dual'], + description: 'Standards dual-published with CSA Group.', + examples: [ + { input: 'IEEE Std C37.30.1-2017/CSA C22.2 No. 60038-1:17' }, + ] + }, + { + key: 'multi_numbered_identifier', + title: 'Multi-Numbered Identifier', + abbr: ['Multi'], + description: 'Standards with multiple designation numbers.', + examples: [ + { input: 'IEEE Std 802.3az-2010' }, + ] + }, + { + key: 'parenthetical_identifier', + title: 'Parenthetical Identifier', + abbr: ['Paren'], + description: 'Standards identified with parenthetical information.', + examples: [ + { input: 'IEEE 1016-2009 (Revision of IEEE 1016-1998)' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'IEEE, IEC/IEEE, or ANSI/IEEE' }, + { name: 'Draft Indicator', description: 'P prefix for draft standards', attribute: 'draft' }, + { name: 'Number', description: 'The standard number' }, + { name: 'Part', description: 'Part number or subpart' }, + { name: 'Year', description: 'Publication or revision year' }, + { name: 'Draft Version', description: 'Draft version number (e.g., D3.0)' }, + { name: 'Relationship', description: 'Relationship to other standards (Revision of, Amendment to)', attribute: 'relationship' }, + { name: 'Typed Stage', description: 'Stage indicator (CDV, FDIS, etc.)', attribute: 'typed_stage' }, + ], + algebra: [ + { type: 'Corrigendum', description: 'Corrections to published standards', syntax: 'IEEE Std [Number]-[Year]/Cor [N]-[Year]', example: 'IEEE Std 802.3-2018/Cor 1-2020' }, + { type: 'Supplement', description: 'Additional content to base standard', syntax: 'IEEE Std [Number][Suffix]-[Year]', example: 'IEEE Std 802.3cg-2019' }, + { type: 'Adoption', description: 'Adoption of external standard', syntax: 'IEEE Std [Number]-[Year] (Adopted from [ExternalID])', example: 'IEEE Std 1244-5-2000 (Adopted from ISO/IEC 14102:1995)' }, + { type: 'Copublished', description: 'Joint IEC/IEEE publication', syntax: 'IEC/IEEE [Number]-[Year]', example: 'IEC/IEEE 62582-6:2022' }, + { type: 'Draft', description: 'Draft stage', syntax: 'IEEE P[Number]/D[Version]', example: 'IEEE P802.3bf/D3.0' }, + ], + }, + { + flavor: 'itu', + logo: '/logos/itu-logo.svg', + name: 'ITU', + fullName: 'International Telecommunication Union', + category: 'international', + description: 'The ITU is the United Nations specialized agency for information and communication technologies. ITU standards (Recommendations) are fundamental to the operation of global telecommunications networks and services.', + website: 'https://www.itu.int', + syntaxNotes: 'ITU Recommendations follow the pattern: ITU-[Sector] [Series][Number]-[Year]. Sectors include R (Radiocommunication), T (Telecommunication Standardization), and D (Telecommunication Development).', + relatedFlavors: ['iso', 'iec'], + docTypes: [ + { + key: 'recommendation', + title: 'Recommendation', + abbr: ['Rec'], + description: 'ITU Recommendations (sometimes called ITU-T Standards) define specifications for telecommunications technologies.', + examples: [ + { input: 'ITU-R 01-201' }, + { input: 'ITU-T G.992.1' }, + { input: 'ITU-R SA.1014-4' }, + { input: 'ITU-T E.164' }, + ] + }, + { + key: 'supplement', + title: 'Supplement', + abbr: ['Suppl'], + description: 'Supplementary material to an ITU Recommendation.', + examples: [ + { input: 'ITU-T G.992.1 Suppl 1' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['Amd'], + description: 'Modifications to an existing ITU Recommendation.', + examples: [ + { input: 'ITU-T G.992.1/Amd 1' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['Cor'], + description: 'Corrections to published ITU Recommendations.', + examples: [ + { input: 'ITU-T G.992.1/Cor 1' }, + ] + }, + { + key: 'special_publication', + title: 'Operational Bulletin', + abbr: ['OB'], + description: 'ITU Operational Bulletin — a cross-bureau periodic publication covering regulatory and administrative information from all three ITU sectors.', + examples: [ + { input: 'ITU OB No. 1283 (01/2024)' }, + { input: 'ITU OB No. 1000' }, + ] + }, + { + key: 'annex', + title: 'Annex', + abbr: ['Annex'], + description: 'An annex to an ITU Special Publication (Operational Bulletin). Rendered as "Annex to ITU OB No. [Number]".', + examples: [ + { input: 'Annex to ITU OB No. 1000' }, + ] + }, + ], + components: [ + { name: 'Sector', description: 'ITU sector: R (Radiocommunication), T (Standardization), D (Development)', attribute: 'sector' }, + { name: 'Series', description: 'The series letter (e.g., G, E, H, SA)', attribute: 'series' }, + { name: 'Number', description: 'The recommendation number' }, + { name: 'Year', description: 'Publication year' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies a Recommendation', syntax: 'ITU-[Sector] [Series].[Number]/Amd [N]', example: 'ITU-T G.992.1/Amd 1' }, + { type: 'Corrigendum', description: 'Corrects errors', syntax: 'ITU-[Sector] [Series].[Number]/Cor [N]', example: 'ITU-T G.992.1/Cor 1' }, + { type: 'Supplement', description: 'Additional content', syntax: 'ITU-[Sector] [Series].[Number] Suppl [N]', example: 'ITU-T G.992.1 Suppl 1' }, + ], + }, + { + flavor: 'iala', + logo: '/logos/iala-logo.svg', + name: 'IALA', + fullName: 'International Association of Marine Aids to Navigation and Lighthouse Authorities', + category: 'international', + description: "IALA is an international technical association that gathers marine aids to navigation authorities, industry manufacturers and consultants to harmonize and improve marine aids to navigation worldwide. IALA Recommendations and Standards guide lighthouse authorities, vessel traffic services, and e-Navigation implementations across more than 90 member countries.", + website: 'https://www.iala.int', + syntaxNotes: "IALA identifiers use a single-letter type prefix followed by a 4-digit zero-padded number: IALA {S|R|G|M|C|A|L|GA|X|P}[Number][ Ed [Edition]][ ([LangLetter])]. General Assembly resolutions use a dotted series.index form (GA01.01).", + urnPattern: 'urn:iala:[type]:[number]:[edition]:[language]', + relatedFlavors: ['iso', 'iho', 'iec'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: ['S'], + description: 'IALA Standards (S series) define normative requirements for marine aids to navigation systems, including the IALA Maritime Buoyage System and e-Navigation components.', + examples: [ + { input: 'IALA S1010' }, + { input: 'IALA S1020 Ed 2.0' }, + { input: 'IALA S1070 Ed 2.0' }, + ], + }, + { + key: 'recommendation', + title: 'Recommendation', + abbr: ['R'], + description: 'IALA Recommendations (R series) are the principal deliverable type, recommending practices and systems to be adopted by member authorities.', + examples: [ + { input: 'IALA R0103 Ed 3.1' }, + { input: 'IALA R0126 Ed 2.0' }, + { input: 'IALA R1024 Ed 1.0' }, + ], + }, + { + key: 'guideline', + title: 'Guideline', + abbr: ['G'], + description: 'IALA Guidelines (G series) provide practical guidance for the implementation and operation of aids to navigation systems.', + examples: [ + { input: 'IALA G1015 Ed 2.2' }, + { input: 'IALA G1045 Ed 1' }, + { input: 'IALA G1078 Ed 2.1' }, + ], + }, + { + key: 'manual', + title: 'Manual', + abbr: ['M'], + description: 'IALA Manuals (M series). Most current manuals (NAVGUIDE, VTS Manual) carry no number; the M prefix is reserved for future numbered manuals.', + examples: [ + { input: 'IALA M0001' }, + ], + }, + { + key: 'model_course', + title: 'Model Course', + abbr: ['C'], + description: 'IALA Model Courses (C series) define training programmes for aids to navigation personnel and VTS operators.', + examples: [ + { input: 'IALA C0103-1 Ed 3.0' }, + { input: 'IALA C2001-1 Ed 1.0' }, + ], + }, + { + key: 'advice', + title: 'Advice', + abbr: ['A'], + description: 'IALA Advices (A series) are brief advisory notes issued by IALA committees. Numbering is dashed (A12-01, A13-04) and they carry no edition.', + examples: [ + { input: 'IALA A12-01' }, + { input: 'IALA A13-04' }, + ], + }, + { + key: 'general_assembly', + title: 'General Assembly Resolution', + abbr: ['GA'], + description: 'Resolutions of the IALA General Assembly, numbered with a dotted series.index form (volume = series, sequence = index).', + examples: [ + { input: 'IALA GA01.01' }, + { input: 'IALA GA01.13' }, + ], + }, + { + key: 'letter', + title: 'Letter', + abbr: ['L'], + description: 'IALA Letters (L series) use a multi-dotted series.sub-series.item form, with an optional sub-part suffix.', + examples: [ + { input: 'IALA L2.1.11' }, + { input: 'IALA L2.7.1-2' }, + ], + }, + { + key: 'annex', + title: 'Annex', + abbr: ['Annex'], + description: 'Annex to an IALA base publication (typically a Guideline). The "Annex"/"ANNEX" marker case is preserved verbatim, with an optional single-letter suffix (A–D).', + examples: [ + { input: 'IALA G1045 Annex Ed 1' }, + { input: 'IALA G1128 ANNEX A Ed 1.6' }, + ], + }, + { + key: 'report', + title: 'Report', + abbr: ['X'], + description: 'IALA Reports & Proceedings (X series, reserved). Current reports carry no code; X is reserved for future numbered reports.', + examples: [], + }, + { + key: 'resolution', + title: 'Resolution', + abbr: ['P'], + description: 'IALA Council Resolutions and publications (P series, reserved). Current resolutions carry no code; P is reserved for future numbered resolutions.', + examples: [], + }, + ], + components: [ + { name: 'Publisher', description: 'IALA — optional on input, always emitted on output' }, + { name: 'Type Letter', description: 'Single-letter type code (S, R, G, M, C, A, L, GA, X, P)', attribute: 'type_letter' }, + { name: 'Number', description: '4-digit zero-padded number; GA series uses dotted series.index', attribute: 'number' }, + { name: 'Sub-part', description: 'Optional hyphenated sub-part suffix', attribute: 'subpart' }, + { name: 'Edition', description: 'Prefixed with "Ed" (cover form) or ":ed" (compact listing form)', attribute: 'edition' }, + { name: 'Language', description: 'Single uppercase letter in parentheses: E, F, S, C, A, R', attribute: 'language' }, + ], + algebra: [ + { type: 'Edition', description: 'Cover-page vs listing-page edition forms', syntax: 'IALA [Type][Number] Ed [X.Y] | IALA [Type][Number]:ed[X.Y]', example: 'IALA R1016 Ed 2.0' }, + { type: 'Sub-part', description: 'Sub-part within a numbered publication', syntax: 'IALA [Type][Number]-[SubPart] Ed [X.Y]', example: 'IALA C0103-1 Ed 3.0' }, + { type: 'Annex', description: 'Wraps a base publication with an annex marker', syntax: 'IALA [Type][Number] Annex [A-D] Ed [X.Y]', example: 'IALA G1128 ANNEX A Ed 1.6' }, + { type: 'Language', description: 'Translation suffix as a parenthesised letter', syntax: 'IALA [Type][Number] Ed [X.Y] ([Lang])', example: 'IALA R1016 Ed 2.0 (F)' }, + ], + }, + { + flavor: 'iho', + logo: '/logos/iho-logo.svg', + name: 'IHO', + fullName: 'International Hydrographic Organization', + category: 'international', + description: "The IHO is an intergovernmental organization that coordinates the setting of international hydrographic and nautical charting standards. Its Standards and Specifications (S-series) underpin Electronic Navigational Charts (ENCs) and the developing S-100 Universal Hydrographic Data Model used by mariners and maritime software worldwide.", + website: 'https://iho.int', + syntaxNotes: "IHO identifiers use a single-letter series prefix followed by a hyphenated number: IHO {S|P|M|B|C}-[Number][ Ap. [Appendix]][ Part [Part]][ Annex [Annex]][ Suppl [Supplement]] [Version].", + urnPattern: 'urn:iho:[type]:[number]:[version]', + relatedFlavors: ['iso', 'iala', 'iec'], + docTypes: [ + { + key: 'standard', + title: 'Standards and Specifications', + abbr: ['S'], + description: 'IHO Standards and Specifications (S series), including the S-100 Universal Hydrographic Data Model and the S-57/S-101 ENC transfer standards.', + examples: [ + { input: 'IHO S-44 5.0.0' }, + { input: 'IHO S-100 Part 4a 1.0.0' }, + { input: 'IHO S-65 Ap. A 1.0.0' }, + ], + }, + { + key: 'publication', + title: 'Publication', + abbr: ['P'], + description: 'IHO Publications (P series) — reference works such as Charts and Publications Regulations. Numbers may carry a sub-year (P-1/21) or sub-part (P-6-3).', + examples: [ + { input: 'IHO P-1 1.0.0' }, + { input: 'IHO P-1/21 1.0.0' }, + { input: 'IHO P-6-3 1.0.0' }, + ], + }, + { + key: 'miscellaneous', + title: 'Miscellaneous Publication', + abbr: ['M'], + description: 'IHO Miscellaneous Publications (M series) — manuals, guides, and reference documents that do not fit the S/P categories.', + examples: [ + { input: 'IHO M-3 2.0.0' }, + ], + }, + { + key: 'bibliographic', + title: 'Bibliographic Publication', + abbr: ['B'], + description: 'IHO Bibliographic Publications (B series) — bibliographies and reference catalogues.', + examples: [ + { input: 'IHO B-4 2.19.0' }, + ], + }, + { + key: 'circular_letter', + title: 'Circular Letter', + abbr: ['C'], + description: 'IHO Circular Letters (C series) — official correspondence from the IHO Secretariat to Member States.', + examples: [ + { input: 'IHO C-13 1.0.0' }, + ], + }, + ], + components: [ + { name: 'Publisher', description: 'IHO — optional on input, always emitted on output' }, + { name: 'Type Letter', description: 'Single-letter series code (S, P, M, B, C)', attribute: 'type_letter' }, + { name: 'Number', description: 'Document number, may include sub-part or slash-year', attribute: 'number' }, + { name: 'Appendix', description: 'Appendix marker: "Ap." prefix', attribute: 'appendix' }, + { name: 'Part', description: 'Part marker: "Part" keyword', attribute: 'part' }, + { name: 'Annex', description: 'Annex marker: "Annex" keyword', attribute: 'annex' }, + { name: 'Supplement', description: 'Supplement marker: "Suppl" keyword', attribute: 'supplement' }, + { name: 'Version', description: 'Three-part dotted version (X.Y.Z)', attribute: 'version' }, + ], + algebra: [ + { type: 'Part', description: 'Subdivision of a standard', syntax: 'IHO [Type]-[Number] Part [Part] [Version]', example: 'IHO S-100 Part 4a 1.0.0' }, + { type: 'Appendix', description: 'Appendix within a publication', syntax: 'IHO [Type]-[Number] Ap. [Letter] [Version]', example: 'IHO S-65 Ap. A 1.0.0' }, + { type: 'Slash Year', description: 'Annual revision indicator within a series', syntax: 'IHO [Type]-[Number]/[Year] [Version]', example: 'IHO P-1/21 1.0.0' }, + { type: 'Sub-part', description: 'Compound number with sub-part', syntax: 'IHO [Type]-[Number]-[SubPart] [Version]', example: 'IHO P-6-3 1.0.0' }, + ], + }, + // ─── REGIONAL ────────────────────────────────────────────────── + { + flavor: 'cen-cenelec', + logo: '/logos/cen-logo.svg', + logos: ['/logos/cen-logo.svg', '/logos/cenelec-logo.png'], + name: 'CEN-CENELEC', + fullName: 'CEN and CENELEC — European Standardization Organizations', + category: 'regional', + description: 'CEN (European Committee for Standardization) and CENELEC (European Committee for Electrotechnical Standardization) are two distinct organizations managed by a single body, the CEN-CENELEC Management Centre (CCMC). They share a unified publishing system, identifier grammar, and catalogue. CEN cooperates with ISO (Vienna Agreement) and CENELEC cooperates with IEC (Frankfurt Agreement). Both are recognized by the EU and EFTA.', + website: 'https://www.cencenelec.eu', + syntaxNotes: 'CEN-CENELEC identifiers use EN (European Norm) designations with CEN or CLC (CENELEC) publisher prefixes. Patterns: EN [Number]:[Year], CEN/TS [Number]:[Year], CLC/TR [Number]:[Year], CEN/CLC [Type] [Number]:[Year].', + urnPattern: 'urn:cen:std:en:[number]:[year]', + relatedFlavors: ['iso', 'iec', 'bsi'], + docTypes: [ + { + key: 'european_norm', + title: 'European Norm', + abbr: ['EN'], + description: 'EN standards are European Standards that must be adopted by all CEN national members.', + examples: [ + { input: 'EN 196-3:2005+A1:2008' }, + { input: 'EN 527-2:2016+A1:2019' }, + { input: 'EN 1090-2:2018' }, + ] + }, + { + key: 'european_prestandard', + title: 'European Prestandard', + abbr: ['ENV'], + description: 'Provisional standards published for provisional application.', + examples: [ + { input: 'ENV 1991-1:1994' }, + ] + }, + { + key: 'technical_specification', + title: 'Technical Specification', + abbr: ['CEN/TS'], + description: 'CEN Technical Specifications for provisional use.', + examples: [ + { input: 'CEN/TS 14243:2012' }, + ] + }, + { + key: 'technical_report', + title: 'Technical Report', + abbr: ['CEN/TR'], + description: 'Informative documents from CEN.', + examples: [ + { input: 'CEN/TR 15522-1:2007' }, + ] + }, + { + key: 'cen_workshop_agreement', + title: 'CEN Workshop Agreement', + abbr: ['CWA'], + description: 'Documents developed through an open CEN Workshop process.', + examples: [ + { input: 'CWA 15261-1:2005' }, + ] + }, + { + key: 'guide', + title: 'Guide', + abbr: ['CLC Guide', 'CEN Guide'], + description: 'Guidance documents from CEN or CENELEC.', + examples: [ + { input: 'CLC Guide 1:2022' }, + ] + }, + { + key: 'harmonization_document', + title: 'Harmonization Document', + abbr: ['HD'], + description: 'CENELEC Harmonization Documents.', + examples: [ + { input: 'HD 60364-1:2008' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['Amd'], + description: 'Amendments to European Norms.', + examples: [ + { input: 'EN ISO 13485:2016/A1:2024' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['Cor', 'AC'], + description: 'Corrections to CEN publications.', + examples: [ + { input: 'EN ISO 13485:2016/AC:2016' }, + ] + }, + { + key: 'consolidated_identifier', + title: 'Consolidated Version', + abbr: ['+A'], + description: 'Base standard with incorporated amendments.', + examples: [ + { input: 'EN 196-3:2005+A1:2008' }, + { input: 'EN 527-2:2016+A1:2019' }, + ] + }, + { + key: 'adopted_european_norm', + title: 'Adopted European Norm', + abbr: ['EN ISO', 'EN IEC'], + description: 'European adoption of international (ISO/IEC) standards.', + examples: [ + { input: 'EN ISO 13485:2016/AC:2016' }, + { input: 'EN ISO 13485:2016/AC:2017' }, + ] + }, + { + key: 'fragment', + title: 'Fragment', + abbr: ['Frag'], + description: 'Specific fragment of a CEN document.', + examples: [ + { input: 'EN 196-3:2005+A1:2008 Frag 1' }, + ] + }, + { + key: 'european_specification', + title: 'European Specification', + abbr: ['ES'], + description: 'CEN European Specifications.', + examples: [ + { input: 'ES 59001:2004' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'CEN, CENELEC (CLC), or joint designations' }, + { name: 'Document Type', description: 'EN, CEN/TS, CEN/TR, CWA, HD, etc.' }, + { name: 'Number', description: 'The document number' }, + { name: 'Part', description: 'Part number' }, + { name: 'Year', description: 'Publication year' }, + { name: 'Consolidated', description: 'Consolidated amendment indicator (+A1, +A2)', attribute: 'consolidated' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies a European Norm', syntax: 'EN [Number]:[Year]/A[N]:[Year]', example: 'EN 196-3:2005+A1:2008' }, + { type: 'Corrigendum', description: 'Corrects errors', syntax: 'EN [Number]:[Year]/AC:[Year]', example: 'EN ISO 13485:2016/AC:2016' }, + { type: 'Consolidated', description: 'Base + amendments', syntax: 'EN [Number]:[Year]+A[N]:[Year]', example: 'EN 196-3:2005+A1:2008' }, + { type: 'Adoption', description: 'Adoption of ISO/IEC standards', syntax: 'EN ISO [Number]:[Year]', example: 'EN ISO 13485:2016' }, + ], + }, + { + flavor: 'etsi', + logo: '/logos/etsi-logo.svg', + name: 'ETSI', + fullName: 'European Telecommunications Standards Institute', + category: 'regional', + description: 'ETSI produces globally applicable standards for Information and Communications Technologies (ICT), including fixed, mobile, radio, converged, broadcast, and internet technologies.', + website: 'https://www.etsi.org', + syntaxNotes: 'ETSI identifiers follow the pattern: ETSI [Type] [Number] V[Version] ([Date]). Types include EG (Guide), EN (Standard), ES (Specification), ET (Technical Report), GS (Group Specification), TS (Technical Specification), TR (Technical Report).', + relatedFlavors: ['cen-cenelec', 'itu', 'iec'], + docTypes: [ + { + key: 'etsi_standard', + title: 'ETSI Standard', + abbr: ['EN', 'ES', 'EG', 'ET', 'GS', 'TS', 'TR', 'SR'], + description: 'ETSI publishes various deliverable types: EN (European Standard), ES (ETSI Specification), EG (ETSI Guide), ET (ETSI Technical Report), GS (Group Specification), TS (Technical Specification), TR (Technical Report), SR (Special Report).', + examples: [ + { input: 'ETSI EG 200 053 V1.5.1 (2004-06)' }, + { input: 'ETSI EN 300 392-2 V3.4.1 (2017-04)' }, + { input: 'ETSI TS 102 023-2 V1.1.1 (2003-08)' }, + { input: 'ETSI GS NFV 002 V1.2.1 (2014-10)' }, + { input: 'ETSI TR 103 392 V1.1.1 (2016-11)' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['A'], + description: 'Amendments to ETSI documents.', + examples: [ + { input: 'ETSI ETR 108/A1 ed.1 (1995-08)' }, + { input: 'ETSI ETS 300 011/A1 ed.1 (1994-12)' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['C'], + description: 'Corrections to ETSI documents.', + examples: [ + { input: 'ETSI ETR 053/C1 ed.2 (1997-03)' }, + { input: 'ETSI ETR 094/C1 ed.1 (1994-03)' }, + ] + }, + { + key: 'supplement_identifier', + title: 'Supplement', + abbr: ['S'], + description: 'Supplements to ETSI base documents.', + examples: [ + { input: 'ETSI ETS 300 001 S1 ed.1 (1993-10)' }, + ] + }, + ], + components: [ + { name: 'Type', description: 'Document type prefix (EN, ES, EG, ET, GS, TS, TR)' }, + { name: 'Number', description: 'The document number' }, + { name: 'Version', description: 'Version number (V[major].[minor].[patch])', attribute: 'version' }, + { name: 'Date', description: 'Publication date in parentheses' }, + { name: 'Edition', description: 'Edition number (ed.N)', attribute: 'edition' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies a base document', syntax: 'ETSI [Type] [Number]/A[N] ed.[N]', example: 'ETSI ETR 108/A1 ed.1 (1995-08)' }, + { type: 'Corrigendum', description: 'Corrects errors', syntax: 'ETSI [Type] [Number]/C[N] ed.[N]', example: 'ETSI ETR 053/C1 ed.2 (1997-03)' }, + { type: 'Supplement', description: 'Supplementary content', syntax: 'ETSI [Type] [Number] S[N] ed.[N]', example: 'ETSI ETS 300 001 S1 ed.1 (1993-10)' }, + ], + }, + // ─── NATIONAL ────────────────────────────────────────────────── + { + flavor: 'nist', + logo: '/logos/nist-logo.svg', + name: 'NIST', + fullName: 'National Institute of Standards and Technology', + category: 'national', + description: 'NIST is a physical sciences laboratory and a non-regulatory agency of the U.S. Department of Commerce. NIST was the first organization to adopt a multi-style, round-trippable PubID scheme with four defined rendering styles (full, abbreviated, short, machine-readable). The NIST PubID covers 19,333+ documents dating from 1901.', + website: 'https://www.nist.gov', + syntaxNotes: 'NIST identifiers use publisher abbreviations (NIST, NBS for pre-1988 documents) followed by a type abbreviation and number. NIST PubID defines four rendering styles: Full (Long), Abbreviated, Short, and Machine-Readable (MR). The MR style uses dot-separated fields and serves as the DOI suffix.', + relatedFlavors: ['ansi', 'ieee'], + docTypes: [ + { + key: 'special_publication', + title: 'Special Publication', + abbr: ['SP'], + description: 'NIST Special Publications cover a wide range of topics including cybersecurity, measurement science, and standards.', + examples: [ + { input: 'NIST SP 800-53 Rev. 5' }, + { input: 'NIST SP 800-63-3' }, + { input: 'NIST SP 1800-1' }, + { input: 'NIST SP 800-171 Rev. 2' }, + ] + }, + { + key: 'federal_information_processing_standards', + title: 'Federal Information Processing Standards', + abbr: ['FIPS'], + description: 'FIPS are U.S. government standards for computer systems, particularly for security and interoperability.', + examples: [ + { input: 'FIPS 197' }, + { input: 'FIPS 180-4' }, + { input: 'FIPS 202' }, + { input: 'FIPS 186-5' }, + ] + }, + { + key: 'interagency_report', + title: 'Interagency/Internal Report', + abbr: ['IR'], + description: 'NIST Internal Reports (NIST IR) document research findings.', + examples: [ + { input: 'NIST IR 8115' }, + { input: 'NIST IR 8259' }, + { input: 'NIST IR 8011 Vol. 3' }, + { input: 'NIST GCR 01-820' }, + ] + }, + { + key: 'technical_note', + title: 'Technical Note', + abbr: ['TN'], + description: 'NIST Technical Notes document technical research and analysis.', + examples: [ + { input: 'NIST TN 2176' }, + { input: 'NIST TN 2088' }, + ] + }, + { + key: 'handbook', + title: 'Handbook', + abbr: ['HB'], + description: 'NIST Handbooks provide reference data and guidelines.', + examples: [ + { input: 'NIST HB 44' }, + { input: 'NBS HB 1' }, + { input: 'NIST HB 150-2C' }, + ] + }, + { + key: 'circular', + title: 'Circular', + abbr: ['CIRC'], + description: 'Historical NBS Circulars (pre-NIST).', + examples: [ + { input: 'NBS CIRC 1' }, + { input: 'NBS CIRC 13' }, + ] + }, + { + key: 'monograph', + title: 'Monograph', + abbr: ['MONO'], + description: 'NBS/NIST Monographs.', + examples: [ + { input: 'NBS MONO 1' }, + { input: 'NIST MONO 1' }, + ] + }, + { + key: 'report', + title: 'Report', + abbr: ['RPT'], + description: 'NBS/NIST Reports.', + examples: [ + { input: 'NBS RPT 1' }, + { input: 'NIST RPT 1' }, + ] + }, + { + key: 'letter_circular', + title: 'Letter Circular', + abbr: ['LCIRC'], + description: 'NBS Letter Circulars.', + examples: [ + { input: 'NBS LCIRC 1' }, + ] + }, + { + key: 'grant_contractor_report', + title: 'Grant/Contractor Report', + abbr: ['GCR'], + description: 'NBS/NIST Grant and Contractor Reports.', + examples: [ + { input: 'NBS GCR 80-287' }, + { input: 'NIST GCR 01-820' }, + ] + }, + { + key: 'crpl_report', + title: 'CRPL Report', + abbr: ['CRPL'], + description: 'Central Radio Propagation Laboratory reports.', + examples: [ + { input: 'NBS CRPL 1' }, + ] + }, + { + key: 'nsrds', + title: 'National Standard Reference Data Series', + abbr: ['NSRDS'], + description: 'NSRDS-NBS publications.', + examples: [ + { input: 'NSRDS-NBS 1' }, + ] + }, + { + key: 'ncstar', + title: 'NIST NCSTAR', + abbr: ['NCSTAR'], + description: 'NIST Investigation of Structural Failures reports.', + examples: [ + { input: 'NIST NCSTAR 1' }, + ] + }, + { + key: 'owmwp', + title: 'OWM Working Paper', + abbr: ['OWMWP'], + description: 'Office of Weights and Measures Working Papers.', + examples: [ + { input: 'NIST OWMWP 1' }, + ] + }, + { + key: 'commercial_standard', + title: 'Commercial Standard', + abbr: ['CS'], + description: 'Historical NBS Commercial Standards.', + examples: [ + { input: 'NBS CS 1' }, + ] + }, + { + key: 'miscellaneous_publication', + title: 'Miscellaneous Publication', + abbr: ['MP'], + description: 'NBS Miscellaneous Publications.', + examples: [ + { input: 'NBS MP 1' }, + ] + }, + { + key: 'circular_supplement', + title: 'Circular Supplement', + abbr: ['CS'], + description: 'Supplements to NBS Circulars.', + examples: [ + { input: 'NBS CIRC 1sup' }, + ] + }, + { + key: 'commercial_standards_monthly', + title: 'Commercial Standards Monthly', + abbr: ['CSM'], + description: 'NBS Commercial Standards Monthly.', + examples: [ + { input: 'NBS CSM 1' }, + ] + }, + { + key: 'commercial_standard_emergency', + title: 'Commercial Standard Emergency', + abbr: ['CSE'], + description: 'Emergency Commercial Standards.', + examples: [ + { input: 'NBS CSE 1' }, + ] + }, + { + key: 'research_brief', + title: 'Research Brief', + abbr: ['RB'], + description: "NIST Research Briefs — short-form research summaries from NIST laboratories. Revisions are appended as a lowercase 'r' suffix (e.g. 6r1).", + examples: [ + { input: 'NIST RB 6' }, + { input: 'NIST RB 4r1' }, + ] + }, + { + key: 'chips_act_rd', + title: 'CHIPS Act R&D', + abbr: ['CHIPS'], + description: "Publications under the NIST CHIPS Research and Development program (Creating Helpful Incentives to Produce Semiconductors). Numbers are compound, hyphenated (e.g. 1400-3).", + examples: [ + { input: 'NIST CHIPS 1400-3' }, + { input: 'NIST CHIPS 1100-1' }, + ] + }, + { + key: 'nwirp', + title: 'NWIRP', + abbr: ['NWIRP'], + description: 'Low-volume NIST series present in the MODS publication dump.', + examples: [ + { input: 'NIST NWIRP 1' }, + ] + }, + ], + stages: [ + { code: '10.00', abbr: 'WD', name: 'Work-in-Progress Draft' }, + { code: '30.00', abbr: 'PRD', name: 'Preliminary Draft' }, + { code: '40.00', abbr: 'PD', name: 'Public Draft' }, + { code: '60.00', abbr: 'Final', name: 'Final Publication' }, + ], + styles: [ + { key: 'full', name: 'Full (Long)', description: 'Used in title page and bibliography', example: 'National Institute of Standards and Technology Special Publication 800-53A' }, + { key: 'abbrev', name: 'Abbreviated', description: 'Used in the Authority section', example: 'Natl. Inst. Stand. Technol. Spec. Publ. 800-53A' }, + { key: 'short', name: 'Short', description: 'Used for inline citations', example: 'NIST SP 800-53A' }, + { key: 'mr', name: 'Machine-Readable', description: 'Used for DOI suffix and machine interchange', example: 'NIST.SP.800-53A' }, + ], + components: [ + { name: 'Publisher', description: 'NIST (post-1988) or NBS (pre-1988)' }, + { name: 'Document Type', description: 'SP, FIPS, IR, TN, HB, etc.' }, + { name: 'Number', description: 'The document number' }, + { name: 'Part', description: 'Part or volume number', attribute: 'part' }, + { name: 'Revision', description: 'Revision number (Rev. 5)', attribute: 'revision' }, + { name: 'Version', description: 'Version number', attribute: 'version' }, + { name: 'Edition', description: 'Edition number', attribute: 'edition' }, + { name: 'Stage', description: 'Publication stage (draft, final)', attribute: 'stage' }, + { name: 'Supplement', description: 'Supplement indicator', attribute: 'supplement' }, + { name: 'Translation', description: 'Translation indicator', attribute: 'translation' }, + { name: 'Update', description: 'Update number', attribute: 'update' }, + { name: 'Volume', description: 'Volume number', attribute: 'volume' }, + ], + algebra: [ + { type: 'Revision', description: 'Revision of an existing document', syntax: 'NIST SP [Number] Rev. [N]', example: 'NIST SP 800-53 Rev. 5' }, + { type: 'Part/Volume', description: 'Multi-part or multi-volume document', syntax: 'NIST [Type] [Number]-[Part] Vol. [N]', example: 'NIST IR 8011 Vol. 3' }, + { type: 'Draft', description: 'Draft version of a document', syntax: 'NIST [Type] [Number] (Draft)', example: 'NIST SP 800-53 Rev. 5 (Draft)' }, + { type: 'Supplement', description: 'Supplement to a base document', syntax: 'NIST [Type] [Number] Suppl. [N]', example: 'NIST SP 800-53 Suppl. 1' }, + ], + }, + { + flavor: 'bsi', + logo: '/logos/bsi-logo.svg', + name: 'BSI', + fullName: 'British Standards Institution', + category: 'national', + description: 'BSI is the UK\'s National Standards Body, producing technical standards for a wide range of products and services. BSI also provides certification and standards-related services.', + website: 'https://www.bsigroup.com', + syntaxNotes: 'BSI identifiers use BS prefix with various type indicators. Adoptions of international standards use patterns like BS ISO, BS EN, BS EN ISO.', + relatedFlavors: ['iso', 'iec', 'cen-cenelec'], + docTypes: [ + { + key: 'british_standard', + title: 'British Standard', + abbr: ['BS'], + description: 'The primary BSI standards deliverable.', + examples: [ + { input: 'BS 476-22:1987' }, + { input: 'BS 8300-1:2018' }, + { input: 'BS 9999:2017' }, + ] + }, + { + key: 'adopted_international_standard', + title: 'Adopted International Standard', + abbr: ['BS ISO', 'BS IEC', 'BS EN'], + description: 'British adoption of international (ISO, IEC) or European (EN) standards.', + examples: [ + { input: 'BS ISO 9001:2015' }, + { input: 'BS EN ISO 13485:2016' }, + { input: 'BS IEC 61131-3:2013' }, + ] + }, + { + key: 'adopted_european_norm', + title: 'Adopted European Norm', + abbr: ['BS EN'], + description: 'British adoption of European Standards.', + examples: [ + { input: 'BS EN 196-3:2005+A1:2008' }, + { input: 'BS EN 1090-2:2018' }, + ] + }, + { + key: 'aerospace_standard', + title: 'Aerospace Standard', + abbr: ['BS A', 'BS Aerospace'], + description: 'Standards for the aerospace industry.', + examples: [ + { input: 'BS A 242-A 245:1974+A1:2017' }, + { input: 'BS A 246-A 249:1974+A1:2017' }, + ] + }, + { + key: 'publicly_available_specification', + title: 'Publicly Available Specification', + abbr: ['PAS'], + description: 'Specifications published to meet urgent market needs.', + examples: [ + { input: 'PAS 9980:2022' }, + ] + }, + { + key: 'technical_specification', + title: 'Technical Specification', + abbr: ['PD TS'], + description: 'Published Documents providing technical guidance.', + examples: [ + { input: 'PD 5500:2023' }, + ] + }, + { + key: 'flex', + title: 'Flex Standard', + abbr: ['Flex'], + description: 'BSI Flex standards are evolved through continuous development.', + examples: [ + { input: 'BSI Flex 1880 v1.0:2022' }, + { input: 'BSI Flex 1886 v3.0:2024' }, + ] + }, + { + key: 'handbook', + title: 'Handbook', + abbr: ['HB'], + description: 'BSI Handbooks providing reference material.', + examples: [ + { input: 'BS HB 1' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['Amd'], + description: 'Amendments to existing British Standards.', + examples: [ + { input: 'BS 476-22:1987+A1:2019' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['Cor'], + description: 'Corrections to published standards.', + examples: [ + { input: 'BS 9999:2017/Cor 1:2018' }, + ] + }, + { + key: 'draft_document', + title: 'Draft for Development', + abbr: ['DD'], + description: 'Draft documents for public comment.', + examples: [ + { input: '14/30300822 DC' }, + { input: '21/30445138 DC' }, + ] + }, + { + key: 'committee_document', + title: 'Committee Document', + abbr: ['DC'], + description: 'Committee draft documents for consultation.', + examples: [ + { input: '14/30300822 DC' }, + ] + }, + { + key: 'published_document', + title: 'Published Document', + abbr: ['PD'], + description: 'Published Documents that provide guidance.', + examples: [ + { input: 'PD 5500:2023' }, + ] + }, + { + key: 'electronic_book', + title: 'Electronic Book', + abbr: ['EB'], + description: 'Electronic versions of standards.', + examples: [ + { input: 'BS EB 1' }, + ] + }, + { + key: 'expert_commentary', + title: 'Expert Commentary', + abbr: ['EC'], + description: 'Expert commentary on standards.', + examples: [ + { input: 'BS EC 1' }, + ] + }, + { + key: 'value_added_publication', + title: 'Value-Added Publication', + abbr: ['VAP'], + description: 'Publications with additional content like commentary or redline.', + examples: [ + { input: 'BS VAP 1' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'BSI (or BS prefix)' }, + { name: 'Adoption Source', description: 'Adopted standard source (ISO, EN, IEC)', attribute: 'adoption_source' }, + { name: 'Document Type', description: 'BS, PAS, PD, Flex, etc.' }, + { name: 'Number', description: 'The document number' }, + { name: 'Part', description: 'Part number' }, + { name: 'Year', description: 'Publication year' }, + { name: 'Amendment/Consolidated', description: 'Consolidated amendment indicator', attribute: 'consolidated' }, + { name: 'Publisher Specific', description: 'BSI-specific publisher codes', attribute: 'publisher' }, + { name: 'Date', description: 'Date information', attribute: 'date' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies a standard', syntax: 'BS [Number]:[Year]+A[N]:[Year]', example: 'BS 476-22:1987+A1:2019' }, + { type: 'Corrigendum', description: 'Corrects errors', syntax: 'BS [Number]:[Year]/Cor [N]:[Year]', example: 'BS 9999:2017/Cor 1:2018' }, + { type: 'Adoption', description: 'Adoption of ISO/EN/IEC', syntax: 'BS [Source] [Number]:[Year]', example: 'BS ISO 9001:2015' }, + { type: 'Consolidated', description: 'Base + incorporated amendments', syntax: 'BS [Number]:[Year]+A[N]:[Year]', example: 'BS A 242-A 245:1974+A1:2017' }, + { type: 'Part', description: 'Multi-part standard', syntax: 'BS [Number]-[Part]:[Year]', example: 'BS 8300-1:2018' }, + { type: 'Bundle', description: 'Multiple documents bundled', syntax: 'BS [Number] + [Number]', example: 'BS A 242-A 245:1974+A1:2017' }, + { type: 'Set', description: 'Document set', syntax: 'BS [Number] Set', example: 'BS 476 Set' }, + ], + }, + { + flavor: 'ansi', + logo: '/logos/ansi-logo.svg', + name: 'ANSI', + fullName: 'American National Standards Institute', + category: 'national', + description: 'ANSI oversees the creation, promulgation, and use of thousands of norms and guidelines that directly impact businesses in nearly every sector. ANSI is also actively engaged in accrediting programs that assess conformance to standards.', + website: 'https://www.ansi.org', + syntaxNotes: 'ANSI identifiers follow simple patterns: ANSI [Number]-[Year] or ANSI/[Developer] [Number]-[Year].', + relatedFlavors: ['ieee', 'astm', 'asme', 'nist'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: [''], + description: 'ANSI American National Standards.', + examples: [ + { input: 'ANSI 802.3-2012' }, + { input: 'ANSI C135.14-1979' }, + { input: 'ANSI Z49.1:2012' }, + ] + }, + { + key: 'american_national_standard', + title: 'American National Standard', + abbr: ['ANS'], + description: 'Formally designated American National Standards.', + examples: [ + { input: 'ANSI/AAMI ST79:2017' }, + { input: 'ANSI/ASHRAE 15-2019' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'ANSI, or ANSI/[Developer]' }, + { name: 'Number', description: 'The standard number' }, + { name: 'Year', description: 'Publication year' }, + ], + algebra: [], + }, + { + flavor: 'jis', + logo: '/logos/jis-logo.svg', + name: 'JIS', + fullName: 'Japanese Industrial Standards', + category: 'national', + description: 'Japanese Industrial Standards (JIS) are national standards for industrial products and technologies in Japan. They are established by the Japanese Industrial Standards Committee (JISC) and published by the Japanese Standards Association.', + website: 'https://www.jsa.or.jp', + syntaxNotes: 'JIS identifiers follow the pattern: JIS [Letter] [Number]:[Year]. The letter indicates the industrial classification (A=Civil Engineering, B=Mechanical, C=Electrical, etc.).', + relatedFlavors: ['iso', 'plateau'], + docTypes: [ + { + key: 'japanese_industrial_standard', + title: 'Japanese Industrial Standard', + abbr: ['JIS'], + description: 'The primary JIS standard type, covering a letter-based classification system.', + examples: [ + { input: 'JIS A 0001:1999' }, + { input: 'JIS B 0205-2:2019' }, + { input: 'JIS C 60068-1:2019' }, + { input: 'JIS K 2238:2019' }, + ] + }, + { + key: 'standard', + title: 'Standard', + abbr: [''], + description: 'General JIS standards.', + examples: [ + { input: 'JIS Z 8801-1:2019' }, + ] + }, + { + key: 'technical_report', + title: 'Technical Report', + abbr: ['TR'], + description: 'JIS Technical Reports.', + examples: [ + { input: 'JIS TR B 0001:2000' }, + ] + }, + { + key: 'technical_specification', + title: 'Technical Specification', + abbr: ['TS'], + description: 'JIS Technical Specifications.', + examples: [ + { input: 'JIS TS Z 0001:2000' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['Amd', 'AM'], + description: 'Amendments to JIS standards.', + examples: [ + { input: 'JIS B 0205-2:2019/AM 1:2021' }, + ] + }, + { + key: 'explanation', + title: 'Explanation', + abbr: ['Exp'], + description: 'Explanatory documents for JIS standards.', + examples: [ + { input: 'JIS Exp A 0001:2000' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'JIS' }, + { name: 'Classification Letter', description: 'Industrial classification letter (A-Z)', attribute: 'classification' }, + { name: 'Number', description: 'The document number' }, + { name: 'Part', description: 'Part number' }, + { name: 'Year', description: 'Publication year' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies a JIS standard', syntax: 'JIS [Letter] [Number]:[Year]/AM [N]:[Year]', example: 'JIS B 0205-2:2019/AM 1:2021' }, + { type: 'Part', description: 'Multi-part standard', syntax: 'JIS [Letter] [Number]-[Part]:[Year]', example: 'JIS B 0205-2:2019' }, + ], + }, + // ─── INDUSTRY ────────────────────────────────────────────────── + { + flavor: 'astm', + logo: '/logos/astm-logo.svg', + name: 'ASTM', + fullName: 'ASTM International', + category: 'industry', + description: 'ASTM International (formerly American Society for Testing and Materials) is one of the largest voluntary standards development organizations in the world. ASTM standards cover a wide range of materials, products, systems, and services.', + website: 'https://www.astm.org', + syntaxNotes: 'ASTM identifiers follow the pattern: ASTM [Type] [Number]-[Year]. Joint standards use ISO/ASTM prefix. Types include no prefix (Standard), TR (Technical Report), ADJ (Adjunct).', + relatedFlavors: ['iso', 'ansi'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: [''], + description: 'ASTM Standards defining test methods, specifications, practices, guides, and terminologies.', + examples: [ + { input: 'ASTM A36/A36M-19' }, + { input: 'ASTM C150/C150M-22' }, + { input: 'ASTM D638-22' }, + { input: 'ASTM E8/E8M-22' }, + ] + }, + { + key: 'adjunct', + title: 'Adjunct', + abbr: ['ADJ'], + description: 'ASTM Adjuncts provide supplementary material to standards.', + examples: [ + { input: 'ASTM ADJD2148' }, + { input: 'ASTM ADJF3504-EA' }, + ] + }, + { + key: 'monograph', + title: 'Monograph', + abbr: ['MONO'], + description: 'ASTM Monographs are in-depth publications on specific topics.', + examples: [ + { input: 'ASTM MONO1-EB' }, + { input: 'ASTM MONO2-EB' }, + ] + }, + { + key: 'technical_report', + title: 'Technical Report', + abbr: ['TR'], + description: 'ASTM Technical Reports.', + examples: [ + { input: 'ISO/ASTM TR 52916-EB' }, + { input: 'ISO/ASTM TR 52952-EB' }, + ] + }, + { + key: 'manual', + title: 'Manual', + abbr: ['MAN'], + description: 'ASTM Manuals provide practical guidance.', + examples: [ + { input: 'ASTM MAN 1' }, + ] + }, + { + key: 'research_report', + title: 'Research Report', + abbr: ['RR'], + description: 'ASTM Research Reports documenting original research.', + examples: [ + { input: 'ASTM RR:C01-1001' }, + ] + }, + { + key: 'data_series', + title: 'Data Series', + abbr: ['DS'], + description: 'ASTM Data Series publications.', + examples: [ + { input: 'ASTM DS 1' }, + ] + }, + { + key: 'iso_dual_published', + title: 'ISO/ASTM Dual-Published', + abbr: ['ISO/ASTM'], + description: 'Standards jointly published by ISO and ASTM.', + examples: [ + { input: 'ISO/ASTM 52900:2021' }, + { input: 'ISO/ASTM 52901:2017' }, + ] + }, + { + key: 'work_in_progress', + title: 'Work in Progress', + abbr: ['WIP'], + description: 'ASTM standards under development.', + examples: [ + { input: 'ASTM WK12345' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'ASTM or ISO/ASTM' }, + { name: 'Number', description: 'The standard number' }, + { name: 'Year', description: 'Publication year' }, + { name: 'Designation', description: 'Grade designation (e.g., A36M)', attribute: 'designation' }, + ], + algebra: [ + { type: 'Dual Publication', description: 'Joint ISO/ASTM standard', syntax: 'ISO/ASTM [Number]:[Year]', example: 'ISO/ASTM 52900:2021' }, + ], + }, + { + flavor: 'ashrae', + logo: '/logos/ashrae-logo.svg', + name: 'ASHRAE', + fullName: 'American Society of Heating, Refrigerating and Air-Conditioning Engineers', + category: 'industry', + description: 'ASHRAE is a global professional society advancing heating, ventilation, air conditioning, and refrigeration (HVAC&R) systems. ASHRAE Standards establish minimum requirements for energy efficiency, indoor air quality, and building systems.', + website: 'https://www.ashrae.org', + syntaxNotes: 'ASHRAE identifiers follow patterns like: ASHRAE Standard [Number]-[Year], ASHRAE Guideline [Number]-[Year], with addenda appended.', + relatedFlavors: ['ansi', 'amca'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: ['Standard'], + description: 'ASHRAE Standards define requirements for HVAC&R systems, energy efficiency, and indoor environmental quality.', + examples: [ + { input: 'ASHRAE Standard 15-2019' }, + { input: 'ASHRAE Standard 90.1-2022' }, + { input: 'ASHRAE Standard 62.1-2022' }, + { input: 'ASHRAE Standard 55-2023' }, + ] + }, + { + key: 'guideline', + title: 'Guideline', + abbr: ['Guideline'], + description: 'ASHRAE Guidelines provide recommendations and best practices.', + examples: [ + { input: 'ASHRAE Guideline 0-2019' }, + { input: 'ASHRAE Guideline 1.4-2019' }, + { input: 'ASHRAE Guideline 10-2011' }, + ] + }, + { + key: 'addendum', + title: 'Addendum', + abbr: ['Addendum'], + description: 'Individual addenda to ASHRAE Standards or Guidelines.', + examples: [ + { input: 'ASHRAE Addendum a to Guideline 1.4-2019' }, + { input: 'ASHRAE Guideline 10-2011 Addendum e' }, + ] + }, + { + key: 'combined_addenda', + title: 'Combined Addenda', + abbr: ['Addenda'], + description: 'Combined multiple addenda packages.', + examples: [ + { input: 'ASHRAE Guideline 0: Addenda a, b, c, d' }, + ] + }, + { + key: 'addenda_package', + title: 'Addenda Package', + abbr: ['Addenda Package'], + description: 'A package of multiple addenda.', + examples: [ + { input: 'ASHRAE Standard 15-2007 Addenda Supplement Package' }, + ] + }, + { + key: 'errata', + title: 'Errata', + abbr: ['Errata'], + description: 'Corrections to published ASHRAE documents.', + examples: [ + { input: 'ASHRAE Errata to Standard 90.1-2022' }, + ] + }, + { + key: 'interpretation', + title: 'Interpretation', + abbr: ['Interp'], + description: 'Official ASHRAE interpretations of standards requirements.', + examples: [ + { input: 'ASHRAE Interpretation IC 62.1-2016-1' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'ASHRAE' }, + { name: 'Type', description: 'Standard or Guideline' }, + { name: 'Number', description: 'The standard/guideline number' }, + { name: 'Year', description: 'Publication year' }, + { name: 'Addendum Letter', description: 'Letter designation for addenda' }, + ], + algebra: [ + { type: 'Addendum', description: 'Individual modification to a standard', syntax: 'ASHRAE Addendum [Letter] to [Type] [Number]-[Year]', example: 'ASHRAE Addendum a to Guideline 1.4-2019' }, + { type: 'Combined Addenda', description: 'Multiple addenda combined', syntax: 'ASHRAE [Type] [Number]: Addenda [Letters]', example: 'ASHRAE Guideline 0: Addenda a, b, c, d' }, + { type: 'Errata', description: 'Correction', syntax: 'ASHRAE Errata to [Type] [Number]-[Year]', example: 'ASHRAE Errata to Standard 90.1-2022' }, + ], + }, + { + flavor: 'asme', + logo: '/logos/asme-logo.svg', + name: 'ASME', + fullName: 'American Society of Mechanical Engineers', + category: 'industry', + description: 'ASME is a professional association that promotes the art, science, and practice of multidisciplinary engineering. ASME standards cover pressure technology, nuclear power, piping, and many other mechanical engineering applications.', + website: 'https://www.asme.org', + syntaxNotes: 'ASME identifiers follow patterns like: ASME [Code] [Number]-[Year], ASME [Section] [Number]-[Year]. Draft standards include revision notes.', + relatedFlavors: ['ansi', 'astm'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: [''], + description: 'ASME Standards covering mechanical engineering specifications and requirements.', + examples: [ + { input: 'ASME B18.3-2022' }, + { input: 'ASME Y14.43-2021' }, + { input: 'ASME B18.3-20XX [Draft Proposed Revision of ASME B18.3-2012 (R2017)]' }, + { input: 'ASME Y14.43-20XX [Revision of ASME Y14.43-2011 (R2020)]' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'ASME' }, + { name: 'Number', description: 'The standard number' }, + { name: 'Year', description: 'Publication year' }, + { name: 'Revision', description: 'Revision information in brackets' }, + ], + algebra: [], + }, + { + flavor: 'ccsds', + logo: '/logos/ccsds-logo.svg', + name: 'CCSDS', + fullName: 'Consultative Committee for Space Data Systems', + category: 'industry', + description: 'CCSDS is a multinational forum for the development of communications and data systems standards for spaceflight. CCSDS standards are used by major space agencies worldwide.', + website: 'https://www.ccsds.org', + syntaxNotes: 'CCSDS identifiers follow the pattern: CCSDS [Number].[Issue]-[Category]-[Version]-[Status]. Categories include B (Blue Book = Recommended Standard), G (Green Book = Recommended Practice), M (Magenta Book = Report).', + relatedFlavors: ['iso'], + docTypes: [ + { + key: 'base', + title: 'Base Document', + abbr: ['B', 'G', 'M'], + description: 'CCSDS documents categorized by color: B (Blue Book, Recommended Standard), G (Green Book, Recommended Practice), M (Magenta Book, Report).', + examples: [ + { input: 'CCSDS 100.0-G-1-S' }, + { input: 'CCSDS 101.0-B-1-S' }, + { input: 'CCSDS 121.0-B-1-S' }, + { input: 'CCSDS 132.0-B-2-S' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['Cor'], + description: 'Corrections to CCSDS documents.', + examples: [ + { input: 'CCSDS 121.0-B-1-S Cor. 1' }, + { input: 'CCSDS 121.0-B-1-S Cor. 2' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'CCSDS' }, + { name: 'Number', description: 'Document number with decimal (e.g., 100.0)' }, + { name: 'Category', description: 'B (Blue/Standard), G (Green/Practice), M (Magenta/Report)' }, + { name: 'Issue', description: 'Issue number after the category letter' }, + { name: 'Status', description: 'S (Superseded), blank (current)' }, + ], + algebra: [ + { type: 'Corrigendum', description: 'Corrects errors in CCSDS documents', syntax: 'CCSDS [Number]-[Category]-[Issue]-[Status] Cor. [N]', example: 'CCSDS 121.0-B-1-S Cor. 1' }, + ], + }, + { + flavor: 'cie', + logo: '/logos/cie-logo.svg', + name: 'CIE', + fullName: 'International Commission on Illumination', + category: 'industry', + description: 'The CIE (Commission Internationale de l\'Eclairage) is an independent, non-profit organization devoted to international cooperation and exchange of information on matters related to light, lighting, and color.', + website: 'https://www.cie.co.at', + syntaxNotes: 'CIE identifiers use numeric identifiers: CIE [Number]:[Year], CIE [Number]-[Part]:[Year]. Joint publications include CIE ISO prefix.', + relatedFlavors: ['iso'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: [''], + description: 'CIE Standards defining specifications for lighting and color.', + examples: [ + { input: 'CIE 232:2019' }, + { input: 'CIE 198-SP1.1:2011' }, + ] + }, + { + key: 'joint_published', + title: 'Joint Published', + abbr: ['CIE ISO'], + description: 'Standards jointly published with ISO.', + examples: [ + { input: 'CIE ISO 10916:2024' }, + { input: 'CIE ISO 11664-1:2019' }, + ] + }, + { + key: 'dual_published', + title: 'Dual Published', + abbr: ['Dual'], + description: 'Dual-published with another organization.', + examples: [ + { input: 'CIE S 023/E:2020' }, + ] + }, + { + key: 'identical', + title: 'Identical', + abbr: ['Ident'], + description: 'Identical adoption of another standard.', + examples: [ + { input: 'CIE Ident 1:2020' }, + ] + }, + { + key: 'conference', + title: 'Conference', + abbr: ['Conf'], + description: 'CIE Conference proceedings.', + examples: [ + { input: 'CIE Conf 1:2020' }, + ] + }, + { + key: 'bundle', + title: 'Bundle', + abbr: ['Bundle'], + description: 'Bundled CIE publications.', + examples: [ + { input: 'CIE 198-SP1.1:2011,198-SP1.2:2011,198-SP1.3:2011,198-SP1.4:2011' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['Cor'], + description: 'Corrections to CIE publications.', + examples: [ + { input: 'CIE 198-SP1.4:2011/Cor1:2013' }, + { input: 'CIE 232:2019/Cor1:2020' }, + ] + }, + { + key: 'supplement', + title: 'Supplement', + abbr: ['SP'], + description: 'Supplements to CIE publications.', + examples: [ + { input: 'CIE 198-SP1.1:2011' }, + ] + }, + { + key: 'tutorial_bundle', + title: 'Tutorial Bundle', + abbr: ['TB'], + description: 'CIE Tutorial Bundles.', + examples: [ + { input: 'CIE TB 1:2020' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'CIE' }, + { name: 'Number', description: 'The publication number' }, + { name: 'Part', description: 'Supplement/part number' }, + { name: 'Year', description: 'Publication year' }, + { name: 'Language', description: 'Language code', attribute: 'language' }, + ], + algebra: [ + { type: 'Corrigendum', description: 'Corrects errors', syntax: 'CIE [Number]:[Year]/Cor[N]:[Year]', example: 'CIE 232:2019/Cor1:2020' }, + { type: 'Bundle', description: 'Multiple documents bundled', syntax: 'CIE [Number],[Number],...', example: 'CIE 198-SP1.1:2011,198-SP1.2:2011' }, + { type: 'Joint Publication', description: 'Published jointly with ISO', syntax: 'CIE ISO [Number]:[Year]', example: 'CIE ISO 10916:2024' }, + ], + }, + { + flavor: 'csa', + logo: '/logos/csa-logo.svg', + name: 'CSA', + fullName: 'CSA Group', + category: 'national', + description: 'CSA Group is a global organization dedicated to safety, social good, and sustainability. CSA develops standards for a wide range of products and services, with particular strength in electrical, gas, and construction standards.', + website: 'https://www.csagroup.org', + syntaxNotes: 'CSA identifiers follow patterns: CSA [Number]:[Year], CAN/CSA-[Number]:[Year] (Canadian national), CSA-[Number]:[Year]. Combined identifiers use / separator.', + relatedFlavors: ['ieee', 'iec', 'bsi'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: [''], + description: 'CSA Standards defining requirements for products and services.', + examples: [ + { input: 'CSA Z662:23' }, + { input: 'CSA A23.1:24' }, + { input: 'CSA N285.0:23' }, + ] + }, + { + key: 'canadian_adopted', + title: 'Canadian Adopted Standard', + abbr: ['CAN/CSA'], + description: 'Canadian national adoption of standards, prefixed with CAN/.', + examples: [ + { input: 'CAN/CSA-ISO 9001:2016' }, + { input: 'CAN/CSA-C22.2 No. 60601-1-6:11' }, + ] + }, + { + key: 'csa_adopted', + title: 'CSA Adopted Standard', + abbr: ['CSA Adopted'], + description: 'CSA adoption of another organization\'s standard.', + examples: [ + { input: 'CSA-ISO 9001:2016' }, + ] + }, + { + key: 'combined', + title: 'Combined Standard', + abbr: ['Combined'], + description: 'Combined documents with multiple designations using / separator.', + examples: [ + { input: 'CSA A23.1:24/CSA A23.2:24' }, + { input: 'CSA N285.0:23/CSA N285.6 SERIES:23' }, + ] + }, + { + key: 'bundled', + title: 'Bundled Standard', + abbr: ['Bundled'], + description: 'Multiple documents bundled with + separator.', + examples: [ + { input: 'CAN/CSA-C22.2 NO. 60601-1-6:11 + A1:15 + A2:21 (R2021) (CONSOLIDATED)' }, + ] + }, + { + key: 'series', + title: 'Series', + abbr: ['SERIES'], + description: 'Series designation for related standards.', + examples: [ + { input: 'CSA N285.6 SERIES:23' }, + ] + }, + { + key: 'package', + title: 'Package', + abbr: ['PKG'], + description: 'Packaged set of standards.', + examples: [ + { input: 'CSA PKG A23.1:24' }, + ] + }, + { + key: 'cec', + title: 'CEC', + abbr: ['CEC'], + description: 'California Energy Commission related standards.', + examples: [ + { input: 'CEC-400-2021-001' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'CSA, CAN/CSA' }, + { name: 'Number', description: 'The standard number' }, + { name: 'Year', description: 'Publication year (2 or 4 digit)' }, + { name: 'Adoption Prefix', description: 'CAN/ prefix for Canadian adoption', attribute: 'adoption_prefix' }, + ], + algebra: [ + { type: 'Adoption', description: 'Adoption of international standard', syntax: 'CAN/CSA-[Source] [Number]:[Year]', example: 'CAN/CSA-ISO 9001:2016' }, + { type: 'Combined', description: 'Multiple standards combined', syntax: 'CSA [Number]:[Year]/CSA [Number]:[Year]', example: 'CSA A23.1:24/CSA A23.2:24' }, + { type: 'Bundled', description: 'Documents bundled with amendments', syntax: 'CSA [Number]:[Year] + A[N]:[Year]', example: 'CAN/CSA-C22.2 NO. 60601-1-6:11 + A1:15 + A2:21' }, + ], + }, + { + flavor: 'oiml', + logo: '/logos/oiml-logo.svg', + name: 'OIML', + fullName: 'International Organization of Legal Metrology', + category: 'international', + description: 'OIML is an intergovernmental treaty organization that develops model regulations, standards, and related documents for legal metrology (measurement standards and instruments).', + website: 'https://www.oiml.org', + syntaxNotes: 'OIML identifiers follow the pattern: OIML [Type] [Number]:[Year]. Types include R (Recommendation), D (Document), G (Guide), V (Vocabulary), B (Basic Publication).', + relatedFlavors: ['iso', 'jcgm'], + docTypes: [ + { + key: 'recommendation', + title: 'Recommendation', + abbr: ['R'], + description: 'OIML International Recommendations are model regulations establishing requirements for measuring instruments.', + examples: [ + { input: 'OIML R 76-1:2006' }, + { input: 'OIML R 138:2007' }, + { input: 'OIML R 49-1:2006' }, + ] + }, + { + key: 'document', + title: 'Document', + abbr: ['D'], + description: 'OIML International Documents provide guidance on legal metrology matters.', + examples: [ + { input: 'OIML D 11:2008' }, + { input: 'OIML D 11:2013' }, + ] + }, + { + key: 'guide', + title: 'Guide', + abbr: ['G'], + description: 'OIML Guides providing guidance on specific aspects of legal metrology.', + examples: [ + { input: 'OIML G 1-100:2008' }, + { input: 'OIML G 14:2011' }, + ] + }, + { + key: 'basic_publication', + title: 'Basic Publication', + abbr: ['B'], + description: 'OIML Basic Publications providing fundamental reference material.', + examples: [ + { input: 'OIML B 1:2020' }, + ] + }, + { + key: 'vocabulary', + title: 'Vocabulary', + abbr: ['V'], + description: 'OIML Vocabularies defining terms used in legal metrology.', + examples: [ + { input: 'OIML V 1:2000' }, + { input: 'OIML V 2-200:2012' }, + ] + }, + { + key: 'expert_report', + title: 'Expert Report', + abbr: ['E'], + description: 'OIML Expert Reports.', + examples: [ + { input: 'OIML E 1:2004' }, + ] + }, + { + key: 'seminar_report', + title: 'Seminar Report', + abbr: ['S'], + description: 'OIML Seminar Reports.', + examples: [ + { input: 'OIML S 1:2000' }, + ] + }, + { + key: 'bulletin', + title: 'Bulletin', + abbr: ['Bulletin'], + description: 'The OIML Bulletin is the periodical of the International Organization of Legal Metrology, published since 1960 (Volume I). It has a four-tier hierarchy: periodical (OIML Bulletin), volume/year (OIML Bulletin 1960), issue (OIML Bulletin 1960-03), and article (OIML Bulletin 1960-03-01). Each article also has a citation form combining roman volume, parenthesised issue, and 8-digit article id (OIML Bulletin LXVII(2) 20260211).', + examples: [ + { input: 'OIML Bulletin' }, + { input: 'OIML Bulletin 1960' }, + { input: 'OIML Bulletin 1960-03' }, + { input: 'OIML Bulletin 1960-03-01' }, + { input: 'OIML Bulletin LXVII(2) 20260211' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['Amd'], + description: 'Amendments to OIML publications.', + examples: [ + { input: 'Amendment (2009) to OIML R 138 Edition 2007 (E)' }, + { input: 'Amendment (2009) to OIML R 138:2007 (E)' }, + ] + }, + { + key: 'annex', + title: 'Annex', + abbr: ['Annex'], + description: 'Annexes to OIML publications.', + examples: [ + { input: 'OIML R 49-1 Annex A' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'OIML' }, + { name: 'Type', description: 'R, D, G, V, B, E, S' }, + { name: 'Number', description: 'The publication number' }, + { name: 'Part', description: 'Part number' }, + { name: 'Year', description: 'Publication year' }, + { name: 'Edition', description: 'Edition indicator' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies an OIML publication', syntax: 'Amendment ([Year]) to OIML [Type] [Number]:[Year] (E)', example: 'Amendment (2009) to OIML R 138:2007 (E)' }, + { type: 'Annex', description: 'Annex to a publication', syntax: 'OIML [Type] [Number] Annex [Letter]', example: 'OIML R 49-1 Annex A' }, + { type: 'Part', description: 'Multi-part publication', syntax: 'OIML [Type] [Number]-[Part]:[Year]', example: 'OIML R 76-1:2006' }, + { type: 'Bulletin Issue', description: 'Issue of the OIML Bulletin periodical', syntax: 'OIML Bulletin [Year]-[Issue]', example: 'OIML Bulletin 1960-03' }, + { type: 'Bulletin Article', description: 'Structured article reference within an issue', syntax: 'OIML Bulletin [Year]-[Issue]-[Sequence]', example: 'OIML Bulletin 1960-03-01' }, + { type: 'Bulletin Citation', description: 'Citation form combining roman volume and article id', syntax: 'OIML Bulletin [RomanVolume]([Issue]) [ArticleID]', example: 'OIML Bulletin LXVII(2) 20260211' }, + ], + }, + { + flavor: 'jcgm', + logo: '/logos/jcgm-logo.svg', + name: 'JCGM', + fullName: 'Joint Committee for Guides in Metrology', + category: 'international', + description: 'The JCGM works to promote and harmonize metrology guidance, maintaining the Guide to the Expression of Uncertainty in Measurement (GUM) and the International Vocabulary of Metrology (VIM).', + website: 'https://www.bipm.org/en/committees/jc/jcgm', + syntaxNotes: 'JCGM identifiers follow: JCGM [Number]:[Year] or JCGM GUM-[Part]:[Year]. The GUM guides use the GUM prefix.', + relatedFlavors: ['iso', 'oiml'], + docTypes: [ + { + key: 'guide', + title: 'Guide', + abbr: [''], + description: 'JCGM Guides including the GUM (Guide to the Expression of Uncertainty in Measurement) and VIM (International Vocabulary of Metrology).', + examples: [ + { input: 'JCGM 100:2008' }, + { input: 'JCGM 101:2008' }, + { input: 'JCGM 102:2011' }, + { input: 'JCGM 200:2012' }, + ] + }, + { + key: 'gum_guide', + title: 'GUM Guide', + abbr: ['GUM'], + description: 'Specific GUM (Guide to the Expression of Uncertainty in Measurement) publications.', + examples: [ + { input: 'JCGM GUM-1:2022-11-28' }, + { input: 'JCGM GUM-6:2020' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['Amd'], + description: 'Amendments to JCGM guides.', + examples: [ + { input: 'JCGM 100:2008/Amd 1' }, + { input: 'JCGM 100:2008/Amd 1:2025-07-25' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'JCGM' }, + { name: 'Number', description: 'The guide number' }, + { name: 'Year', description: 'Publication year' }, + { name: 'Publisher Specific', description: 'JCGM publisher info', attribute: 'publisher' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies a JCGM guide', syntax: 'JCGM [Number]:[Year]/Amd [N]:[Date]', example: 'JCGM 100:2008/Amd 1:2025-07-25' }, + ], + }, + { + flavor: 'idf', + logo: '/logos/idf-logo.png', + name: 'IDF', + fullName: 'International Dairy Federation', + category: 'industry', + description: 'The IDF is a source of scientific and technical expertise for the global dairy sector. IDF standards and methods of analysis are used internationally.', + website: 'https://www.fil-idf.org', + syntaxNotes: 'IDF identifiers follow: IDF [Type] [Number]-[Part]:[Year]. Types include no prefix (Standard), RM (Reviewed Method). Joint ISO/IDF publications exist.', + relatedFlavors: ['iso'], + docTypes: [ + { + key: 'international_standard', + title: 'International Standard', + abbr: [''], + description: 'IDF International Standards for dairy products and methods.', + examples: [ + { input: 'IDF 148-1:2008' }, + { input: 'IDF 146:2003' }, + { input: 'IDF 140-1:2007' }, + ] + }, + { + key: 'reviewed_method', + title: 'Reviewed Method', + abbr: ['RM'], + description: 'IDF Reviewed Methods for dairy analysis.', + examples: [ + { input: 'IDF/RM 254:2022' }, + { input: 'IDF/RM 233-1:2017' }, + ] + }, + { + key: 'amendment', + title: 'Amendment', + abbr: ['AMD'], + description: 'Amendments to IDF publications.', + examples: [ + { input: 'IDF 146:2003/AMD 1:2023' }, + { input: 'IDF 140-1:2007/AMD 1:2012' }, + ] + }, + { + key: 'corrigendum', + title: 'Corrigendum', + abbr: ['COR'], + description: 'Corrections to IDF publications.', + examples: [ + { input: 'IDF 148-1:2008/COR 1:2009' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'IDF' }, + { name: 'Number', description: 'The publication number' }, + { name: 'Part', description: 'Part number' }, + { name: 'Year', description: 'Publication year' }, + ], + algebra: [ + { type: 'Amendment', description: 'Modifies an IDF standard', syntax: 'IDF [Number]:[Year]/AMD [N]:[Year]', example: 'IDF 146:2003/AMD 1:2023' }, + { type: 'Corrigendum', description: 'Corrects errors', syntax: 'IDF [Number]:[Year]/COR [N]:[Year]', example: 'IDF 148-1:2008/COR 1:2009' }, + ], + }, + { + flavor: 'api', + logo: '/logos/api-logo.svg', + name: 'API', + fullName: 'American Petroleum Institute', + category: 'industry', + description: 'API represents all segments of America\'s oil and natural gas industry. API Standards cover everything from drilling and production to refining and distribution of petroleum products.', + website: 'https://www.api.org', + syntaxNotes: 'API identifiers follow: API [Type] [Number]. Types include Std (Standard), RP (Recommended Practice), Spec (Specification), TR (Technical Report), Bull (Bulletin), Publ (Publication), MPMS (Manual of Petroleum Measurement Standards).', + relatedFlavors: ['ansi', 'astm'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: ['Std'], + description: 'API Standards for the petroleum industry.', + examples: [ + { input: 'API Std 650' }, + { input: 'API Std 620' }, + ] + }, + { + key: 'recommended_practice', + title: 'Recommended Practice', + abbr: ['RP'], + description: 'API Recommended Practices providing guidance.', + examples: [ + { input: 'API RP 500' }, + { input: 'API RP 14C' }, + ] + }, + { + key: 'specification', + title: 'Specification', + abbr: ['Spec'], + description: 'API Specifications defining product requirements.', + examples: [ + { input: 'API Spec 5L' }, + { input: 'API Spec 6A' }, + ] + }, + { + key: 'technical_report', + title: 'Technical Report', + abbr: ['TR'], + description: 'API Technical Reports.', + examples: [ + { input: 'API TR 21C' }, + { input: 'API TR 21TR2' }, + ] + }, + { + key: 'bulletin', + title: 'Bulletin', + abbr: ['BULL', 'Bul'], + description: 'API Bulletins providing technical information.', + examples: [ + { input: 'API BULL 11L2' }, + { input: 'API BULL 5100' }, + ] + }, + { + key: 'publication', + title: 'Publication', + abbr: ['PUBL', 'Publ'], + description: 'API Publications.', + examples: [ + { input: 'API PUBL 1628B' }, + { input: 'API PUBL 4527' }, + ] + }, + { + key: 'mpms', + title: 'Manual of Petroleum Measurement Standards', + abbr: ['MPMS'], + description: 'API MPMS chapters covering petroleum measurement.', + examples: [ + { input: 'API MPMS Chapter 4.1' }, + ] + }, + { + key: 'continuous_operations_standard', + title: 'Continuous Operations Standard', + abbr: ['COS'], + description: 'API standards for continuous operations in the petroleum industry.', + examples: [], + }, + { + key: 'typeless_standard', + title: 'Typeless Standard', + abbr: [], + description: 'API documents published without a type designation, identified by number only.', + examples: [ + { input: 'API 5L' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'API' }, + { name: 'Type', description: 'Std, RP, Spec, TR, Bull, Publ, MPMS, COS' }, + { name: 'Number', description: 'The document number' }, + ], + algebra: [], + }, + { + flavor: 'amca', + logo: '/logos/amca-logo.png', + name: 'AMCA', + fullName: 'Air Movement and Control Association', + category: 'industry', + description: 'AMCA International is a not-for-profit association of the world\'s manufacturers of air movement, air control, and air conditioning equipment. AMCA develops standards and test methods for these products.', + website: 'https://www.amca.org', + syntaxNotes: 'AMCA identifiers follow: AMCA [Type] [Number]-[Year] or ANSI/AMCA [Number]-[Year] for ANSI-accredited standards.', + relatedFlavors: ['ansi', 'ashrae'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: ['Standard'], + description: 'AMCA Standards for air movement and control equipment.', + examples: [ + { input: 'ANSI/AMCA Standard 210-16' }, + { input: 'ANSI/AMCA Standard 220-21' }, + ] + }, + { + key: 'publication', + title: 'Publication', + abbr: ['Publication'], + description: 'AMCA Publications providing technical information.', + examples: [ + { input: 'AMCA Publication 211-22 (Rev. 01-23)' }, + { input: 'AMCA Publication 311-16' }, + ] + }, + { + key: 'interpretation', + title: 'Interpretation', + abbr: ['Interp'], + description: 'AMCA Interpretations of standards.', + examples: [ + { input: 'AMCA 99 JW Interp' }, + { input: 'AMCA 99 KB Interp' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'AMCA, ANSI/AMCA' }, + { name: 'Number', description: 'The standard number' }, + { name: 'Year', description: 'Publication year (2 digit)' }, + ], + algebra: [], + }, + { + flavor: 'plateau', + logo: '/logos/plateau-logo.svg', + name: 'PLATEAU', + fullName: 'PLATEAU (MLIT Japan)', + category: 'national', + description: 'PLATEAU is a project by Japan\'s Ministry of Land, Infrastructure, Transport and Tourism (MLIT) that promotes the use of 3D city models for urban planning and management.', + website: 'https://www.mlit.go.jp/plateau', + syntaxNotes: 'PLATEAU identifiers follow: PLATEAU [Type] #[Number] [Edition]. Types include Handbook, Technical Report, Annex. Japanese edition numbering is used.', + relatedFlavors: ['jis'], + docTypes: [ + { + key: 'handbook', + title: 'Handbook', + abbr: ['Handbook'], + description: 'PLATEAU Handbooks providing guidance on 3D city model usage.', + examples: [ + { input: 'PLATEAU Handbook #00 第1.0版' }, + { input: 'PLATEAU Handbook #00 第2.0版' }, + ] + }, + { + key: 'technical_report', + title: 'Technical Report', + abbr: ['Technical Report'], + description: 'PLATEAU Technical Reports.', + examples: [ + { input: 'PLATEAU Technical Report #00' }, + { input: 'PLATEAU Technical Report #01' }, + ] + }, + { + key: 'annex', + title: 'Annex', + abbr: ['Annex'], + description: 'Annexes to PLATEAU Handbooks.', + examples: [ + { input: 'PLATEAU Handbook #00 Annex 1' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'PLATEAU' }, + { name: 'Number', description: 'Document number with # prefix' }, + { name: 'Edition', description: 'Edition in Japanese format (第X.X版)' }, + ], + algebra: [], + }, + { + flavor: 'sae', + logo: '/logos/sae-logo.svg', + name: 'SAE', + fullName: 'SAE International', + category: 'industry', + description: 'SAE International is a global association of engineers and technical experts in the aerospace, automotive, and commercial vehicle industries. SAE standards cover ground vehicles, aerospace, and other mobility engineering fields.', + website: 'https://www.sae.org', + syntaxNotes: 'SAE identifiers follow: SAE [Type] [Number]. Types include J (Ground Vehicle), AS (Aerospace), ARP (Aerospace Recommended Practice), AMS (Aerospace Material Specification).', + relatedFlavors: ['ansi', 'astm'], + docTypes: [ + { + key: 'standard', + title: 'Standard', + abbr: ['J', 'AS', 'ARP', 'AMS'], + description: 'SAE Standards covering ground vehicles (J-prefix), aerospace (AS-prefix), recommended practices (ARP), and material specifications (AMS).', + examples: [ + { input: 'SAE J3016' }, + { input: 'SAE AS9100D' }, + { input: 'SAE ARP4754A' }, + { input: 'SAE AMS5500' }, + ] + }, + ], + components: [ + { name: 'Publisher', description: 'SAE' }, + { name: 'Type Prefix', description: 'J, AS, ARP, AMS', attribute: 'type_prefix' }, + { name: 'Number', description: 'The standard number' }, + { name: 'Date', description: 'Publication date', attribute: 'date' }, + ], + algebra: [], + }, + { + flavor: 'adobe', + logo: '/logos/adobe-logo.svg', + name: 'Adobe', + fullName: 'Adobe Inc.', + category: 'industry', + description: "Adobe publishes foundational technical specifications for digital typography, font formats, and document interchange — including the Adobe Glyph List, PostScript Language Reference, CIDFont specifications, and the Adobe-Japan/Korea/CJK character collections. These underpin modern text rendering engines and CJK font workflows.", + website: 'https://www.adobe.com', + syntaxNotes: 'Adobe identifiers use two shapes: slug-keyed publications (Adobe Glyph List, Adobe-Japan1-7) and numbered Technical Notes (Adobe Technical Note #5014, ATN5014).', + relatedFlavors: ['iso'], + docTypes: [ + { + key: 'publication', + title: 'Publication', + abbr: [''], + description: 'Adobe named publications identified by a kebab-case slug, optionally versioned. Includes character collections (Adobe-Japan1), the Adobe Glyph List, and the PostScript Language Reference.', + examples: [ + { input: 'Adobe Glyph List' }, + { input: 'Adobe-Japan1-7' }, + { input: 'Adobe-Korea1-2' }, + { input: 'Adobe-CNS1-0' }, + { input: 'Adobe-GB1-5' }, + ], + }, + { + key: 'tech_note', + title: 'Technical Note', + abbr: ['ATN'], + description: 'Adobe Technical Notes are numbered 4-digit (typically 5xxx series) technical specifications such as AFM, CIDFont, and SFNT-Mask specifications. They have a formal citation form (Adobe Technical Note #5014) and a short alias (ATN5014) used in document anchors.', + examples: [ + { input: 'Adobe Technical Note #5014' }, + { input: 'ATN5014' }, + { input: 'Adobe Technical Note #5902' }, + ], + }, + ], + components: [ + { name: 'Publisher', description: 'Adobe' }, + { name: 'Slug', description: 'Kebab-case slug for publications (adobe-glyph-list, adobe-japan1)', attribute: 'slug' }, + { name: 'Number', description: '4-digit Technical Note number (5xxx series)', attribute: 'number' }, + { name: 'Version', description: 'Collection version (Adobe-Japan1-7 → version 7)', attribute: 'version' }, + ], + algebra: [ + { type: 'Short Alias', description: 'Anchor-id form used in cross-references', syntax: 'ATN[Number]', example: 'ATN5014' }, + { type: 'Citation Form', description: 'Formal citation form', syntax: 'Adobe Technical Note #[Number]', example: 'Adobe Technical Note #5014' }, + { type: 'Collection Version', description: 'Character collection with version', syntax: 'Adobe-[Collection]-[Version]', example: 'Adobe-Japan1-7' }, + ], + }, +] + +// Helpers +export function getPublishersByCategory(category: string): Publisher[] { + return publishers.filter(p => p.category === category) +} + +export function getPublisher(flavor: string): Publisher | undefined { + return publishers.find(p => p.flavor === flavor) +} + +export const internationalPublishers = getPublishersByCategory('international') +export const regionalPublishers = getPublishersByCategory('regional') +export const nationalPublishers = getPublishersByCategory('national') +export const industryPublishers = getPublishersByCategory('industry') diff --git a/src/data/flavors/adobe.ts b/src/data/flavors/adobe.ts new file mode 100644 index 0000000..9e00f19 --- /dev/null +++ b/src/data/flavors/adobe.ts @@ -0,0 +1,79 @@ +import type { Publisher } from '../types' + +export const adobe: Publisher = { + flavor: "adobe", + logo: "/logos/adobe-logo.svg", + name: "Adobe", + fullName: "Adobe Inc.", + category: "industry", + description: "Adobe publishes foundational technical specifications for digital typography, font formats, and document interchange — including the Adobe Glyph List, PostScript Language Reference, CIDFont specifications, and the Adobe-Japan/Korea/CJK character collections. These underpin modern text rendering engines and CJK font workflows.", + website: "https://www.adobe.com", + syntaxNotes: "Adobe identifiers use two shapes: slug-keyed publications (Adobe Glyph List, Adobe-Japan1-7) and numbered Technical Notes (Adobe Technical Note #5014, ATN5014).", + relatedFlavors: ["iso"], + docTypes: [ + { + key: "publication", + title: "Publication", + abbr: [""], + description: "Adobe named publications identified by a kebab-case slug, optionally versioned. Includes character collections (Adobe-Japan1), the Adobe Glyph List, and the PostScript Language Reference.", + examples: [ + { input: "Adobe Glyph List" }, + { input: "Adobe-Japan1-7" }, + { input: "Adobe-Korea1-2" }, + { input: "Adobe-CNS1-0" }, + { input: "Adobe-GB1-5" }, + ], + }, + { + key: "tech_note", + title: "Technical Note", + abbr: ["ATN"], + description: "Adobe Technical Notes are numbered 4-digit (typically 5xxx series) technical specifications such as AFM, CIDFont, and SFNT-Mask specifications. They have a formal citation form (Adobe Technical Note #5014) and a short alias (ATN5014) used in document anchors.", + examples: [ + { input: "Adobe Technical Note #5014" }, + { input: "ATN5014" }, + { input: "Adobe Technical Note #5902" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "Adobe", + dataType: "enum", + values: ["Adobe"], + example: "Adobe", + }, + { + name: "Slug", + description: "Kebab-case slug for publications (adobe-glyph-list, adobe-japan1)", + attribute: "slug", + dataType: "string", + format: "Kebab-case slug for named publications (adobe-glyph-list, adobe-japan1).", + example: "adobe-japan1", + }, + { + name: "Number", + description: "4-digit Technical Note number (5xxx series)", + attribute: "number", + dataType: "integer", + format: "4-digit Technical Note number, typically 5xxx series.", + example: "5014", + }, + { + name: "Version", + description: "Collection version (Adobe-Japan1-7 → version 7)", + attribute: "version", + dataType: "integer", + format: "Collection version (Adobe-Japan1-7 → version 7).", + example: "7", + }, +], + algebra: [ + { type: "Short Alias", description: "Anchor-id form used in cross-references", syntax: "ATN[Number]", example: "ATN5014" }, + { type: "Citation Form", description: "Formal citation form", syntax: "Adobe Technical Note #[Number]", example: "Adobe Technical Note #5014" }, + { type: "Collection Version", description: "Character collection with version", syntax: "Adobe-[Collection]-[Version]", example: "Adobe-Japan1-7" }, +], +} + +export default adobe diff --git a/src/data/flavors/amca.ts b/src/data/flavors/amca.ts new file mode 100644 index 0000000..7c216ba --- /dev/null +++ b/src/data/flavors/amca.ts @@ -0,0 +1,72 @@ +import type { Publisher } from '../types' + +export const amca: Publisher = { + flavor: "amca", + logo: "/logos/amca-logo.png", + name: "AMCA", + fullName: "Air Movement and Control Association", + category: "industry", + description: "AMCA International is a not-for-profit association of the world's manufacturers of air movement, air control, and air conditioning equipment. AMCA develops standards and test methods for these products.", + website: "https://www.amca.org", + syntaxNotes: "AMCA identifiers follow: AMCA [Type] [Number]-[Year] or ANSI/AMCA [Number]-[Year] for ANSI-accredited standards.", + relatedFlavors: ["ansi", "ashrae"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: ["Standard"], + description: "AMCA Standards for air movement and control equipment.", + examples: [ + { input: "ANSI/AMCA Standard 210-16" }, + { input: "ANSI/AMCA Standard 220-21" }, + ], + }, + { + key: "publication", + title: "Publication", + abbr: ["Publication"], + description: "AMCA Publications providing technical information.", + examples: [ + { input: "AMCA Publication 211-22 (Rev. 01-23)" }, + { input: "AMCA Publication 311-16" }, + ], + }, + { + key: "interpretation", + title: "Interpretation", + abbr: ["Interp"], + description: "AMCA Interpretations of standards.", + examples: [ + { input: "AMCA 99 JW Interp" }, + { input: "AMCA 99 KB Interp" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "AMCA, ANSI/AMCA", + dataType: "enum", + values: ["AMCA"], + example: "AMCA", + }, + { + name: "Number", + description: "The standard number", + dataType: "integer", + format: "1–3 digit number.", + example: "210", + }, + { + name: "Year", + description: "Publication year (2 digit)", + dataType: "year", + format: "4-digit year, preceded by hyphen.", + example: "2022", + }, +], + algebra: [ +], +} + +export default amca diff --git a/src/data/flavors/ansi.ts b/src/data/flavors/ansi.ts new file mode 100644 index 0000000..b4759ad --- /dev/null +++ b/src/data/flavors/ansi.ts @@ -0,0 +1,64 @@ +import type { Publisher } from '../types' + +export const ansi: Publisher = { + flavor: "ansi", + logo: "/logos/ansi-logo.svg", + name: "ANSI", + fullName: "American National Standards Institute", + category: "national", + description: "ANSI oversees the creation, promulgation, and use of thousands of norms and guidelines that directly impact businesses in nearly every sector. ANSI is also actively engaged in accrediting programs that assess conformance to standards.", + website: "https://www.ansi.org", + syntaxNotes: "ANSI identifiers follow simple patterns: ANSI [Number]-[Year] or ANSI/[Developer] [Number]-[Year].", + relatedFlavors: ["ieee", "astm", "asme", "nist"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: [""], + description: "ANSI American National Standards.", + examples: [ + { input: "ANSI 802.3-2012" }, + { input: "ANSI C135.14-1979" }, + { input: "ANSI Z49.1:2012" }, + ], + }, + { + key: "american_national_standard", + title: "American National Standard", + abbr: ["ANS"], + description: "Formally designated American National Standards.", + examples: [ + { input: "ANSI/AAMI ST79:2017" }, + { input: "ANSI/ASHRAE 15-2019" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "ANSI, or ANSI/[Developer]", + dataType: "enum", + values: ["ANSI", "ANSI/[Developer]"], + format: "Developer can be AAMI, ASHRAE, etc.", + example: "ANSI", + }, + { + name: "Number", + description: "The standard number", + dataType: "string", + format: "Alphanumeric identifier.", + example: "802.3", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by hyphen or colon.", + example: "2012", + }, +], + algebra: [ +], +} + +export default ansi diff --git a/src/data/flavors/api.ts b/src/data/flavors/api.ts new file mode 100644 index 0000000..7bf4600 --- /dev/null +++ b/src/data/flavors/api.ts @@ -0,0 +1,127 @@ +import type { Publisher } from '../types' + +export const api: Publisher = { + flavor: "api", + logo: "/logos/api-logo.svg", + name: "API", + fullName: "American Petroleum Institute", + category: "industry", + description: "API represents all segments of America's oil and natural gas industry. API Standards cover everything from drilling and production to refining and distribution of petroleum products.", + website: "https://www.api.org", + syntaxNotes: "API identifiers follow: API [Type] [Number]. Types include Std (Standard), RP (Recommended Practice), Spec (Specification), TR (Technical Report), Bull (Bulletin), Publ (Publication), MPMS (Manual of Petroleum Measurement Standards).", + relatedFlavors: ["ansi", "astm"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: ["Std"], + description: "API Standards for the petroleum industry.", + examples: [ + { input: "API Std 650" }, + { input: "API Std 620" }, + ], + }, + { + key: "recommended_practice", + title: "Recommended Practice", + abbr: ["RP"], + description: "API Recommended Practices providing guidance.", + examples: [ + { input: "API RP 500" }, + { input: "API RP 14C" }, + ], + }, + { + key: "specification", + title: "Specification", + abbr: ["Spec"], + description: "API Specifications defining product requirements.", + examples: [ + { input: "API Spec 5L" }, + { input: "API Spec 6A" }, + ], + }, + { + key: "technical_report", + title: "Technical Report", + abbr: ["TR"], + description: "API Technical Reports.", + examples: [ + { input: "API TR 21C" }, + { input: "API TR 21TR2" }, + ], + }, + { + key: "bulletin", + title: "Bulletin", + abbr: ["BULL", "Bul"], + description: "API Bulletins providing technical information.", + examples: [ + { input: "API BULL 11L2" }, + { input: "API BULL 5100" }, + ], + }, + { + key: "publication", + title: "Publication", + abbr: ["PUBL", "Publ"], + description: "API Publications.", + examples: [ + { input: "API PUBL 1628B" }, + { input: "API PUBL 4527" }, + ], + }, + { + key: "mpms", + title: "Manual of Petroleum Measurement Standards", + abbr: ["MPMS"], + description: "API MPMS chapters covering petroleum measurement.", + examples: [ + { input: "API MPMS Chapter 4.1" }, + ], + }, + { + key: "continuous_operations_standard", + title: "Continuous Operations Standard", + abbr: ["COS"], + description: "API standards for continuous operations in the petroleum industry.", + examples: [], + }, + { + key: "typeless_standard", + title: "Typeless Standard", + abbr: [], + description: "API documents published without a type designation, identified by number only.", + examples: [ + { input: "API 5L" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "API", + dataType: "enum", + values: ["API"], + example: "API", + }, + { + name: "Type", + description: "Std, RP, Spec, TR, Bull, Publ, MPMS, COS", + dataType: "enum", + values: ["Std (Standard)", "RP (Recommended Practice)", "Spec (Specification)", "TR (Technical Report)", "Bul (Bulletin)", "Pub (Publication)", "G (Guide)"], + example: "RP", + }, + { + name: "Number", + description: "The document number", + dataType: "string", + format: "Type-specific numbering. May include letters.", + example: "500", + }, +], + algebra: [ +], +} + +export default api diff --git a/src/data/flavors/ashrae.ts b/src/data/flavors/ashrae.ts new file mode 100644 index 0000000..adbb200 --- /dev/null +++ b/src/data/flavors/ashrae.ts @@ -0,0 +1,125 @@ +import type { Publisher } from '../types' + +export const ashrae: Publisher = { + flavor: "ashrae", + logo: "/logos/ashrae-logo.svg", + name: "ASHRAE", + fullName: "American Society of Heating, Refrigerating and Air-Conditioning Engineers", + category: "industry", + description: "ASHRAE is a global professional society advancing heating, ventilation, air conditioning, and refrigeration (HVAC&R) systems. ASHRAE Standards establish minimum requirements for energy efficiency, indoor air quality, and building systems.", + website: "https://www.ashrae.org", + syntaxNotes: "ASHRAE identifiers follow patterns like: ASHRAE Standard [Number]-[Year], ASHRAE Guideline [Number]-[Year], with addenda appended.", + relatedFlavors: ["ansi", "amca"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: ["Standard"], + description: "ASHRAE Standards define requirements for HVAC&R systems, energy efficiency, and indoor environmental quality.", + examples: [ + { input: "ASHRAE Standard 15-2019" }, + { input: "ASHRAE Standard 90.1-2022" }, + { input: "ASHRAE Standard 62.1-2022" }, + { input: "ASHRAE Standard 55-2023" }, + ], + }, + { + key: "guideline", + title: "Guideline", + abbr: ["Guideline"], + description: "ASHRAE Guidelines provide recommendations and best practices.", + examples: [ + { input: "ASHRAE Guideline 0-2019" }, + { input: "ASHRAE Guideline 1.4-2019" }, + { input: "ASHRAE Guideline 10-2011" }, + ], + }, + { + key: "addendum", + title: "Addendum", + abbr: ["Addendum"], + description: "Individual addenda to ASHRAE Standards or Guidelines.", + examples: [ + { input: "ASHRAE Addendum a to Guideline 1.4-2019" }, + { input: "ASHRAE Guideline 10-2011 Addendum e" }, + ], + }, + { + key: "combined_addenda", + title: "Combined Addenda", + abbr: ["Addenda"], + description: "Combined multiple addenda packages.", + examples: [ + { input: "ASHRAE Guideline 0: Addenda a, b, c, d" }, + ], + }, + { + key: "addenda_package", + title: "Addenda Package", + abbr: ["Addenda Package"], + description: "A package of multiple addenda.", + examples: [ + { input: "ASHRAE Standard 15-2007 Addenda Supplement Package" }, + ], + }, + { + key: "errata", + title: "Errata", + abbr: ["Errata"], + description: "Corrections to published ASHRAE documents.", + examples: [ + { input: "ASHRAE Errata to Standard 90.1-2022" }, + ], + }, + { + key: "interpretation", + title: "Interpretation", + abbr: ["Interp"], + description: "Official ASHRAE interpretations of standards requirements.", + examples: [ + { input: "ASHRAE Interpretation IC 62.1-2016-1" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "ASHRAE", + dataType: "enum", + values: ["ASHRAE"], + example: "ASHRAE", + }, + { + name: "Type", + description: "Standard or Guideline", + dataType: "enum", + values: ["Standard", "Guideline"], + example: "Standard", + }, + { + name: "Number", + description: "The standard/guideline number", + dataType: "string", + format: "Alphanumeric. May include decimal (e.g., 90.1, 1.4).", + example: "90.1", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by hyphen.", + example: "2019", + }, + { + name: "Addendum Letter", + description: "Letter designation for addenda", + }, +], + algebra: [ + { type: "Addendum", description: "Individual modification to a standard", syntax: "ASHRAE Addendum [Letter] to [Type] [Number]-[Year]", example: "ASHRAE Addendum a to Guideline 1.4-2019" }, + { type: "Combined Addenda", description: "Multiple addenda combined", syntax: "ASHRAE [Type] [Number]: Addenda [Letters]", example: "ASHRAE Guideline 0: Addenda a, b, c, d" }, + { type: "Errata", description: "Correction", syntax: "ASHRAE Errata to [Type] [Number]-[Year]", example: "ASHRAE Errata to Standard 90.1-2022" }, +], +} + +export default ashrae diff --git a/src/data/flavors/asme.ts b/src/data/flavors/asme.ts new file mode 100644 index 0000000..6f7e020 --- /dev/null +++ b/src/data/flavors/asme.ts @@ -0,0 +1,58 @@ +import type { Publisher } from '../types' + +export const asme: Publisher = { + flavor: "asme", + logo: "/logos/asme-logo.svg", + name: "ASME", + fullName: "American Society of Mechanical Engineers", + category: "industry", + description: "ASME is a professional association that promotes the art, science, and practice of multidisciplinary engineering. ASME standards cover pressure technology, nuclear power, piping, and many other mechanical engineering applications.", + website: "https://www.asme.org", + syntaxNotes: "ASME identifiers follow patterns like: ASME [Code] [Number]-[Year], ASME [Section] [Number]-[Year]. Draft standards include revision notes.", + relatedFlavors: ["ansi", "astm"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: [""], + description: "ASME Standards covering mechanical engineering specifications and requirements.", + examples: [ + { input: "ASME B18.3-2022" }, + { input: "ASME Y14.43-2021" }, + { input: "ASME B18.3-20XX [Draft Proposed Revision of ASME B18.3-2012 (R2017)]" }, + { input: "ASME Y14.43-20XX [Revision of ASME Y14.43-2011 (R2020)]" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "ASME", + dataType: "enum", + values: ["ASME"], + example: "ASME", + }, + { + name: "Number", + description: "The standard number", + dataType: "string", + format: "Alphanumeric code (e.g., BPVC, B31.3, PTC 19.3).", + example: "BPVC", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by hyphen.", + example: "2023", + }, + { + name: "Revision", + description: "Revision information in brackets", + }, +], + algebra: [ +], +} + +export default asme diff --git a/src/data/flavors/astm.ts b/src/data/flavors/astm.ts new file mode 100644 index 0000000..23fa821 --- /dev/null +++ b/src/data/flavors/astm.ts @@ -0,0 +1,136 @@ +import type { Publisher } from '../types' + +export const astm: Publisher = { + flavor: "astm", + logo: "/logos/astm-logo.svg", + name: "ASTM", + fullName: "ASTM International", + category: "industry", + description: "ASTM International (formerly American Society for Testing and Materials) is one of the largest voluntary standards development organizations in the world. ASTM standards cover a wide range of materials, products, systems, and services.", + website: "https://www.astm.org", + syntaxNotes: "ASTM identifiers follow the pattern: ASTM [Type] [Number]-[Year]. Joint standards use ISO/ASTM prefix. Types include no prefix (Standard), TR (Technical Report), ADJ (Adjunct).", + relatedFlavors: ["iso", "ansi"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: [""], + description: "ASTM Standards defining test methods, specifications, practices, guides, and terminologies.", + examples: [ + { input: "ASTM A36/A36M-19" }, + { input: "ASTM C150/C150M-22" }, + { input: "ASTM D638-22" }, + { input: "ASTM E8/E8M-22" }, + ], + }, + { + key: "adjunct", + title: "Adjunct", + abbr: ["ADJ"], + description: "ASTM Adjuncts provide supplementary material to standards.", + examples: [ + { input: "ASTM ADJD2148" }, + { input: "ASTM ADJF3504-EA" }, + ], + }, + { + key: "monograph", + title: "Monograph", + abbr: ["MONO"], + description: "ASTM Monographs are in-depth publications on specific topics.", + examples: [ + { input: "ASTM MONO1-EB" }, + { input: "ASTM MONO2-EB" }, + ], + }, + { + key: "technical_report", + title: "Technical Report", + abbr: ["TR"], + description: "ASTM Technical Reports.", + examples: [ + { input: "ISO/ASTM TR 52916-EB" }, + { input: "ISO/ASTM TR 52952-EB" }, + ], + }, + { + key: "manual", + title: "Manual", + abbr: ["MAN"], + description: "ASTM Manuals provide practical guidance.", + examples: [ + { input: "ASTM MAN 1" }, + ], + }, + { + key: "research_report", + title: "Research Report", + abbr: ["RR"], + description: "ASTM Research Reports documenting original research.", + examples: [ + { input: "ASTM RR:C01-1001" }, + ], + }, + { + key: "data_series", + title: "Data Series", + abbr: ["DS"], + description: "ASTM Data Series publications.", + examples: [ + { input: "ASTM DS 1" }, + ], + }, + { + key: "iso_dual_published", + title: "ISO/ASTM Dual-Published", + abbr: ["ISO/ASTM"], + description: "Standards jointly published by ISO and ASTM.", + examples: [ + { input: "ISO/ASTM 52900:2021" }, + { input: "ISO/ASTM 52901:2017" }, + ], + }, + { + key: "work_in_progress", + title: "Work in Progress", + abbr: ["WIP"], + description: "ASTM standards under development.", + examples: [ + { input: "ASTM WK12345" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "ASTM or ISO/ASTM", + dataType: "enum", + values: ["ASTM"], + example: "ASTM", + }, + { + name: "Number", + description: "The standard number", + dataType: "string", + format: "Letter prefix + number, optionally with /M for metric (e.g., C33/C33M).", + example: "C33/C33M", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "2 or 4 digit year, preceded by hyphen.", + example: "-18", + }, + { + name: "Designation", + description: "Grade designation (e.g., A36M)", + attribute: "designation", + }, +], + algebra: [ + { type: "Dual Publication", description: "Joint ISO/ASTM standard", syntax: "ISO/ASTM [Number]:[Year]", example: "ISO/ASTM 52900:2021" }, +], +} + +export default astm diff --git a/src/data/flavors/bipm.ts b/src/data/flavors/bipm.ts new file mode 100644 index 0000000..b30b86b --- /dev/null +++ b/src/data/flavors/bipm.ts @@ -0,0 +1,76 @@ +import type { Publisher } from '../types' + +export const bipm: Publisher = { + flavor: "bipm", + logo: "/logos/bipm-logo.svg", + logoLight: "/logos/bipm-logo.svg", + logoDark: "/logos/bipm-logo-dark.svg", + name: "BIPM", + fullName: "Bureau International des Poids et Mesures (International Bureau of Weights and Measures)", + category: "international", + description: "The BIPM is the intergovernmental organization established by the Metre Convention in 1875, through which Member States act together on matters related to measurement science and measurement standards. The BIPM provides the basis for a single, coherent system of measurements throughout the world, traceable to the International System of Units (SI). It operates under the authority of the General Conference on Weights and Measures (CGPM) and the supervision of the International Committee for Weights and Measures (CIPM). The BIPM identifier schema covers four unrelated document families: committee documents (CIPM/CGPM recommendations and resolutions), meeting reports, articles in the Metrologia journal, and editions of the SI Brochure.", + website: "https://www.bipm.org", + syntaxNotes: "BIPM identifiers come in four families with distinct shapes: Committee Document — ' [N] ([, ])' (e.g., 'CIPM REC 1 (1927, F)'); Meeting — 'Meeting of the (, )'; Metrologia article — 'Metrologia, , '; SI Brochure — 'SI Brochure ' or 'SI Brochure , Appendix '.", + urnPattern: "urn:bipm:[type]:[number]:[year]", + relatedFlavors: ["iso", "jcgm", "oiml"], + docTypes: [ + { + key: "committee_document", + title: "Committee Document", + abbr: ["REC", "RES", "DECN", "ACT", "DECL"], + description: "CIPM and CGPM formal documents. Type codes: REC (Recommendation), RES (Resolution), DECN (Decision), ACT (Act), DECL (Statement). Each is owned by a committee group (CIPM, CGPM, JCRB, CCTF, CCQM, CCT, CCL, CCAUV, CCU, CCM, CCEM, CCPR, CCRI). The short form uses the abbreviated key; the long form spells out the type name in English or French.", + examples: [ + { input: "CIPM REC 1 (1927)" }, + { input: "CGPM RES 1 (1889)" }, + { input: "CIPM REC 1 (1927, F)" }, + { input: "CGPM DECL (1983)" }, + ], + }, + { + key: "meeting", + title: "Meeting Report", + abbr: ["Meeting"], + description: "Reports from meetings of consultative committees and other BIPM-convened bodies. Identified by the committee, year, and meeting place. Examples include the annual meeting of the Consultative Committee for Length (CCL) and others.", + examples: [ + { input: "Meeting of the CCTF (2015, Geneva)" }, + { input: "Meeting of the CCQM (2018, Sèvres)" }, + ], + }, + { + key: "metrologia_article", + title: "Metrologia Article", + abbr: ["Metrologia"], + description: "Articles published in Metrologia, the BIPM's peer-reviewed journal covering fundamental advances in measurement science. Indexed by volume and starting page number. Published by IOP Publishing on behalf of the BIPM since 1965.", + examples: [ + { input: "Metrologia, 37, 87" }, + { input: "Metrologia, 56, 032001" }, + ], + }, + { + key: "si_brochure", + title: "SI Brochure", + abbr: ["SI"], + description: "The defining reference for the International System of Units (SI), published by the BIPM. Each edition is the authoritative statement of the SI definitions in force. Appendices cover specific topics (mises en pratique, unit conversions, historical context). The 9th edition (2019) implemented the revised SI definitions based on fixed values of the defining constants.", + examples: [ + { input: "SI Brochure 9" }, + { input: "SI Brochure 9, Appendix 1" }, + { input: "SI Brochure 8" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "BIPM", example: "BIPM" }, + { name: "Committee Group", description: "Owning committee acronym: CIPM, CGPM, JCRB, CCTF, CCQM, CCT, CCL, CCAUV, CCU, CCM, CCEM, CCPR, CCRI", attribute: "group", example: "CIPM" }, + { name: "Type Code", description: "REC, RES, DECN, ACT, or DECL", attribute: "type_code", example: "REC" }, + { name: "Number", description: "Sequential document number within year and committee", attribute: "number", example: "1" }, + { name: "Year", description: "Adoption year, in parentheses", attribute: "year", example: "1927" }, + { name: "Language", description: "F for French, omitted for English (default)", attribute: "language", example: "F" }, + ], + algebra: [ + { type: "Committee Document", description: "Short abbreviated form", syntax: " [N] ([, ])", example: "CIPM REC 1 (1927, F)" }, + { type: "Long Form", description: "Spelled-out type name in English or French", syntax: " [N] ()", example: "Recommendation 1 CIPM (1927)" }, + { type: "SI Brochure", description: "Edition-based reference", syntax: "SI Brochure [, Appendix ]", example: "SI Brochure 9, Appendix 1" }, + ], +} + +export default bipm diff --git a/src/data/flavors/bsi.ts b/src/data/flavors/bsi.ts new file mode 100644 index 0000000..4b55e33 --- /dev/null +++ b/src/data/flavors/bsi.ts @@ -0,0 +1,248 @@ +import type { Publisher } from '../types' + +export const bsi: Publisher = { + flavor: "bsi", + logo: "/logos/bsi-logo.svg", + name: "BSI", + fullName: "British Standards Institution", + category: "national", + description: "BSI is the UK's National Standards Body, producing technical standards for a wide range of products and services. BSI also provides certification and standards-related services.", + website: "https://www.bsigroup.com", + syntaxNotes: "BSI identifiers use BS prefix with various type indicators. Adoptions of international standards use patterns like BS ISO, BS EN, BS EN ISO.", + relatedFlavors: ["iso", "iec", "cen-cenelec"], + docTypes: [ + { + key: "british_standard", + title: "British Standard", + abbr: ["BS"], + description: "The primary BSI standards deliverable.", + examples: [ + { input: "BS 476-22:1987" }, + { input: "BS 8300-1:2018" }, + { input: "BS 9999:2017" }, + ], + }, + { + key: "adopted_international_standard", + title: "Adopted International Standard", + abbr: ["BS ISO", "BS IEC", "BS EN"], + description: "British adoption of international (ISO, IEC) or European (EN) standards.", + examples: [ + { input: "BS ISO 9001:2015" }, + { input: "BS EN ISO 13485:2016" }, + { input: "BS IEC 61131-3:2013" }, + ], + }, + { + key: "adopted_european_norm", + title: "Adopted European Norm", + abbr: ["BS EN"], + description: "British adoption of European Standards.", + examples: [ + { input: "BS EN 196-3:2005+A1:2008" }, + { input: "BS EN 1090-2:2018" }, + ], + }, + { + key: "aerospace_standard", + title: "Aerospace Standard", + abbr: ["BS A", "BS Aerospace"], + description: "Standards for the aerospace industry.", + examples: [ + { input: "BS A 242-A 245:1974+A1:2017" }, + { input: "BS A 246-A 249:1974+A1:2017" }, + ], + }, + { + key: "publicly_available_specification", + title: "Publicly Available Specification", + abbr: ["PAS"], + description: "Specifications published to meet urgent market needs.", + examples: [ + { input: "PAS 9980:2022" }, + ], + }, + { + key: "technical_specification", + title: "Technical Specification", + abbr: ["PD TS"], + description: "Published Documents providing technical guidance.", + examples: [ + { input: "PD 5500:2023" }, + ], + }, + { + key: "flex", + title: "Flex Standard", + abbr: ["Flex"], + description: "BSI Flex standards are evolved through continuous development.", + examples: [ + { input: "BSI Flex 1880 v1.0:2022" }, + { input: "BSI Flex 1886 v3.0:2024" }, + ], + }, + { + key: "handbook", + title: "Handbook", + abbr: ["HB"], + description: "BSI Handbooks providing reference material.", + examples: [ + { input: "BS HB 1" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["Amd"], + description: "Amendments to existing British Standards.", + examples: [ + { input: "BS 476-22:1987+A1:2019" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["Cor"], + description: "Corrections to published standards.", + examples: [ + { input: "BS 9999:2017/Cor 1:2018" }, + ], + }, + { + key: "draft_document", + title: "Draft for Development", + abbr: ["DD"], + description: "Draft documents for public comment.", + examples: [ + { input: "14/30300822 DC" }, + { input: "21/30445138 DC" }, + ], + }, + { + key: "committee_document", + title: "Committee Document", + abbr: ["DC"], + description: "Committee draft documents for consultation.", + examples: [ + { input: "14/30300822 DC" }, + ], + }, + { + key: "published_document", + title: "Published Document", + abbr: ["PD"], + description: "Published Documents that provide guidance.", + examples: [ + { input: "PD 5500:2023" }, + ], + }, + { + key: "electronic_book", + title: "Electronic Book", + abbr: ["EB"], + description: "Electronic versions of standards.", + examples: [ + { input: "BS EB 1" }, + ], + }, + { + key: "expert_commentary", + title: "Expert Commentary", + abbr: ["EC"], + description: "Expert commentary on standards.", + examples: [ + { input: "BS EC 1" }, + ], + }, + { + key: "value_added_publication", + title: "Value-Added Publication", + abbr: ["VAP"], + description: "Publications with additional content like commentary or redline.", + examples: [ + { input: "BS VAP 1" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "BSI (or BS prefix)", + dataType: "enum", + values: ["BS", "BSI", "PAS"], + example: "BS", + }, + { + name: "Adoption Source", + description: "Adopted standard source (ISO, EN, IEC)", + attribute: "adoption_source", + dataType: "enum", + values: ["ISO", "EN", "IEC", "EN ISO"], + format: "Present when adopting another publisher's standard.", + example: "ISO", + }, + { + name: "Document Type", + description: "BS, PAS, PD, Flex, etc.", + dataType: "enum", + values: ["BS", "PAS", "PD", "Flex", "HB", "DD", "EB", "EC", "VAP"], + example: "BS", + }, + { + name: "Number", + description: "The document number", + dataType: "string", + format: "1–6 digit number, may include letters.", + example: "476", + }, + { + name: "Part", + description: "Part number", + dataType: "integer", + format: "Optional. After dash.", + example: "22", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by colon.", + example: "2015", + }, + { + name: "Amendment/Consolidated", + description: "Consolidated amendment indicator", + attribute: "consolidated", + dataType: "compound", + format: "After \"+\". E.g. +A1:2019 for incorporated amendment.", + example: "+A1:2019", + }, + { + name: "Publisher Specific", + description: "BSI-specific publisher codes", + attribute: "publisher", + dataType: "string", + format: "Publisher-specific codes.", + example: "A", + }, + { + name: "Date", + description: "Date information", + attribute: "date", + dataType: "string", + format: "Date for draft documents.", + example: "14/30300822", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies a standard", syntax: "BS [Number]:[Year]+A[N]:[Year]", example: "BS 476-22:1987+A1:2019" }, + { type: "Corrigendum", description: "Corrects errors", syntax: "BS [Number]:[Year]/Cor [N]:[Year]", example: "BS 9999:2017/Cor 1:2018" }, + { type: "Adoption", description: "Adoption of ISO/EN/IEC", syntax: "BS [Source] [Number]:[Year]", example: "BS ISO 9001:2015" }, + { type: "Consolidated", description: "Base + incorporated amendments", syntax: "BS [Number]:[Year]+A[N]:[Year]", example: "BS A 242-A 245:1974+A1:2017" }, + { type: "Part", description: "Multi-part standard", syntax: "BS [Number]-[Part]:[Year]", example: "BS 8300-1:2018" }, + { type: "Bundle", description: "Multiple documents bundled", syntax: "BS [Number] + [Number]", example: "BS A 242-A 245:1974+A1:2017" }, + { type: "Set", description: "Document set", syntax: "BS [Number] Set", example: "BS 476 Set" }, +], +} + +export default bsi diff --git a/src/data/flavors/ccsds.ts b/src/data/flavors/ccsds.ts new file mode 100644 index 0000000..020a8e4 --- /dev/null +++ b/src/data/flavors/ccsds.ts @@ -0,0 +1,70 @@ +import type { Publisher } from '../types' + +export const ccsds: Publisher = { + flavor: "ccsds", + logo: "/logos/ccsds-logo.svg", + name: "CCSDS", + fullName: "Consultative Committee for Space Data Systems", + category: "industry", + description: "CCSDS is a multinational forum for the development of communications and data systems standards for spaceflight. CCSDS standards are used by major space agencies worldwide.", + website: "https://www.ccsds.org", + syntaxNotes: "CCSDS identifiers follow the pattern: CCSDS [Number].[Issue]-[Category]-[Version]-[Status]. Categories include B (Blue Book = Recommended Standard), G (Green Book = Recommended Practice), M (Magenta Book = Report).", + relatedFlavors: ["iso"], + docTypes: [ + { + key: "base", + title: "Base Document", + abbr: ["B", "G", "M"], + description: "CCSDS documents categorized by color: B (Blue Book, Recommended Standard), G (Green Book, Recommended Practice), M (Magenta Book, Report).", + examples: [ + { input: "CCSDS 100.0-G-1-S" }, + { input: "CCSDS 101.0-B-1-S" }, + { input: "CCSDS 121.0-B-1-S" }, + { input: "CCSDS 132.0-B-2-S" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["Cor"], + description: "Corrections to CCSDS documents.", + examples: [ + { input: "CCSDS 121.0-B-1-S Cor. 1" }, + { input: "CCSDS 121.0-B-1-S Cor. 2" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "CCSDS", + dataType: "enum", + values: ["CCSDS"], + example: "CCSDS", + }, + { + name: "Number", + description: "Document number with decimal (e.g., 100.0)", + dataType: "string", + format: "NNN.N-L-V format: series number + book type letter + version (e.g., 121.0-B-1).", + example: "121.0-B-1", + }, + { + name: "Category", + description: "B (Blue/Standard), G (Green/Practice), M (Magenta/Report)", + }, + { + name: "Issue", + description: "Issue number after the category letter", + }, + { + name: "Status", + description: "S (Superseded), blank (current)", + }, +], + algebra: [ + { type: "Corrigendum", description: "Corrects errors in CCSDS documents", syntax: "CCSDS [Number]-[Category]-[Issue]-[Status] Cor. [N]", example: "CCSDS 121.0-B-1-S Cor. 1" }, +], +} + +export default ccsds diff --git a/src/data/flavors/cen_cenelec.ts b/src/data/flavors/cen_cenelec.ts new file mode 100644 index 0000000..b7c0107 --- /dev/null +++ b/src/data/flavors/cen_cenelec.ts @@ -0,0 +1,173 @@ +import type { Publisher } from '../types' + +export const cen_cenelec: Publisher = { + flavor: "cen-cenelec", + logo: "/logos/cen-logo.svg", + logos: ["/logos/cen-logo.svg", "/logos/cenelec-logo.png"], + name: "CEN-CENELEC", + fullName: "CEN and CENELEC — European Standardization Organizations", + category: "regional", + description: "CEN (European Committee for Standardization) and CENELEC (European Committee for Electrotechnical Standardization) are two distinct organizations managed by a single body, the CEN-CENELEC Management Centre (CCMC). They share a unified publishing system, identifier grammar, and catalogue. CEN cooperates with ISO (Vienna Agreement) and CENELEC cooperates with IEC (Frankfurt Agreement). Both are recognized by the EU and EFTA.", + website: "https://www.cencenelec.eu", + syntaxNotes: "CEN-CENELEC identifiers use EN (European Norm) designations with CEN or CLC (CENELEC) publisher prefixes. Patterns: EN [Number]:[Year], CEN/TS [Number]:[Year], CLC/TR [Number]:[Year], CEN/CLC [Type] [Number]:[Year].", + urnPattern: "urn:cen:std:en:[number]:[year]", + relatedFlavors: ["iso", "iec", "bsi"], + docTypes: [ + { + key: "european_norm", + title: "European Norm", + abbr: ["EN"], + description: "EN standards are European Standards that must be adopted by all CEN national members.", + examples: [ + { input: "EN 196-3:2005+A1:2008" }, + { input: "EN 527-2:2016+A1:2019" }, + { input: "EN 1090-2:2018" }, + ], + }, + { + key: "european_prestandard", + title: "European Prestandard", + abbr: ["ENV"], + description: "Provisional standards published for provisional application.", + examples: [ + { input: "ENV 1991-1:1994" }, + ], + }, + { + key: "technical_specification", + title: "Technical Specification", + abbr: ["CEN/TS"], + description: "CEN Technical Specifications for provisional use.", + examples: [ + { input: "CEN/TS 14243:2012" }, + ], + }, + { + key: "technical_report", + title: "Technical Report", + abbr: ["CEN/TR"], + description: "Informative documents from CEN.", + examples: [ + { input: "CEN/TR 15522-1:2007" }, + ], + }, + { + key: "cen_workshop_agreement", + title: "CEN Workshop Agreement", + abbr: ["CWA"], + description: "Documents developed through an open CEN Workshop process.", + examples: [ + { input: "CWA 15261-1:2005" }, + ], + }, + { + key: "guide", + title: "Guide", + abbr: ["CLC Guide", "CEN Guide"], + description: "Guidance documents from CEN or CENELEC.", + examples: [ + { input: "CLC Guide 1:2022" }, + ], + }, + { + key: "harmonization_document", + title: "Harmonization Document", + abbr: ["HD"], + description: "CENELEC Harmonization Documents.", + examples: [ + { input: "HD 60364-1:2008" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["Amd"], + description: "Amendments to European Norms.", + examples: [ + { input: "EN ISO 13485:2016/A1:2024" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["Cor", "AC"], + description: "Corrections to CEN publications.", + examples: [ + { input: "EN ISO 13485:2016/AC:2016" }, + ], + }, + { + key: "consolidated_identifier", + title: "Consolidated Version", + abbr: ["+A"], + description: "Base standard with incorporated amendments.", + examples: [ + { input: "EN 196-3:2005+A1:2008" }, + { input: "EN 527-2:2016+A1:2019" }, + ], + }, + { + key: "adopted_european_norm", + title: "Adopted European Norm", + abbr: ["EN ISO", "EN IEC"], + description: "European adoption of international (ISO/IEC) standards.", + examples: [ + { input: "EN ISO 13485:2016/AC:2016" }, + { input: "EN ISO 13485:2016/AC:2017" }, + ], + }, + { + key: "fragment", + title: "Fragment", + abbr: ["Frag"], + description: "Specific fragment of a CEN document.", + examples: [ + { input: "EN 196-3:2005+A1:2008 Frag 1" }, + ], + }, + { + key: "european_specification", + title: "European Specification", + abbr: ["ES"], + description: "CEN European Specifications.", + examples: [ + { input: "ES 59001:2004" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "CEN, CENELEC (CLC), or joint designations", + }, + { + name: "Document Type", + description: "EN, CEN/TS, CEN/TR, CWA, HD, etc.", + }, + { + name: "Number", + description: "The document number", + }, + { + name: "Part", + description: "Part number", + }, + { + name: "Year", + description: "Publication year", + }, + { + name: "Consolidated", + description: "Consolidated amendment indicator (+A1, +A2)", + attribute: "consolidated", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies a European Norm", syntax: "EN [Number]:[Year]/A[N]:[Year]", example: "EN 196-3:2005+A1:2008" }, + { type: "Corrigendum", description: "Corrects errors", syntax: "EN [Number]:[Year]/AC:[Year]", example: "EN ISO 13485:2016/AC:2016" }, + { type: "Consolidated", description: "Base + amendments", syntax: "EN [Number]:[Year]+A[N]:[Year]", example: "EN 196-3:2005+A1:2008" }, + { type: "Adoption", description: "Adoption of ISO/IEC standards", syntax: "EN ISO [Number]:[Year]", example: "EN ISO 13485:2016" }, +], +} + +export default cen_cenelec diff --git a/src/data/flavors/cie.ts b/src/data/flavors/cie.ts new file mode 100644 index 0000000..868ed0d --- /dev/null +++ b/src/data/flavors/cie.ts @@ -0,0 +1,138 @@ +import type { Publisher } from '../types' + +export const cie: Publisher = { + flavor: "cie", + logo: "/logos/cie-logo.svg", + name: "CIE", + fullName: "International Commission on Illumination", + category: "industry", + description: "The CIE (Commission Internationale de l'Eclairage) is an independent, non-profit organization devoted to international cooperation and exchange of information on matters related to light, lighting, and color.", + website: "https://www.cie.co.at", + syntaxNotes: "CIE identifiers use numeric identifiers: CIE [Number]:[Year], CIE [Number]-[Part]:[Year]. Joint publications include CIE ISO prefix.", + relatedFlavors: ["iso"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: [""], + description: "CIE Standards defining specifications for lighting and color.", + examples: [ + { input: "CIE 232:2019" }, + { input: "CIE 198-SP1.1:2011" }, + ], + }, + { + key: "joint_published", + title: "Joint Published", + abbr: ["CIE ISO"], + description: "Standards jointly published with ISO.", + examples: [ + { input: "CIE ISO 10916:2024" }, + { input: "CIE ISO 11664-1:2019" }, + ], + }, + { + key: "dual_published", + title: "Dual Published", + abbr: ["Dual"], + description: "Dual-published with another organization.", + examples: [ + { input: "CIE S 023/E:2020" }, + ], + }, + { + key: "identical", + title: "Identical", + abbr: ["Ident"], + description: "Identical adoption of another standard.", + examples: [ + { input: "CIE Ident 1:2020" }, + ], + }, + { + key: "conference", + title: "Conference", + abbr: ["Conf"], + description: "CIE Conference proceedings.", + examples: [ + { input: "CIE Conf 1:2020" }, + ], + }, + { + key: "bundle", + title: "Bundle", + abbr: ["Bundle"], + description: "Bundled CIE publications.", + examples: [ + { input: "CIE 198-SP1.1:2011,198-SP1.2:2011,198-SP1.3:2011,198-SP1.4:2011" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["Cor"], + description: "Corrections to CIE publications.", + examples: [ + { input: "CIE 198-SP1.4:2011/Cor1:2013" }, + { input: "CIE 232:2019/Cor1:2020" }, + ], + }, + { + key: "supplement", + title: "Supplement", + abbr: ["SP"], + description: "Supplements to CIE publications.", + examples: [ + { input: "CIE 198-SP1.1:2011" }, + ], + }, + { + key: "tutorial_bundle", + title: "Tutorial Bundle", + abbr: ["TB"], + description: "CIE Tutorial Bundles.", + examples: [ + { input: "CIE TB 1:2020" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "CIE", + dataType: "enum", + values: ["CIE"], + example: "CIE", + }, + { + name: "Number", + description: "The publication number", + dataType: "integer", + format: "1–4 digit number.", + example: "232", + }, + { + name: "Part", + description: "Supplement/part number", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by colon.", + example: "2019", + }, + { + name: "Language", + description: "Language code", + attribute: "language", + }, +], + algebra: [ + { type: "Corrigendum", description: "Corrects errors", syntax: "CIE [Number]:[Year]/Cor[N]:[Year]", example: "CIE 232:2019/Cor1:2020" }, + { type: "Bundle", description: "Multiple documents bundled", syntax: "CIE [Number],[Number],...", example: "CIE 198-SP1.1:2011,198-SP1.2:2011" }, + { type: "Joint Publication", description: "Published jointly with ISO", syntax: "CIE ISO [Number]:[Year]", example: "CIE ISO 10916:2024" }, +], +} + +export default cie diff --git a/src/data/flavors/csa.ts b/src/data/flavors/csa.ts new file mode 100644 index 0000000..7181d55 --- /dev/null +++ b/src/data/flavors/csa.ts @@ -0,0 +1,127 @@ +import type { Publisher } from '../types' + +export const csa: Publisher = { + flavor: "csa", + logo: "/logos/csa-logo.svg", + name: "CSA", + fullName: "CSA Group", + category: "national", + description: "CSA Group is a global organization dedicated to safety, social good, and sustainability. CSA develops standards for a wide range of products and services, with particular strength in electrical, gas, and construction standards.", + website: "https://www.csagroup.org", + syntaxNotes: "CSA identifiers follow patterns: CSA [Number]:[Year], CAN/CSA-[Number]:[Year] (Canadian national), CSA-[Number]:[Year]. Combined identifiers use / separator.", + relatedFlavors: ["ieee", "iec", "bsi"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: [""], + description: "CSA Standards defining requirements for products and services.", + examples: [ + { input: "CSA Z662:23" }, + { input: "CSA A23.1:24" }, + { input: "CSA N285.0:23" }, + ], + }, + { + key: "canadian_adopted", + title: "Canadian Adopted Standard", + abbr: ["CAN/CSA"], + description: "Canadian national adoption of standards, prefixed with CAN/.", + examples: [ + { input: "CAN/CSA-ISO 9001:2016" }, + { input: "CAN/CSA-C22.2 No. 60601-1-6:11" }, + ], + }, + { + key: "csa_adopted", + title: "CSA Adopted Standard", + abbr: ["CSA Adopted"], + description: "CSA adoption of another organization's standard.", + examples: [ + { input: "CSA-ISO 9001:2016" }, + ], + }, + { + key: "combined", + title: "Combined Standard", + abbr: ["Combined"], + description: "Combined documents with multiple designations using / separator.", + examples: [ + { input: "CSA A23.1:24/CSA A23.2:24" }, + { input: "CSA N285.0:23/CSA N285.6 SERIES:23" }, + ], + }, + { + key: "bundled", + title: "Bundled Standard", + abbr: ["Bundled"], + description: "Multiple documents bundled with + separator.", + examples: [ + { input: "CAN/CSA-C22.2 NO. 60601-1-6:11 + A1:15 + A2:21 (R2021) (CONSOLIDATED)" }, + ], + }, + { + key: "series", + title: "Series", + abbr: ["SERIES"], + description: "Series designation for related standards.", + examples: [ + { input: "CSA N285.6 SERIES:23" }, + ], + }, + { + key: "package", + title: "Package", + abbr: ["PKG"], + description: "Packaged set of standards.", + examples: [ + { input: "CSA PKG A23.1:24" }, + ], + }, + { + key: "cec", + title: "CEC", + abbr: ["CEC"], + description: "California Energy Commission related standards.", + examples: [ + { input: "CEC-400-2021-001" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "CSA, CAN/CSA", + dataType: "enum", + values: ["CSA", "CAN/CSA"], + format: "CAN/ prefix for Canadian National Standards.", + example: "CSA", + }, + { + name: "Number", + description: "The standard number", + dataType: "string", + format: "May include \"NO.\" prefix and dash-separated parts.", + example: "N285.6", + }, + { + name: "Year", + description: "Publication year (2 or 4 digit)", + dataType: "year", + format: "2 or 4 digit year, preceded by colon.", + example: ":23", + }, + { + name: "Adoption Prefix", + description: "CAN/ prefix for Canadian adoption", + attribute: "adoption_prefix", + }, +], + algebra: [ + { type: "Adoption", description: "Adoption of international standard", syntax: "CAN/CSA-[Source] [Number]:[Year]", example: "CAN/CSA-ISO 9001:2016" }, + { type: "Combined", description: "Multiple standards combined", syntax: "CSA [Number]:[Year]/CSA [Number]:[Year]", example: "CSA A23.1:24/CSA A23.2:24" }, + { type: "Bundled", description: "Documents bundled with amendments", syntax: "CSA [Number]:[Year] + A[N]:[Year]", example: "CAN/CSA-C22.2 NO. 60601-1-6:11 + A1:15 + A2:21" }, +], +} + +export default csa diff --git a/src/data/flavors/easc.ts b/src/data/flavors/easc.ts new file mode 100644 index 0000000..7a91b6b --- /dev/null +++ b/src/data/flavors/easc.ts @@ -0,0 +1,53 @@ +import type { Publisher } from '../types' + +export const easc: Publisher = { + flavor: "easc", + logo: "/logos/easc-logo.svg", + name: "EASC", + fullName: "Euro-Asian Council for Standardization, Metrology and Certification (МГС)", + category: "regional", + description: "The Euro-Asian Council for Standardization, Metrology and Certification (EASC, Межгосударственный совет по стандартизации, метрологии и сертификации / МГС) is the intergovernmental standards body of the Commonwealth of Independent States (CIS). Founded in 1992, the EASC is the successor to the Soviet State Standards Commission and serves as the regional standards body for Armenia, Azerbaijan, Belarus, Georgia, Kazakhstan, Kyrgyzstan, Moldova, Russia, Tajikistan, Turkmenistan, Uzbekistan, and Ukraine. The EASC issues GOST interstate standards (modeled separately as the 'gost' flavor) and the EASC-series documents: ПМГ (Interstate Rules on Standardization) and РМГ (Interstate Recommendations on Standardization).", + website: "https://easc.org.by", + syntaxNotes: "EASC identifiers follow the shape: [ В] [-]. Series is ПМГ (Latin: PMG) for Interstate Rules or РМГ (Latin: RMG) for Interstate Recommendations. The optional Cyrillic 'В' marks a defense-related variant (stored as Latin 'V' for cross-script consistency). Canonical render is Cyrillic per mgscatalog.by. Year separator accepts ASCII hyphen OR Unicode em-dash/en-dash (Russian typographic convention).", + urnPattern: "urn:easc:[series]:[number]:[year]", + relatedFlavors: ["gost", "iso", "iec"], + docTypes: [ + { + key: "pmg", + title: "Interstate Rules (ПМГ)", + abbr: ["ПМГ", "PMG"], + description: "ПМГ — Правила по межгосударственной стандартизации (Rules on interstate standardization). Procedural rules issued by EASC governing how interstate standards are proposed, drafted, adopted, and revised. The 'В' variant (Latin: V) marks a defense-related rule with restricted handling.", + examples: [ + { input: "ПМГ 03-2025" }, + { input: "ПМГ 126-2013" }, + { input: "ПМГ В 31-2001" }, + { input: "PMG 03-2025", output: "ПМГ 03-2025" }, + ], + }, + { + key: "rmg", + title: "Interstate Recommendations (РМГ)", + abbr: ["РМГ", "RMG"], + description: "РМГ — Рекомендации по межгосударственной стандартизации (Recommendations on interstate standardization). Technical recommendations issued by EASC covering measurement methods, calibration procedures, metrological terminology, and reference materials. Adopted by member states as guidance rather than binding requirements.", + examples: [ + { input: "РМГ 151-2025" }, + { input: "РМГ 29-2013" }, + { input: "RMG 29-2013", output: "РМГ 29-2013" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "EASC (МГС) — the issuing body", example: "EASC" }, + { name: "Series", description: "ПМГ (PMG) for Interstate Rules or РМГ (RMG) for Interstate Recommendations. Canonical render is Cyrillic.", attribute: "series", example: "ПМГ" }, + { name: "Variant", description: "Optional Cyrillic 'В' (Latin 'V') marking a defense-related variant.", attribute: "variant", example: "В" }, + { name: "Number", description: "Sequential document number, zero-padded", attribute: "number", example: "03" }, + { name: "Year", description: "Adoption year (2 or 4 digits), separated by hyphen or em-dash", attribute: "year", example: "2025" }, + ], + algebra: [ + { type: "Interstate Rule", description: "ПМГ series — procedural rules", syntax: "ПМГ [В] -", example: "ПМГ 03-2025" }, + { type: "Interstate Recommendation", description: "РМГ series — technical recommendations", syntax: "РМГ -", example: "РМГ 29-2013" }, + { type: "Defense Variant", description: "Optional 'В' marks a defense-related document", syntax: " В -", example: "ПМГ В 31-2001" }, + ], +} + +export default easc diff --git a/src/data/flavors/ecma.ts b/src/data/flavors/ecma.ts new file mode 100644 index 0000000..29a5fac --- /dev/null +++ b/src/data/flavors/ecma.ts @@ -0,0 +1,66 @@ +import type { Publisher } from '../types' + +export const ecma: Publisher = { + flavor: "ecma", + logo: "/logos/ecma-logo.svg", + name: "ECMA", + fullName: "Ecma International", + category: "industry", + description: "Ecma International (originally the European Computer Manufacturers Association, now officially Ecma International) is a standards organization for information and communication systems founded in 1961 and based in Geneva. Ecma is best known for the ECMAScript specification (the language behind JavaScript), the JSON data interchange format, the C# and Common Language Infrastructure specifications, the Office Open XML formats, and the Dart language. Ecma standards follow a simple numbering scheme (ECMA-N) with no edition in the printed identifier — editions are tracked as separate metadata.", + website: "https://ecma-international.org", + syntaxNotes: "ECMA identifiers follow three shapes depending on the document class. Standards: 'ECMA-[-]' (the publisher token joins the number directly with no space; part only appears for multi-part standards like ECMA-418-1). Technical Reports: 'ECMA TR/'. Mementos: 'ECMA MEM/'. Edition is separate metadata and is NOT rendered in the printed identifier string.", + urnPattern: "urn:ecma:[type]:[number]:[part]", + relatedFlavors: ["iso", "ieee", "w3c"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: [""], + description: "Ecma International Standards — normative specifications including ECMAScript (ECMA-262), JSON (ECMA-404), C# (ECMA-334), Common Language Infrastructure (ECMA-335), Office Open XML (ECMA-376), and many others. Standards join the publisher token directly to the number with no space ('ECMA-262', not 'ECMA 262'). Multi-part standards append the part number with a hyphen (e.g. ECMA-418-1).", + examples: [ + { input: "ECMA-262" }, + { input: "ECMA-334" }, + { input: "ECMA-335" }, + { input: "ECMA-376" }, + { input: "ECMA-404" }, + { input: "ECMA-418-1" }, + ], + }, + { + key: "technical_report", + title: "Technical Report", + abbr: ["TR"], + description: "Ecma Technical Reports — informative documents providing technical guidance, rationale, or experimental results that support Ecma Standards. Identified by the 'TR/' separator between the publisher token and the sequence number.", + examples: [ + { input: "ECMA TR/101" }, + { input: "ECMA TR/53" }, + ], + }, + { + key: "memento", + title: "Memento", + abbr: ["MEM"], + description: "Ecma Mementos — annual snapshot documents summarizing Ecma's organization, members, and activities for a given year. Identified by the 'MEM/' separator and the year (e.g. ECMA MEM/1970).", + examples: [ + { input: "ECMA MEM/1970" }, + { input: "ECMA MEM/2024" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "ECMA — joined directly to standard number with no space ('ECMA-262'), separated by a space for TR/MEM ('ECMA TR/101')", example: "ECMA" }, + { name: "Type Prefix", description: "nil for Standards, 'TR' for Technical Reports, 'MEM' for Mementos", attribute: "type_prefix" }, + { name: "Number", description: "Document number, kept as a string to preserve any leading zeros", attribute: "number", example: "262" }, + { name: "Part", description: "Part number for multi-part standards, appended with hyphen (e.g. '-1' in ECMA-418-1)", attribute: "part", example: "1" }, + { name: "Edition", description: "Edition metadata (separate from the printed identifier). Decimal editions like '5.1' occur. NOT rendered in to_s.", attribute: "edition" }, + ], + algebra: [ + { type: "Standard", description: "Publisher joined directly to number with no space", syntax: "ECMA-[-]", example: "ECMA-262" }, + { type: "Multi-part Standard", description: "Standard split into multiple parts", syntax: "ECMA--", example: "ECMA-418-1" }, + { type: "Technical Report", description: "TR separated by space + slash", syntax: "ECMA TR/", example: "ECMA TR/101" }, + { type: "Memento", description: "MEM separated by space + slash, year as number", syntax: "ECMA MEM/", example: "ECMA MEM/1970" }, + { type: "Without Publisher", description: "Bare form, no leading ECMA token", syntax: "- | TR/ | MEM/", example: "-262" }, + ], +} + +export default ecma diff --git a/src/data/flavors/etsi.ts b/src/data/flavors/etsi.ts new file mode 100644 index 0000000..999897e --- /dev/null +++ b/src/data/flavors/etsi.ts @@ -0,0 +1,103 @@ +import type { Publisher } from '../types' + +export const etsi: Publisher = { + flavor: "etsi", + logo: "/logos/etsi-logo.svg", + name: "ETSI", + fullName: "European Telecommunications Standards Institute", + category: "regional", + description: "ETSI produces globally applicable standards for Information and Communications Technologies (ICT), including fixed, mobile, radio, converged, broadcast, and internet technologies.", + website: "https://www.etsi.org", + syntaxNotes: "ETSI identifiers follow the pattern: ETSI [Type] [Number] V[Version] ([Date]). Types include EG (Guide), EN (Standard), ES (Specification), ET (Technical Report), GS (Group Specification), TS (Technical Specification), TR (Technical Report).", + relatedFlavors: ["cen-cenelec", "itu", "iec"], + docTypes: [ + { + key: "etsi_standard", + title: "ETSI Standard", + abbr: ["EN", "ES", "EG", "ET", "GS", "TS", "TR", "SR"], + description: "ETSI publishes various deliverable types: EN (European Standard), ES (ETSI Specification), EG (ETSI Guide), ET (ETSI Technical Report), GS (Group Specification), TS (Technical Specification), TR (Technical Report), SR (Special Report).", + examples: [ + { input: "ETSI EG 200 053 V1.5.1 (2004-06)" }, + { input: "ETSI EN 300 392-2 V3.4.1 (2017-04)" }, + { input: "ETSI TS 102 023-2 V1.1.1 (2003-08)" }, + { input: "ETSI GS NFV 002 V1.2.1 (2014-10)" }, + { input: "ETSI TR 103 392 V1.1.1 (2016-11)" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["A"], + description: "Amendments to ETSI documents.", + examples: [ + { input: "ETSI ETR 108/A1 ed.1 (1995-08)" }, + { input: "ETSI ETS 300 011/A1 ed.1 (1994-12)" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["C"], + description: "Corrections to ETSI documents.", + examples: [ + { input: "ETSI ETR 053/C1 ed.2 (1997-03)" }, + { input: "ETSI ETR 094/C1 ed.1 (1994-03)" }, + ], + }, + { + key: "supplement_identifier", + title: "Supplement", + abbr: ["S"], + description: "Supplements to ETSI base documents.", + examples: [ + { input: "ETSI ETS 300 001 S1 ed.1 (1993-10)" }, + ], + }, +], + components: [ + { + name: "Type", + description: "Document type prefix (EN, ES, EG, ET, GS, TS, TR)", + dataType: "enum", + values: ["EN (European Standard)", "ES (ETSI Specification)", "EG (ETSI Guide)", "ET (ETSI Technical Report)", "GS (Group Specification)", "TS (Technical Specification)", "TR (Technical Report)", "SR (Special Report)"], + example: "EN", + }, + { + name: "Number", + description: "The document number", + dataType: "string", + format: "Space-separated groups (e.g., 300 392-2). May include dash for parts.", + example: "300 392-2", + }, + { + name: "Version", + description: "Version number (V[major].[minor].[patch])", + attribute: "version", + dataType: "string", + format: "V[Major].[Minor].[Patch] (Semantic versioning)", + example: "V3.4.1", + }, + { + name: "Date", + description: "Publication date in parentheses", + dataType: "string", + format: "YYYY-MM in parentheses.", + example: "(2017-04)", + }, + { + name: "Edition", + description: "Edition number (ed.N)", + attribute: "edition", + dataType: "string", + format: "Optional. \"ed.[N]\"", + example: "ed.2", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies a base document", syntax: "ETSI [Type] [Number]/A[N] ed.[N]", example: "ETSI ETR 108/A1 ed.1 (1995-08)" }, + { type: "Corrigendum", description: "Corrects errors", syntax: "ETSI [Type] [Number]/C[N] ed.[N]", example: "ETSI ETR 053/C1 ed.2 (1997-03)" }, + { type: "Supplement", description: "Supplementary content", syntax: "ETSI [Type] [Number] S[N] ed.[N]", example: "ETSI ETS 300 001 S1 ed.1 (1993-10)" }, +], +} + +export default etsi diff --git a/src/data/flavors/gost.ts b/src/data/flavors/gost.ts new file mode 100644 index 0000000..d9145e4 --- /dev/null +++ b/src/data/flavors/gost.ts @@ -0,0 +1,67 @@ +import type { Publisher } from '../types' + +export const gost: Publisher = { + flavor: "gost", + logo: "/logos/gost-logo.svg", + name: "GOST", + fullName: "Interstate Council for Standardization, Metrology and Certification (МГС / EASC)", + category: "regional", + description: "GOST (ГОСТ, from Gosudarstvennyy Standart, 'State Standard') is the regional standards system administered by the Euro-Asian Council for Standardization, Metrology and Certification (МГС / EASC), covering the Russian Federation, Belarus, Kazakhstan, Armenia, Kyrgyzstan, Moldova, Tajikistan, Uzbekistan, and several other CIS member states. GOST standards cover industrial products, measurement systems, engineering, and technology — comparable to ISO standards in scope. GOST R (ГОСТ Р) denotes Russian Federation national standards. The PubID GOST schema models both classes plus Identical Adoptions (the IDT relationship, where a GOST is structurally and technically identical to an adopted foreign standard, e.g., ГОСТ 31610.18-2016/IEC 60079-18:2014).", + website: "https://easc.org.by", + syntaxNotes: "GOST identifiers follow the shape: GOST [R][ ][ ] [-][/][ ()]. The Cyrillic 'ГОСТ' and Latin 'GOST' forms are interchangeable; PubID canonicalizes to Latin-script 'GOST'. The slash form (GOST X/Y) denotes an Identical Adoption (IDT) — both halves are part of the identifier.", + urnPattern: "urn:gost:[type]:[number]:[year]", + relatedFlavors: ["iso", "iec"], + docTypes: [ + { + key: "interstate_standard", + title: "Interstate Standard", + abbr: ["ГОСТ"], + description: "Bare GOST — an interstate standard issued by the МГС (Межгосударственный совет по стандартизации, Euro-Asian Council for Standardization). Adopted by all CIS member states. The bare 'ГОСТ' (no R) form denotes interstate scope. Copublishers (ISO, IEC, ISP) may be embedded before the number when the standard is jointly published.", + examples: [ + { input: "ГОСТ 14946-82" }, + { input: "GOST 14946-82", output: "GOST 14946-82" }, + { input: "GOST 2.312" }, + { input: "GOST ISO 9692-1" }, + { input: "GOST R ISO/IEC ISP 10609-9-95" }, + ], + }, + { + key: "national_standard", + title: "National Standard (GOST R)", + abbr: ["GOST R", "ГОСТ Р"], + description: "GOST R (ГОСТ Р) — a Russian Federation national standard issued by Rosstandart (Федеральное агентство по техническому регулированию и метрологии). The 'R' suffix marks the standard as Russian-national rather than interstate. GOST R standards are not automatically adopted by other CIS states but may serve as the basis for future interstate GOSTs. Published since 1992, after the dissolution of the Soviet GOST system.", + examples: [ + { input: "GOST R 34.12-2015" }, + { input: "GOST R 58904-2020" }, + { input: "GOST R ISO 9001-2011" }, + ], + }, + { + key: "identical_adoption", + title: "Identical Adoption (IDT)", + abbr: ["IDT"], + description: "A GOST that is structurally and technically identical to an adopted foreign standard (IDT per ISO Guide 2). The slash IS part of the official GOST designation and is NOT optional. The GOST appears on the left of the slash, the adopted standard on the right. Modified (MOD) and Not Equivalent (NEQ) degrees of adoption are NOT modeled here — they are bibliographic metadata carried as Relaton relations, not as part of the identifier.", + examples: [ + { input: "ГОСТ 31610.18-2016/IEC 60079-18:2014" }, + { input: "GOST R 58904-2020/ISO/TR 25901-1:2016" }, + { input: "GOST 31425.5-2025/ISO 9902-5:2001" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "GOST — always rendered in canonical Latin-script form on output (Cyrillic ГОСТ is parsed but canonicalizes to GOST).", example: "GOST" }, + { name: "Scope Marker", description: "The optional 'R' suffix marks a Russian Federation national standard (GOST R). Absent for interstate GOSTs.", attribute: "national", example: "R" }, + { name: "Copublisher", description: "Optional copublisher when the GOST is jointly published or directly adopts another organization's standard: ISO, IEC, ISP, etc.", attribute: "copublisher", example: "ISO" }, + { name: "Subtype", description: "Optional subtype designation within the GOST system.", attribute: "subtype" }, + { name: "Number", description: "The standard number, may include dotted subparts (34.12)", attribute: "number", example: "14946" }, + { name: "Year", description: "Publication year, separated by a dash (or em-dash on input). May be absent on undated references.", attribute: "year", example: "82" }, + { name: "Adopted Reference", description: "Parenthesized adoption reference (MOD/NEQ degree — bibliographic only, not the IDT slash form)", attribute: "adopted_reference" }, + ], + algebra: [ + { type: "Identical Adoption", description: "A GOST that is identical to an adopted foreign standard. Slash is part of the official designation.", syntax: "GOST [R] [Copublisher] [Number]-[Year]/[Adopted ID]", example: "GOST 31610.18-2016/IEC 60079-18:2014" }, + { type: "Joint Publication", description: "Copublisher embedded before the number for jointly-published standards", syntax: "GOST [Copublisher] [Number]-[Year]", example: "GOST ISO 9692-1" }, + { type: "National vs Interstate", description: "GOST R = Russian Federation national; bare GOST = CIS interstate (МГС).", syntax: "GOST [R?] [Number]-[Year]", example: "GOST R 34.12-2015" }, + ], +} + +export default gost diff --git a/src/data/flavors/iala.ts b/src/data/flavors/iala.ts new file mode 100644 index 0000000..aecb85a --- /dev/null +++ b/src/data/flavors/iala.ts @@ -0,0 +1,182 @@ +import type { Publisher } from '../types' + +export const iala: Publisher = { + flavor: "iala", + logo: "/logos/iala-logo-light.svg", + logoLight: "/logos/iala-logo-light.svg", + logoDark: "/logos/iala-logo-dark.svg", + name: "IALA", + fullName: "International Association of Marine Aids to Navigation and Lighthouse Authorities", + category: "international", + description: "IALA is an international technical association that gathers marine aids to navigation authorities, industry manufacturers and consultants to harmonize and improve marine aids to navigation worldwide. IALA Recommendations and Standards guide lighthouse authorities, vessel traffic services, and e-Navigation implementations across more than 90 member countries.", + website: "https://www.iala.int", + syntaxNotes: "IALA identifiers use a single-letter type prefix followed by a 4-digit zero-padded number: IALA {S|R|G|M|C|A|L|GA|X|P}[Number][ Ed [Edition]][ ([LangLetter])]. General Assembly resolutions use a dotted series.index form (GA01.01).", + urnPattern: "urn:iala:[type]:[number]:[edition]:[language]", + relatedFlavors: ["iso", "iho", "iec"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: ["S"], + description: "IALA Standards (S series) define normative requirements for marine aids to navigation systems, including the IALA Maritime Buoyage System and e-Navigation components.", + examples: [ + { input: "IALA S1010" }, + { input: "IALA S1020 Ed 2.0" }, + { input: "IALA S1070 Ed 2.0" }, + ], + }, + { + key: "recommendation", + title: "Recommendation", + abbr: ["R"], + description: "IALA Recommendations (R series) are the principal deliverable type, recommending practices and systems to be adopted by member authorities.", + examples: [ + { input: "IALA R0103 Ed 3.1" }, + { input: "IALA R0126 Ed 2.0" }, + { input: "IALA R1024 Ed 1.0" }, + ], + }, + { + key: "guideline", + title: "Guideline", + abbr: ["G"], + description: "IALA Guidelines (G series) provide practical guidance for the implementation and operation of aids to navigation systems.", + examples: [ + { input: "IALA G1015 Ed 2.2" }, + { input: "IALA G1045 Ed 1" }, + { input: "IALA G1078 Ed 2.1" }, + ], + }, + { + key: "manual", + title: "Manual", + abbr: ["M"], + description: "IALA Manuals (M series). Most current manuals (NAVGUIDE, VTS Manual) carry no number; the M prefix is reserved for future numbered manuals.", + examples: [ + { input: "IALA M0001" }, + ], + }, + { + key: "model_course", + title: "Model Course", + abbr: ["C"], + description: "IALA Model Courses (C series) define training programmes for aids to navigation personnel and VTS operators.", + examples: [ + { input: "IALA C0103-1 Ed 3.0" }, + { input: "IALA C2001-1 Ed 1.0" }, + ], + }, + { + key: "advice", + title: "Advice", + abbr: ["A"], + description: "IALA Advices (A series) are brief advisory notes issued by IALA committees. Numbering is dashed (A12-01, A13-04) and they carry no edition.", + examples: [ + { input: "IALA A12-01" }, + { input: "IALA A13-04" }, + ], + }, + { + key: "general_assembly", + title: "General Assembly Resolution", + abbr: ["GA"], + description: "Resolutions of the IALA General Assembly, numbered with a dotted series.index form (volume = series, sequence = index).", + examples: [ + { input: "IALA GA01.01" }, + { input: "IALA GA01.13" }, + ], + }, + { + key: "letter", + title: "Letter", + abbr: ["L"], + description: "IALA Letters (L series) use a multi-dotted series.sub-series.item form, with an optional sub-part suffix.", + examples: [ + { input: "IALA L2.1.11" }, + { input: "IALA L2.7.1-2" }, + ], + }, + { + key: "annex", + title: "Annex", + abbr: ["Annex"], + description: "Annex to an IALA base publication (typically a Guideline). The \"Annex\"/\"ANNEX\" marker case is preserved verbatim, with an optional single-letter suffix (A–D).", + examples: [ + { input: "IALA G1045 Annex Ed 1" }, + { input: "IALA G1128 ANNEX A Ed 1.6" }, + ], + }, + { + key: "report", + title: "Report", + abbr: ["X"], + description: "IALA Reports & Proceedings (X series, reserved). Current reports carry no code; X is reserved for future numbered reports.", + examples: [], + }, + { + key: "resolution", + title: "Resolution", + abbr: ["P"], + description: "IALA Council Resolutions and publications (P series, reserved). Current resolutions carry no code; P is reserved for future numbered resolutions.", + examples: [], + }, +], + components: [ + { + name: "Publisher", + description: "IALA — optional on input, always emitted on output", + dataType: "enum", + values: ["IALA"], + example: "IALA", + }, + { + name: "Type Letter", + description: "Single-letter type code (S, R, G, M, C, A, L, GA, X, P)", + attribute: "type_letter", + dataType: "enum", + values: ["S (Standard)", "R (Recommendation)", "G (Guideline)", "M (Manual)", "C (Model Course)", "A (Advice)", "L (Letter)", "GA (General Assembly)", "X (Report)", "P (Resolution)"], + example: "R", + }, + { + name: "Number", + description: "4-digit zero-padded number; GA series uses dotted series.index", + attribute: "number", + dataType: "string", + format: "4-digit zero-padded for S/R/G/M/C; dotted series.index for GA; dotted series.subseries.item for L", + example: "0103", + }, + { + name: "Sub-part", + description: "Optional hyphenated sub-part suffix", + attribute: "subpart", + dataType: "integer", + format: "Optional. Hyphenated suffix on the number.", + example: "-1", + }, + { + name: "Edition", + description: "Prefixed with \"Ed\" (cover form) or \":ed\" (compact listing form)", + attribute: "edition", + dataType: "string", + format: "\"Ed X.Y\" (cover form) or \":edX.Y\" (compact listing form).", + example: "Ed 3.0", + }, + { + name: "Language", + description: "Single uppercase letter in parentheses: E, F, S, C, A, R", + attribute: "language", + dataType: "enum", + values: ["E (English)", "F (French)", "S (Spanish)", "C (Chinese)", "A (Arabic)", "R (Russian)"], + format: "Optional. Single uppercase letter in parentheses.", + example: "F", + }, +], + algebra: [ + { type: "Edition", description: "Cover-page vs listing-page edition forms", syntax: "IALA [Type][Number] Ed [X.Y] | IALA [Type][Number]:ed[X.Y]", example: "IALA R1016 Ed 2.0" }, + { type: "Sub-part", description: "Sub-part within a numbered publication", syntax: "IALA [Type][Number]-[SubPart] Ed [X.Y]", example: "IALA C0103-1 Ed 3.0" }, + { type: "Annex", description: "Wraps a base publication with an annex marker", syntax: "IALA [Type][Number] Annex [A-D] Ed [X.Y]", example: "IALA G1128 ANNEX A Ed 1.6" }, + { type: "Language", description: "Translation suffix as a parenthesised letter", syntax: "IALA [Type][Number] Ed [X.Y] ([Lang])", example: "IALA R1016 Ed 2.0 (F)" }, +], +} + +export default iala diff --git a/src/data/flavors/iana.ts b/src/data/flavors/iana.ts new file mode 100644 index 0000000..469d31b --- /dev/null +++ b/src/data/flavors/iana.ts @@ -0,0 +1,41 @@ +import type { Publisher } from '../types' + +export const iana: Publisher = { + flavor: "iana", + logo: "/logos/iana-logo.svg", + name: "IANA", + fullName: "Internet Assigned Numbers Authority", + category: "industry", + description: "IANA is the organization responsible for coordinating the global Internet's unique identifiers — domain names, IP address numbers, protocol parameter values — under contract to ICANN (Internet Corporation for Assigned Names and Numbers) since 1998. IANA maintains the registries that define protocol parameters used across the Internet's core standards: HTTP, DNS, TLS, MIME, URI schemes, character sets, and hundreds of others. Each registry is the authoritative source of truth for the values that make the Internet interoperable.", + website: "https://www.iana.org", + syntaxNotes: "IANA identifiers are protocol registries, not numbered standards. The identifier is a hierarchical registry slug: 'IANA [/]'. The leading underscore in registry names (e.g. '_6lowpan-parameters') is part of the canonical form.", + urnPattern: "urn:iana:[registry]:[sub_registry]", + relatedFlavors: ["iso", "itu"], + docTypes: [ + { + key: "registry", + title: "Protocol Registry", + abbr: [""], + description: "IANA protocol parameter registries. Each registry is a hierarchical namespace managed by IANA containing the assigned values for a specific protocol parameter set. Sub-registries partition a top-level registry into focused sub-lists (e.g. the _6lowpan-parameters registry has a lowpan_nhc sub-registry). The registry slug is always kept verbatim — IANA does not normalize the case or punctuation.", + examples: [ + { input: "IANA _6lowpan-parameters" }, + { input: "IANA _6lowpan-parameters/lowpan_nhc" }, + { input: "IANA uri-schemes" }, + { input: "IANA media-types" }, + { input: "IANA http-parameters" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "IANA — always emitted unless with_publisher=false", example: "IANA" }, + { name: "Registry", description: "Top-level registry slug, kept verbatim (e.g. _6lowpan-parameters, uri-schemes, media-types)", attribute: "registry", example: "_6lowpan-parameters" }, + { name: "Sub-registry", description: "Optional sub-registry slug after the slash, kept verbatim", attribute: "sub_registry", example: "lowpan_nhc" }, + ], + algebra: [ + { type: "Top-level Registry", description: "Bare registry without sub-registry", syntax: "IANA ", example: "IANA uri-schemes" }, + { type: "Sub-registry", description: "Registry with sub-registry partition", syntax: "IANA /", example: "IANA _6lowpan-parameters/lowpan_nhc" }, + { type: "Without Publisher", description: "Bare index-key slug (no 'IANA ' prefix)", syntax: "[/]", example: "_6lowpan-parameters/lowpan_nhc" }, + ], +} + +export default iana diff --git a/src/data/flavors/idf.ts b/src/data/flavors/idf.ts new file mode 100644 index 0000000..57db08d --- /dev/null +++ b/src/data/flavors/idf.ts @@ -0,0 +1,88 @@ +import type { Publisher } from '../types' + +export const idf: Publisher = { + flavor: "idf", + logo: "/logos/idf-logo.png", + name: "IDF", + fullName: "International Dairy Federation", + category: "industry", + description: "The IDF is a source of scientific and technical expertise for the global dairy sector. IDF standards and methods of analysis are used internationally.", + website: "https://www.fil-idf.org", + syntaxNotes: "IDF identifiers follow: IDF [Type] [Number]-[Part]:[Year]. Types include no prefix (Standard), RM (Reviewed Method). Joint ISO/IDF publications exist.", + relatedFlavors: ["iso"], + docTypes: [ + { + key: "international_standard", + title: "International Standard", + abbr: [""], + description: "IDF International Standards for dairy products and methods.", + examples: [ + { input: "IDF 148-1:2008" }, + { input: "IDF 146:2003" }, + { input: "IDF 140-1:2007" }, + ], + }, + { + key: "reviewed_method", + title: "Reviewed Method", + abbr: ["RM"], + description: "IDF Reviewed Methods for dairy analysis.", + examples: [ + { input: "IDF/RM 254:2022" }, + { input: "IDF/RM 233-1:2017" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["AMD"], + description: "Amendments to IDF publications.", + examples: [ + { input: "IDF 146:2003/AMD 1:2023" }, + { input: "IDF 140-1:2007/AMD 1:2012" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["COR"], + description: "Corrections to IDF publications.", + examples: [ + { input: "IDF 148-1:2008/COR 1:2009" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "IDF", + dataType: "enum", + values: ["IDF"], + example: "IDF", + }, + { + name: "Number", + description: "The publication number", + dataType: "integer", + format: "1–3 digit number.", + example: "146", + }, + { + name: "Part", + description: "Part number", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by colon.", + example: "2003", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies an IDF standard", syntax: "IDF [Number]:[Year]/AMD [N]:[Year]", example: "IDF 146:2003/AMD 1:2023" }, + { type: "Corrigendum", description: "Corrects errors", syntax: "IDF [Number]:[Year]/COR [N]:[Year]", example: "IDF 148-1:2008/COR 1:2009" }, +], +} + +export default idf diff --git a/src/data/flavors/iec.ts b/src/data/flavors/iec.ts new file mode 100644 index 0000000..94bd85b --- /dev/null +++ b/src/data/flavors/iec.ts @@ -0,0 +1,304 @@ +import type { Publisher } from '../types' + +export const iec: Publisher = { + flavor: "iec", + logo: "/logos/iec-logo.svg", + name: "IEC", + fullName: "International Electrotechnical Commission", + category: "international", + description: "The IEC is a global organization that prepares and publishes international standards for all electrical, electronic, and related technologies. IEC standards cover a vast range of technologies from power generation to nanotechnology.", + website: "https://www.iec.ch", + syntaxNotes: "IEC identifiers follow the pattern: IEC [Type] [Number]-[Part]:[Year]. Many IEC identifiers include CISPR (Comité International Spécial des Perturbations Radioélectriques) designations. Value-added products (CSV, CMV, RLV, etc.) use suffixes.", + urnPattern: "urn:iec:std:iec:[number]:[edition]:[language]", + relatedFlavors: ["iso", "ieee", "bsi", "cen-cenelec", "csa"], + docTypes: [ + { + key: "international_standard", + title: "International Standard", + abbr: ["IS"], + description: "The primary IEC standard deliverable, defining requirements and specifications for electrotechnical products and systems.", + examples: [ + { input: "IEC 61131-3:2013" }, + { input: "IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV" }, + { input: "CISPR 16-1-1:2019" }, + { input: "IEC 60034-1:2022 RLV" }, + ], + }, + { + key: "technical_report", + title: "Technical Report", + abbr: ["TR"], + description: "An informative document containing collected data or analysis that does not constitute a standard.", + examples: [ + { input: "IEC TR 60825-14:2022" }, + { input: "IEC TR 62357-1:2016" }, + ], + }, + { + key: "technical_specification", + title: "Technical Specification", + abbr: ["TS"], + description: "A specification published for provisional application, typically when technology is still evolving.", + examples: [ + { input: "IEC TS 62600-100:2012" }, + { input: "IEC TS 62257-1:2015" }, + ], + }, + { + key: "publicly_available_specification", + title: "Publicly Available Specification", + abbr: ["PAS"], + description: "A specification published to respond to urgent market needs.", + examples: [ + { input: "IEC PAS 62430:2007" }, + ], + }, + { + key: "guide", + title: "Guide", + abbr: ["Guide"], + description: "IEC Guides provide guidance on standardization principles and practices.", + examples: [ + { input: "IEC GUIDE 103:1980" }, + { input: "IEC GUIDE 108:2019" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["AMD", "AM"], + description: "Modifies an existing standard by adding, changing, or deleting specified elements.", + examples: [ + { input: "IEC 61131-3:2013/AMD1:2019" }, + { input: "IEC 60050-111/AMD1/FRAG1 ED2" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["COR"], + description: "Corrects technical or editorial errors in a published document.", + examples: [ + { input: "CISPR 16-1-3:2004/COR1:2006" }, + { input: "CISPR 16-1-5:2014/COR1:2020" }, + ], + }, + { + key: "interpretation_sheet", + title: "Interpretation Sheet", + abbr: ["ISH"], + description: "Official interpretation of requirements in an IEC standard.", + examples: [ + { input: "IEC 60079-0:2017/ISH1:2023" }, + { input: "IEC 60335-2-6:2002/ISH1:2008" }, + ], + }, + { + key: "consolidated_identifier", + title: "Consolidated Version", + abbr: ["CSV", "CMV"], + description: "A value-added product combining the base standard with all amendments. CSV (Consolidated Standalone Version) and CMV (Consolidated Mixed Version).", + examples: [ + { input: "IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV" }, + { input: "IEC 61010-1:2010+AMD1:2016 CMV" }, + ], + }, + { + key: "working_document", + title: "Working Document", + abbr: ["WD"], + description: "Internal working documents for IEC committee use.", + examples: [ + { input: "IEC 2/2102/CDV" }, + { input: "IEC 2/2103/NP" }, + ], + }, + { + key: "fragment_identifier", + title: "Fragment Identifier", + abbr: ["FRAG"], + description: "References a specific fragment within an amendment.", + examples: [ + { input: "IEC 60050-111/AMD1/FRAG1 ED2" }, + { input: "IEC 60050-121/AMD2/FRAG1 ED2" }, + ], + }, + { + key: "component_specification", + title: "Component Specification", + abbr: ["CS"], + description: "Specifications for electronic components.", + examples: [ + { input: "IEC 60127-1:2006/AMD1:2014" }, + ], + }, + { + key: "operational_document", + title: "Operational Document", + abbr: ["OD"], + description: "Documents related to IEC conformity assessment systems.", + examples: [ + { input: "IECEx OD 005-1" }, + ], + }, + { + key: "systems_reference_document", + title: "Systems Reference Document", + abbr: ["SRD"], + description: "Reference documents for IEC systems.", + examples: [ + { input: "IEC SRD 63226:2021" }, + ], + }, + { + key: "vap_identifier", + title: "Value-Added Product", + abbr: ["CSV", "CMV", "RLV", "SER", "EXV", "PAC", "PRV"], + description: "Value-added versions of standards (Consolidated, Redline, Series, Extract, Package, Preview).", + examples: [ + { input: "IEC 60034-1:2022 RLV" }, + { input: "IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV" }, + { input: "IEC 60335-2-6:2002 SER" }, + ], + }, + { + key: "test_report_form", + title: "Test Report Form", + abbr: ["TRF"], + description: "Standardized forms used in IEC conformity assessment.", + examples: [ + { input: "IECEx TRF 60079/0" }, + ], + }, + { + key: "sheet_identifier", + title: "Sheet Identifier", + abbr: ["Sheet"], + description: "Individual sheet within a multi-sheet standard.", + examples: [ + { input: "IEC 60335-2-6:2002 Sheet 1" }, + ], + }, + { + key: "societal_technology_trend_report", + title: "Societal Technology Trend Report", + abbr: ["STTR"], + description: "Reports analyzing technology trends and their societal impact.", + examples: [ + { input: "IEC STTR 1:2020" }, + ], + }, + { + key: "white_paper", + title: "White Paper", + abbr: ["WP"], + description: "IEC white papers exploring emerging technology topics.", + examples: [ + { input: "IEC WP AAL:2022" }, + ], + }, +], + stages: [ + { code: "00.00", abbr: "PWI", name: "Preliminary Work Item" }, + { code: "10.00", abbr: "NP", name: "New Proposal" }, + { code: "20.00", abbr: "WD", name: "Working Draft" }, + { code: "30.00", abbr: "CD", name: "Committee Draft" }, + { code: "35.00", abbr: "CC", name: "Committee Draft for Enquiry" }, + { code: "40.00", abbr: "CDV", name: "Committee Draft for Vote" }, + { code: "40.99", abbr: "DTS", name: "Draft Technical Specification" }, + { code: "40.99", abbr: "DTR", name: "Draft Technical Report" }, + { code: "50.00", abbr: "FDIS", name: "Final Draft International Standard" }, + { code: "50.99", abbr: "FDTS", name: "Final Draft Technical Specification" }, + { code: "50.99", abbr: "FDTR", name: "Final Draft Technical Report" }, + { code: "60.00", abbr: "PRF", name: "Proof (pre-publication)" }, + { code: "60.60", abbr: "IS", name: "International Standard (published)" }, +], + components: [ + { + name: "Publisher", + description: "The issuing organization (IEC, CISPR)", + dataType: "enum", + values: ["IEC", "CISPR"], + example: "IEC", + }, + { + name: "Document Type", + description: "The type of deliverable (IS, TR, TS, Guide, etc.)", + dataType: "enum", + values: ["IS", "TR", "TS", "PAS", "Guide", "ISH"], + format: "Appears between publisher and number", + example: "TR", + }, + { + name: "Number", + description: "The unique document number", + dataType: "integer", + format: "1–6 digit number", + example: "61131", + }, + { + name: "Part", + description: "Part number for multi-part standards", + dataType: "integer", + format: "Optional. After dash following number.", + example: "3", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by colon", + example: "2013", + }, + { + name: "Edition", + description: "Edition number (e.g., ED2)", + dataType: "integer", + format: "Optional. Prefixed with \"ED\"", + example: "ED2", + }, + { + name: "Language", + description: "Language code", + dataType: "enum", + values: ["en", "fr", "ru", "de", "es", "ja", "zh"], + format: "Optional. In parentheses.", + example: "en", + }, + { + name: "Stage", + description: "Development stage (CD, CDV, FDIS)", + dataType: "enum", + values: ["NP", "WD", "CD", "CC", "CDV", "FDIS", "PRF", "IS"], + format: "Optional.", + example: "CDV", + }, + { + name: "VAP Suffix", + description: "Value-added product suffix (CSV, RLV, SER, etc.)", + attribute: "vap_suffix", + dataType: "enum", + values: ["CSV", "CMV", "RLV", "SER", "EXV", "PAC", "PRV", "DB"], + format: "Value-Added Product suffix at end of identifier", + example: "CSV", + }, + { + name: "Consolidated Amendment", + description: "Consolidated amendment references (+AMD1:2009+AMD2:2013)", + attribute: "consolidated_amendment", + dataType: "compound", + format: "One or more amendment references joined with \"+\", e.g. +AMD1:2009+AMD2:2013", + example: "+AMD1:2009+AMD2:2013", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies a base standard", syntax: "IEC [Number]:[Year]/AMD[N]:[Year]", example: "IEC 61131-3:2013/AMD1:2019" }, + { type: "Corrigendum", description: "Corrects errors in published documents", syntax: "IEC [Number]:[Year]/COR[N]:[Year]", example: "CISPR 16-1-3:2004/COR1:2006" }, + { type: "Consolidated", description: "Base + amendments combined", syntax: "IEC [Number]:[Year]+AMD1:[Year] CSV", example: "IEC 60950-1:2005+AMD1:2009+AMD2:2013 CSV" }, + { type: "Fragment", description: "Specific fragment within an amendment", syntax: "IEC [Number]/AMD[N]/FRAG[N] ED[N]", example: "IEC 60050-111/AMD1/FRAG1 ED2" }, + { type: "Part", description: "Multi-part standard", syntax: "IEC [Number]-[Part]:[Year]", example: "IEC 61131-3:2013" }, + { type: "Interpretation Sheet", description: "Official interpretation", syntax: "IEC [Number]:[Year]/ISH[N]:[Year]", example: "IEC 60079-0:2017/ISH1:2023" }, +], +} + +export default iec diff --git a/src/data/flavors/ieee.ts b/src/data/flavors/ieee.ts new file mode 100644 index 0000000..f604864 --- /dev/null +++ b/src/data/flavors/ieee.ts @@ -0,0 +1,249 @@ +import type { Publisher } from '../types' + +export const ieee: Publisher = { + flavor: "ieee", + logo: "/logos/ieee-logo.svg", + name: "IEEE", + fullName: "Institute of Electrical and Electronics Engineers", + category: "international", + description: "IEEE is the world's largest technical professional organization for the advancement of technology. IEEE Standards Association (IEEE SA) develops standards across a wide range of industries including power and energy, telecommunications, computing, and more.", + website: "https://standards.ieee.org", + syntaxNotes: "IEEE identifiers follow patterns like: IEEE Std [Number]-[Year], IEEE [Number]-[Year], IEEE [Draft Number]/D[DraftVersion]. Some include AIEE legacy identifiers.", + urnPattern: "urn:ieee:std:[number]:[year]", + relatedFlavors: ["iec", "iso", "csa", "bsi"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: ["Std"], + description: "IEEE Standards define requirements, specifications, and best practices for technologies.", + examples: [ + { input: "IEEE Std 802.3-2018" }, + { input: "IEEE Std 802.11-2020" }, + { input: "IEEE Std 754-2019" }, + { input: "IEEE Std 1588-2019" }, + ], + }, + { + key: "project_draft_identifier", + title: "Project Draft", + abbr: ["P"], + description: "Draft standards under development, prefixed with P.", + examples: [ + { input: "IEEE P802.3bf/D3.0" }, + { input: "IEEE P802.11be/D7.0" }, + { input: "IEEE P1453/D11, May 2023" }, + ], + }, + { + key: "adopted_standard", + title: "Adopted Standard", + abbr: ["Adopted"], + description: "An IEEE adoption of another organization's standard.", + examples: [ + { input: "IEEE Std 1244-5-2000 (Adopted from ISO/IEC 14102:1995)" }, + ], + }, + { + key: "dual_published", + title: "Dual-Published Standard", + abbr: ["Dual"], + description: "Standards published jointly by IEEE and another organization (e.g., IEC/IEEE).", + examples: [ + { input: "IEC/IEEE 62582-6:2022" }, + { input: "IEC/IEEE 60780-323:2023" }, + ], + }, + { + key: "iec_ieee_copublished", + title: "IEC/IEEE Copublished", + abbr: ["Copub"], + description: "Standards jointly published by IEC and IEEE.", + examples: [ + { input: "IEC/IEEE P60780-323, CDV1 2014" }, + { input: "IEC/IEEE P62582-6, FDIS May 2019" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["Cor", "Cor 1"], + description: "Corrections to published IEEE standards.", + examples: [ + { input: "IEEE Std 802.3-2018/Cor 1-2020" }, + ], + }, + { + key: "supplement_identifier", + title: "Supplement", + abbr: ["Suppl"], + description: "Supplementary material to a base standard.", + examples: [ + { input: "IEEE Std 802.3cg-2019 (Supplement to IEEE Std 802.3-2018)" }, + ], + }, + { + key: "redlined_standard", + title: "Redlined Standard", + abbr: ["Redline"], + description: "A version showing changes from the previous edition with additions and deletions marked.", + examples: [ + { input: "IEEE Std 802.3-2018 (Redline of IEEE Std 802.3-2015)" }, + ], + }, + { + key: "nesc", + title: "NESC (National Electrical Safety Code)", + abbr: ["NESC"], + description: "The National Electrical Safety Code, published by IEEE.", + examples: [ + { input: "2012 NESC Handbook, Seventh Edition" }, + { input: "2017 NESC Handbook, Premier Edition" }, + ], + }, + { + key: "si_standard", + title: "SI Standard", + abbr: ["SI"], + description: "IEEE/ASTM SI 10 standard for metric/inch conversion.", + examples: [ + { input: "IEEE/ASTM SI 10-2010" }, + ], + }, + { + key: "joint_development", + title: "Joint Development", + abbr: ["Joint"], + description: "Standards under joint development by IEC and IEEE.", + examples: [ + { input: "IEC/IEEE P60780-323, CDV1 2014" }, + ], + }, + { + key: "dual_identifier", + title: "Dual Identifier", + abbr: ["Dual"], + description: "Standards with dual numbering from different organizations.", + examples: [ + { input: "ANSI/IEEE Std 802.3-1985" }, + ], + }, + { + key: "conformance_identifier", + title: "Conformance Identifier", + abbr: ["Conformance"], + description: "Conformance testing documentation.", + examples: [ + { input: "IEEE Std 802.3.1-2013" }, + ], + }, + { + key: "interpretation_identifier", + title: "Interpretation", + abbr: ["Interp"], + description: "Official interpretations of IEEE standards.", + examples: [ + { input: "IEEE Std 802.3 Interpretation #1-2007" }, + ], + }, + { + key: "csa_dual_published", + title: "CSA Dual-Published", + abbr: ["CSA Dual"], + description: "Standards dual-published with CSA Group.", + examples: [ + { input: "IEEE Std C37.30.1-2017/CSA C22.2 No. 60038-1:17" }, + ], + }, + { + key: "multi_numbered_identifier", + title: "Multi-Numbered Identifier", + abbr: ["Multi"], + description: "Standards with multiple designation numbers.", + examples: [ + { input: "IEEE Std 802.3az-2010" }, + ], + }, + { + key: "parenthetical_identifier", + title: "Parenthetical Identifier", + abbr: ["Paren"], + description: "Standards identified with parenthetical information.", + examples: [ + { input: "IEEE 1016-2009 (Revision of IEEE 1016-1998)" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "IEEE, IEC/IEEE, or ANSI/IEEE", + dataType: "enum", + values: ["IEEE", "IEC/IEEE", "ANSI/IEEE"], + example: "IEEE", + }, + { + name: "Draft Indicator", + description: "P prefix for draft standards", + attribute: "draft", + dataType: "enum", + values: ["P"], + format: "Present only for draft standards. Replaces \"Std\".", + example: "P", + }, + { + name: "Number", + description: "The standard number", + dataType: "string", + format: "Alphanumeric. May contain dots (e.g., 802.3, C37.118)", + example: "802.3", + }, + { + name: "Part", + description: "Part number or subpart", + dataType: "string", + format: "Optional. Subpart after dot in number.", + example: "1", + }, + { + name: "Year", + description: "Publication or revision year", + dataType: "year", + format: "4-digit year, preceded by hyphen", + example: "2018", + }, + { + name: "Draft Version", + description: "Draft version number (e.g., D3.0)", + dataType: "string", + format: "Format: D[Major].[Minor]. Only for drafts.", + example: "D3.0", + }, + { + name: "Relationship", + description: "Relationship to other standards (Revision of, Amendment to)", + attribute: "relationship", + dataType: "string", + format: "Optional. Describes relation to other standards (e.g., \"Revision of\", \"Amendment to\").", + example: "Revision of IEEE 1016-1998", + }, + { + name: "Typed Stage", + description: "Stage indicator (CDV, FDIS, etc.)", + attribute: "typed_stage", + dataType: "enum", + values: ["CDV", "FDIS"], + format: "Optional. For IEC/IEEE joint documents.", + example: "CDV", + }, +], + algebra: [ + { type: "Corrigendum", description: "Corrections to published standards", syntax: "IEEE Std [Number]-[Year]/Cor [N]-[Year]", example: "IEEE Std 802.3-2018/Cor 1-2020" }, + { type: "Supplement", description: "Additional content to base standard", syntax: "IEEE Std [Number][Suffix]-[Year]", example: "IEEE Std 802.3cg-2019" }, + { type: "Adoption", description: "Adoption of external standard", syntax: "IEEE Std [Number]-[Year] (Adopted from [ExternalID])", example: "IEEE Std 1244-5-2000 (Adopted from ISO/IEC 14102:1995)" }, + { type: "Copublished", description: "Joint IEC/IEEE publication", syntax: "IEC/IEEE [Number]-[Year]", example: "IEC/IEEE 62582-6:2022" }, + { type: "Draft", description: "Draft stage", syntax: "IEEE P[Number]/D[Version]", example: "IEEE P802.3bf/D3.0" }, +], +} + +export default ieee diff --git a/src/data/flavors/ietf.ts b/src/data/flavors/ietf.ts new file mode 100644 index 0000000..72a5f5d --- /dev/null +++ b/src/data/flavors/ietf.ts @@ -0,0 +1,88 @@ +import type { Publisher } from '../types' + +export const ietf: Publisher = { + flavor: "ietf", + logo: "/logos/ietf-logo.svg", + name: "IETF", + fullName: "Internet Engineering Task Force", + category: "industry", + description: "The Internet Engineering Task Force (IETF) is the premier body for developing and promoting Internet standards. Organized as a large open international community of network designers, operators, vendors, and researchers, the IETF produces the Request for Comments (RFC) document series — the foundational specifications of the Internet, covering TCP/IP, DNS, TLS, HTTP, BGP, SMTP, and every other core Internet protocol. The IETF also maintains three sub-series overlays on top of RFCs: STD (Internet Standards — RFCs that have reached full standardization), BCP (Best Current Practices — RFCs documenting community-agreed practices), and FYI (For Your Information — RFCs providing introductory and explanatory material, now mostly historical).", + website: "https://www.ietf.org", + syntaxNotes: "IETF identifiers come in 5 shapes: RFC '', BCP '', STD '', FYI '', and Internet-Draft '-'. Internet-Drafts are work-in-progress documents with a name like 'draft-giuliano-treedn' and an optional two-digit version suffix. RFCs/BCPs/STDs/FYIs share the same numbering space conceptually but each has its own sub-series index.", + urnPattern: "urn:ietf:[series]:[number]", + relatedFlavors: ["iana", "w3c"], + docTypes: [ + { + key: "rfc", + title: "Request for Comments (RFC)", + abbr: ["RFC"], + description: "The Request for Comments series — the foundational document series of the Internet. RFCs cover every Internet protocol from TCP (RFC 793) and IP (RFC 791) through HTTP (RFC 9110), TLS (RFC 8446), and modern extensions. Despite the name, RFCs at the STD level are formal Internet Standards. RFC numbers are never reused; once published, an RFC is immutable (errors are addressed via new RFCs that obsolete old ones).", + examples: [ + { input: "RFC 2119" }, + { input: "RFC 8174" }, + { input: "RFC 791" }, + { input: "RFC 9110" }, + { input: "RFC 8446" }, + ], + }, + { + key: "bcp", + title: "Best Current Practice (BCP)", + abbr: ["BCP"], + description: "The Best Current Practice sub-series — RFCs that document agreed-upon community practices rather than protocol specifications. BCPs cover topics like IETF conduct (BCP 54, RFC 7154), IANA considerations (BCP 26, RFC 8126), and security guidelines. A single BCP number may aggregate multiple RFCs.", + examples: [ + { input: "BCP 3" }, + { input: "BCP 26" }, + { input: "BCP 54" }, + ], + }, + { + key: "std", + title: "Internet Standard (STD)", + abbr: ["STD"], + description: "The Internet Standard sub-series — RFCs that have completed the full IETF standardization process and are designated as official Internet Standards. STD numbers are stable across revisions: when an STD RFC is updated, the STD number is retained while the underlying RFC number may change. For example, STD 66 (the URI Generic Syntax) has been revised multiple times across RFC 3986, RFC 6874, etc.", + examples: [ + { input: "STD 66" }, + { input: "STD 1" }, + { input: "STD 80" }, + ], + }, + { + key: "fyi", + title: "For Your Information (FYI)", + abbr: ["FYI"], + description: "The For Your Information sub-series — RFCs providing introductory, explanatory, or background material aimed at users and newcomers. The FYI sub-series is largely historical; most FYIs were published in the early 1990s. FYI numbers are stable identifiers even though the underlying RFC may be obsoleted.", + examples: [ + { input: "FYI 1" }, + { input: "FYI 17" }, + { input: "FYI 36" }, + ], + }, + { + key: "internet_draft", + title: "Internet-Draft", + abbr: ["draft"], + description: "Work-in-progress documents being developed within IETF Working Groups (or by individual submitters). Internet-Drafts are NOT RFCs and are NOT official specifications — they exist for review and revision. Draft names follow the form 'draft----' where the version is a two-digit suffix. Drafts automatically expire after 6 months unless renewed. A draft's name is unique for the document's lifetime; only the version suffix changes between revisions.", + examples: [ + { input: "draft-giuliano-treedn-02" }, + { input: "draft-giuliano-treedn" }, + { input: "draft-ietf-httpbis-cache-digest-04" }, + ], + }, + ], + components: [ + { name: "Series", description: "Series prefix: RFC, BCP, STD, FYI (or nil for Internet-Drafts)", attribute: "series", example: "RFC" }, + { name: "Number", description: "Sequence number within the sub-series (RFC, BCP, STD, FYI)", attribute: "number", example: "2119" }, + { name: "Draft Name", description: "Internet-Draft name (e.g. 'draft-giuliano-treedn'), without version suffix", attribute: "name" }, + { name: "Version", description: "Internet-Draft two-digit version suffix (e.g. '02'), nil when absent", attribute: "version" }, + ], + algebra: [ + { type: "RFC", description: "Standard RFC citation", syntax: "RFC ", example: "RFC 2119" }, + { type: "BCP", description: "Best Current Practice", syntax: "BCP ", example: "BCP 3" }, + { type: "STD", description: "Internet Standard (sub-series)", syntax: "STD ", example: "STD 66" }, + { type: "FYI", description: "For Your Information", syntax: "FYI ", example: "FYI 1" }, + { type: "Internet-Draft", description: "Work-in-progress draft, optional version suffix", syntax: "[-]", example: "draft-giuliano-treedn-02" }, + ], +} + +export default ietf diff --git a/src/data/flavors/iho.ts b/src/data/flavors/iho.ts new file mode 100644 index 0000000..883d450 --- /dev/null +++ b/src/data/flavors/iho.ts @@ -0,0 +1,138 @@ +import type { Publisher } from '../types' + +export const iho: Publisher = { + flavor: "iho", + logo: "/logos/iho-logo.svg", + name: "IHO", + fullName: "International Hydrographic Organization", + category: "international", + description: "The International Hydrographic Organization (IHO) is an intergovernmental organization that coordinates the setting of international hydrographic and nautical charting standards. Its S-series of Standards and Specifications underpin Electronic Navigational Charts (ENCs), the S-100 Universal Hydrographic Data Model, and the maritime regulatory framework under SOLAS. Member states commit to adopting IHO specifications for their national charting agencies.", + website: "https://iho.int", + syntaxNotes: "IHO identifiers use a single-letter series prefix followed by a hyphenated number: IHO {S|P|M|B|C}-[Number][ Ap. [Appendix]][ Part [Part]][ Annex [Annex]][ Suppl [Supplement]] [Version].", + urnPattern: "urn:iho:[type]:[number]:[version]", + relatedFlavors: ["iso", "iala", "iec"], + docTypes: [ + { + key: "standard", + title: "Standards and Specifications", + abbr: ["S"], + description: "IHO Standards and Specifications (S series), including the S-100 Universal Hydrographic Data Model and the S-57/S-101 ENC transfer standards.", + examples: [ + { input: "IHO S-44 5.0.0" }, + { input: "IHO S-100 Part 4a 1.0.0" }, + { input: "IHO S-65 Ap. A 1.0.0" }, + ], + }, + { + key: "publication", + title: "Publication", + abbr: ["P"], + description: "IHO Publications (P series) — reference works such as Charts and Publications Regulations. Numbers may carry a sub-year (P-1/21) or sub-part (P-6-3).", + examples: [ + { input: "IHO P-1 1.0.0" }, + { input: "IHO P-1/21 1.0.0" }, + { input: "IHO P-6-3 1.0.0" }, + ], + }, + { + key: "miscellaneous", + title: "Miscellaneous Publication", + abbr: ["M"], + description: "IHO Miscellaneous Publications (M series) — manuals, guides, and reference documents that do not fit the S/P categories.", + examples: [ + { input: "IHO M-3 2.0.0" }, + ], + }, + { + key: "bibliographic", + title: "Bibliographic Publication", + abbr: ["B"], + description: "IHO Bibliographic Publications (B series) — bibliographies and reference catalogues.", + examples: [ + { input: "IHO B-4 2.19.0" }, + ], + }, + { + key: "circular_letter", + title: "Circular Letter", + abbr: ["C"], + description: "IHO Circular Letters (C series) — official correspondence from the IHO Secretariat to Member States.", + examples: [ + { input: "IHO C-13 1.0.0" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "IHO — optional on input, always emitted on output", + dataType: "enum", + values: ["IHO"], + example: "IHO", + }, + { + name: "Type Letter", + description: "Single-letter series code (S, P, M, B, C)", + attribute: "type_letter", + dataType: "enum", + values: ["S (Standard/Specification)", "P (Publication)", "M (Miscellaneous)", "B (Bibliographic)", "C (Circular Letter)"], + example: "S", + }, + { + name: "Number", + description: "Document number, may include sub-part or slash-year", + attribute: "number", + dataType: "string", + format: "Hyphenated after type letter. May include slash-year (P-1/21) or sub-part (P-6-3).", + example: "44", + }, + { + name: "Appendix", + description: "Appendix marker: \"Ap.\" prefix", + attribute: "appendix", + dataType: "string", + format: "\"Ap.\" prefix, single letter.", + example: "Ap. A", + }, + { + name: "Part", + description: "Part marker: \"Part\" keyword", + attribute: "part", + dataType: "string", + format: "\"Part\" keyword. Alphanumeric allowed (e.g. 4a).", + example: "Part 4a", + }, + { + name: "Annex", + description: "Annex marker: \"Annex\" keyword", + attribute: "annex", + dataType: "string", + format: "\"Annex\" keyword.", + example: "Annex A", + }, + { + name: "Supplement", + description: "Supplement marker: \"Suppl\" keyword", + attribute: "supplement", + dataType: "string", + format: "\"Suppl\" keyword.", + example: "Suppl 1", + }, + { + name: "Version", + description: "Three-part dotted version (X.Y.Z)", + attribute: "version", + dataType: "string", + format: "Three-part dotted version (X.Y.Z).", + example: "5.0.0", + }, +], + algebra: [ + { type: "Part", description: "Subdivision of a standard", syntax: "IHO [Type]-[Number] Part [Part] [Version]", example: "IHO S-100 Part 4a 1.0.0" }, + { type: "Appendix", description: "Appendix within a publication", syntax: "IHO [Type]-[Number] Ap. [Letter] [Version]", example: "IHO S-65 Ap. A 1.0.0" }, + { type: "Slash Year", description: "Annual revision indicator within a series", syntax: "IHO [Type]-[Number]/[Year] [Version]", example: "IHO P-1/21 1.0.0" }, + { type: "Sub-part", description: "Compound number with sub-part", syntax: "IHO [Type]-[Number]-[SubPart] [Version]", example: "IHO P-6-3 1.0.0" }, +], +} + +export default iho diff --git a/src/data/flavors/iso.ts b/src/data/flavors/iso.ts new file mode 100644 index 0000000..9720dc7 --- /dev/null +++ b/src/data/flavors/iso.ts @@ -0,0 +1,320 @@ +import type { Publisher } from '../types' + +export const iso: Publisher = { + flavor: "iso", + logo: "/logos/iso-logo.svg", + name: "ISO", + fullName: "International Organization for Standardization", + category: "international", + description: "ISO is an independent, non-governmental international organization that develops standards to ensure the quality, safety, and efficiency of products, services, and systems. ISO has published over 25,000 international standards covering almost all aspects of technology and manufacturing.", + website: "https://www.iso.org", + syntaxNotes: "ISO identifiers follow the pattern: [Copublisher/]ISO [Type] [Number][-Part]:[Year]. Joint publications use copublishers like ISO/IEC, ISO/ASTM, etc.", + urnPattern: "urn:iso:std:iso[:copublisher]:[number]:[edition]:[language]", + relatedFlavors: ["iec", "astm", "bsi", "cen-cenelec", "ieee"], + docTypes: [ + { + key: "international_standard", + title: "International Standard", + abbr: ["IS"], + description: "The primary deliverable of ISO. International Standards are documents that provide requirements, specifications, guidelines, or characteristics that can be used consistently to ensure materials, products, processes, and services are fit for their purpose.", + examples: [ + { input: "ISO 9001:2015" }, + { input: "ISO/IEC 17031-1:2020" }, + { input: "ISO 14001:2015(en)" }, + { input: "ISO 9001:2015/Ed 5" }, + ], + }, + { + key: "technical_report", + title: "Technical Report", + abbr: ["TR"], + description: "A Technical Report (TR) is an informative document containing information of a different kind from that of the International Standards. TRs are published when a technical committee has collected data of a different kind from that which is normally published as a standard.", + examples: [ + { input: "ISO/TR 10450:2019" }, + { input: "ISO/TR 25679:2008" }, + { input: "ISO/TR 13587:2012" }, + ], + }, + { + key: "technical_specification", + title: "Technical Specification", + abbr: ["TS"], + description: "A Technical Specification (TS) addresses work still under technical development, or where it is believed that there will be a future, but not immediate, possibility of agreement on an International Standard. Published for provisional use.", + examples: [ + { input: "ISO/TS 22003:2013" }, + { input: "ISO/TS 14033:2012" }, + { input: "ISO/TS 16949:2009" }, + ], + }, + { + key: "publicly_available_specification", + title: "Publicly Available Specification", + abbr: ["PAS"], + description: "A PAS is published to respond to an urgent market need, representing either the consensus in a working group or the result of a workshop agreement. It has a maximum lifetime of 6 years before it must be converted to another deliverable type.", + examples: [ + { input: "ISO/PAS 45001:2017" }, + { input: "ISO/PAS 28000:2007" }, + { input: "ISO/PAS 22399:2007" }, + ], + }, + { + key: "guide", + title: "Guide", + abbr: ["Guide"], + description: "ISO Guides provide guidance and orientation on specific topics. They are not standards themselves but provide rules, guidelines, or recommendations for standardization work.", + examples: [ + { input: "ISO Guide 73:2009" }, + { input: "ISO/IEC Guide 98-3:2008" }, + { input: "ISO Guide 35:2017" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["Amd", "AM"], + description: "An Amendment modifies an existing International Standard by adding, changing, or deleting specified elements. It is published as a separate supplement to the base document and referenced using the base document ID.", + examples: [ + { input: "ISO 9001:2015/Amd 1:2024" }, + { input: "ISO 14001:2015/Amd 1:2023" }, + { input: "ISO/IEC 17031-1:2020/Amd 1:2022" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["Cor", "COR"], + description: "A Corrigendum corrects technical or editorial errors in an already published document. Unlike amendments, corrigenda do not add new content but fix mistakes.", + examples: [ + { input: "ISO 9001:2015/Cor 1:2016" }, + { input: "ISO 14001:2015/Cor 1:2016" }, + ], + }, + { + key: "supplement", + title: "Supplement", + abbr: ["Suppl"], + description: "A Supplement adds additional content to a base standard, such as supplementary requirements or guidelines.", + examples: [ + { input: "ISO/IEC 17031-1:2020/Suppl:2021" }, + ], + }, + { + key: "addendum", + title: "Addendum", + abbr: ["Add"], + description: "An Addendum is a legacy supplement type used primarily in older ISO documents. It adds new material to an existing standard.", + examples: [ + { input: "ISO 2789:2006/Add 1:2008" }, + ], + }, + { + key: "international_workshop_agreement", + title: "International Workshop Agreement", + abbr: ["IWA"], + description: "An IWA is a document developed through a workshop rather than the normal committee process. It provides a mechanism for reaching consensus outside the normal committee structure.", + examples: [ + { input: "IWA 36:2022" }, + { input: "IWA 39:2024" }, + { input: "AWI IWA 36" }, + ], + }, + { + key: "international_standardized_profile", + title: "International Standardized Profile", + abbr: ["ISP"], + description: "An ISP defines a standardized set of choices of the options available in International Standards for a particular function or application.", + examples: [ + { input: "ISO/IEC ISP 10611-7:2003" }, + ], + }, + { + key: "technology_trends_assessments", + title: "Technology Trends Assessments", + abbr: ["TTA"], + description: "TTAs are documents that provide an overview of emerging technologies and their potential for standardization.", + examples: [ + { input: "ISO/TTA 1:1994" }, + { input: "ISO/TTA 2:1997" }, + ], + }, + { + key: "directives", + title: "Directives", + abbr: ["Directives"], + description: "ISO/IEC Directives define the rules for the preparation and presentation of International Standards and other deliverables.", + examples: [ + { input: "ISO/IEC Directives Part 1:2023" }, + { input: "ISO/IEC Directives Part 2:2021" }, + ], + }, + { + key: "directives_supplement", + title: "Directives Supplement", + abbr: ["DIR SUP"], + description: "Supplements to the ISO/IEC Directives that provide additional procedures specific to ISO, IEC, or JTC.", + examples: [ + { input: "ISO/IEC DIR 1 ISO SUP:2023" }, + ], + }, + { + key: "extract", + title: "Extract", + abbr: ["Extract"], + description: "An Extract is a reproduction of a portion of a published International Standard.", + examples: [ + { input: "ISO 9001:2015/Extract" }, + ], + }, + { + key: "recommendation", + title: "Recommendation", + abbr: ["R"], + description: "A Recommendation is a legacy document type used in early ISO/IEC publications.", + examples: [ + { input: "ISO/R 100:1959" }, + ], + }, + { + key: "tc_document", + title: "Technical Committee Document", + abbr: ["N", "TC Doc"], + description: "Internal working documents of ISO technical committees, numbered with N-numbers.", + examples: [ + { input: "ISO/TC 176 N 1000" }, + ], + }, + { + key: "data", + title: "Data Document", + abbr: ["Data"], + description: "Data documents provide reference data sets or databases.", + examples: [ + { input: "ISO/Data 1:2007" }, + ], + }, +], + stages: [ + { code: "00.00", abbr: "PWI", name: "Preliminary Work Item" }, + { code: "10.00", abbr: "NP", name: "New Proposal" }, + { code: "10.99", abbr: "AWI", name: "Approved Work Item" }, + { code: "20.00", abbr: "WD", name: "Working Draft" }, + { code: "30.00", abbr: "CD", name: "Committee Draft" }, + { code: "40.00", abbr: "DIS", name: "Draft International Standard" }, + { code: "50.00", abbr: "FDIS", name: "Final Draft International Standard" }, + { code: "60.00", abbr: "PRF", name: "Proof of a standard (pre-publication)" }, + { code: "60.60", abbr: "IS", name: "International Standard (published)" }, + { code: "90.20", abbr: "RVD", name: "Review Discontinued" }, + { code: "90.60", abbr: "WTH", name: "Withdrawn" }, + { code: "90.92", abbr: "WDT", name: "Withdrawal Decided" }, + { code: "90.93", abbr: "RVD", name: "Review Verified" }, + { code: "95.20", abbr: "FPN", name: "Final Proposal for Withdrawal" }, + { code: "95.99", abbr: "WTH", name: "Withdrawal of International Standard" }, +], + components: [ + { + name: "Publisher", + description: "The issuing organization (ISO, or joint like ISO/IEC)", + dataType: "enum", + values: ["ISO"], + example: "ISO", + }, + { + name: "Copublisher", + description: "Additional organizations in joint publications (IEC, ASTM, CEN, etc.)", + attribute: "copublisher", + dataType: "enum", + values: ["IEC", "ASTM", "CEN", "IEEE", "ITU", "SAE", "IWA", "UNESCO", "OIML", "CIE"], + format: "Optional. Present for joint publications.", + example: "IEC", + }, + { + name: "Document Type", + description: "The type of deliverable (IS, TR, TS, PAS, Guide, etc.)", + attribute: "type", + dataType: "enum", + values: ["IS", "TR", "TS", "PAS", "Guide", "IWA", "ISP", "TTA", "R"], + format: "Appears between publisher and number", + example: "TR", + }, + { + name: "Number", + description: "The unique document number", + attribute: "number", + dataType: "integer", + format: "1–5 digit number", + example: "9001", + }, + { + name: "Part", + description: "Part number for multi-part standards", + attribute: "part", + dataType: "integer", + format: "Optional. Appended with hyphen after number.", + example: "1", + }, + { + name: "Year", + description: "Publication year", + attribute: "year", + dataType: "year", + format: "4-digit year, preceded by colon", + example: "2015", + }, + { + name: "Edition", + description: "Edition number (e.g., Ed 5)", + attribute: "edition", + dataType: "integer", + format: "Optional. Prefixed with \"Ed\"", + example: "5", + }, + { + name: "Language", + description: "Language code (en, fr, ru, etc.)", + attribute: "language", + dataType: "enum", + values: ["en", "fr", "ru", "de", "es", "ja", "zh", "ar", "pt", "it"], + format: "Optional. In parentheses after year.", + example: "en", + }, + { + name: "Stage", + description: "Development stage (WD, CD, DIS, FDIS)", + attribute: "stage", + dataType: "enum", + values: ["PWI", "NP", "AWI", "WD", "CD", "DIS", "FDIS", "PRF", "IS"], + format: "Optional. Precedes document type.", + example: "DIS", + }, + { + name: "Typed Stage", + description: "Stage combined with document type (e.g., DTR for Draft Technical Report)", + attribute: "typed_stage", + dataType: "enum", + values: ["DTR", "DTS", "FDTR", "FDTS", "AWI", "NP", "PRF"], + format: "Optional. Combined stage+type abbreviation.", + example: "DTR", + }, + { + name: "Supplement", + description: "Amendment or corrigendum reference", + attribute: "supplement", + dataType: "compound", + format: "Amendment/Corrigendum/Addendum with number and year, after slash", + example: "Amd 1:2024", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies a base standard by adding, changing, or deleting elements", syntax: "ISO [Number]:[Year]/Amd [N]:[Year]", example: "ISO 9001:2015/Amd 1:2024" }, + { type: "Corrigendum", description: "Corrects technical or editorial errors", syntax: "ISO [Number]:[Year]/Cor [N]:[Year]", example: "ISO 9001:2015/Cor 1:2016" }, + { type: "Addendum", description: "Legacy supplement type adding new material", syntax: "ISO [Number]:[Year]/Add [N]:[Year]", example: "ISO 2789:2006/Add 1:2008" }, + { type: "Part", description: "Multi-part standard relationship", syntax: "ISO [Number]-[Part]:[Year]", example: "ISO/IEC 17031-1:2020" }, + { type: "Series", description: "All-parts reference to a multi-part series", syntax: "ISO [Number] (all parts)", example: "ISO 9001 (all parts)" }, + { type: "Bundle", description: "Multiple documents bundled together", syntax: "[PubID] + [PubID]", example: "BS ISO 26000 + IWA 26" }, + { type: "Draft", description: "Draft stage of a document", syntax: "ISO/[Stage] [Type] [Number]", example: "ISO/DIS 45001" }, + { type: "Internal Document", description: "Working documents with N-numbers", syntax: "ISO/TC [N] [DocNumber]", example: "ISO/TC 176 N 1000" }, + { type: "Clause Reference", description: "Reference to specific clause within a document", syntax: "ISO [Number]:[Year], Clause [N]", example: "ISO 9001:2015, Clause 4.1" }, +], +} + +export default iso diff --git a/src/data/flavors/itu.ts b/src/data/flavors/itu.ts new file mode 100644 index 0000000..d8ff946 --- /dev/null +++ b/src/data/flavors/itu.ts @@ -0,0 +1,114 @@ +import type { Publisher } from '../types' + +export const itu: Publisher = { + flavor: "itu", + logo: "/logos/itu-logo.svg", + name: "ITU", + fullName: "International Telecommunication Union", + category: "international", + description: "The ITU is the United Nations specialized agency for information and communication technologies. ITU standards (Recommendations) are fundamental to the operation of global telecommunications networks and services.", + website: "https://www.itu.int", + syntaxNotes: "ITU Recommendations follow the pattern: ITU-[Sector] [Series][Number]-[Year]. Sectors include R (Radiocommunication), T (Telecommunication Standardization), and D (Telecommunication Development).", + relatedFlavors: ["iso", "iec"], + docTypes: [ + { + key: "recommendation", + title: "Recommendation", + abbr: ["Rec"], + description: "ITU Recommendations (sometimes called ITU-T Standards) define specifications for telecommunications technologies.", + examples: [ + { input: "ITU-R 01-201" }, + { input: "ITU-T G.992.1" }, + { input: "ITU-R SA.1014-4" }, + { input: "ITU-T E.164" }, + ], + }, + { + key: "supplement", + title: "Supplement", + abbr: ["Suppl"], + description: "Supplementary material to an ITU Recommendation.", + examples: [ + { input: "ITU-T G.992.1 Suppl 1" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["Amd"], + description: "Modifications to an existing ITU Recommendation.", + examples: [ + { input: "ITU-T G.992.1/Amd 1" }, + ], + }, + { + key: "corrigendum", + title: "Corrigendum", + abbr: ["Cor"], + description: "Corrections to published ITU Recommendations.", + examples: [ + { input: "ITU-T G.992.1/Cor 1" }, + ], + }, + { + key: "special_publication", + title: "Operational Bulletin", + abbr: ["OB"], + description: "ITU Operational Bulletin — a cross-bureau periodic publication covering regulatory and administrative information from all three ITU sectors.", + examples: [ + { input: "ITU OB No. 1283 (01/2024)" }, + { input: "ITU OB No. 1000" }, + ], + }, + { + key: "annex", + title: "Annex", + abbr: ["Annex"], + description: "An annex to an ITU Special Publication (Operational Bulletin). Rendered as \"Annex to ITU OB No. [Number]\".", + examples: [ + { input: "Annex to ITU OB No. 1000" }, + ], + }, +], + components: [ + { + name: "Sector", + description: "ITU sector: R (Radiocommunication), T (Standardization), D (Development)", + attribute: "sector", + dataType: "enum", + values: ["R (Radiocommunication)", "T (Standardization)", "D (Development)"], + format: "Required. After hyphen following ITU.", + example: "T", + }, + { + name: "Series", + description: "The series letter (e.g., G, E, H, SA)", + attribute: "series", + dataType: "enum", + values: ["G", "E", "H", "I", "J", "L", "M", "N", "P", "Q", "S", "T", "V", "X", "Y", "Z", "SA"], + format: "Required. Follows sector, separated by dot.", + example: "G", + }, + { + name: "Number", + description: "The recommendation number", + dataType: "string", + format: "Series-specific. Often includes dot-separated sub-numbers.", + example: "992.1", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "Optional. Preceded by hyphen.", + example: "2019", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies a Recommendation", syntax: "ITU-[Sector] [Series].[Number]/Amd [N]", example: "ITU-T G.992.1/Amd 1" }, + { type: "Corrigendum", description: "Corrects errors", syntax: "ITU-[Sector] [Series].[Number]/Cor [N]", example: "ITU-T G.992.1/Cor 1" }, + { type: "Supplement", description: "Additional content", syntax: "ITU-[Sector] [Series].[Number] Suppl [N]", example: "ITU-T G.992.1 Suppl 1" }, +], +} + +export default itu diff --git a/src/data/flavors/jcgm.ts b/src/data/flavors/jcgm.ts new file mode 100644 index 0000000..421cf92 --- /dev/null +++ b/src/data/flavors/jcgm.ts @@ -0,0 +1,80 @@ +import type { Publisher } from '../types' + +export const jcgm: Publisher = { + flavor: "jcgm", + logo: "/logos/jcgm-logo.svg", + name: "JCGM", + fullName: "Joint Committee for Guides in Metrology", + category: "international", + description: "The JCGM works to promote and harmonize metrology guidance, maintaining the Guide to the Expression of Uncertainty in Measurement (GUM) and the International Vocabulary of Metrology (VIM).", + website: "https://www.bipm.org/en/committees/jc/jcgm", + syntaxNotes: "JCGM identifiers follow: JCGM [Number]:[Year] or JCGM GUM-[Part]:[Year]. The GUM guides use the GUM prefix.", + relatedFlavors: ["iso", "oiml"], + docTypes: [ + { + key: "guide", + title: "Guide", + abbr: [""], + description: "JCGM Guides including the GUM (Guide to the Expression of Uncertainty in Measurement) and VIM (International Vocabulary of Metrology).", + examples: [ + { input: "JCGM 100:2008" }, + { input: "JCGM 101:2008" }, + { input: "JCGM 102:2011" }, + { input: "JCGM 200:2012" }, + ], + }, + { + key: "gum_guide", + title: "GUM Guide", + abbr: ["GUM"], + description: "Specific GUM (Guide to the Expression of Uncertainty in Measurement) publications.", + examples: [ + { input: "JCGM GUM-1:2022-11-28" }, + { input: "JCGM GUM-6:2020" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["Amd"], + description: "Amendments to JCGM guides.", + examples: [ + { input: "JCGM 100:2008/Amd 1" }, + { input: "JCGM 100:2008/Amd 1:2025-07-25" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "JCGM", + dataType: "enum", + values: ["JCGM"], + example: "JCGM", + }, + { + name: "Number", + description: "The guide number", + dataType: "integer", + format: "1–3 digit number.", + example: "100", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by colon.", + example: "2012", + }, + { + name: "Publisher Specific", + description: "JCGM publisher info", + attribute: "publisher", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies a JCGM guide", syntax: "JCGM [Number]:[Year]/Amd [N]:[Date]", example: "JCGM 100:2008/Amd 1:2025-07-25" }, +], +} + +export default jcgm diff --git a/src/data/flavors/jis.ts b/src/data/flavors/jis.ts new file mode 100644 index 0000000..434318b --- /dev/null +++ b/src/data/flavors/jis.ts @@ -0,0 +1,116 @@ +import type { Publisher } from '../types' + +export const jis: Publisher = { + flavor: "jis", + logo: "/logos/jis-logo.svg", + name: "JIS", + fullName: "Japanese Industrial Standards", + category: "national", + description: "Japanese Industrial Standards (JIS) are national standards for industrial products and technologies in Japan. They are established by the Japanese Industrial Standards Committee (JISC) and published by the Japanese Standards Association.", + website: "https://www.jsa.or.jp", + syntaxNotes: "JIS identifiers follow the pattern: JIS [Letter] [Number]:[Year]. The letter indicates the industrial classification (A=Civil Engineering, B=Mechanical, C=Electrical, etc.).", + relatedFlavors: ["iso", "plateau"], + docTypes: [ + { + key: "japanese_industrial_standard", + title: "Japanese Industrial Standard", + abbr: ["JIS"], + description: "The primary JIS standard type, covering a letter-based classification system.", + examples: [ + { input: "JIS A 0001:1999" }, + { input: "JIS B 0205-2:2019" }, + { input: "JIS C 60068-1:2019" }, + { input: "JIS K 2238:2019" }, + ], + }, + { + key: "standard", + title: "Standard", + abbr: [""], + description: "General JIS standards.", + examples: [ + { input: "JIS Z 8801-1:2019" }, + ], + }, + { + key: "technical_report", + title: "Technical Report", + abbr: ["TR"], + description: "JIS Technical Reports.", + examples: [ + { input: "JIS TR B 0001:2000" }, + ], + }, + { + key: "technical_specification", + title: "Technical Specification", + abbr: ["TS"], + description: "JIS Technical Specifications.", + examples: [ + { input: "JIS TS Z 0001:2000" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["Amd", "AM"], + description: "Amendments to JIS standards.", + examples: [ + { input: "JIS B 0205-2:2019/AM 1:2021" }, + ], + }, + { + key: "explanation", + title: "Explanation", + abbr: ["Exp"], + description: "Explanatory documents for JIS standards.", + examples: [ + { input: "JIS Exp A 0001:2000" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "JIS", + dataType: "enum", + values: ["JIS"], + example: "JIS", + }, + { + name: "Classification Letter", + description: "Industrial classification letter (A-Z)", + attribute: "classification", + dataType: "enum", + values: ["A (Civil Eng.)", "B (Mechanical)", "C (Electrical)", "D (Automotive)", "E (Railway)", "F (Shipbuilding)", "G (Iron & Steel)", "H (Non-Ferrous Metals)", "K (Chemical)", "L (Textile)", "M (Mining)", "P (Pulp & Paper)", "Q (Quality)", "R (Ceramics)", "S (Domestic)", "T (Medical)", "W (Aerospace)", "X (Info Processing)", "Z (General/Misc.)"], + example: "B", + }, + { + name: "Number", + description: "The document number", + dataType: "string", + format: "4-digit number.", + example: "0205", + }, + { + name: "Part", + description: "Part number", + dataType: "integer", + format: "Optional. After dash.", + example: "2", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by colon.", + example: "2019", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies a JIS standard", syntax: "JIS [Letter] [Number]:[Year]/AM [N]:[Year]", example: "JIS B 0205-2:2019/AM 1:2021" }, + { type: "Part", description: "Multi-part standard", syntax: "JIS [Letter] [Number]-[Part]:[Year]", example: "JIS B 0205-2:2019" }, +], +} + +export default jis diff --git a/src/data/flavors/nist.ts b/src/data/flavors/nist.ts new file mode 100644 index 0000000..e849c90 --- /dev/null +++ b/src/data/flavors/nist.ts @@ -0,0 +1,349 @@ +import type { Publisher } from '../types' + +export const nist: Publisher = { + flavor: "nist", + logo: "/logos/nist-logo.svg", + name: "NIST", + fullName: "National Institute of Standards and Technology", + category: "national", + description: "NIST is a physical sciences laboratory and a non-regulatory agency of the U.S. Department of Commerce. NIST was the first organization to adopt a multi-style, round-trippable PubID scheme with four defined rendering styles (full, abbreviated, short, machine-readable). The NIST PubID covers 19,333+ documents dating from 1901.", + website: "https://www.nist.gov", + syntaxNotes: "NIST identifiers use publisher abbreviations (NIST, NBS for pre-1988 documents) followed by a type abbreviation and number. NIST PubID defines four rendering styles: Full (Long), Abbreviated, Short, and Machine-Readable (MR). The MR style uses dot-separated fields and serves as the DOI suffix.", + relatedFlavors: ["ansi", "ieee"], + docTypes: [ + { + key: "special_publication", + title: "Special Publication", + abbr: ["SP"], + description: "NIST Special Publications cover a wide range of topics including cybersecurity, measurement science, and standards.", + examples: [ + { input: "NIST SP 800-53 Rev. 5" }, + { input: "NIST SP 800-63-3" }, + { input: "NIST SP 1800-1" }, + { input: "NIST SP 800-171 Rev. 2" }, + ], + }, + { + key: "federal_information_processing_standards", + title: "Federal Information Processing Standards", + abbr: ["FIPS"], + description: "FIPS are U.S. government standards for computer systems, particularly for security and interoperability.", + examples: [ + { input: "FIPS 197" }, + { input: "FIPS 180-4" }, + { input: "FIPS 202" }, + { input: "FIPS 186-5" }, + ], + }, + { + key: "interagency_report", + title: "Interagency/Internal Report", + abbr: ["IR"], + description: "NIST Internal Reports (NIST IR) document research findings.", + examples: [ + { input: "NIST IR 8115" }, + { input: "NIST IR 8259" }, + { input: "NIST IR 8011 Vol. 3" }, + { input: "NIST GCR 01-820" }, + ], + }, + { + key: "technical_note", + title: "Technical Note", + abbr: ["TN"], + description: "NIST Technical Notes document technical research and analysis.", + examples: [ + { input: "NIST TN 2176" }, + { input: "NIST TN 2088" }, + ], + }, + { + key: "handbook", + title: "Handbook", + abbr: ["HB"], + description: "NIST Handbooks provide reference data and guidelines.", + examples: [ + { input: "NIST HB 44" }, + { input: "NBS HB 1" }, + { input: "NIST HB 150-2C" }, + ], + }, + { + key: "circular", + title: "Circular", + abbr: ["CIRC"], + description: "Historical NBS Circulars (pre-NIST).", + examples: [ + { input: "NBS CIRC 1" }, + { input: "NBS CIRC 13" }, + ], + }, + { + key: "monograph", + title: "Monograph", + abbr: ["MONO"], + description: "NBS/NIST Monographs.", + examples: [ + { input: "NBS MONO 1" }, + { input: "NIST MONO 1" }, + ], + }, + { + key: "report", + title: "Report", + abbr: ["RPT"], + description: "NBS/NIST Reports.", + examples: [ + { input: "NBS RPT 1" }, + { input: "NIST RPT 1" }, + ], + }, + { + key: "letter_circular", + title: "Letter Circular", + abbr: ["LCIRC"], + description: "NBS Letter Circulars.", + examples: [ + { input: "NBS LCIRC 1" }, + ], + }, + { + key: "grant_contractor_report", + title: "Grant/Contractor Report", + abbr: ["GCR"], + description: "NBS/NIST Grant and Contractor Reports.", + examples: [ + { input: "NBS GCR 80-287" }, + { input: "NIST GCR 01-820" }, + ], + }, + { + key: "crpl_report", + title: "CRPL Report", + abbr: ["CRPL"], + description: "Central Radio Propagation Laboratory reports.", + examples: [ + { input: "NBS CRPL 1" }, + ], + }, + { + key: "nsrds", + title: "National Standard Reference Data Series", + abbr: ["NSRDS"], + description: "NSRDS-NBS publications.", + examples: [ + { input: "NSRDS-NBS 1" }, + ], + }, + { + key: "ncstar", + title: "NIST NCSTAR", + abbr: ["NCSTAR"], + description: "NIST Investigation of Structural Failures reports.", + examples: [ + { input: "NIST NCSTAR 1" }, + ], + }, + { + key: "owmwp", + title: "OWM Working Paper", + abbr: ["OWMWP"], + description: "Office of Weights and Measures Working Papers.", + examples: [ + { input: "NIST OWMWP 1" }, + ], + }, + { + key: "commercial_standard", + title: "Commercial Standard", + abbr: ["CS"], + description: "Historical NBS Commercial Standards.", + examples: [ + { input: "NBS CS 1" }, + ], + }, + { + key: "miscellaneous_publication", + title: "Miscellaneous Publication", + abbr: ["MP"], + description: "NBS Miscellaneous Publications.", + examples: [ + { input: "NBS MP 1" }, + ], + }, + { + key: "circular_supplement", + title: "Circular Supplement", + abbr: ["CS"], + description: "Supplements to NBS Circulars.", + examples: [ + { input: "NBS CIRC 1sup" }, + ], + }, + { + key: "commercial_standards_monthly", + title: "Commercial Standards Monthly", + abbr: ["CSM"], + description: "NBS Commercial Standards Monthly.", + examples: [ + { input: "NBS CSM 1" }, + ], + }, + { + key: "commercial_standard_emergency", + title: "Commercial Standard Emergency", + abbr: ["CSE"], + description: "Emergency Commercial Standards.", + examples: [ + { input: "NBS CSE 1" }, + ], + }, + { + key: "research_brief", + title: "Research Brief", + abbr: ["RB"], + description: "NIST Research Briefs — short-form research summaries from NIST laboratories. Revisions are appended as a lowercase 'r' suffix (e.g. 6r1).", + examples: [ + { input: "NIST RB 6" }, + { input: "NIST RB 4r1" }, + ], + }, + { + key: "chips_act_rd", + title: "CHIPS Act R&D", + abbr: ["CHIPS"], + description: "Publications under the NIST CHIPS Research and Development program (Creating Helpful Incentives to Produce Semiconductors). Numbers are compound, hyphenated (e.g. 1400-3).", + examples: [ + { input: "NIST CHIPS 1400-3" }, + { input: "NIST CHIPS 1100-1" }, + ], + }, + { + key: "nwirp", + title: "NWIRP", + abbr: ["NWIRP"], + description: "Low-volume NIST series present in the MODS publication dump.", + examples: [ + { input: "NIST NWIRP 1" }, + ], + }, +], + stages: [ + { code: "10.00", abbr: "WD", name: "Work-in-Progress Draft" }, + { code: "30.00", abbr: "PRD", name: "Preliminary Draft" }, + { code: "40.00", abbr: "PD", name: "Public Draft" }, + { code: "60.00", abbr: "Final", name: "Final Publication" }, +], + styles: [ + { key: "full", name: "Full (Long)", description: "Used in title page and bibliography", example: "National Institute of Standards and Technology Special Publication 800-53A" }, + { key: "abbrev", name: "Abbreviated", description: "Used in the Authority section", example: "Natl. Inst. Stand. Technol. Spec. Publ. 800-53A" }, + { key: "short", name: "Short", description: "Used for inline citations", example: "NIST SP 800-53A" }, + { key: "mr", name: "Machine-Readable", description: "Used for DOI suffix and machine interchange", example: "NIST.SP.800-53A" }, +], + components: [ + { + name: "Publisher", + description: "NIST (post-1988) or NBS (pre-1988)", + dataType: "enum", + values: ["NIST", "NBS"], + format: "NBS for pre-1988 documents.", + example: "NIST", + }, + { + name: "Document Type", + description: "SP, FIPS, IR, TN, HB, etc.", + dataType: "enum", + values: ["SP", "FIPS", "IR", "TN", "HB", "CIRC", "MONO", "RPT", "LCIRC", "GCR", "CRPL", "NSRDS", "NCSTAR", "OWMWP", "CS", "MP", "CSM", "CSE", "RB", "CHIPS", "NWIRP"], + example: "SP", + }, + { + name: "Number", + description: "The document number", + dataType: "string", + format: "1–6 digits. May include dash-separated sub-numbers (e.g., 800-53).", + example: "800-53", + }, + { + name: "Part", + description: "Part or volume number", + attribute: "part", + dataType: "string", + format: "Optional. Appended after number with dash.", + example: "3", + }, + { + name: "Revision", + description: "Revision number (Rev. 5)", + attribute: "revision", + dataType: "string", + format: "Optional. Prefixed with \"Rev.\"", + example: "Rev. 5", + }, + { + name: "Version", + description: "Version number", + attribute: "version", + dataType: "string", + format: "Optional. Prefixed with \"v\".", + example: "v1.0", + }, + { + name: "Edition", + description: "Edition number", + attribute: "edition", + dataType: "string", + format: "Optional.", + example: "1", + }, + { + name: "Stage", + description: "Publication stage (draft, final)", + attribute: "stage", + dataType: "enum", + values: ["draft", "final", "withdrawn"], + format: "Optional. In parentheses.", + example: "Draft", + }, + { + name: "Supplement", + description: "Supplement indicator", + attribute: "supplement", + dataType: "string", + format: "Optional. Prefixed with \"Suppl.\"", + example: "Suppl. 1", + }, + { + name: "Translation", + description: "Translation indicator", + attribute: "translation", + dataType: "enum", + values: ["tr"], + format: "Optional.", + example: "tr", + }, + { + name: "Update", + description: "Update number", + attribute: "update", + dataType: "integer", + format: "Optional. Prefixed with \"Upd.\"", + example: "1", + }, + { + name: "Volume", + description: "Volume number", + attribute: "volume", + dataType: "integer", + format: "Optional. Prefixed with \"Vol.\"", + example: "3", + }, +], + algebra: [ + { type: "Revision", description: "Revision of an existing document", syntax: "NIST SP [Number] Rev. [N]", example: "NIST SP 800-53 Rev. 5" }, + { type: "Part/Volume", description: "Multi-part or multi-volume document", syntax: "NIST [Type] [Number]-[Part] Vol. [N]", example: "NIST IR 8011 Vol. 3" }, + { type: "Draft", description: "Draft version of a document", syntax: "NIST [Type] [Number] (Draft)", example: "NIST SP 800-53 Rev. 5 (Draft)" }, + { type: "Supplement", description: "Supplement to a base document", syntax: "NIST [Type] [Number] Suppl. [N]", example: "NIST SP 800-53 Suppl. 1" }, +], +} + +export default nist diff --git a/src/data/flavors/oasis.ts b/src/data/flavors/oasis.ts new file mode 100644 index 0000000..c5de2f8 --- /dev/null +++ b/src/data/flavors/oasis.ts @@ -0,0 +1,45 @@ +import type { Publisher } from '../types' + +export const oasis: Publisher = { + flavor: "oasis", + logo: "/logos/oasis-logo.svg", + name: "OASIS", + fullName: "Organization for the Advancement of Structured Information Standards", + category: "industry", + description: "OASIS is a global nonprofit consortium that drives the development, convergence, and adoption of open standards for the information society. Founded in 1993 as SGML Open, OASIS produces some of the most widely deployed standards in the world, including SAML (federated identity), DocBook (technical documentation), OpenDocument (ODF — office document format), AMQP (messaging), DITA (technical publishing), and a large family of cybersecurity, privacy, and emergency-management standards. OASIS standards are developed through an open, multi-stage process: Committee Specifications → Candidate OASIS Standards → OASIS Standard (the normative, ratified form).", + website: "https://www.oasis-open.org", + syntaxNotes: "OASIS identifiers are slug-based with inconsistent internal structure (spec name + version + approval stage + part + label, in varying order). The PubID schema preserves the exact printed slug verbatim in `original` (which alone drives `to_s`); the remaining component fields (spec, version, stage, part) are best-effort decomposition for relaton querying and may be nil.", + urnPattern: "urn:oasis:[spec]:[version]", + relatedFlavors: ["iso", "w3c", "ogc"], + docTypes: [ + { + key: "standard", + title: "OASIS Standard", + abbr: [""], + description: "An OASIS specification at any stage of the standards lifecycle (Committee Specification, Candidate OASIS Standard, OASIS Standard, or errata). The slug carries the spec name, version, stage abbreviation (e.g. PS01 for Public Review Draft 1, CS01 for Committee Specification 1), and optional part label. The PubID schema always preserves the exact slug — round-trip is lossless regardless of how the slug is decomposed.", + examples: [ + { input: "OASIS OSLC-CoreShapes-3.0-PS01-Pt8" }, + { input: "OASIS saml-core-2.0-os" }, + { input: "OASIS docbook-5.0-os" }, + { input: "OASIS opendocument-v1.2-os" }, + { input: "OASIS amqp-core-1.0-os" }, + { input: "OASIS dita-v1.3-part0-os" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "OASIS — omitted when with_publisher=false", example: "OASIS" }, + { name: "Original Slug", description: "The exact slug printed after 'OASIS ' — always set, drives to_s. Lossless round-trip regardless of decomposition.", attribute: "original", example: "OSLC-CoreShapes-3.0-PS01-Pt8" }, + { name: "Spec", description: "Best-effort spec name fragment (e.g. 'OSLC-CoreShapes', 'saml-core'). May be nil.", attribute: "spec", example: "saml-core" }, + { name: "Version", description: "Best-effort version fragment (e.g. '3.0', '2.0', 'v1.3'). May be nil.", attribute: "version", example: "2.0" }, + { name: "Stage", description: "Approval stage fragment (e.g. 'PS01', 'CS01', 'OS', 'COS', 'Errata01'). May be nil.", attribute: "stage", example: "PS01" }, + { name: "Part", description: "Part label fragment (e.g. 'Pt8', 'Part1', 'part0'). May be nil.", attribute: "part", example: "Pt8" }, + ], + algebra: [ + { type: "Full Slug", description: "Publisher + verbatim slug (lossless round-trip)", syntax: "OASIS ", example: "OASIS saml-core-2.0-os" }, + { type: "Without Publisher", description: "Bare slug form (no 'OASIS ' prefix)", syntax: "", example: "saml-core-2.0-os" }, + { type: "Stage Lifecycle", description: "Slug encodes stage (PS01 → CS01 → OS → Errata01)", syntax: "--", example: "OSLC-CoreShapes-3.0-PS01" }, + ], +} + +export default oasis diff --git a/src/data/flavors/ogc.ts b/src/data/flavors/ogc.ts new file mode 100644 index 0000000..faec974 --- /dev/null +++ b/src/data/flavors/ogc.ts @@ -0,0 +1,42 @@ +import type { Publisher } from '../types' + +export const ogc: Publisher = { + flavor: "ogc", + logo: "/logos/ogc-logo.svg", + name: "OGC", + fullName: "Open Geospatial Consortium", + category: "industry", + description: "The Open Geospatial Consortium (OGC) is an international voluntary consensus standards organization founded in 1994. OGC develops open, consensus-based standards for geospatial content and services, GIS data processing, and geospatial data sharing. Major OGC standards include Web Map Service (WMS), Web Feature Service (WFS), Geographic Mark-up Language (GML), Sensor Observation Service (SOS), and the OGC API family (Features, Tiles, Records, Environmental Data Retrieval). Member organizations include national mapping agencies, defense organizations, and major technology vendors.", + website: "https://www.ogc.org", + syntaxNotes: "OGC identifiers are digit-leading: '-[]'. The year is 2 digits, the number is 3 digits (zero-padded), and the optional revision suffix is the lowercased token including its separator letter: 'r1', 'c1', 'a', 'r3a', 'r12a'. The leading 'OGC ' publisher token is added only when with_publisher=true (default is bare).", + urnPattern: "urn:ogc:[year]:[number]:[revision]", + relatedFlavors: ["iso", "iho", "ieee"], + docTypes: [ + { + key: "document", + title: "OGC Document", + abbr: [""], + description: "All OGC specification documents — standards, discussion papers, engineering reports, and best practice documents — share the same identifier shape. The two-digit year, three-digit zero-padded sequence number, and optional revision suffix uniquely identify any OGC document. Examples: 24-032r1 (a 2024 standard revision 1), 01-009a (a 2001 document revision 'a').", + examples: [ + { input: "24-032r1" }, + { input: "01-009a" }, + { input: "OGC 24-032r1" }, + { input: "06-042r3" }, + { input: "17-016r2" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "OGC — omitted by default, added when with_publisher=true", example: "OGC" }, + { name: "Year", description: "Two-digit year (the 'yy' field)", attribute: "year", example: "24" }, + { name: "Number", description: "Three-digit zero-padded sequence number (preserves leading zeros)", attribute: "number", example: "032" }, + { name: "Revision", description: "Optional lowercased revision token including separator: 'r1', 'c1', 'a', 'r3a', 'r12a'. nil when absent.", attribute: "revision", example: "r1" }, + ], + algebra: [ + { type: "Bare Document", description: "Default form without publisher prefix", syntax: "-[]", example: "24-032r1" }, + { type: "With Publisher", description: "Publisher prefix added when with_publisher=true", syntax: "OGC -[]", example: "OGC 24-032r1" }, + { type: "Revision", description: "Revision suffix variants: r (revision), c (corrigendum), a (amendment)", syntax: "-[r|]", example: "01-009a" }, + ], +} + +export default ogc diff --git a/src/data/flavors/oiml.ts b/src/data/flavors/oiml.ts new file mode 100644 index 0000000..d692e2b --- /dev/null +++ b/src/data/flavors/oiml.ts @@ -0,0 +1,171 @@ +import type { Publisher } from '../types' + +export const oiml: Publisher = { + flavor: "oiml", + logo: "/logos/oiml-logo-light.svg", + logoLight: "/logos/oiml-logo-light.svg", + logoDark: "/logos/oiml-logo-dark.svg", + name: "OIML", + fullName: "International Organization of Legal Metrology", + category: "international", + description: "The International Organization of Legal Metrology (OIML, Organisation Internationale de Métrologie Légale) is an intergovernmental treaty organization founded in 1955 that develops model regulations, standards, and related documents for legal metrology — the discipline of measurement as it affects consumers, trade, regulation, and law. OIML Recommendations establish the requirements that measuring instruments (weighing scales, fuel pumps, taximeters, utility meters, medical devices) must satisfy to be legally placed on the market. Member states from over 60 countries commit to adopting OIML Recommendations into their national measurement systems, enabling mutual recognition of instrument approvals under the OIML-CS (MAA) framework.", + website: "https://www.oiml.org", + syntaxNotes: "OIML identifiers follow the pattern: OIML [Type] [Number]:[Year]. Types include R (Recommendation), D (Document), G (Guide), V (Vocabulary), B (Basic Publication).", + relatedFlavors: ["iso", "jcgm"], + docTypes: [ + { + key: "recommendation", + title: "Recommendation", + abbr: ["R"], + description: "OIML International Recommendations are model regulations establishing requirements for measuring instruments.", + examples: [ + { input: "OIML R 76-1:2006" }, + { input: "OIML R 138:2007" }, + { input: "OIML R 49-1:2006" }, + ], + }, + { + key: "document", + title: "Document", + abbr: ["D"], + description: "OIML International Documents provide guidance on legal metrology matters.", + examples: [ + { input: "OIML D 11:2008" }, + { input: "OIML D 11:2013" }, + ], + }, + { + key: "guide", + title: "Guide", + abbr: ["G"], + description: "OIML Guides providing guidance on specific aspects of legal metrology.", + examples: [ + { input: "OIML G 1-100:2008" }, + { input: "OIML G 14:2011" }, + ], + }, + { + key: "basic_publication", + title: "Basic Publication", + abbr: ["B"], + description: "OIML Basic Publications providing fundamental reference material.", + examples: [ + { input: "OIML B 1:2020" }, + ], + }, + { + key: "vocabulary", + title: "Vocabulary", + abbr: ["V"], + description: "OIML Vocabularies defining terms used in legal metrology.", + examples: [ + { input: "OIML V 1:2000" }, + { input: "OIML V 2-200:2012" }, + ], + }, + { + key: "expert_report", + title: "Expert Report", + abbr: ["E"], + description: "OIML Expert Reports.", + examples: [ + { input: "OIML E 1:2004" }, + ], + }, + { + key: "seminar_report", + title: "Seminar Report", + abbr: ["S"], + description: "OIML Seminar Reports.", + examples: [ + { input: "OIML S 1:2000" }, + ], + }, + { + key: "bulletin", + title: "Bulletin", + abbr: ["Bulletin"], + description: "The OIML Bulletin is the periodical of the International Organization of Legal Metrology, published since 1960 (Volume I). It has a four-tier hierarchy: periodical (OIML Bulletin), volume/year (OIML Bulletin 1960), issue (OIML Bulletin 1960-03), and article (OIML Bulletin 1960-03-01). Each article also has a citation form combining roman volume, parenthesised issue, and 8-digit article id (OIML Bulletin LXVII(2) 20260211).", + examples: [ + { input: "OIML Bulletin" }, + { input: "OIML Bulletin 1960" }, + { input: "OIML Bulletin 1960-03" }, + { input: "OIML Bulletin 1960-03-01" }, + { input: "OIML Bulletin LXVII(2) 20260211" }, + ], + }, + { + key: "amendment", + title: "Amendment", + abbr: ["Amd"], + description: "Amendments to OIML publications.", + examples: [ + { input: "Amendment (2009) to OIML R 138 Edition 2007 (E)" }, + { input: "Amendment (2009) to OIML R 138:2007 (E)" }, + ], + }, + { + key: "annex", + title: "Annex", + abbr: ["Annex"], + description: "Annexes to OIML publications.", + examples: [ + { input: "OIML R 49-1 Annex A" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "OIML", + dataType: "enum", + values: ["OIML"], + example: "OIML", + }, + { + name: "Type", + description: "R, D, G, V, B, E, S", + dataType: "enum", + values: ["R (Recommendation)", "D (Document)", "G (Guide)", "V (Vocabulary)", "B (Basic Publication)", "E (Expert Report)", "S (Supplement)"], + example: "R", + }, + { + name: "Number", + description: "The publication number", + dataType: "integer", + format: "1–3 digit number.", + example: "76", + }, + { + name: "Part", + description: "Part number", + dataType: "integer", + format: "Optional. After dash.", + example: "1", + }, + { + name: "Year", + description: "Publication year", + dataType: "year", + format: "4-digit year, preceded by colon.", + example: "2006", + }, + { + name: "Edition", + description: "Edition indicator", + dataType: "string", + format: "Optional. Edition indicator (e.g., E:2008).", + example: "E:2008", + }, +], + algebra: [ + { type: "Amendment", description: "Modifies an OIML publication", syntax: "Amendment ([Year]) to OIML [Type] [Number]:[Year] (E)", example: "Amendment (2009) to OIML R 138:2007 (E)" }, + { type: "Annex", description: "Annex to a publication", syntax: "OIML [Type] [Number] Annex [Letter]", example: "OIML R 49-1 Annex A" }, + { type: "Part", description: "Multi-part publication", syntax: "OIML [Type] [Number]-[Part]:[Year]", example: "OIML R 76-1:2006" }, + { type: "Bulletin Issue", description: "Issue of the OIML Bulletin periodical", syntax: "OIML Bulletin [Year]-[Issue]", example: "OIML Bulletin 1960-03" }, + { type: "Bulletin Article", description: "Structured article reference within an issue", syntax: "OIML Bulletin [Year]-[Issue]-[Sequence]", example: "OIML Bulletin 1960-03-01" }, + { type: "Bulletin Citation", description: "Citation form combining roman volume and article id", syntax: "OIML Bulletin [RomanVolume]([Issue]) [ArticleID]", example: "OIML Bulletin LXVII(2) 20260211" }, +], +} + +export default oiml diff --git a/src/data/flavors/plateau.ts b/src/data/flavors/plateau.ts new file mode 100644 index 0000000..5d216b5 --- /dev/null +++ b/src/data/flavors/plateau.ts @@ -0,0 +1,68 @@ +import type { Publisher } from '../types' + +export const plateau: Publisher = { + flavor: "plateau", + logo: "/logos/plateau-logo.svg", + name: "PLATEAU", + fullName: "PLATEAU (MLIT Japan)", + category: "national", + description: "PLATEAU is a project by Japan's Ministry of Land, Infrastructure, Transport and Tourism (MLIT) that promotes the use of 3D city models for urban planning and management.", + website: "https://www.mlit.go.jp/plateau", + syntaxNotes: "PLATEAU identifiers follow: PLATEAU [Type] #[Number] [Edition]. Types include Handbook, Technical Report, Annex. Japanese edition numbering is used.", + relatedFlavors: ["jis"], + docTypes: [ + { + key: "handbook", + title: "Handbook", + abbr: ["Handbook"], + description: "PLATEAU Handbooks providing guidance on 3D city model usage.", + examples: [ + { input: "PLATEAU Handbook #00 第1.0版" }, + { input: "PLATEAU Handbook #00 第2.0版" }, + ], + }, + { + key: "technical_report", + title: "Technical Report", + abbr: ["Technical Report"], + description: "PLATEAU Technical Reports.", + examples: [ + { input: "PLATEAU Technical Report #00" }, + { input: "PLATEAU Technical Report #01" }, + ], + }, + { + key: "annex", + title: "Annex", + abbr: ["Annex"], + description: "Annexes to PLATEAU Handbooks.", + examples: [ + { input: "PLATEAU Handbook #00 Annex 1" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "PLATEAU", + dataType: "enum", + values: ["Plateau"], + example: "Plateau", + }, + { + name: "Number", + description: "Document number with # prefix", + dataType: "integer", + format: "1–3 digit number.", + example: "1", + }, + { + name: "Edition", + description: "Edition in Japanese format (第X.X版)", + }, +], + algebra: [ +], +} + +export default plateau diff --git a/src/data/flavors/sae.ts b/src/data/flavors/sae.ts new file mode 100644 index 0000000..cc55d17 --- /dev/null +++ b/src/data/flavors/sae.ts @@ -0,0 +1,57 @@ +import type { Publisher } from '../types' + +export const sae: Publisher = { + flavor: "sae", + logo: "/logos/sae-logo.svg", + name: "SAE", + fullName: "SAE International", + category: "industry", + description: "SAE International is a global association of engineers and technical experts in the aerospace, automotive, and commercial vehicle industries. SAE standards cover ground vehicles, aerospace, and other mobility engineering fields.", + website: "https://www.sae.org", + syntaxNotes: "SAE identifiers follow: SAE [Type] [Number]. Types include J (Ground Vehicle), AS (Aerospace), ARP (Aerospace Recommended Practice), AMS (Aerospace Material Specification).", + relatedFlavors: ["ansi", "astm"], + docTypes: [ + { + key: "standard", + title: "Standard", + abbr: ["J", "AS", "ARP", "AMS"], + description: "SAE Standards covering ground vehicles (J-prefix), aerospace (AS-prefix), recommended practices (ARP), and material specifications (AMS).", + examples: [ + { input: "SAE J3016" }, + { input: "SAE AS9100D" }, + { input: "SAE ARP4754A" }, + { input: "SAE AMS5500" }, + ], + }, +], + components: [ + { + name: "Publisher", + description: "SAE", + dataType: "enum", + values: ["SAE"], + example: "SAE", + }, + { + name: "Type Prefix", + description: "J, AS, ARP, AMS", + attribute: "type_prefix", + }, + { + name: "Number", + description: "The standard number", + dataType: "string", + format: "Alphanumeric. May include letter suffix for version.", + example: "J3016", + }, + { + name: "Date", + description: "Publication date", + attribute: "date", + }, +], + algebra: [ +], +} + +export default sae diff --git a/src/data/flavors/tgpp.ts b/src/data/flavors/tgpp.ts new file mode 100644 index 0000000..8f126a9 --- /dev/null +++ b/src/data/flavors/tgpp.ts @@ -0,0 +1,56 @@ +import type { Publisher } from '../types' + +export const tgpp: Publisher = { + flavor: "tgpp", + logo: "/logos/tgpp-logo.svg", + name: "3GPP", + fullName: "3rd Generation Partnership Project", + category: "industry", + description: "3GPP (the 3rd Generation Partnership Project) is a collaboration agreement between telecommunications standards development organizations (ARIB, ATIS, CCSA, ETSI, TSDSI, TTA, TTC) established in 1998 to produce globally-applicable technical specifications and technical reports for a 3rd generation mobile system. 3GPP subsequently expanded its scope to cover GSM, LTE, 5G NR, and 6G study items. The 3GPP specifications underpin cellular networks worldwide — every GSM, UMTS, LTE, and 5G handset and base station relies on 3GPP specifications for its air interface, core network, and protocol stacks.", + website: "https://www.3gpp.org", + syntaxNotes: "3GPP identifiers use a type prefix (TS for Technical Specification, TR for Technical Report) followed by a dotted number, optional letter suffix (U, dcs, ext), 1-2 hyphenated parts, release token (REL-N, Ph1, UMTS, Release 2000), and three-part version (X.Y.Z). Default form has no publisher token; with_publisher=true adds '3GPP ' prefix.", + urnPattern: "urn:3gpp:[type]:[number]:[release]:[version]", + relatedFlavors: ["etsi", "ieee", "itu"], + docTypes: [ + { + key: "technical_specification", + title: "Technical Specification (TS)", + abbr: ["TS"], + description: "Normative 3GPP specifications defining the mobile network standards. Numbered with a dotted core (e.g. 23.207), optional letter suffix (U, dcs, ext), and 1-2 hyphenated parts. Tagged with a release token (REL-N for releases 4+, plus legacy Ph1/Ph2/UMTS/Release 2000) and a three-part version (X.Y.Z) that increases with each revision.", + examples: [ + { input: "TS 23.207:REL-4/2.0.0" }, + { input: "3GPP TS 23.207:REL-4/2.0.0" }, + { input: "TS 29.198-04-1:REL-5/5.0.0" }, + { input: "TS 26.171:REL-5/5.0.0" }, + ], + }, + { + key: "technical_report", + title: "Technical Report (TR)", + abbr: ["TR"], + description: "Informative 3GPP reports covering feasibility studies, investigation results, and explanatory material that supports the normative TS documents. Same identifier shape as TS but with TR prefix. Often the precursor to a future TS — when a TR concludes that a feature is feasible, the work item is transferred to a TS.", + examples: [ + { input: "TR 00.01U:UMTS/3.0.0" }, + { input: "3GPP TR 21.866:REL-15/15.0.0" }, + { input: "TR 22.891:REL-14/14.0.0" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "3GPP — omitted by default, added when with_publisher=true", example: "3GPP" }, + { name: "Type Prefix", description: "TS for Technical Specification, TR for Technical Report", attribute: "type_prefix", example: "TS" }, + { name: "Number", description: "Dotted core (e.g. 23.207), kept as string to preserve leading zeros", attribute: "number", example: "23.207" }, + { name: "Suffix", description: "Optional letter suffix directly after number: 'U', 'dcs', 'ext'", attribute: "suffix", example: "U" }, + { name: "Parts", description: "1-2 hyphenated parts (e.g. -1, -04-1), strings preserve zero-padding", attribute: "parts", example: "-04-1" }, + { name: "Release", description: "Raw release token: 'REL-4', 'Ph1', 'UMTS', 'Release 2000'", attribute: "release", example: "REL-4" }, + { name: "Version", description: "Three-part version string (X.Y.Z)", attribute: "version", example: "2.0.0" }, + ], + algebra: [ + { type: "Default Form", description: "No publisher prefix (default)", syntax: " [][]:/", example: "TS 23.207:REL-4/2.0.0" }, + { type: "With Publisher", description: "Publisher prefix added", syntax: "3GPP [][]:/", example: "3GPP TS 23.207:REL-4/2.0.0" }, + { type: "Multi-part", description: "Multi-part spec with hyphenated parts", syntax: " -[-]:/", example: "TS 29.198-04-1:REL-5/5.0.0" }, + { type: "Legacy Release", description: "Pre-REL-4 release tokens", syntax: " :/", example: "TR 00.01U:UMTS/3.0.0" }, + ], +} + +export default tgpp diff --git a/src/data/flavors/w3c.ts b/src/data/flavors/w3c.ts new file mode 100644 index 0000000..098d662 --- /dev/null +++ b/src/data/flavors/w3c.ts @@ -0,0 +1,133 @@ +import type { Publisher } from '../types' + +export const w3c: Publisher = { + flavor: "w3c", + logo: "/logos/w3c-logo.svg", + name: "W3C", + fullName: "World Wide Web Consortium", + category: "industry", + description: "The World Wide Web Consortium (W3C) is the main international standards organization for the World Wide Web, founded in 1994 by Tim Berners-Lee. W3C develops the foundational specifications of the Web — HTML, CSS, XML, SVG, WebAssembly, the Semantic Web stack, accessibility guidelines (WCAG), and dozens of others. Member organizations, a full-time staff, and the public collaborate via Working Groups to develop standards through a multi-stage maturity process: Working Draft (WD) → Candidate Recommendation (CR) → Proposed Recommendation (PR) → W3C Recommendation (REC). The W3C PubID schema models every stage of this lifecycle, plus notes, obsolete/superseded recommendations, and proposed edited recommendations of existing standards.", + website: "https://www.w3.org", + syntaxNotes: "W3C identifiers are slug-based with an optional type prefix indicating the document's maturity stage: WD (Working Draft), CR (Candidate Recommendation), CRD (Candidate Recommendation Draft), NOTE (Working Group Note), PR (Proposed Recommendation), PER (Proposed Edited Recommendation), REC (Recommendation), OBSL (Obsolete Recommendation), SPR (Superseded Recommendation). The slug carries the spec shortname and optional date suffix (YYYYMMDD).", + urnPattern: "urn:w3c:[type]:[code]", + relatedFlavors: ["iso", "ieee", "oasis"], + docTypes: [ + { + key: "working_draft", + title: "Working Draft (WD)", + abbr: ["WD"], + description: "The earliest maturity stage of a W3C specification. A WD is a work-in-progress document published for review and discussion. There may be many WDs before a spec advances to CR. Identified by the 'WD-' prefix before the spec shortname.", + examples: [ + { input: "W3C WD-charmod-19991129" }, + { input: "W3C WD-html5-20110525" }, + ], + }, + { + key: "candidate_recommendation_draft", + title: "Candidate Recommendation Draft (CRD)", + abbr: ["CRD"], + description: "A daily-build draft of a Candidate Recommendation. CRDs are published frequently to track ongoing editorial changes between formal CR snapshots.", + examples: [ + { input: "W3C CRD-css-color-5-20240101" }, + ], + }, + { + key: "candidate_recommendation", + title: "Candidate Recommendation (CR)", + abbr: ["CR"], + description: "A specification that has passed wide review and is ready for implementation testing. A CR is the W3C's call to implementers to build the spec and report back. Identified by the 'CR-' prefix.", + examples: [ + { input: "W3C CR-css-flexbox-1-20181119" }, + { input: "W3C CR-webcodecs-20230330" }, + ], + }, + { + key: "proposed_recommendation", + title: "Proposed Recommendation (PR)", + abbr: ["PR"], + description: "A specification that has received significant implementation experience and is sent to the W3C Advisory Committee for formal review. The final maturity stage before REC.", + examples: [ + { input: "W3C PR-html5-20140417" }, + ], + }, + { + key: "proposed_edited_recommendation", + title: "Proposed Edited Recommendation (PER)", + abbr: ["PER"], + description: "A proposal to revise an existing Recommendation with editorial (non-substantive) changes. Sent to the Advisory Committee for review before the revision is published.", + examples: [ + { input: "W3C PER-svg Tiny12-20081110" }, + ], + }, + { + key: "recommendation", + title: "Recommendation (REC)", + abbr: ["REC"], + description: "A normative W3C standard that has been formally endorsed by the W3C Director and Director-level review. RECs are the most stable, authoritative form of a W3C specification and are widely implemented across the Web platform.", + examples: [ + { input: "W3C REC-html52-20171214" }, + { input: "W3C REC-xml-20081126" }, + { input: "W3C REC-SVG11-20030114" }, + ], + }, + { + key: "note", + title: "Working Group Note (NOTE)", + abbr: ["NOTE"], + description: "An informative document published by a W3C Working Group. Notes are not normative standards but provide guidance, use cases, or explanatory material. The 'NOTE-' prefix is the W3C convention for these documents.", + examples: [ + { input: "W3C NOTE-xml-names" }, + { input: "W3C NOTE-datetime-19980827" }, + ], + }, + { + key: "draft_note", + title: "Draft Note", + abbr: [""], + description: "A draft of a Working Group Note, before formal publication as a NOTE. Identified by the spec shortname without a NOTE- prefix.", + examples: [ + { input: "W3C 2dcontext" }, + ], + }, + { + key: "standard", + title: "Standard", + abbr: [""], + description: "A non-prefixed W3C standard document. The bare slug form without a maturity-stage prefix is used for documents that don't follow the conventional WD-CR-PR-REC lifecycle.", + examples: [ + { input: "W3C 2dcontext" }, + ], + }, + { + key: "obsolete_recommendation", + title: "Obsolete Recommendation (OBSL)", + abbr: ["OBSL"], + description: "A Recommendation that the W3C has formally marked as no longer current. It remains in the historical record but should not be referenced for new implementations. The 'OBSL-' prefix marks this status.", + examples: [ + { input: "W3C OBSL-xhtml1-20180327" }, + ], + }, + { + key: "superseded_recommendation", + title: "Superseded Recommendation (SPR)", + abbr: ["SPR"], + description: "A Recommendation that has been replaced by a newer version. Superseded Recommendations remain in the W3C's historical record but are explicitly marked as superseded by the 'SPR-' prefix.", + examples: [ + { input: "W3C SPR-html401-20180327" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "W3C — omitted when with_publisher=false", example: "W3C" }, + { name: "Type Prefix", description: "Maturity stage abbreviation: WD, CRD, CR, PR, PER, REC, NOTE, OBSL, SPR (or empty for unprefixed forms)", attribute: "type_prefix", example: "REC" }, + { name: "Code", description: "Spec shortname + optional date suffix (YYYYMMDD)", attribute: "code", example: "html52-20171214" }, + ], + algebra: [ + { type: "Maturity Lifecycle", description: "Standard progression: WD → CRD → CR → PR → REC", syntax: "-", example: "W3C REC-html52-20171214" }, + { type: "Note", description: "Informative Working Group Note", syntax: "NOTE-", example: "W3C NOTE-xml-names" }, + { type: "Status Change", description: "Obsoleted (OBSL) or superseded (SPR) former Recommendations", syntax: "-", example: "W3C OBSL-xhtml1-20180327" }, + { type: "Without Publisher", description: "Bare slug form (no 'W3C ' prefix)", syntax: "[-]", example: "REC-html52-20171214" }, + ], +} + +export default w3c diff --git a/src/data/flavors/xsf.ts b/src/data/flavors/xsf.ts new file mode 100644 index 0000000..458b235 --- /dev/null +++ b/src/data/flavors/xsf.ts @@ -0,0 +1,39 @@ +import type { Publisher } from '../types' + +export const xsf: Publisher = { + flavor: "xsf", + logo: "/logos/xsf-logo.svg", + name: "XSF", + fullName: "XMPP Standards Foundation", + category: "industry", + description: "The XMPP Standards Foundation (XSF) is the foundation chartered to define and publish the open protocols of the Extensible Messaging and Presence Protocol (XMPP) — the XML-based instant-messaging and presence protocol that powers Jabber and many real-time communication systems. Founded in 2002 as the Jabber Software Foundation, the XSF publishes XMPP Extension Protocols (XEPs) that extend the core XMPP specifications (RFC 6120 and RFC 6121) with new features: multi-user chat, publish-subscribe, file transfer, voice/video signaling, and many others. XEPs follow a documented maturity process: Experimental → Proposed → Draft → Final (or Deprecated → Obsolete for retired extensions).", + website: "https://xmpp.org", + syntaxNotes: "XSF identifiers use a single document type: XEP (XMPP Extension Protocol). The identifier is 'XEP-' where the number is zero-padded to 4 digits ('XEP-0001', not 'XEP-1'). The XSF never prints its publisher name in the identifier — the leading token is always 'XEP'.", + urnPattern: "urn:xsf:xep:[number]", + relatedFlavors: ["ietf", "iana", "w3c"], + docTypes: [ + { + key: "xep", + title: "XMPP Extension Protocol (XEP)", + abbr: ["XEP"], + description: "XMPP Extension Protocols published by the XSF. Each XEP extends the core XMPP specifications with a specific feature (multi-user chat, publish-subscribe, file transfer, signaling, etc.). The number is zero-padded to 4 digits. XEPs progress through a maturity lifecycle: Experimental (work-in-progress) → Proposed (under review) → Draft (stable, widely implemented) → Final (mature, no further changes). Retired XEPs are marked Deprecated and eventually Obsolete.", + examples: [ + { input: "XEP-0001" }, + { input: "XEP-0045" }, + { input: "XEP-0060" }, + { input: "XEP-0166" }, + { input: "XEP-0352" }, + ], + }, + ], + components: [ + { name: "Type", description: "Always 'XEP' — the XSF never prints its publisher name in the identifier", example: "XEP" }, + { name: "Number", description: "XEP number, zero-padded to 4 digits ('0001', not 1). Kept as a string to preserve padding.", attribute: "number", example: "0045" }, + ], + algebra: [ + { type: "XEP Reference", description: "Canonical form: 'XEP-' + 4-digit zero-padded number", syntax: "XEP-", example: "XEP-0045" }, + { type: "Maturity Stage", description: "XEPs carry maturity metadata (Experimental, Proposed, Draft, Final, Deprecated, Obsolete) outside the identifier", syntax: "XEP- []", example: "XEP-0045 [Draft]" }, + ], +} + +export default xsf diff --git a/src/data/index.ts b/src/data/index.ts new file mode 100644 index 0000000..f6379d4 --- /dev/null +++ b/src/data/index.ts @@ -0,0 +1,14 @@ +export { publishers, publishersByFlavor, getPublisher, + getPublishersByCategory, internationalPublishers, regionalPublishers, + nationalPublishers, industryPublishers } from './registry' + +export { categoryLabels, categoryOrder } from './types' +export type { Publisher, DocType, FlavorComponent, AlgebraRelation, + PubIDStyle, Stage, Category } from './types' + +// Re-export getComponentMeta for compatibility with ported VitePress components. +// The data is now merged into FlavorComponent directly (SSOT), so this is a +// no-op identity function — returns the component unchanged. +export function getComponentMeta(_flavor: string, _componentName: string): Record { + return {} +} diff --git a/src/data/registry.ts b/src/data/registry.ts new file mode 100644 index 0000000..5073f0a --- /dev/null +++ b/src/data/registry.ts @@ -0,0 +1,26 @@ +// Auto-generated by scripts/migrate-data.mjs +// Do not edit manually — edit per-flavor files in ./flavors/ instead. + +import type { Publisher } from './types' + +// OCP-compliant auto-discovery: a new flavor file in ./flavors/ is +// automatically included in the registry without code edits here. +const modules = import.meta.glob('./flavors/*.ts', { eager: true, import: 'default' }) as Record + +export const publishers: Publisher[] = Object.values(modules) + .sort((a, b) => a.flavor.localeCompare(b.flavor)) + +export const publishersByFlavor = new Map(publishers.map(p => [p.flavor, p])) + +export function getPublisher(flavor: string): Publisher | undefined { + return publishersByFlavor.get(flavor) +} + +export function getPublishersByCategory(category: Publisher['category']): Publisher[] { + return publishers.filter(p => p.category === category) +} + +export const internationalPublishers = getPublishersByCategory('international') +export const regionalPublishers = getPublishersByCategory('regional') +export const nationalPublishers = getPublishersByCategory('national') +export const industryPublishers = getPublishersByCategory('industry') diff --git a/src/data/syntax-data.ts b/src/data/syntax-data.ts new file mode 100644 index 0000000..85cbaa8 --- /dev/null +++ b/src/data/syntax-data.ts @@ -0,0 +1,721 @@ +export interface SyntaxPattern { + label: string + pattern: string +} + +const data: Record> = { + iso: { + international_standard: [ + { label: 'Published (dated)', pattern: 'ISO [Number]:[Year]' }, + { label: 'Published (undated)', pattern: 'ISO [Number]' }, + { label: 'With copublisher', pattern: 'ISO/[Copublisher] [Number]-[Part]:[Year]' }, + { label: 'With language', pattern: 'ISO [Number]:[Year]([Language])' }, + { label: 'Draft Proposal', pattern: 'ISO/DP [Number]:[Year]' }, + { label: 'Proposed Work Item', pattern: 'ISO/PWI [Number]' }, + { label: 'New Work Item Proposal', pattern: 'ISO/NP [Number]' }, + { label: 'Approved Work Item', pattern: 'ISO/AWI [Number]' }, + { label: 'Working Draft', pattern: 'ISO/WD [Number]' }, + { label: 'Working Draft Study', pattern: 'ISO/WDS [Number]' }, + { label: 'Committee Draft', pattern: 'ISO/CD [Number]' }, + { label: 'Draft International Standard', pattern: 'ISO/DIS [Number]:[Year]' }, + { label: 'Final Draft International Standard', pattern: 'ISO/FDIS [Number]:[Year]' }, + { label: 'Proof', pattern: 'ISO/PRF [Number]:[Year]' }, + ], + technical_report: [ + { label: 'Published (dated)', pattern: 'ISO/TR [Number]:[Year]' }, + { label: 'Published (undated)', pattern: 'ISO/TR [Number]' }, + { label: 'With copublisher', pattern: 'ISO/[Copublisher]/TR [Number]-[Part]:[Year]' }, + { label: 'Proposed Work Item', pattern: 'ISO/PWI TR [Number]' }, + { label: 'New Work Item Proposal', pattern: 'ISO/NP TR [Number]' }, + { label: 'Approved Work Item', pattern: 'ISO/AWI TR [Number]' }, + { label: 'Working Draft', pattern: 'ISO/WD TR [Number]' }, + { label: 'Committee Draft', pattern: 'ISO/CD TR [Number]' }, + { label: 'Proposed Draft TR', pattern: 'ISO/PDTR [Number]' }, + { label: 'Draft Technical Report', pattern: 'ISO/DTR [Number]:[Year]' }, + { label: 'Final Draft TR', pattern: 'ISO/FDTR [Number]:[Year]' }, + { label: 'Proof', pattern: 'ISO/PRF TR [Number]' }, + ], + technical_specification: [ + { label: 'Published (dated)', pattern: 'ISO/TS [Number]:[Year]' }, + { label: 'Published (undated)', pattern: 'ISO/TS [Number]' }, + { label: 'With copublisher', pattern: 'ISO/[Copublisher]/TS [Number]-[Part]:[Year]' }, + { label: 'Proposed Work Item', pattern: 'ISO/PWI TS [Number]' }, + { label: 'New Work Item Proposal', pattern: 'ISO/NP TS [Number]' }, + { label: 'Approved Work Item', pattern: 'ISO/AWI TS [Number]' }, + { label: 'Working Draft', pattern: 'ISO/WD TS [Number]' }, + { label: 'Committee Draft', pattern: 'ISO/CDTS [Number]' }, + { label: 'Proposed Draft TS', pattern: 'ISO/PDTS [Number]' }, + { label: 'Draft Technical Specification', pattern: 'ISO/DTS [Number]:[Year]' }, + { label: 'Final Draft TS', pattern: 'ISO/FDTS [Number]:[Year]' }, + { label: 'Proof', pattern: 'ISO/PRF TS [Number]' }, + ], + publicly_available_specification: [ + { label: 'Published (dated)', pattern: 'ISO/PAS [Number]:[Year]' }, + { label: 'Published (undated)', pattern: 'ISO/PAS [Number]' }, + { label: 'Proposed Work Item', pattern: 'ISO/PWI PAS [Number]' }, + { label: 'New Work Item Proposal', pattern: 'ISO/NP PAS [Number]' }, + { label: 'Approved Work Item', pattern: 'ISO/AWI PAS [Number]' }, + { label: 'Working Draft', pattern: 'ISO/WD PAS [Number]' }, + { label: 'Committee Draft', pattern: 'ISO/CD PAS [Number]' }, + { label: 'Draft PAS', pattern: 'ISO/DPAS [Number]' }, + { label: 'Final Draft PAS', pattern: 'ISO/FDPAS [Number]' }, + { label: 'Proof', pattern: 'ISO/PRF PAS [Number]' }, + ], + guide: [ + { label: 'Published (dated)', pattern: 'ISO Guide [Number]:[Year]' }, + { label: 'Published (undated)', pattern: 'ISO Guide [Number]' }, + { label: 'With copublisher', pattern: 'ISO/IEC Guide [Number]-[Part]:[Year]' }, + { label: 'Proposed Work Item', pattern: 'ISO/PWI Guide [Number]' }, + { label: 'New Work Item Proposal', pattern: 'ISO/NP Guide [Number]' }, + { label: 'Approved Work Item', pattern: 'ISO/AWI Guide [Number]' }, + { label: 'Working Draft', pattern: 'ISO/WD Guide [Number]' }, + { label: 'Committee Draft', pattern: 'ISO/CD Guide [Number]' }, + { label: 'Draft Guide', pattern: 'ISO/DGuide [Number]' }, + { label: 'Final Draft Guide', pattern: 'ISO/FDGuide [Number]' }, + { label: 'Proof', pattern: 'ISO/PRF Guide [Number]' }, + ], + amendment: [ + { label: 'Published', pattern: '[Base]/Amd [N]:[Year]' }, + { label: 'Proposed Work Item', pattern: '[Base]/PWI Amd [N]' }, + { label: 'New Work Item Proposal', pattern: '[Base]/NP Amd [N]' }, + { label: 'Approved Work Item', pattern: '[Base]/AWI Amd [N]' }, + { label: 'Working Draft', pattern: '[Base]/WD Amd [N]' }, + { label: 'Committee Draft', pattern: '[Base]/CD Amd [N]' }, + { label: 'Proposed Draft Amendment', pattern: '[Base]/PDAM [N]' }, + { label: 'Draft Amendment', pattern: '[Base]/DAmd [N]:[Year]' }, + { label: 'Final Draft Amendment', pattern: '[Base]/FDAmd [N]:[Year]' }, + { label: 'Proof', pattern: '[Base]/PRF Amd [N]' }, + ], + corrigendum: [ + { label: 'Published', pattern: '[Base]/Cor [N]:[Year]' }, + { label: 'Proposed Work Item', pattern: '[Base]/PWI Cor [N]' }, + { label: 'New Work Item Proposal', pattern: '[Base]/NP Cor [N]' }, + { label: 'Approved Work Item', pattern: '[Base]/AWI Cor [N]' }, + { label: 'Working Draft', pattern: '[Base]/WD Cor [N]' }, + { label: 'Committee Draft', pattern: '[Base]/CD Cor [N]' }, + { label: 'Draft Corrigendum', pattern: '[Base]/DCor [N]:[Year]' }, + { label: 'Final Draft Corrigendum', pattern: '[Base]/FDCor [N]:[Year]' }, + { label: 'Proof', pattern: '[Base]/PRF Cor [N]' }, + ], + supplement: [ + { label: 'Directives Supplement', pattern: 'ISO/IEC Directives Part [N] Supplement:[Year]' }, + ], + addendum: [ + { label: 'Published', pattern: '[Base]/Add [N]:[Year]' }, + ], + international_workshop_agreement: [ + { label: 'Published (dated)', pattern: 'IWA [Number]:[Year]' }, + { label: 'Published (undated)', pattern: 'IWA [Number]' }, + { label: 'With part', pattern: 'IWA [Number]-[Part]:[Year]' }, + { label: 'Proposed Work Item', pattern: 'PWI IWA [Number]' }, + { label: 'New Work Item Proposal', pattern: 'NP IWA [Number]' }, + { label: 'Approved Work Item', pattern: 'AWI IWA [Number]' }, + { label: 'Working Draft', pattern: 'ISO/WD IWA [Number]' }, + { label: 'Committee Draft', pattern: 'CD IWA [Number]' }, + { label: 'Draft IWA', pattern: 'DIWA [Number]' }, + { label: 'Proof', pattern: 'PRF IWA [Number]' }, + ], + international_standardized_profile: [ + { label: 'Published', pattern: 'ISO/IEC ISP [Number]-[Part]:[Year]' }, + ], + technology_trends_assessments: [ + { label: 'Published', pattern: 'ISO/TTA [Number]:[Year]' }, + ], + directives: [ + { label: 'Published', pattern: 'ISO/IEC Directives Part [N]:[Year]' }, + ], + directives_supplement: [ + { label: 'Published', pattern: 'ISO/IEC Directives Part [N] ISO Supplement:[Year]' }, + ], + extract: [ + { label: 'Published', pattern: '[Base]/Extract' }, + ], + recommendation: [ + { label: 'Published', pattern: 'ISO/R [Number]:[Year]' }, + ], + tc_document: [ + { label: 'Committee document', pattern: 'ISO/TC [N] [DocNumber]' }, + ], + data: [ + { label: 'Published', pattern: 'ISO/Data [Number]:[Year]' }, + ], + }, + iec: { + international_standard: [ + { label: 'Published (dated)', pattern: 'IEC [Number]-[Part]:[Year]' }, + { label: 'Published (undated)', pattern: 'IEC [Number]-[Part]' }, + { label: 'With edition', pattern: 'IEC [Number]-[Part]:[Year] ED[N]' }, + { label: 'Consolidated', pattern: 'IEC [Number]:[Year]+AMD[N]:[Year] CSV' }, + ], + technical_report: [ + { label: 'Published (dated)', pattern: 'IEC TR [Number]-[Part]:[Year]' }, + { label: 'Published (undated)', pattern: 'IEC TR [Number]-[Part]' }, + ], + technical_specification: [ + { label: 'Published (dated)', pattern: 'IEC TS [Number]-[Part]:[Year]' }, + { label: 'Published (undated)', pattern: 'IEC TS [Number]-[Part]' }, + ], + publicly_available_specification: [ + { label: 'Published', pattern: 'IEC PAS [Number]:[Year]' }, + ], + guide: [ + { label: 'Published', pattern: 'IEC GUIDE [Number]:[Year]' }, + ], + amendment: [ + { label: 'Published', pattern: '[Base]/AMD[N]:[Year]' }, + ], + corrigendum: [ + { label: 'Published', pattern: '[Base]/COR[N]:[Year]' }, + ], + interpretation_sheet: [ + { label: 'Published', pattern: '[Base]/ISH[N]:[Year]' }, + ], + consolidated_identifier: [ + { label: 'Consolidated version', pattern: '[Base]+AMD[N]:[Year] CSV' }, + ], + working_document: [ + { label: 'Working document', pattern: 'IEC [Committee]/[DocNumber]/[Stage]' }, + ], + fragment_identifier: [ + { label: 'Fragment', pattern: '[Base]/AMD[N]/FRAG[N] ED[N]' }, + ], + component_specification: [ + { label: 'Published', pattern: 'IEC [Number]-[Part]:[Year]' }, + ], + operational_document: [ + { label: 'Published', pattern: 'IECEx OD [Number]-[Part]' }, + ], + systems_reference_document: [ + { label: 'Published', pattern: 'IEC SRD [Number]:[Year]' }, + ], + vap_identifier: [ + { label: 'Value-Added Product', pattern: 'IEC [Number]:[Year] [VAP]' }, + ], + test_report_form: [ + { label: 'Test report form', pattern: 'IECEx TRF [Number]' }, + ], + sheet_identifier: [ + { label: 'Sheet', pattern: 'IEC [Number]-[Part]:[Year] Sheet [N]' }, + ], + societal_technology_trend_report: [ + { label: 'Published', pattern: 'IEC STTR [Number]:[Year]' }, + ], + white_paper: [ + { label: 'Published', pattern: 'IEC WP [Code]:[Year]' }, + ], + }, + ieee: { + standard: [ + { label: 'Published', pattern: 'IEEE Std [Number]-[Year]' }, + { label: 'With subpart', pattern: 'IEEE Std [Number].[Sub]-[Year]' }, + ], + project_draft_identifier: [ + { label: 'Project draft', pattern: 'IEEE P[Number]/D[Version]' }, + ], + adopted_standard: [ + { label: 'Adopted', pattern: 'IEEE Std [Number]-[Year] (Adopted from [ExternalID])' }, + ], + dual_published: [ + { label: 'Dual-published', pattern: 'IEC/IEEE [Number]-[Part]:[Year]' }, + ], + iec_ieee_copublished: [ + { label: 'Published', pattern: 'IEC/IEEE [Number]-[Part]:[Year]' }, + { label: 'Draft', pattern: 'IEC/IEEE [Number]/D[Version] IEC:[Year] ([Date])' }, + ], + corrigendum: [ + { label: 'Published', pattern: '[Base]/Cor [N]-[Year]' }, + ], + supplement_identifier: [ + { label: 'Supplement', pattern: '[Base][Suffix]-[Year]' }, + ], + redlined_standard: [ + { label: 'Redlined', pattern: '[Base] (Redline of [PrevID])' }, + ], + nesc: [ + { label: 'NESC Handbook', pattern: '[Year] NESC Handbook, [Edition] Edition' }, + ], + si_standard: [ + { label: 'SI Standard', pattern: 'IEEE/ASTM SI 10-[Year]' }, + ], + joint_development: [ + { label: 'Joint development', pattern: 'IEC/IEEE P[Number], [Stage] [Year]' }, + ], + dual_identifier: [ + { label: 'Dual identifier', pattern: '[FirstID] and [SecondID]' }, + ], + conformance_identifier: [ + { label: 'Conformance', pattern: '[Base].[Sub]-[Year]' }, + ], + interpretation_identifier: [ + { label: 'Interpretation', pattern: '[Base] Interpretation #[N]-[Year]' }, + ], + csa_dual_published: [ + { label: 'CSA dual-published', pattern: '[Base]/CSA [CSA_ID]' }, + ], + multi_numbered_identifier: [ + { label: 'Cross-reference', pattern: '[PrimaryID]/[SecondaryID]' }, + { label: 'Multi-numbered', pattern: '[PrimaryID] and [SecondaryID]' }, + ], + parenthetical_identifier: [ + { label: 'Parenthetical', pattern: 'IEEE [Number]-[Year] ([Relationship])' }, + ], + }, + itu: { + recommendation: [ + { label: 'Published', pattern: 'ITU-[Sector] [Series].[Number]' }, + { label: 'With year', pattern: 'ITU-[Sector] [Series].[Number]-[Year]' }, + ], + supplement: [ + { label: 'Supplement', pattern: '[Base] Suppl [N]' }, + ], + amendment: [ + { label: 'Amendment', pattern: '[Base]/Amd [N]' }, + ], + corrigendum: [ + { label: 'Corrigendum', pattern: '[Base]/Cor [N]' }, + ], + special_publication: [ + { label: 'Operational Bulletin', pattern: 'ITU OB No. [Number] ([Month]/[Year])' }, + { label: 'Without date', pattern: 'ITU OB No. [Number]' }, + ], + annex: [ + { label: 'Annex to OB', pattern: 'Annex to ITU OB No. [Number]' }, + ], + }, + nist: { + special_publication: [ + { label: 'Published', pattern: 'NIST SP [Number]' }, + { label: 'With revision', pattern: 'NIST SP [Number] Rev. [N]' }, + { label: 'With volume', pattern: 'NIST SP [Number] Vol. [N]' }, + { label: 'With part', pattern: 'NIST SP [Number]-[Part]' }, + ], + federal_information_processing_standards: [ + { label: 'Published', pattern: 'FIPS [Number]' }, + ], + interagency_report: [ + { label: 'Published', pattern: 'NIST IR [Number]' }, + { label: 'With volume', pattern: 'NIST IR [Number] Vol. [N]' }, + ], + technical_note: [ + { label: 'Published', pattern: 'NIST TN [Number]' }, + ], + handbook: [ + { label: 'Published', pattern: 'NIST HB [Number]-[Part]' }, + ], + circular: [ + { label: 'Published', pattern: 'NBS CIRC [Number]' }, + ], + monograph: [ + { label: 'Published', pattern: 'NBS MONO [Number]' }, + ], + report: [ + { label: 'Published', pattern: 'NBS RPT [Number]' }, + ], + letter_circular: [ + { label: 'Published', pattern: 'NBS LCIRC [Number]' }, + ], + grant_contractor_report: [ + { label: 'Published', pattern: 'NIST GCR [Number]' }, + ], + crpl_report: [ + { label: 'Published', pattern: 'NBS CRPL [Number]' }, + ], + nsrds: [ + { label: 'Published', pattern: 'NSRDS-NBS [Number]' }, + ], + ncstar: [ + { label: 'Published', pattern: 'NIST NCSTAR [Number]' }, + ], + owmwp: [ + { label: 'Published', pattern: 'NIST OWMWP [Number]' }, + ], + commercial_standard: [ + { label: 'Published', pattern: 'NBS CS [Number]' }, + ], + miscellaneous_publication: [ + { label: 'Published', pattern: 'NBS MP [Number]' }, + ], + circular_supplement: [ + { label: 'Supplement', pattern: '[Base]sup' }, + ], + commercial_standards_monthly: [ + { label: 'Published', pattern: 'NBS CSM [Number]' }, + ], + commercial_standard_emergency: [ + { label: 'Published', pattern: 'NBS CSE [Number]' }, + ], + }, + bsi: { + british_standard: [ + { label: 'Published', pattern: 'BS [Number]-[Part]:[Year]' }, + { label: 'With amendment', pattern: 'BS [Number]:[Year]+A[N]:[Year]' }, + ], + adopted_international_standard: [ + { label: 'Adopted ISO', pattern: 'BS ISO [Number]:[Year]' }, + { label: 'Adopted IEC', pattern: 'BS EN IEC [Number]:[Year]' }, + ], + adopted_european_norm: [ + { label: 'Published', pattern: 'BS EN [Number]-[Part]:[Year]' }, + { label: 'With amendment', pattern: 'BS EN [Number]:[Year]+A[N]:[Year]' }, + ], + aerospace_standard: [ + { label: 'Published', pattern: 'BS A [Number]:[Year]' }, + { label: 'With amendment', pattern: 'BS A [Number]:[Year]+A[N]:[Year]' }, + ], + publicly_available_specification: [ + { label: 'Published', pattern: 'PAS [Number]:[Year]' }, + ], + technical_specification: [ + { label: 'Published', pattern: 'PD [Number]:[Year]' }, + ], + flex: [ + { label: 'Published', pattern: 'BSI Flex [Number] v[Version]:[Year]' }, + ], + handbook: [ + { label: 'Published', pattern: 'BS HB [Number]' }, + ], + amendment: [ + { label: 'Incorporated', pattern: '[Base]+A[N]:[Year]' }, + { label: 'Separate', pattern: '[Base] AMD[N]' }, + ], + corrigendum: [ + { label: 'Published', pattern: '[Base]/C[N]:[Year]' }, + ], + draft_document: [ + { label: 'Draft for Development', pattern: 'DD [Number]-[Part]:[Year]' }, + ], + committee_document: [ + { label: 'Committee document', pattern: '[YY]/[DocNumber] DC' }, + ], + published_document: [ + { label: 'Published', pattern: 'PD [Number]:[Year]' }, + ], + electronic_book: [ + { label: 'E-book', pattern: 'BS EB [Number]' }, + ], + expert_commentary: [ + { label: 'Abbreviated', pattern: '[Base] ExComm' }, + { label: 'Full', pattern: '[Base] Expert Commentary' }, + { label: 'With topic', pattern: '[Base] ExComm ([Topic])' }, + ], + value_added_publication: [ + { label: 'PDF', pattern: '[Base] PDF' }, + { label: 'Book', pattern: '[Base] BOOK' }, + { label: 'Track Changes', pattern: '[Base] - TC' }, + ], + }, + 'cen-cenelec': { + european_norm: [ + { label: 'Published (dated)', pattern: 'EN [Number]-[Part]:[Year]' }, + { label: 'With amendment', pattern: 'EN [Number]:[Year]+A[N]:[Year]' }, + ], + european_prestandard: [ + { label: 'Published', pattern: 'ENV [Number]-[Part]:[Year]' }, + ], + technical_specification: [ + { label: 'Published', pattern: 'CEN/TS [Number]:[Year]' }, + ], + technical_report: [ + { label: 'Published', pattern: 'CEN/TR [Number]:[Year]' }, + ], + cen_workshop_agreement: [ + { label: 'Published', pattern: 'CWA [Number]-[Part]:[Year]' }, + ], + guide: [ + { label: 'Published', pattern: 'CLC Guide [Number]:[Year]' }, + ], + harmonization_document: [ + { label: 'Published', pattern: 'HD [Number]-[Part]:[Year]' }, + ], + amendment: [ + { label: 'Amendment', pattern: '[Base]/A[N]:[Year]' }, + ], + corrigendum: [ + { label: 'Corrigendum', pattern: '[Base]/AC:[Year]' }, + ], + consolidated_identifier: [ + { label: 'Consolidated', pattern: '[Base]+A[N]:[Year]' }, + ], + adopted_european_norm: [ + { label: 'Adopted', pattern: 'EN ISO [Number]:[Year]' }, + ], + fragment: [ + { label: 'Fragment', pattern: 'EN [Number]:[Year] Frag [N]' }, + ], + european_specification: [ + { label: 'Published', pattern: 'ES [Number]:[Year]' }, + ], + }, + etsi: { + etsi_standard: [ + { label: 'Published', pattern: 'ETSI [Type] [Number] V[Version] ([Date])' }, + ], + amendment: [ + { label: 'Amendment', pattern: '[Base]/A[N] ed.[N] ([Date])' }, + ], + corrigendum: [ + { label: 'Corrigendum', pattern: '[Base]/C[N] ed.[N] ([Date])' }, + ], + supplement_identifier: [ + { label: 'Supplement', pattern: '[Base] S[N] ed.[N] ([Date])' }, + ], + }, + ansi: { + standard: [ + { label: 'Published', pattern: 'ANSI [Number]-[Year]' }, + ], + american_national_standard: [ + { label: 'With developer', pattern: 'ANSI/[Developer] [Number]-[Year]' }, + ], + }, + astm: { + standard: [ + { label: 'Published', pattern: 'ASTM [Letter][Number]/[Letter][Number]M-[Year]' }, + { label: 'Without metric', pattern: 'ASTM [Letter][Number]-[Year]' }, + ], + }, + ashrae: { + standard: [ + { label: 'Published', pattern: 'ASHRAE Standard [Number]-[Year]' }, + ], + guideline: [ + { label: 'Published', pattern: 'ASHRAE Guideline [Number]-[Year]' }, + ], + addendum: [ + { label: 'Addendum', pattern: '[Base] Addendum [Letter]' }, + ], + interpretation: [ + { label: 'Interpretation', pattern: '[Base] Interpretation [IC]' }, + ], + errata: [ + { label: 'Errata', pattern: '[Base] Errata' }, + ], + combined_addenda: [ + { label: 'Combined Addenda', pattern: '[Base] Combined Addenda' }, + ], + addenda_package: [ + { label: 'Addenda Package', pattern: '[Base] Addenda Package' }, + ], + test_standard: [ + { label: 'Published', pattern: 'ASHRAE Standard [Number]-[Year]' }, + ], + }, + asme: { + standard: [ + { label: 'Published', pattern: 'ASME [Code]-[Year]' }, + ], + }, + ccsds: { + blue_book: [ + { label: 'Recommended Standard', pattern: 'CCSDS [Number] (Recommended Standard)' }, + ], + magenta_book: [ + { label: 'Recommended Practice', pattern: 'CCSDS [Number] (Recommended Practice)' }, + ], + corrigendum: [ + { label: 'Corrigendum', pattern: '[Base] Corrigendum [N]' }, + ], + }, + cie: { + standard: [ + { label: 'Published', pattern: 'CIE [Number]:[Year]' }, + ], + technical_report: [ + { label: 'Published', pattern: 'CIE [Number]:[Year]' }, + ], + technical_note: [ + { label: 'Published', pattern: 'CIE TN [Number]:[Year]' }, + ], + guide: [ + { label: 'Published', pattern: 'CIE [Number]:[Year]' }, + ], + international_lighting_vocabulary: [ + { label: 'Published', pattern: 'CIE [Number]:[Year]' }, + ], + proceedings: [ + { label: 'Published', pattern: 'CIE [Number]:[Year]' }, + ], + draft_standard: [ + { label: 'Draft', pattern: 'CIE DS [Number]:[Year]' }, + ], + dissemination: [ + { label: 'Published', pattern: 'CIE [Number]:[Year]' }, + ], + supplement: [ + { label: 'Supplement', pattern: '[Base]-SP[Part]:[Year]' }, + ], + corrigendum: [ + { label: 'Corrigendum', pattern: '[Base] Corrigendum [N]' }, + ], + }, + csa: { + standard: [ + { label: 'Published', pattern: '[CAN/CSA]-[Number]:[Year]' }, + ], + recommended_practice: [ + { label: 'Published', pattern: '[CAN/CSA]-[Number]:[Year]' }, + ], + guide: [ + { label: 'Published', pattern: 'CSA [Number]:[Year]' }, + ], + adoption: [ + { label: 'Adopted', pattern: 'CAN/CSA-[Source] [Number]:[Year]' }, + ], + consolidated: [ + { label: 'Consolidated', pattern: '[Number]:[Year] + A[N]:[Year]' }, + ], + series: [ + { label: 'Series', pattern: '[Number] SERIES:[Year]' }, + ], + bundle: [ + { label: 'Bundle', pattern: '[Number] + A[N]:[Year] + A[N]:[Year]' }, + ], + update: [ + { label: 'Update', pattern: '[Number]:[Year] U[Number]' }, + ], + }, + jis: { + japanese_industrial_standard: [ + { label: 'Published', pattern: 'JIS [Class] [Number]-[Part]:[Year]' }, + ], + technical_report: [ + { label: 'Published', pattern: 'JIS [Class] [Number] TR:[Year]' }, + ], + technical_specification: [ + { label: 'Published', pattern: 'JIS [Class] [Number] TS:[Year]' }, + ], + basic_standard: [ + { label: 'Published', pattern: 'JIS Z [Number]:[Year]' }, + ], + handbook: [ + { label: 'Published', pattern: 'JIS [Class] [Number] HB' }, + ], + handbook_compilation: [ + { label: 'Published', pattern: 'JIS [Class] [Number] HB' }, + ], + amendment: [ + { label: 'Amendment', pattern: '[Base]/Amd [N]:[Year]' }, + ], + explanation: [ + { label: 'Explanation', pattern: '[Base] Explanation' }, + ], + }, + jcgm: { + guide: [ + { label: 'Published', pattern: 'JCGM [Number]:[Year]' }, + ], + document: [ + { label: 'Published', pattern: 'JCGM [Number]:[Year]' }, + ], + supplement: [ + { label: 'Supplement', pattern: 'JCGM [Number]-[Part]:[Year]' }, + ], + amendment: [ + { label: 'Amendment', pattern: '[Base]/Amd [N]:[Year]' }, + ], + }, + oiml: { + recommendation: [ + { label: 'Published (dated)', pattern: 'OIML R [Number]-[Part]:[Year]' }, + { label: 'Published (undated)', pattern: 'OIML R [Number]-[Part]' }, + ], + document: [ + { label: 'Published', pattern: 'OIML D [Number]:[Year]' }, + ], + guide: [ + { label: 'Published', pattern: 'OIML G [Number]:[Year]' }, + ], + vocabulary: [ + { label: 'Published', pattern: 'OIML V [Number]:[Year]' }, + ], + basic_publication: [ + { label: 'Published', pattern: 'OIML B [Number]:[Year]' }, + ], + expert_report: [ + { label: 'Published', pattern: 'OIML E [Number]:[Year]' }, + ], + supplement: [ + { label: 'Supplement', pattern: '[Base]/Suppl [N]:[Year]' }, + ], + amendment: [ + { label: 'Amendment', pattern: '[Base]/Amd [N]:[Year]' }, + ], + annex: [ + { label: 'Annex', pattern: '[Base] Annex [N]:[Year]' }, + ], + corrigendum: [ + { label: 'Corrigendum', pattern: '[Base]/Cor [N]:[Year]' }, + ], + }, + idf: { + international_standard: [ + { label: 'Published', pattern: 'IDF [Number]:[Year]' }, + ], + reviewed_method: [ + { label: 'Published', pattern: 'IDF [Number]:[Year]' }, + ], + amendment: [ + { label: 'Amendment', pattern: '[Base]/AMD [N]:[Year]' }, + ], + corrigendum: [ + { label: 'Corrigendum', pattern: '[Base]/COR [N]:[Year]' }, + ], + supplement: [ + { label: 'Supplement', pattern: '[Base]/[SupplType] [N]:[Year]' }, + ], + }, + api: { + standard: [ + { label: 'Published', pattern: 'API Std [Number]' }, + ], + recommended_practice: [ + { label: 'Published', pattern: 'API RP [Number]' }, + ], + specification: [ + { label: 'Published', pattern: 'API Spec [Number]' }, + ], + technical_report: [ + { label: 'Published', pattern: 'API TR [Number]' }, + ], + bulletin: [ + { label: 'Published', pattern: 'API Bul [Number]' }, + ], + publication: [ + { label: 'Published', pattern: 'API Pub [Number]' }, + ], + guide: [ + { label: 'Published', pattern: 'API G [Number]' }, + ], + }, + amca: { + standard: [ + { label: 'Published', pattern: 'AMCA [Number]-[Year]' }, + ], + certified_ratings_program: [ + { label: 'CRP', pattern: 'AMCA CRP [Number]-[Year]' }, + ], + publication: [ + { label: 'Published', pattern: 'AMCA Pub [Number]-[Year]' }, + ], + }, + plateau: { + handbook: [ + { label: 'Published', pattern: 'Plateau Handbook [Number]:[Year]' }, + ], + technical_report: [ + { label: 'Published', pattern: 'Plateau TR [Number]:[Year]' }, + ], + annex: [ + { label: 'Annex', pattern: '[Base] Annex [Number]:[Year]' }, + ], + }, + sae: { + standard: [ + { label: 'Published', pattern: 'SAE [Type][Number][Version]' }, + ], + }, +} + +export function getTypeSyntax(flavor: string, typeKey: string): SyntaxPattern[] | undefined { + return data[flavor]?.[typeKey] +} diff --git a/src/data/types.ts b/src/data/types.ts new file mode 100644 index 0000000..32b5670 --- /dev/null +++ b/src/data/types.ts @@ -0,0 +1,73 @@ +export interface DocType { + key: string + title: string + abbr: string[] + description: string + examples: { input: string; output?: string }[] + syntax?: string +} + +export interface Stage { + code: string + abbr: string + name: string +} + +export interface FlavorComponent { + name: string + description: string + attribute?: string + dataType?: 'enum' | 'integer' | 'string' | 'year' | 'compound' + values?: string[] + format?: string + example?: string +} + +export interface AlgebraRelation { + type: string + description: string + syntax: string + example: string +} + +export interface PubIDStyle { + key: string + name: string + description: string + example: string +} + +export interface Publisher { + flavor: string + name: string + fullName: string + category: 'international' | 'regional' | 'national' | 'industry' + description: string + website?: string + docTypes: DocType[] + stages?: Stage[] + styles?: PubIDStyle[] + components: FlavorComponent[] + algebra: AlgebraRelation[] + urnPattern?: string + relatedFlavors?: string[] + syntaxNotes?: string + logo: string + logos?: string[] + // For publishers with separate light/dark brand assets (rendered against + // dark/light backgrounds). When set, the layout picks the variant that + // matches the active theme. + logoLight?: string + logoDark?: string +} + +export type Category = Publisher['category'] + +export const categoryLabels: Record = { + international: 'International', + regional: 'Regional', + national: 'National', + industry: 'Industry' +} + +export const categoryOrder: Category[] = ['international', 'regional', 'national', 'industry'] diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..e16c13c --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro new file mode 100644 index 0000000..bf36ae6 --- /dev/null +++ b/src/layouts/BaseLayout.astro @@ -0,0 +1,62 @@ +--- +import '../styles/global.css' +import Header from '~/components/Header.astro' +import Footer from '~/components/Footer.astro' + +interface Props { + title: string + description?: string + noindex?: boolean +} + +const { title, description = 'Universal Publication Identifier', noindex = false } = Astro.props +const fullTitle = title === 'PubID' ? title : `${title} · PubID` +--- + + + + + + + {fullTitle} + + {noindex && } + + + + + + + + + +
+
+ +
+