From 1dea4840278ea66c135e5a26620f67aca0e3e4a3 Mon Sep 17 00:00:00 2001 From: hemp-dev Date: Sat, 9 May 2026 14:47:46 +0300 Subject: [PATCH 1/3] feat(astro): Add Astro site rules Add an Astro rule pack with clean and violating fixtures so static site boundaries are enforceable. Index Astro frontmatter to let existing import and side-effect checks run against real pages. --- .gitignore | 1 + apps/site/astro.config.mjs | 5 + apps/site/package.json | 16 + apps/site/src/content/landing.test.ts | 30 + apps/site/src/content/landing.ts | 113 + apps/site/src/pages/index.astro | 197 + apps/site/src/styles/landing.css | 1089 +++++ apps/site/tsconfig.json | 8 + package.json | 5 +- packages/analyzer/src/checks/check-utils.ts | 8 +- packages/parser/src/file-index.ts | 11 +- packages/parser/src/import-graph.ts | 4 +- packages/parser/src/index.ts | 35 +- pnpm-lock.yaml | 3730 +++++++++++++++-- rules/astro-site.rules.yml | 131 + rules/s-agent-architecture.rules.yml | 26 + .../fixtures/astro-site-clean/CLAUDE.md | 3 + .../src/components/RuleCard.astro | 9 + .../astro-site-clean/src/content/landing.ts | 11 + .../astro-site-clean/src/pages/index.astro | 9 + .../fixtures/astro-site-violation/CLAUDE.md | 3 + .../src/components/UnsafeWidget.astro | 7 + .../src/content/landing.ts | 3 + .../src/pages/index.astro | 10 + tests/integration/analyze-astro-site.test.ts | 46 + tests/unit/astro-file-index.test.ts | 42 + 26 files changed, 5212 insertions(+), 340 deletions(-) create mode 100644 apps/site/astro.config.mjs create mode 100644 apps/site/package.json create mode 100644 apps/site/src/content/landing.test.ts create mode 100644 apps/site/src/content/landing.ts create mode 100644 apps/site/src/pages/index.astro create mode 100644 apps/site/src/styles/landing.css create mode 100644 apps/site/tsconfig.json create mode 100644 rules/astro-site.rules.yml create mode 100644 tests/evaluation/fixtures/astro-site-clean/CLAUDE.md create mode 100644 tests/evaluation/fixtures/astro-site-clean/src/components/RuleCard.astro create mode 100644 tests/evaluation/fixtures/astro-site-clean/src/content/landing.ts create mode 100644 tests/evaluation/fixtures/astro-site-clean/src/pages/index.astro create mode 100644 tests/evaluation/fixtures/astro-site-violation/CLAUDE.md create mode 100644 tests/evaluation/fixtures/astro-site-violation/src/components/UnsafeWidget.astro create mode 100644 tests/evaluation/fixtures/astro-site-violation/src/content/landing.ts create mode 100644 tests/evaluation/fixtures/astro-site-violation/src/pages/index.astro create mode 100644 tests/integration/analyze-astro-site.test.ts create mode 100644 tests/unit/astro-file-index.test.ts diff --git a/.gitignore b/.gitignore index 251a0b3..b977a4e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ node_modules/ .pnpm-store/ dist/ +.astro/ coverage/ *.tsbuildinfo diff --git a/apps/site/astro.config.mjs b/apps/site/astro.config.mjs new file mode 100644 index 0000000..250e741 --- /dev/null +++ b/apps/site/astro.config.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from "astro/config"; + +export default defineConfig({ + output: "static" +}); diff --git a/apps/site/package.json b/apps/site/package.json new file mode 100644 index 0000000..0508497 --- /dev/null +++ b/apps/site/package.json @@ -0,0 +1,16 @@ +{ + "name": "@s-agent/site", + "version": "0.1.0", + "private": true, + "description": "Astro landing page for IntentGuard, powered by S-Agent.", + "type": "module", + "scripts": { + "dev": "astro dev --host 127.0.0.1", + "build": "astro build", + "preview": "astro preview --host 127.0.0.1", + "test": "vitest run src" + }, + "devDependencies": { + "astro": "^5.13.0" + } +} diff --git a/apps/site/src/content/landing.test.ts b/apps/site/src/content/landing.test.ts new file mode 100644 index 0000000..c29877a --- /dev/null +++ b/apps/site/src/content/landing.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, it } from "vitest"; +import { findingStatuses, proofChain, violationTypes } from "./landing"; + +describe("landing content", () => { + it("keeps the documented finding statuses visible on the landing page", () => { + expect(findingStatuses.map((item) => item.status)).toEqual([ + "PROVEN", + "PROBABLE", + "SUSPECT", + "RULE_CONFLICT", + "DISMISSED" + ]); + }); + + it("states that only proven findings can block", () => { + const blockingStatuses = findingStatuses.filter((item) => item.effect === "Can block"); + + expect(blockingStatuses).toHaveLength(1); + expect(blockingStatuses[0]?.status).toBe("PROVEN"); + }); + + it("presents the MVP around the approved symbolic checks", () => { + expect(violationTypes.map((item) => item.title)).toEqual([ + "Layer Boundary", + "Forbidden Side Effect", + "Value Invariant" + ]); + expect(proofChain).toContain("SemanticRule YAML"); + }); +}); diff --git a/apps/site/src/content/landing.ts b/apps/site/src/content/landing.ts new file mode 100644 index 0000000..3dd1c65 --- /dev/null +++ b/apps/site/src/content/landing.ts @@ -0,0 +1,113 @@ +export const brand = { + product: "IntentGuard", + engine: "S-Agent", + category: "Intent-Aware Code Review", + headline: "Protect business intent in every code change.", + subheadline: + "Turn approved engineering docs, ADRs, and project rules into deterministic pull request checks before intent drift reaches main." +} as const; + +export const proofChain = [ + "CLAUDE.md", + "SemanticRule YAML", + "TypeScript diff", + "Symbolic evidence", + "CLI / PR gate" +] as const; + +export const violationTypes = [ + { + title: "Layer Boundary", + rule: "auth must not import billing", + example: "import { charge } from '../billing/service'", + accent: "blue" + }, + { + title: "Forbidden Side Effect", + rule: "read-only flows must not write", + example: "await db.invoice.update(...)", + accent: "red" + }, + { + title: "Value Invariant", + rule: "discount cannot exceed max", + example: "discount = 0.85", + accent: "green" + } +] as const; + +export const findingStatuses = [ + { + status: "PROVEN", + effect: "Can block", + detail: "A deterministic check found symbolic evidence for an approved critical rule." + }, + { + status: "PROBABLE", + effect: "Review", + detail: "A strong signal needs human judgment before it can become enforceable." + }, + { + status: "SUSPECT", + effect: "Inform", + detail: "A weak signal is useful context, not a reason to stop a merge." + }, + { + status: "RULE_CONFLICT", + effect: "Investigate", + detail: "A heuristic suspicion disagrees with deterministic evidence." + }, + { + status: "DISMISSED", + effect: "No action", + detail: "The finding has no actionable evidence for this change." + } +] as const; + +export const semanticRuleSnippet = [ + "rule_id: AUTH-BOUNDARY-001", + "status: approved", + "severity: critical", + "invariants:", + " - type: forbidden_import", + " forbidden_imports:", + " - '@acme/billing'", + "enforcement:", + " mode: block" +] as const; + +export const diffLines = [ + { + tone: "muted", + text: "apps/auth/session.ts" + }, + { + tone: "bad", + text: '+ import { charge } from "@acme/billing";' + }, + { + tone: "normal", + text: "+ export async function createSession(user) {" + }, + { + tone: "normal", + text: "+ return issueSession(user);" + }, + { + tone: "normal", + text: "+ }" + } +] as const; + +export const cliReportLines = [ + "$ pnpm analyze:demo:broken", + "", + "PROVEN critical finding", + "rule_id: AUTH-BOUNDARY-001", + "violated invariant: auth must not import billing", + "changed file: src/auth/session.ts", + "evidence: import edge auth -> billing", + "status: PROVEN", + "", + "Merge blocked: approved critical rule with proof." +] as const; diff --git a/apps/site/src/pages/index.astro b/apps/site/src/pages/index.astro new file mode 100644 index 0000000..2ecb16f --- /dev/null +++ b/apps/site/src/pages/index.astro @@ -0,0 +1,197 @@ +--- +import { + brand, + cliReportLines, + diffLines, + findingStatuses, + proofChain, + semanticRuleSnippet, + violationTypes +} from "../content/landing"; +import "../styles/landing.css"; + +const pageTitle = `${brand.product} - ${brand.category}`; +const pageDescription = + "Deterministic-first semantic code review for TypeScript teams. Approved rules, symbolic evidence, proof-carrying findings."; +--- + + + + + + + + + + + {pageTitle} + + + + +
+
+
+

{brand.category}

+

{brand.headline}

+

{brand.subheadline}

+ +
    +
  • Approved rules are source of truth
  • +
  • LLM cannot create blocking findings
  • +
  • PROVEN critical evidence can block
  • +
+
+ +
+ + +
+

SemanticRule

+
{semanticRuleSnippet.join("\n")}
+
+ +
+

Changed diff

+ {diffLines.map((line) => ( +
{line.text}
+ ))} +
+ +
+

Proof-carrying finding

+

AUTH-BOUNDARY-001

+
+
+
Status
+
PROVEN
+
+
+
Evidence
+
import edge auth -> billing
+
+
+
Action
+
Block merge
+
+
+
+ +
+

Trace

+
    + {proofChain.map((item) =>
  1. {item}
  2. )} +
+
+
+
+ +
+
+ {violationTypes.map((item) => ( +
+ {item.title} + {item.rule} +
+ ))} +
+
+ +
+
+

Docs become guardrails

+

Your most repeated review comments should be executable.

+
+
+

+ IntentGuard starts where teams already write intent: CLAUDE.md, READMEs, + ADRs, and architecture notes. Candidate rules can be suggested, but the + approved YAML file is the source of truth. +

+

+ The MVP stays deliberately narrow: TypeScript diffs, symbolic checks, and + proof-carrying findings for the three violations that teams repeat by hand. +

+
+
+ +
+ {violationTypes.map((item) => ( +
+ 0{violationTypes.indexOf(item) + 1} +

{item.title}

+

{item.rule}

+ {item.example} +
+ ))} +
+ +
+
+

Finding statuses

+

Only proof gets to stop a merge.

+

+ Heuristics can point reviewers toward risk. Blocking remains conservative: + approved critical rules, deterministic evidence, and a concrete trace. +

+
+ +
+ {findingStatuses.map((item) => ( +
+ {item.status} + {item.effect} +

{item.detail}

+
+ ))} +
+
+ +
+
+

CLI first

+

A report a reviewer can audit, not a vibe they have to trust.

+

+ S-Agent indexes TypeScript, runs approved SemanticRules, classifies + evidence, and prints the same chain that will later become a GitHub + Action comment. +

+ Start with one rule +
+ +
+
+ + + + diff --git a/apps/site/src/styles/landing.css b/apps/site/src/styles/landing.css new file mode 100644 index 0000000..dddde17 --- /dev/null +++ b/apps/site/src/styles/landing.css @@ -0,0 +1,1089 @@ +:root { + color-scheme: light; + --paper: #f4eddf; + --paper-strong: #fffaf0; + --ink: #11100e; + --muted: #6f675b; + --line: #11100e; + --blue: #2358ff; + --cyan: #5fd7ff; + --red: #f04a3a; + --green: #22b86f; + --yellow: #ffd84a; + --shadow: 10px 10px 0 var(--ink); + --radius: 6px; +} + +* { + box-sizing: border-box; +} + +html { + background: var(--paper); + scroll-behavior: smooth; +} + +body { + min-width: 320px; + margin: 0; + overflow-x: hidden; + color: var(--ink); + font-family: "Aptos", "Helvetica Neue", Helvetica, sans-serif; + letter-spacing: 0; + background: + repeating-linear-gradient(90deg, rgba(17, 16, 14, 0.045) 0 1px, transparent 1px 44px), + repeating-linear-gradient(0deg, rgba(17, 16, 14, 0.035) 0 1px, transparent 1px 44px), + var(--paper); +} + +body::after { + position: fixed; + inset: 0; + z-index: 30; + pointer-events: none; + content: ""; + opacity: 0.18; + background-image: + linear-gradient(90deg, rgba(17, 16, 14, 0.12) 1px, transparent 1px), + linear-gradient(0deg, rgba(255, 250, 240, 0.35) 1px, transparent 1px); + background-size: 7px 7px; + mix-blend-mode: multiply; +} + +a { + color: inherit; + text-decoration: none; +} + +pre, +code { + font-family: "JetBrains Mono", "IBM Plex Mono", "SFMono-Regular", Consolas, monospace; +} + +.site-header { + position: sticky; + top: 0; + z-index: 20; + display: grid; + grid-template-columns: 1fr auto auto; + gap: 24px; + align-items: center; + padding: 14px 28px; + border-bottom: 2px solid var(--ink); + background: rgba(244, 237, 223, 0.86); + backdrop-filter: blur(14px); +} + +.brand-mark { + display: inline-flex; + gap: 12px; + align-items: center; + width: max-content; +} + +.brand-mark__sigil { + display: grid; + width: 42px; + height: 42px; + place-items: center; + color: var(--paper-strong); + font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif; + font-weight: 800; + background: var(--ink); + border: 2px solid var(--ink); + box-shadow: 4px 4px 0 var(--red); +} + +.brand-mark strong, +.brand-mark small { + display: block; + line-height: 1.05; +} + +.brand-mark strong { + font-size: 1.05rem; +} + +.brand-mark small { + margin-top: 3px; + color: var(--muted); + font-size: 0.78rem; +} + +.site-nav { + display: flex; + gap: 8px; + align-items: center; +} + +.site-nav a, +.header-action { + padding: 10px 12px; + border: 1.5px solid transparent; + border-radius: var(--radius); + font-size: 0.92rem; + font-weight: 700; +} + +.site-nav a:hover, +.header-action:hover { + border-color: var(--ink); + background: var(--paper-strong); +} + +.header-action { + border-color: var(--ink); + background: var(--yellow); + box-shadow: 3px 3px 0 var(--ink); +} + +.hero { + display: grid; + grid-template-columns: minmax(0, 0.9fr) minmax(520px, 1.1fr); + gap: 42px; + align-items: center; + max-width: 1420px; + min-height: 80svh; + margin: 0 auto; + padding: 34px 32px 26px; +} + +.hero__copy { + max-width: 700px; +} + +.eyebrow { + width: max-content; + max-width: 100%; + margin: 0 0 18px; + padding: 8px 10px; + overflow-wrap: anywhere; + color: var(--ink); + font-size: 0.86rem; + font-weight: 800; + line-height: 1; + background: var(--cyan); + border: 2px solid var(--ink); + box-shadow: 4px 4px 0 var(--ink); +} + +.hero h1, +.section h2 { + margin: 0; + font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif; + font-weight: 900; + letter-spacing: 0; +} + +.hero h1 { + max-width: 760px; + font-size: 4.75rem; + line-height: 0.96; + text-wrap: balance; +} + +.hero__lede { + max-width: 640px; + margin: 26px 0 0; + color: #29241d; + font-size: 1.2rem; + line-height: 1.55; +} + +.hero__actions { + display: flex; + flex-wrap: wrap; + gap: 14px; + margin-top: 30px; +} + +.button { + display: inline-flex; + min-height: 48px; + align-items: center; + justify-content: center; + padding: 12px 18px; + border: 2px solid var(--ink); + border-radius: var(--radius); + font-weight: 900; + line-height: 1.1; + box-shadow: 5px 5px 0 var(--ink); + transition: + translate 160ms ease, + box-shadow 160ms ease; +} + +.button:hover { + translate: 2px 2px; + box-shadow: 3px 3px 0 var(--ink); +} + +.button--primary { + color: var(--paper-strong); + background: var(--ink); +} + +.button--secondary { + background: var(--paper-strong); +} + +.trust-list { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 10px; + max-width: 620px; + padding: 0; + margin: 30px 0 0; + list-style: none; +} + +.trust-list li { + display: flex; + gap: 10px; + align-items: flex-start; + color: #29241d; + font-size: 0.9rem; + font-weight: 700; + line-height: 1.35; +} + +.trust-list li::before { + flex: 0 0 auto; + width: 12px; + height: 12px; + margin-top: 5px; + content: ""; + background: var(--green); + border: 2px solid var(--ink); +} + +.proof-stage { + position: relative; + min-height: 560px; + isolation: isolate; +} + +.stage-rails { + position: absolute; + inset: 52px 34px 42px; + z-index: -1; + border: 2px solid var(--ink); + background: + linear-gradient(135deg, transparent 0 47%, rgba(17, 16, 14, 0.14) 47% 48%, transparent 48%), + linear-gradient(45deg, transparent 0 47%, rgba(17, 16, 14, 0.14) 47% 48%, transparent 48%), + rgba(255, 216, 74, 0.22); + background-size: 80px 80px; + transform: rotate(-3deg); +} + +.stage-rails::before, +.stage-rails::after { + position: absolute; + content: ""; + border: 2px solid var(--ink); + background: var(--paper); +} + +.stage-rails::before { + top: -28px; + right: 18%; + width: 64px; + height: 64px; +} + +.stage-rails::after { + right: -24px; + bottom: 18%; + width: 94px; + height: 28px; + background: var(--red); +} + +.artifact { + position: absolute; + width: 320px; + padding: 16px; + border: 2px solid var(--ink); + border-radius: var(--radius); + background: rgba(255, 250, 240, 0.94); + box-shadow: var(--shadow); + translate: 0 0; + animation: lift 7s ease-in-out infinite; +} + +.artifact__label { + width: max-content; + margin: 0 0 12px; + padding: 5px 8px; + font-size: 0.72rem; + font-weight: 900; + line-height: 1; + background: var(--yellow); + border: 1.5px solid var(--ink); +} + +.artifact pre { + margin: 0; + overflow-x: auto; + font-size: 0.74rem; + line-height: 1.55; +} + +.artifact--rule { + top: 20px; + left: 10px; + transform: rotate(-4deg); +} + +.artifact--diff { + top: 100px; + right: 12px; + width: 360px; + transform: rotate(3deg); + animation-delay: 700ms; +} + +.artifact--finding { + bottom: 48px; + left: 86px; + width: 360px; + transform: rotate(1deg); + animation-delay: 1300ms; +} + +.artifact--trace { + right: 0; + bottom: 2px; + width: 292px; + background: var(--cyan); + transform: rotate(-2deg); + animation-delay: 1900ms; +} + +.artifact--finding h2 { + margin: 0 0 14px; + font-size: 1.35rem; +} + +.artifact dl { + display: grid; + gap: 8px; + margin: 0; +} + +.artifact dl div { + display: grid; + grid-template-columns: 86px 1fr; + gap: 10px; + align-items: baseline; + padding-top: 8px; + border-top: 1.5px solid rgba(17, 16, 14, 0.22); +} + +.artifact dt { + color: var(--muted); + font-size: 0.78rem; + font-weight: 800; +} + +.artifact dd { + margin: 0; + font-weight: 900; +} + +.artifact ol { + display: grid; + gap: 8px; + padding-left: 22px; + margin: 0; + font-weight: 900; +} + +.diff-line { + padding: 7px 8px; + margin-top: 6px; + overflow-wrap: anywhere; + font-family: "JetBrains Mono", "IBM Plex Mono", "SFMono-Regular", Consolas, monospace; + font-size: 0.78rem; + background: rgba(17, 16, 14, 0.05); + border-left: 4px solid var(--green); +} + +.diff-line--bad { + background: rgba(240, 74, 58, 0.12); + border-left-color: var(--red); +} + +.diff-line--muted { + color: var(--muted); + background: transparent; + border-left-color: var(--ink); +} + +@keyframes lift { + 0%, + 100% { + translate: 0 0; + } + + 50% { + translate: 0 -10px; + } +} + +.signal-strip { + border-top: 2px solid var(--ink); + border-bottom: 2px solid var(--ink); + background: var(--ink); +} + +.signal-strip__track { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + max-width: 1420px; + margin: 0 auto; +} + +.signal-card { + min-height: 112px; + padding: 22px 28px; + color: var(--paper-strong); + border-right: 2px solid var(--paper); +} + +.signal-card:last-child { + border-right: 0; +} + +.signal-card strong, +.signal-card span { + display: block; +} + +.signal-card strong { + margin-bottom: 10px; + font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif; + font-size: 1.45rem; + line-height: 1.05; +} + +.signal-card span { + color: rgba(255, 250, 240, 0.78); + font-size: 0.98rem; + line-height: 1.4; +} + +.signal-card--blue { + background: var(--blue); +} + +.signal-card--red { + background: var(--red); +} + +.signal-card--green { + color: var(--ink); + background: var(--green); +} + +.signal-card--green span { + color: rgba(17, 16, 14, 0.78); +} + +.section { + max-width: 1220px; + padding: 92px 32px; + margin: 0 auto; +} + +.section--split { + display: grid; + grid-template-columns: minmax(0, 0.92fr) minmax(360px, 1.08fr); + gap: 64px; + align-items: start; +} + +.section h2 { + max-width: 640px; + font-size: 3.35rem; + line-height: 1; +} + +.copy-stack { + display: grid; + gap: 18px; + font-size: 1.12rem; + line-height: 1.65; +} + +.copy-stack p, +.section-heading p, +.work-copy p { + margin: 0; + color: #332d25; +} + +.check-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; + padding-top: 0; +} + +.check-card { + position: relative; + min-height: 300px; + padding: 22px; + overflow: hidden; + border: 2px solid var(--ink); + border-radius: var(--radius); + background: var(--paper-strong); + box-shadow: var(--shadow); +} + +.check-card::before { + position: absolute; + right: 18px; + bottom: 18px; + width: 78px; + height: 78px; + content: ""; + border: 2px solid var(--ink); +} + +.check-card--blue::before { + background: var(--blue); +} + +.check-card--red::before { + background: var(--red); +} + +.check-card--green::before { + background: var(--green); +} + +.check-card__index { + display: inline-grid; + width: 48px; + height: 48px; + place-items: center; + margin-bottom: 44px; + font-weight: 900; + border: 2px solid var(--ink); + background: var(--yellow); +} + +.check-card h3 { + max-width: 260px; + margin: 0 0 12px; + font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif; + font-size: 2rem; + line-height: 1.05; +} + +.check-card p { + max-width: 290px; + margin: 0 0 18px; + color: #342d25; + line-height: 1.5; +} + +.check-card code { + display: block; + max-width: 100%; + padding: 10px; + overflow-wrap: anywhere; + font-size: 0.8rem; + line-height: 1.45; + background: rgba(17, 16, 14, 0.07); + border: 1.5px solid rgba(17, 16, 14, 0.2); +} + +.proof-section { + border-top: 2px solid var(--ink); +} + +.section-heading { + display: grid; + gap: 18px; + max-width: 760px; +} + +.section-heading h2 { + max-width: 760px; +} + +.section-heading p { + max-width: 680px; + font-size: 1.08rem; + line-height: 1.6; +} + +.status-grid { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 12px; + margin-top: 42px; +} + +.status-card { + min-height: 236px; + padding: 16px; + border: 2px solid var(--ink); + border-radius: var(--radius); + background: var(--paper-strong); +} + +.status-card strong { + display: block; + margin-bottom: 10px; + overflow-wrap: anywhere; + font-size: 1rem; + line-height: 1.1; +} + +.status-card span { + display: inline-block; + padding: 6px 8px; + margin-bottom: 26px; + font-size: 0.78rem; + font-weight: 900; + border: 1.5px solid var(--ink); +} + +.status-card p { + margin: 0; + color: #342d25; + font-size: 0.92rem; + line-height: 1.45; +} + +.status-card--proven { + background: var(--green); +} + +.status-card--proven span { + background: var(--paper-strong); +} + +.status-card--probable span { + background: var(--yellow); +} + +.status-card--suspect span { + color: var(--paper-strong); + background: var(--blue); +} + +.status-card--rule_conflict span { + color: var(--paper-strong); + background: var(--red); +} + +.status-card--dismissed { + background: #d8d0c2; +} + +.status-card--dismissed span { + background: var(--paper); +} + +.section--work { + align-items: center; + padding-top: 24px; +} + +.work-copy { + display: grid; + gap: 20px; +} + +.work-copy h2 { + max-width: 620px; +} + +.work-copy p { + max-width: 560px; + font-size: 1.08rem; + line-height: 1.6; +} + +.work-copy .button { + width: max-content; + margin-top: 6px; +} + +.terminal { + overflow: hidden; + color: var(--paper-strong); + border: 2px solid var(--ink); + border-radius: var(--radius); + background: #12110f; + box-shadow: var(--shadow); +} + +.terminal__bar { + display: flex; + gap: 8px; + padding: 14px; + border-bottom: 2px solid #2f2d28; +} + +.terminal__bar span { + width: 13px; + height: 13px; + border: 1.5px solid var(--paper-strong); + border-radius: 50%; +} + +.terminal__bar span:nth-child(1) { + background: var(--red); +} + +.terminal__bar span:nth-child(2) { + background: var(--yellow); +} + +.terminal__bar span:nth-child(3) { + background: var(--green); +} + +.terminal pre { + min-height: 360px; + padding: 24px; + margin: 0; + overflow-x: auto; + font-size: 0.92rem; + line-height: 1.6; +} + +.site-footer { + display: flex; + gap: 18px; + align-items: center; + justify-content: space-between; + padding: 26px 32px; + color: var(--paper-strong); + background: var(--ink); +} + +.site-footer p { + max-width: 760px; + margin: 0; + line-height: 1.45; +} + +.site-footer a { + font-weight: 900; + text-decoration: underline; + text-decoration-thickness: 2px; + text-underline-offset: 4px; +} + +@media (max-width: 1120px) { + .hero { + grid-template-columns: 1fr; + min-height: auto; + padding-top: 52px; + } + + .hero h1 { + font-size: 4.6rem; + } + + .proof-stage { + min-height: 640px; + } + + .status-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +@media (max-height: 760px) and (min-width: 900px) { + .hero { + align-items: start; + min-height: 62svh; + padding-top: 18px; + padding-bottom: 12px; + } + + .hero h1 { + font-size: 3.55rem; + line-height: 0.98; + } + + .hero__lede { + margin-top: 18px; + font-size: 1rem; + line-height: 1.48; + } + + .hero__actions { + margin-top: 22px; + } + + .trust-list { + display: none; + } + + .proof-stage { + min-height: 470px; + } + + .artifact { + padding: 14px; + } + + .artifact--rule { + width: 300px; + top: 10px; + } + + .artifact--diff { + top: 74px; + width: 340px; + } + + .artifact--finding { + bottom: 26px; + left: 74px; + width: 340px; + } + + .artifact--trace { + width: 270px; + } + + .signal-card { + min-height: 96px; + padding: 10px 20px; + } + + .signal-card strong { + margin-bottom: 4px; + font-size: 1.08rem; + } + + .signal-card span { + font-size: 0.86rem; + } +} + +@media (max-width: 840px) { + .site-header { + grid-template-columns: 1fr auto; + } + + .site-nav { + display: none; + } + + .hero { + padding-right: 20px; + padding-left: 20px; + } + + .hero h1 { + font-size: 3.7rem; + } + + .hero__lede { + font-size: 1.08rem; + } + + .proof-stage { + display: grid; + gap: 18px; + min-height: auto; + } + + .trust-list { + grid-template-columns: 1fr; + } + + .stage-rails { + inset: 20px; + } + + .stage-rails::before, + .stage-rails::after { + display: none; + } + + .artifact { + position: relative; + inset: auto; + width: calc(100% - 8px); + transform: none; + } + + .signal-strip__track, + .check-grid, + .section--split { + grid-template-columns: 1fr; + } + + .signal-card { + border-right: 0; + border-bottom: 2px solid var(--paper); + } + + .signal-card:last-child { + border-bottom: 0; + } + + .section { + padding: 72px 20px; + } + + .section h2 { + font-size: 2.65rem; + } + + .status-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 560px) { + .site-header { + grid-template-columns: 1fr; + gap: 14px; + padding: 12px 14px; + } + + .brand-mark__sigil { + width: 38px; + height: 38px; + } + + .brand-mark small { + display: none; + } + + .header-action { + display: none; + } + + .hero { + padding-top: 42px; + overflow: hidden; + } + + .hero h1 { + max-width: 9ch; + font-size: 2.35rem; + line-height: 1; + text-wrap: normal; + } + + .hero__lede { + max-width: 32ch; + font-size: 0.98rem; + } + + .trust-list { + display: none; + } + + .hero__actions, + .button, + .work-copy .button { + width: 100%; + } + + .proof-stage { + display: none; + } + + .stage-rails { + display: block; + inset: 28px 16px 12px; + transform: rotate(-2deg); + } + + .artifact { + position: absolute; + width: 220px; + padding: 10px; + box-shadow: 5px 5px 0 var(--ink); + animation: none; + } + + .artifact__label { + margin-bottom: 8px; + font-size: 0.65rem; + } + + .artifact pre { + max-height: 116px; + font-size: 0.62rem; + } + + .artifact--rule { + top: 0; + left: 0; + width: calc(100% - 18px); + } + + .artifact--diff { + display: none; + } + + .artifact--finding { + display: none; + } + + .artifact--finding h2 { + font-size: 1rem; + } + + .artifact dl div { + grid-template-columns: 64px 1fr; + gap: 8px; + } + + .artifact dt, + .artifact dd { + font-size: 0.72rem; + } + + .artifact--trace { + display: none; + } + + .artifact ol { + gap: 4px; + padding-left: 18px; + font-size: 0.68rem; + } + + .status-grid { + grid-template-columns: 1fr; + } + + .terminal pre { + min-height: 300px; + font-size: 0.8rem; + } + + .site-footer { + display: grid; + } +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + + *, + *::before, + *::after { + animation-duration: 1ms !important; + animation-iteration-count: 1 !important; + transition-duration: 1ms !important; + } +} diff --git a/apps/site/tsconfig.json b/apps/site/tsconfig.json new file mode 100644 index 0000000..3f8474a --- /dev/null +++ b/apps/site/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"], + "compilerOptions": { + "types": ["vitest"] + } +} diff --git a/package.json b/package.json index 0373ba2..e730fe4 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,14 @@ "description": "Deterministic-first semantic code review guard for TypeScript projects.", "type": "commonjs", "scripts": { - "build": "tsc -b", + "build": "tsc -b && pnpm --filter @s-agent/site run build", "clean": "tsc -b --clean", "lint": "tsc -b --pretty false", "test": "vitest run", "test:watch": "vitest", + "site:dev": "pnpm --filter @s-agent/site run dev", + "site:build": "pnpm --filter @s-agent/site run build", + "site:preview": "pnpm --filter @s-agent/site run preview", "analyze:demo": "pnpm --filter @s-agent/cli run analyze --project ../../examples/demo-typescript-app-clean", "analyze:demo:broken": "pnpm --filter @s-agent/cli run analyze --project ../../examples/demo-typescript-app", "analyze:self": "pnpm --filter @s-agent/cli run analyze --project ../.. --rules ../../rules --json", diff --git a/packages/analyzer/src/checks/check-utils.ts b/packages/analyzer/src/checks/check-utils.ts index fcc8175..174d433 100644 --- a/packages/analyzer/src/checks/check-utils.ts +++ b/packages/analyzer/src/checks/check-utils.ts @@ -23,8 +23,14 @@ export function importMatchesPattern(importReference: ImportReference, pattern: ); } + if (matchesPath(normalizedSource, normalizedPattern)) { + return true; + } + const basenamePattern = normalizeProjectPath(path.basename(normalizedPattern)); - return Boolean(basenamePattern && normalizedSource.includes(basenamePattern.replace(/\*/g, ""))); + const literalPattern = basenamePattern.replace(/\*/g, ""); + + return Boolean(literalPattern && normalizedSource.includes(literalPattern)); } export function functionAtLine(file: IndexedFile, line: number): FunctionInfo | undefined { diff --git a/packages/parser/src/file-index.ts b/packages/parser/src/file-index.ts index 2bfce28..0544eae 100644 --- a/packages/parser/src/file-index.ts +++ b/packages/parser/src/file-index.ts @@ -3,6 +3,7 @@ import path from "node:path"; import { relativeToRoot } from "@s-agent/shared"; const ignoredDirectories = new Set([".git", "dist", "node_modules", "coverage"]); +const sourceFileExtensions = /\.(astro|ts|tsx)$/; export interface SourceFileEntry { absolutePath: string; @@ -10,6 +11,10 @@ export interface SourceFileEntry { text: string; } +function isIndexableSourceFile(fileName: string): boolean { + return sourceFileExtensions.test(fileName) && !fileName.endsWith(".d.ts"); +} + export async function listTypeScriptFiles(projectRoot: string): Promise { async function visit(directory: string): Promise { const entries = await fs.readdir(directory, { withFileTypes: true }); @@ -25,11 +30,7 @@ export async function listTypeScriptFiles(projectRoot: string): Promise fs.existsSync(filePath)); diff --git a/packages/parser/src/index.ts b/packages/parser/src/index.ts index e899171..f3e7b19 100644 --- a/packages/parser/src/index.ts +++ b/packages/parser/src/index.ts @@ -18,16 +18,47 @@ export interface ProjectIndex { files: IndexedFile[]; } +function astroFrontmatterScript(text: string): string { + const lines = text.split(/\r?\n/); + + if (lines[0]?.trim() !== "---") { + return ""; + } + + const closingFenceIndex = lines.findIndex((line, index) => index > 0 && line.trim() === "---"); + + if (closingFenceIndex === -1) { + return ""; + } + + return lines + .map((line, index) => (index > 0 && index < closingFenceIndex ? line : "")) + .join("\n"); +} + +function scriptTextFor(entry: { absolutePath: string; text: string }): string { + if (entry.absolutePath.endsWith(".astro")) { + return astroFrontmatterScript(entry.text); + } + + return entry.text; +} + +function scriptKindFor(absolutePath: string): ts.ScriptKind { + return absolutePath.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS; +} + export async function indexProject(projectRoot: string): Promise { const root = path.resolve(projectRoot); const sourceFiles = await readSourceFiles(root); const files = sourceFiles.map((entry) => { + const scriptText = scriptTextFor(entry); const sourceFile = ts.createSourceFile( entry.absolutePath, - entry.text, + scriptText, ts.ScriptTarget.Latest, true, - entry.absolutePath.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS + scriptKindFor(entry.absolutePath) ); const symbols = extractSymbols(sourceFile); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f85924..a4b43fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,6 +37,12 @@ importers: specifier: workspace:* version: link:../../packages/rules + apps/site: + devDependencies: + astro: + specifier: ^5.13.0 + version: 5.18.1(@types/node@22.19.18)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4) + packages/analyzer: dependencies: '@s-agent/parser': @@ -104,194 +110,696 @@ importers: packages: + '@astrojs/compiler@2.13.1': + resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} + + '@astrojs/internal-helpers@0.7.6': + resolution: {integrity: sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==} + + '@astrojs/markdown-remark@6.3.11': + resolution: {integrity: sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==} + + '@astrojs/prism@3.3.0': + resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/telemetry@3.3.0': + resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@capsizecss/unpack@4.0.0': + resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} + engines: {node: '>=18'} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - '@rollup/rollup-android-arm-eabi@4.60.3': - resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} - cpu: [arm] - os: [android] + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - '@rollup/rollup-android-arm64@4.60.3': - resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} - cpu: [arm64] - os: [android] + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} - '@rollup/rollup-darwin-arm64@4.60.3': - resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.3': - resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.3': - resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] - os: [freebsd] + os: [darwin] - '@rollup/rollup-freebsd-x64@4.60.3': - resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] - os: [freebsd] + os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.60.3': - resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} - cpu: [arm] + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.60.3': - resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.60.3': - resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} - cpu: [arm64] + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.60.3': - resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.60.3': + resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.3': + resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.3': + resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.3': + resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.3': + resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.3': + resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.60.3': + resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.60.3': + resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} cpu: [arm64] os: [linux] @@ -370,15 +878,57 @@ packages: cpu: [x64] os: [win32] + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@types/node@22.19.18': resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + '@vitest/expect@2.1.9': resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} @@ -408,22 +958,158 @@ packages: '@vitest/utils@2.1.9': resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + astro@5.18.1: + resolution: {integrity: sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -433,10 +1119,75 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + + devalue@5.8.0: + resolution: {integrity: sha512-2zA9pFEsnp7vWBZbXF5JAgAq0fsUIt/1XPbRiAmRV3lp/2C3upzH+sADiyy66aFCihoLEsrQHxNM5w1gIDfsBg==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -445,438 +1196,2503 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} - nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - postcss@8.5.14: - resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} - engines: {node: ^10 || ^12 || >=14} + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - rollup@4.60.3: - resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} - engines: {node: '>=14.0.0'} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} - vite-node@2.1.9: - resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} - engines: {node: ^18.0.0 || >=20.0.0} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} hasBin: true - vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - 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 + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} - vitest@2.1.9: - resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.9 - '@vitest/ui': 2.1.9 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - yaml@2.8.4: - resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} - engines: {node: '>= 14.6'} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.2: + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} -snapshots: + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} - '@esbuild/aix-ppc64@0.21.5': - optional: true + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} - '@esbuild/android-arm64@0.21.5': - optional: true + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} - '@esbuild/android-arm@0.21.5': - optional: true + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} - '@esbuild/android-x64@0.21.5': - optional: true + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - '@esbuild/darwin-arm64@0.21.5': - optional: true + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} - '@esbuild/darwin-x64@0.21.5': - optional: true + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - '@esbuild/freebsd-arm64@0.21.5': - optional: true + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} - '@esbuild/freebsd-x64@0.21.5': - optional: true + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} - '@esbuild/linux-arm64@0.21.5': - optional: true + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} - '@esbuild/linux-arm@0.21.5': - optional: true + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} - '@esbuild/linux-ia32@0.21.5': - optional: true + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} - '@esbuild/linux-loong64@0.21.5': - optional: true + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - '@esbuild/linux-mips64el@0.21.5': - optional: true + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} - '@esbuild/linux-ppc64@0.21.5': - optional: true + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - '@esbuild/linux-riscv64@0.21.5': - optional: true + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - '@esbuild/linux-s390x@0.21.5': - optional: true + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} - '@esbuild/linux-x64@0.21.5': - optional: true + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} - '@esbuild/netbsd-x64@0.21.5': - optional: true + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - '@esbuild/openbsd-x64@0.21.5': - optional: true + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} - '@esbuild/sunos-x64@0.21.5': - optional: true + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} - '@esbuild/win32-arm64@0.21.5': - optional: true + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} - '@esbuild/win32-ia32@0.21.5': - optional: true + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} - '@esbuild/win32-x64@0.21.5': - optional: true + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} - '@jridgewell/sourcemap-codec@1.5.5': {} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - '@rollup/rollup-android-arm-eabi@4.60.3': - optional: true + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - '@rollup/rollup-android-arm64@4.60.3': - optional: true + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} - '@rollup/rollup-darwin-arm64@4.60.3': - optional: true + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - '@rollup/rollup-darwin-x64@4.60.3': - optional: true + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - '@rollup/rollup-freebsd-arm64@4.60.3': - optional: true + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - '@rollup/rollup-freebsd-x64@4.60.3': - optional: true + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} - '@rollup/rollup-linux-arm-gnueabihf@4.60.3': - optional: true + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - '@rollup/rollup-linux-arm-musleabihf@4.60.3': - optional: true + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} - '@rollup/rollup-linux-arm64-gnu@4.60.3': - optional: true + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + rollup@4.60.3: + resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + smol-toml@1.6.1: + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + engines: {node: '>=16'} + hasBin: true + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + engines: {node: '>=18'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.7.4: + resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@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: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@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 + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + 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 + + vite@6.4.2: + resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + yaml@2.8.4: + resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + yocto-spinner@0.2.3: + resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} + engines: {node: '>=18.19'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@astrojs/compiler@2.13.1': {} + + '@astrojs/internal-helpers@0.7.6': {} + + '@astrojs/markdown-remark@6.3.11': + dependencies: + '@astrojs/internal-helpers': 0.7.6 + '@astrojs/prism': 3.3.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.1 + 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 + shiki: 3.23.0 + smol-toml: 1.6.1 + 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 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@3.3.0': + dependencies: + prismjs: 1.30.0 + + '@astrojs/telemetry@3.3.0': + dependencies: + ci-info: 4.4.0 + debug: 4.4.3 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.1 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@capsizecss/unpack@4.0.0': + dependencies: + fontkitten: 1.0.3 + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.10.0 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@oslojs/encoding@1.1.0': {} + + '@rollup/pluginutils@5.3.0(rollup@4.60.3)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.3 + + '@rollup/rollup-android-arm-eabi@4.60.3': + optional: true + + '@rollup/rollup-android-arm64@4.60.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.3': + optional: true + + '@rollup/rollup-darwin-x64@4.60.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.3': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.3': + optional: true + + '@shikijs/core@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/themes@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/types@3.23.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.8': {} + + '@types/estree@1.0.9': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@22.19.18': + dependencies: + undici-types: 6.21.0 + + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.3.1': {} + + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.18))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 5.4.21(@types/node@22.19.18) + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.21 + pathe: 1.1.2 + + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.2.1 + tinyrainbow: 1.2.0 + + acorn@8.16.0: {} + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@6.2.3: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + + assertion-error@2.0.1: {} + + astro@5.18.1(@types/node@22.19.18)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4): + dependencies: + '@astrojs/compiler': 2.13.1 + '@astrojs/internal-helpers': 0.7.6 + '@astrojs/markdown-remark': 6.3.11 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 4.0.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) + acorn: 8.16.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.1.1 + cssesc: 3.0.0 + debug: 4.4.3 + deterministic-object-hash: 2.0.2 + devalue: 5.8.0 + diff: 8.0.4 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.27.7 + estree-walker: 3.0.3 + flattie: 1.1.1 + fontace: 0.4.1 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.1 + magic-string: 0.30.21 + magicast: 0.5.2 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.1 + package-manager-detector: 1.6.0 + piccolore: 0.1.3 + picomatch: 4.0.4 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.4 + shiki: 3.23.0 + smol-toml: 1.6.1 + svgo: 4.0.1 + tinyexec: 1.1.2 + tinyglobby: 0.2.16 + tsconfck: 3.1.6(typescript@5.9.3) + ultrahtml: 1.6.0 + unifont: 0.7.4 + unist-util-visit: 5.1.0 + unstorage: 1.17.5 + vfile: 6.0.3 + vite: 6.4.2(@types/node@22.19.18)(yaml@2.8.4) + vitefu: 1.1.3(vite@6.4.2(@types/node@22.19.18)(yaml@2.8.4)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + optionalDependencies: + sharp: 0.34.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + base-64@1.0.0: {} + + boolbase@1.0.0: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + + cac@6.7.14: {} + + camelcase@8.0.0: {} + + ccount@2.0.1: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + check-error@2.1.3: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + ci-info@4.4.0: {} + + cli-boxes@3.0.0: {} + + clsx@2.1.1: {} + + comma-separated-tokens@2.0.3: {} + + commander@11.1.0: {} + + common-ancestor-path@1.0.1: {} + + cookie-es@1.2.3: {} + + cookie@1.1.1: {} + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + deep-eql@5.0.2: {} + + defu@6.1.7: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@2.1.2: + optional: true + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.8.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@8.0.4: {} + + dlv@1.1.3: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dset@3.1.4: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + es-module-lexer@1.7.0: {} + + esbuild@0.21.5: + 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 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + escape-string-regexp@5.0.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + eventemitter3@5.0.4: {} + + expect-type@1.3.0: {} + + extend@3.0.2: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + flattie@1.1.1: {} + + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 + + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 + + fsevents@2.3.3: + optional: true + + get-east-asian-width@1.6.0: {} + + github-slugger@2.0.0: {} + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.1 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + http-cache-semantics@4.2.0: {} + + import-meta-resolve@4.2.0: {} + + iron-webcrypto@1.2.1: {} + + is-docker@3.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-plain-obj@4.1.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + kleur@3.0.3: {} + + longest-streak@3.1.0: {} + + loupe@3.2.1: {} + + lru-cache@11.3.6: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.2: + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + + markdown-table@3.0.4: {} + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.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.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 - '@rollup/rollup-linux-arm64-musl@4.60.3': - optional: true + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - '@rollup/rollup-linux-loong64-gnu@4.60.3': - optional: true + micromark-util-encode@2.0.1: {} - '@rollup/rollup-linux-loong64-musl@4.60.3': - optional: true + micromark-util-html-tag-name@2.0.1: {} - '@rollup/rollup-linux-ppc64-gnu@4.60.3': - optional: true + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 - '@rollup/rollup-linux-ppc64-musl@4.60.3': - optional: true + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 - '@rollup/rollup-linux-riscv64-gnu@4.60.3': - optional: true + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - '@rollup/rollup-linux-riscv64-musl@4.60.3': - optional: true + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - '@rollup/rollup-linux-s390x-gnu@4.60.3': - optional: true + micromark-util-symbol@2.0.1: {} - '@rollup/rollup-linux-x64-gnu@4.60.3': - optional: true + micromark-util-types@2.0.2: {} - '@rollup/rollup-linux-x64-musl@4.60.3': - optional: true + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color - '@rollup/rollup-openbsd-x64@4.60.3': - optional: true + mrmime@2.0.1: {} - '@rollup/rollup-openharmony-arm64@4.60.3': - optional: true + ms@2.1.3: {} - '@rollup/rollup-win32-arm64-msvc@4.60.3': - optional: true + nanoid@3.3.12: {} - '@rollup/rollup-win32-ia32-msvc@4.60.3': - optional: true + neotraverse@0.6.18: {} - '@rollup/rollup-win32-x64-gnu@4.60.3': - optional: true + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 - '@rollup/rollup-win32-x64-msvc@4.60.3': - optional: true + node-fetch-native@1.6.7: {} - '@types/estree@1.0.8': {} + node-mock-http@1.0.4: {} - '@types/estree@1.0.9': {} + normalize-path@3.0.0: {} - '@types/node@22.19.18': + nth-check@2.1.1: dependencies: - undici-types: 6.21.0 + boolbase: 1.0.0 - '@vitest/expect@2.1.9': + ofetch@1.5.1: dependencies: - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 - chai: 5.3.3 - tinyrainbow: 1.2.0 + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.18))': + ohash@2.0.11: {} + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: dependencies: - '@vitest/spy': 2.1.9 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 5.4.21(@types/node@22.19.18) + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 - '@vitest/pretty-format@2.1.9': + p-limit@6.2.0: dependencies: - tinyrainbow: 1.2.0 + yocto-queue: 1.2.2 - '@vitest/runner@2.1.9': + p-queue@8.1.1: dependencies: - '@vitest/utils': 2.1.9 - pathe: 1.1.2 + eventemitter3: 5.0.4 + p-timeout: 6.1.4 - '@vitest/snapshot@2.1.9': + p-timeout@6.1.4: {} + + package-manager-detector@1.6.0: {} + + parse-latin@7.0.0: dependencies: - '@vitest/pretty-format': 2.1.9 - magic-string: 0.30.21 - pathe: 1.1.2 + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 - '@vitest/spy@2.1.9': + pathe@1.1.2: {} + + pathval@2.0.1: {} + + piccolore@0.1.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + postcss@8.5.14: dependencies: - tinyspy: 3.0.2 + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 - '@vitest/utils@2.1.9': + prismjs@1.30.0: {} + + prompts@2.4.2: dependencies: - '@vitest/pretty-format': 2.1.9 - loupe: 3.2.1 - tinyrainbow: 1.2.0 + kleur: 3.0.3 + sisteransi: 1.0.5 - assertion-error@2.0.1: {} + property-information@7.1.0: {} - cac@6.7.14: {} + radix3@1.1.2: {} - chai@5.3.3: + readdirp@5.0.0: {} + + regex-recursion@6.0.2: dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + regex-utilities: 2.3.0 - check-error@2.1.3: {} + regex-utilities@2.3.0: {} - debug@4.4.3: + regex@6.1.0: dependencies: - ms: 2.1.3 - - deep-eql@5.0.2: {} + regex-utilities: 2.3.0 - es-module-lexer@1.7.0: {} + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 - esbuild@0.21.5: - 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 + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 - estree-walker@3.0.3: + rehype-stringify@10.0.1: dependencies: - '@types/estree': 1.0.9 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 - expect-type@1.3.0: {} + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 - fsevents@2.3.3: - optional: true + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - loupe@3.2.1: {} + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - magic-string@0.30.21: + remark-rehype@11.1.2: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 - ms@2.1.3: {} + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 - nanoid@3.3.12: {} + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 - pathe@1.1.2: {} + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 - pathval@2.0.1: {} + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 - picocolors@1.1.1: {} + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 - postcss@8.5.14: + retext@9.0.0: dependencies: - nanoid: 3.3.12 - picocolors: 1.1.1 - source-map-js: 1.2.1 + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 rollup@4.60.3: dependencies: @@ -909,28 +3725,228 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.60.3 fsevents: 2.3.3 + sax@1.6.0: {} + + semver@7.7.4: {} + + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + + shiki@3.23.0: + dependencies: + '@shikijs/core': 3.23.0 + '@shikijs/engine-javascript': 3.23.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + siginfo@2.0.0: {} + sisteransi@1.0.5: {} + + smol-toml@1.6.1: {} + source-map-js@1.2.1: {} + space-separated-tokens@2.0.2: {} + stackback@0.0.2: {} std-env@3.10.0: {} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + svgo@4.0.1: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.2.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 + + tiny-inflate@1.0.3: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} + tinyexec@1.1.2: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinypool@1.1.1: {} tinyrainbow@1.2.0: {} tinyspy@3.0.2: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + tslib@2.8.1: + optional: true + + type-fest@4.41.0: {} + typescript@5.9.3: {} + ufo@1.6.4: {} + + ultrahtml@1.6.0: {} + + uncrypto@0.1.3: {} + undici-types@6.21.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.7.4: + dependencies: + css-tree: 3.2.1 + ofetch: 1.5.1 + ohash: 2.0.11 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unstorage@1.17.5: + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.3.6 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + vite-node@2.1.9(@types/node@22.19.18): dependencies: cac: 6.7.14 @@ -958,6 +3974,23 @@ snapshots: '@types/node': 22.19.18 fsevents: 2.3.3 + vite@6.4.2(@types/node@22.19.18)(yaml@2.8.4): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.14 + rollup: 4.60.3 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 22.19.18 + fsevents: 2.3.3 + yaml: 2.8.4 + + vitefu@1.1.3(vite@6.4.2(@types/node@22.19.18)(yaml@2.8.4)): + optionalDependencies: + vite: 6.4.2(@types/node@22.19.18)(yaml@2.8.4) + vitest@2.1.9(@types/node@22.19.18): dependencies: '@vitest/expect': 2.1.9 @@ -993,11 +4026,48 @@ snapshots: - supports-color - terser + web-namespaces@2.0.1: {} + + which-pm-runs@1.1.0: {} + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + xxhash-wasm@1.1.0: {} + yaml@2.8.4: {} + yargs-parser@21.1.1: {} + + yocto-queue@1.2.2: {} + + yocto-spinner@0.2.3: + dependencies: + yoctocolors: 2.1.2 + + yoctocolors@2.1.2: {} + + zod-to-json-schema@3.25.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): + dependencies: + typescript: 5.9.3 + zod: 3.25.76 + zod@3.25.76: {} + + zwitch@2.0.4: {} diff --git a/rules/astro-site.rules.yml b/rules/astro-site.rules.yml new file mode 100644 index 0000000..be3b8e2 --- /dev/null +++ b/rules/astro-site.rules.yml @@ -0,0 +1,131 @@ +rules: + - rule_id: S-AGENT-ASTRO-NODE-001 + domain: astro-site + status: approved + owner: web-platform + severity: critical + scope: + modules: + - "src/pages/**" + - "src/components/**" + - "src/layouts/**" + - "apps/site/src/pages/**" + - "apps/site/src/components/**" + - "apps/site/src/layouts/**" + intent: "Astro presentation files must stay static and must not couple the site to server-only runtimes or S-Agent enforcement internals." + invariants: + - id: S-AGENT-ASTRO-NODE-001 + type: forbidden_import + description: "Astro pages, layouts and components must not import Node runtime modules or S-Agent analysis packages." + forbidden_imports: + - "fs" + - "child_process" + - "net" + - "http" + - "https" + - "node:fs" + - "node:child_process" + - "node:net" + - "node:http" + - "node:https" + - "@s-agent/analyzer" + - "@s-agent/parser" + - "@s-agent/verifier" + - "@s-agent/rules" + - "@s-agent/core" + enforcement: + mode: block + source: + file: "AGENTS.md" + section: "Self-Application Principle" + line: 45 + + - rule_id: S-AGENT-ASTRO-STATIC-SIDE-EFFECTS-001 + domain: astro-site + status: approved + owner: web-platform + severity: warning + scope: + modules: + - "src/pages/**" + - "src/components/**" + - "src/layouts/**" + - "src/content/**" + - "apps/site/src/pages/**" + - "apps/site/src/components/**" + - "apps/site/src/layouts/**" + - "apps/site/src/content/**" + intent: "Static Astro site source should render approved content and must not perform network, analytics, LLM or mutation side effects during page generation." + invariants: + - id: S-AGENT-ASTRO-STATIC-SIDE-EFFECTS-001 + type: forbidden_side_effect + description: "Astro static site source must not perform runtime side-effect calls." + readonly: true + forbidden_calls: + - fetch + - openai + - anthropic + - chatCompletion + - responses + - generateText + - track + - identify + - capture + - setItem + - emit + - publish + - dispatch + enforcement: + mode: review + source: + file: "AGENTS.md" + section: "Core Principle" + line: 19 + + - rule_id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001 + domain: astro-site + status: approved + owner: web-platform + severity: warning + scope: + modules: + - "src/content/**" + - "apps/site/src/content/**" + intent: "Astro content modules own approved marketing facts and must not depend on presentation pages, layouts or components." + invariants: + - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001A + type: layer_boundary + description: "Standalone Astro content modules must not import pages." + from: "src/content/**" + to: "src/pages/**" + - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001B + type: layer_boundary + description: "Standalone Astro content modules must not import components." + from: "src/content/**" + to: "src/components/**" + - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001C + type: layer_boundary + description: "Standalone Astro content modules must not import layouts." + from: "src/content/**" + to: "src/layouts/**" + - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001D + type: layer_boundary + description: "Monorepo Astro content modules must not import pages." + from: "apps/site/src/content/**" + to: "apps/site/src/pages/**" + - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001E + type: layer_boundary + description: "Monorepo Astro content modules must not import components." + from: "apps/site/src/content/**" + to: "apps/site/src/components/**" + - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001F + type: layer_boundary + description: "Monorepo Astro content modules must not import layouts." + from: "apps/site/src/content/**" + to: "apps/site/src/layouts/**" + enforcement: + mode: review + source: + file: "AGENTS.md" + section: "Self-Application Principle" + line: 45 diff --git a/rules/s-agent-architecture.rules.yml b/rules/s-agent-architecture.rules.yml index f6c886f..1f62227 100644 --- a/rules/s-agent-architecture.rules.yml +++ b/rules/s-agent-architecture.rules.yml @@ -96,6 +96,32 @@ rules: section: "S-Agent Internal Architecture Rules" line: 75 + - rule_id: S-AGENT-ARCH-SITE-001 + domain: architecture + status: approved + owner: core-team + severity: warning + scope: + modules: + - "apps/site/**" + intent: "The site app owns the public marketing landing page and must stay presentation-only." + invariants: + - id: S-AGENT-ARCH-SITE-001 + type: forbidden_import + description: "apps/site must not import core analysis packages or duplicate analyzer logic." + forbidden_imports: + - "@s-agent/analyzer" + - "@s-agent/parser" + - "@s-agent/verifier" + - "@s-agent/rules" + - "@s-agent/core" + enforcement: + mode: review + source: + file: "AGENTS.md" + section: "Self-Application Principle" + line: 45 + - rule_id: S-AGENT-RULE-LIFECYCLE-001 domain: rule-lifecycle status: approved diff --git a/tests/evaluation/fixtures/astro-site-clean/CLAUDE.md b/tests/evaluation/fixtures/astro-site-clean/CLAUDE.md new file mode 100644 index 0000000..a11ef49 --- /dev/null +++ b/tests/evaluation/fixtures/astro-site-clean/CLAUDE.md @@ -0,0 +1,3 @@ +# Clean Astro Site Fixture + +Astro pages render approved local content without runtime side effects. diff --git a/tests/evaluation/fixtures/astro-site-clean/src/components/RuleCard.astro b/tests/evaluation/fixtures/astro-site-clean/src/components/RuleCard.astro new file mode 100644 index 0000000..4085d44 --- /dev/null +++ b/tests/evaluation/fixtures/astro-site-clean/src/components/RuleCard.astro @@ -0,0 +1,9 @@ +--- +interface Props { + title: string; +} + +const { title } = Astro.props; +--- + +
{title}
diff --git a/tests/evaluation/fixtures/astro-site-clean/src/content/landing.ts b/tests/evaluation/fixtures/astro-site-clean/src/content/landing.ts new file mode 100644 index 0000000..13ba4a3 --- /dev/null +++ b/tests/evaluation/fixtures/astro-site-clean/src/content/landing.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; + +const brandSchema = z.object({ + headline: z.string() +}); + +export const brand = { + headline: "Protect business intent in every code change." +} as const; + +brandSchema.parse(brand); diff --git a/tests/evaluation/fixtures/astro-site-clean/src/pages/index.astro b/tests/evaluation/fixtures/astro-site-clean/src/pages/index.astro new file mode 100644 index 0000000..c2773e4 --- /dev/null +++ b/tests/evaluation/fixtures/astro-site-clean/src/pages/index.astro @@ -0,0 +1,9 @@ +--- +import RuleCard from "../components/RuleCard.astro"; +import { brand } from "../content/landing"; +--- + +
+

{brand.headline}

+ +
diff --git a/tests/evaluation/fixtures/astro-site-violation/CLAUDE.md b/tests/evaluation/fixtures/astro-site-violation/CLAUDE.md new file mode 100644 index 0000000..3e334fc --- /dev/null +++ b/tests/evaluation/fixtures/astro-site-violation/CLAUDE.md @@ -0,0 +1,3 @@ +# Astro Site Fixture + +Astro presentation files must stay static. Marketing content modules own approved facts and must not import pages, layouts or components. diff --git a/tests/evaluation/fixtures/astro-site-violation/src/components/UnsafeWidget.astro b/tests/evaluation/fixtures/astro-site-violation/src/components/UnsafeWidget.astro new file mode 100644 index 0000000..3acea42 --- /dev/null +++ b/tests/evaluation/fixtures/astro-site-violation/src/components/UnsafeWidget.astro @@ -0,0 +1,7 @@ +--- +import fs from "node:fs"; + +const localCopy = fs.readFileSync("landing.md", "utf8"); +--- + + diff --git a/tests/evaluation/fixtures/astro-site-violation/src/content/landing.ts b/tests/evaluation/fixtures/astro-site-violation/src/content/landing.ts new file mode 100644 index 0000000..ae5b864 --- /dev/null +++ b/tests/evaluation/fixtures/astro-site-violation/src/content/landing.ts @@ -0,0 +1,3 @@ +import Page from "../pages/index.astro"; + +export const landingReference = Page; diff --git a/tests/evaluation/fixtures/astro-site-violation/src/pages/index.astro b/tests/evaluation/fixtures/astro-site-violation/src/pages/index.astro new file mode 100644 index 0000000..4d3e970 --- /dev/null +++ b/tests/evaluation/fixtures/astro-site-violation/src/pages/index.astro @@ -0,0 +1,10 @@ +--- +import UnsafeWidget from "../components/UnsafeWidget.astro"; + +const remoteCopy = await fetch("https://example.com/landing-copy.json"); +--- + +
+ +

{remoteCopy.status}

+
diff --git a/tests/integration/analyze-astro-site.test.ts b/tests/integration/analyze-astro-site.test.ts new file mode 100644 index 0000000..bdbf970 --- /dev/null +++ b/tests/integration/analyze-astro-site.test.ts @@ -0,0 +1,46 @@ +import path from "node:path"; +import { describe, expect, it } from "vitest"; +import { runSAgentAnalysis } from "@s-agent/core"; + +const repoRoot = path.resolve(__dirname, "../.."); +const rulesDirectory = path.join(repoRoot, "rules"); +const fixturesRoot = path.resolve(__dirname, "../evaluation/fixtures"); + +describe("integration: Astro site rules", () => { + it("detects Astro presentation, side-effect, and content-boundary violations", async () => { + const result = await runSAgentAnalysis({ + projectRoot: path.join(fixturesRoot, "astro-site-violation"), + rulesDirectory + }); + + expect(result.findings).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + rule_id: "S-AGENT-ASTRO-NODE-001", + status: "PROVEN", + blocking: true + }), + expect.objectContaining({ + rule_id: "S-AGENT-ASTRO-STATIC-SIDE-EFFECTS-001", + status: "PROBABLE", + blocking: false + }), + expect.objectContaining({ + rule_id: "S-AGENT-ASTRO-CONTENT-BOUNDARY-001", + status: "PROVEN", + blocking: false + }) + ]) + ); + }); + + it("keeps a clean Astro landing free of Astro rule findings", async () => { + const result = await runSAgentAnalysis({ + projectRoot: path.join(fixturesRoot, "astro-site-clean"), + rulesDirectory + }); + + expect(result.findings).toEqual([]); + expect(result.blocking).toBe(false); + }); +}); diff --git a/tests/unit/astro-file-index.test.ts b/tests/unit/astro-file-index.test.ts new file mode 100644 index 0000000..6281f6c --- /dev/null +++ b/tests/unit/astro-file-index.test.ts @@ -0,0 +1,42 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { describe, expect, it } from "vitest"; +import { indexProject } from "@s-agent/parser"; + +describe("unit: Astro file indexing", () => { + it("indexes Astro frontmatter imports with original line numbers", async () => { + const projectRoot = await fs.mkdtemp(path.join(os.tmpdir(), "s-agent-astro-index-")); + await fs.mkdir(path.join(projectRoot, "src/pages"), { recursive: true }); + await fs.mkdir(path.join(projectRoot, "src/content"), { recursive: true }); + await fs.writeFile( + path.join(projectRoot, "src/pages/index.astro"), + [ + "---", + "import { brand } from \"../content/landing\";", + "const title = brand.product;", + "---", + "

{title}

", + "" + ].join("\n"), + "utf8" + ); + await fs.writeFile( + path.join(projectRoot, "src/content/landing.ts"), + "export const brand = { product: \"IntentGuard\" } as const;\n", + "utf8" + ); + + const index = await indexProject(projectRoot); + const page = index.files.find((file) => file.relativePath === "src/pages/index.astro"); + + expect(page).toBeDefined(); + expect(page?.imports).toEqual([ + expect.objectContaining({ + source: "../content/landing", + importedPath: "src/content/landing.ts", + line: 2 + }) + ]); + }); +}); From edaa96cf385dcc832d6ccfd5efe7978781db2e0b Mon Sep 17 00:00:00 2001 From: hemp-dev Date: Sat, 9 May 2026 14:47:46 +0300 Subject: [PATCH 2/3] Add SEO landing pages and metadata --- apps/site/astro.config.mjs | 5 +- apps/site/package.json | 2 +- apps/site/public/llms.txt | 27 ++ apps/site/public/og/intentguard-og.png | Bin 0 -> 118450 bytes apps/site/public/og/intentguard-og.svg | 38 +++ apps/site/public/robots.txt | 27 ++ apps/site/src/content/landing.test.ts | 49 ++- apps/site/src/content/landing.ts | 108 +++++++ apps/site/src/content/seo-pages.ts | 185 ++++++++++++ apps/site/src/pages/[slug].astro | 171 +++++++++++ apps/site/src/pages/index.astro | 180 ++++++++++- apps/site/src/pages/sitemap.xml.ts | 36 +++ apps/site/src/styles/landing.css | 394 ++++++++++++++++++++++++- rules/astro-site.rules.yml | 36 +++ 14 files changed, 1247 insertions(+), 11 deletions(-) create mode 100644 apps/site/public/llms.txt create mode 100644 apps/site/public/og/intentguard-og.png create mode 100644 apps/site/public/og/intentguard-og.svg create mode 100644 apps/site/public/robots.txt create mode 100644 apps/site/src/content/seo-pages.ts create mode 100644 apps/site/src/pages/[slug].astro create mode 100644 apps/site/src/pages/sitemap.xml.ts diff --git a/apps/site/astro.config.mjs b/apps/site/astro.config.mjs index 250e741..1d56794 100644 --- a/apps/site/astro.config.mjs +++ b/apps/site/astro.config.mjs @@ -1,5 +1,8 @@ import { defineConfig } from "astro/config"; +const site = process.env.SITE_URL ?? "https://intentguard.dev"; + export default defineConfig({ - output: "static" + output: "static", + site }); diff --git a/apps/site/package.json b/apps/site/package.json index 0508497..1f99029 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -8,7 +8,7 @@ "dev": "astro dev --host 127.0.0.1", "build": "astro build", "preview": "astro preview --host 127.0.0.1", - "test": "vitest run src" + "test": "vitest run --root ../.. apps/site/src" }, "devDependencies": { "astro": "^5.13.0" diff --git a/apps/site/public/llms.txt b/apps/site/public/llms.txt new file mode 100644 index 0000000..9caa398 --- /dev/null +++ b/apps/site/public/llms.txt @@ -0,0 +1,27 @@ +# IntentGuard + +> IntentGuard is an intent-aware code review tool that turns approved engineering docs, ADRs, and project rules into deterministic pull request checks for TypeScript teams. + +IntentGuard is powered by S-Agent Core, an open-source semantic analysis engine. Blocking findings require approved SemanticRules, deterministic symbolic evidence, and PROVEN status. + +Source repository: https://github.com/muthukumar-js-dev/intent-guard + +## Useful answers + +- IntentGuard checks whether pull requests preserve documented business and architecture intent. +- Intent-aware code review catches changes that compile and pass tests but violate approved rules. +- The MVP is TypeScript-first and focuses on layer boundaries, forbidden side effects, and value invariants. +- LLMs may suggest candidate rules or explanations later, but they are not the source of truth for blocking. +- Only PROVEN findings from approved critical rules in block mode can stop a merge. + +## Public paths + +- [Landing page](/) +- [Semantic code review](/semantic-code-review) +- [Intent-aware code review](/intent-aware-code-review) +- [AI code review guardrails](/ai-code-review-guardrails) +- [Architecture drift prevention](/architecture-drift-prevention) +- [Business logic regression prevention](/business-logic-regression-prevention) +- [Source repository](https://github.com/muthukumar-js-dev/intent-guard) +- [Sitemap](/sitemap.xml) +- [Robots policy](/robots.txt) diff --git a/apps/site/public/og/intentguard-og.png b/apps/site/public/og/intentguard-og.png new file mode 100644 index 0000000000000000000000000000000000000000..4cbc024e1c96c839b354ddaedb7e852572780f13 GIT binary patch literal 118450 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 z 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 literal 0 HcmV?d00001 diff --git a/apps/site/public/og/intentguard-og.svg b/apps/site/public/og/intentguard-og.svg new file mode 100644 index 0000000..9124aef --- /dev/null +++ b/apps/site/public/og/intentguard-og.svg @@ -0,0 +1,38 @@ + + IntentGuard intent-aware code review + Open graph image for IntentGuard, a deterministic code review guard for TypeScript pull requests. + + + + + + + + + + + + + IG + IntentGuard + powered by S-Agent + + Intent-Aware Code Review + Protect business + intent in every + code change. + Approved rules. Symbolic evidence. Proof. + + + + SemanticRule + status: approved + evidence: PROVEN + action: block + + + + TypeScript PR guardrails + for architecture and business rules + + diff --git a/apps/site/public/robots.txt b/apps/site/public/robots.txt new file mode 100644 index 0000000..b445674 --- /dev/null +++ b/apps/site/public/robots.txt @@ -0,0 +1,27 @@ +# Public landing page crawl policy. + +User-agent: * +Allow: / + +User-agent: GPTBot +Allow: / + +User-agent: ChatGPT-User +Allow: / + +User-agent: PerplexityBot +Allow: / + +User-agent: ClaudeBot +Allow: / + +User-agent: anthropic-ai +Allow: / + +User-agent: Google-Extended +Allow: / + +User-agent: Bingbot +Allow: / + +Sitemap: https://intentguard.dev/sitemap.xml diff --git a/apps/site/src/content/landing.test.ts b/apps/site/src/content/landing.test.ts index c29877a..5c86361 100644 --- a/apps/site/src/content/landing.test.ts +++ b/apps/site/src/content/landing.test.ts @@ -1,5 +1,17 @@ import { describe, expect, it } from "vitest"; -import { findingStatuses, proofChain, violationTypes } from "./landing"; +import { + answerBlocks, + comparisonRows, + faqItems, + findingStatuses, + heroDefinition, + pageMetadata, + proofChain, + siteMetadata, + violationTypes, + workflowSteps +} from "./landing"; +import { seoClusterPages, seoClusterSlugs } from "./seo-pages"; describe("landing content", () => { it("keeps the documented finding statuses visible on the landing page", () => { @@ -27,4 +39,39 @@ describe("landing content", () => { ]); expect(proofChain).toContain("SemanticRule YAML"); }); + + it("keeps extractable answer content for AEO surfaces", () => { + expect(pageMetadata.description).toContain("intent-aware code review tool"); + expect(pageMetadata.lastUpdated).toMatch(/^\d{4}-\d{2}-\d{2}$/); + expect(siteMetadata.productionUrl).toBe("https://intentguard.dev"); + expect(siteMetadata.githubUrl).toBe("https://github.com/muthukumar-js-dev/intent-guard"); + expect(siteMetadata.ogImagePath).toBe("/og/intentguard-og.png"); + expect(heroDefinition).toContain("TypeScript PRs"); + expect(answerBlocks).toHaveLength(3); + expect(answerBlocks[0]?.title).toBe("What is IntentGuard?"); + expect(answerBlocks[0]?.body).toContain("proof-carrying findings"); + }); + + it("keeps FAQ and comparison content visible for search snippets", () => { + expect(faqItems.map((item) => item.question)).toContain("What can block a pull request?"); + expect(comparisonRows.map((item) => item.alternative)).toEqual([ + "SAST", + "Linters", + "AI reviewers", + "Architecture tools" + ]); + expect(workflowSteps).toHaveLength(4); + }); + + it("defines the SEO cluster pages requested for forced promotion", () => { + expect(seoClusterSlugs).toEqual([ + "semantic-code-review", + "intent-aware-code-review", + "ai-code-review-guardrails", + "architecture-drift-prevention", + "business-logic-regression-prevention" + ]); + expect(seoClusterPages.every((page) => page.faq.length >= 2)).toBe(true); + expect(seoClusterPages.every((page) => page.definition.includes("IntentGuard"))).toBe(true); + }); }); diff --git a/apps/site/src/content/landing.ts b/apps/site/src/content/landing.ts index 3dd1c65..fdb56d2 100644 --- a/apps/site/src/content/landing.ts +++ b/apps/site/src/content/landing.ts @@ -7,6 +7,40 @@ export const brand = { "Turn approved engineering docs, ADRs, and project rules into deterministic pull request checks before intent drift reaches main." } as const; +export const pageMetadata = { + title: "IntentGuard - Intent-Aware Code Review for TypeScript PRs", + description: + "IntentGuard is an intent-aware code review tool that turns approved engineering docs into deterministic TypeScript pull request checks with proof-carrying findings.", + lastUpdated: "2026-05-08" +} as const; + +export const siteMetadata = { + productionUrl: "https://intentguard.dev", + githubUrl: "https://github.com/muthukumar-js-dev/intent-guard", + ogImagePath: "/og/intentguard-og.png" +} as const; + +export const heroDefinition = + "IntentGuard is an intent-aware code review guard for TypeScript PRs that turns approved rules into proof-carrying checks." as const; + +export const answerBlocks = [ + { + title: "What is IntentGuard?", + body: + "IntentGuard is an intent-aware code review tool for engineering teams that need pull requests to preserve approved business and architecture rules. It turns SemanticRule YAML into deterministic TypeScript checks and reports proof-carrying findings reviewers can audit." + }, + { + title: "What is intent-aware code review?", + body: + "Intent-aware code review verifies whether a code change preserves documented business, product, and architecture intent. It catches changes that compile and pass tests but still violate approved rules such as module boundaries, side-effect limits, or value thresholds." + }, + { + title: "Who is it for?", + body: + "IntentGuard is built for TypeScript-heavy teams using AI coding tools, large refactors, or fast-moving product engineering workflows. It is most useful when important rules live in ADRs, READMEs, CLAUDE.md, or senior engineers' repeated review comments." + } +] as const; + export const proofChain = [ "CLAUDE.md", "SemanticRule YAML", @@ -15,6 +49,29 @@ export const proofChain = [ "CLI / PR gate" ] as const; +export const workflowSteps = [ + { + title: "Start with docs", + body: + "Use CLAUDE.md, READMEs, ADRs, and architecture notes as source material for candidate rules." + }, + { + title: "Approve SemanticRules", + body: + "A human approves explicit YAML rules. The approved SemanticRule file becomes the source of truth." + }, + { + title: "Check every PR", + body: + "IntentGuard indexes TypeScript code, analyzes imports and functions, verifies findings, and prints a proof-carrying report." + }, + { + title: "Block only proof", + body: + "Only PROVEN findings from approved critical rules in block mode can stop a merge." + } +] as const; + export const violationTypes = [ { title: "Layer Boundary", @@ -36,6 +93,29 @@ export const violationTypes = [ } ] as const; +export const comparisonRows = [ + { + alternative: "SAST", + checks: "Security vulnerability patterns", + adds: "Product and architecture intent, such as billing boundaries and domain invariants" + }, + { + alternative: "Linters", + checks: "Style, syntax, and generic code-quality rules", + adds: "Team-specific business rules backed by approved documentation" + }, + { + alternative: "AI reviewers", + checks: "Broad contextual suggestions and plausible concerns", + adds: "Deterministic blocking only when approved rules produce symbolic evidence" + }, + { + alternative: "Architecture tools", + checks: "Dependencies, packages, and structural drift", + adds: "PR-level reports tied to documented business and architecture intent" + } +] as const; + export const findingStatuses = [ { status: "PROVEN", @@ -64,6 +144,34 @@ export const findingStatuses = [ } ] as const; +export const faqItems = [ + { + question: "Is IntentGuard a replacement for SAST?", + answer: + "No. IntentGuard complements SAST by checking business and architecture intent rather than security vulnerability classes." + }, + { + question: "Does IntentGuard use an LLM?", + answer: + "The MVP does not use an LLM for enforcement. Future LLM features may suggest candidate rules or explanations, but approved SemanticRules remain the source of truth." + }, + { + question: "What can block a pull request?", + answer: + "Only a PROVEN finding from an approved critical rule in block mode can block a pull request." + }, + { + question: "What languages are supported?", + answer: + "The MVP is TypeScript-first and focuses on deterministic symbolic checks for TypeScript diffs." + }, + { + question: "Do teams need perfect documentation to start?", + answer: + "No. Teams can start with one important rule reviewers already enforce manually, then expand the SemanticRule set over time." + } +] as const; + export const semanticRuleSnippet = [ "rule_id: AUTH-BOUNDARY-001", "status: approved", diff --git a/apps/site/src/content/seo-pages.ts b/apps/site/src/content/seo-pages.ts new file mode 100644 index 0000000..29ff5d0 --- /dev/null +++ b/apps/site/src/content/seo-pages.ts @@ -0,0 +1,185 @@ +import { pageMetadata } from "./landing"; + +export interface SeoFaq { + question: string; + answer: string; +} + +export interface SeoClusterPage { + slug: string; + keyword: string; + title: string; + description: string; + hero: string; + definition: string; + proofPoints: string[]; + useCases: string[]; + faq: SeoFaq[]; +} + +export const seoClusterPages: SeoClusterPage[] = [ + { + slug: "semantic-code-review", + keyword: "semantic code review", + title: "Semantic Code Review for TypeScript PRs", + description: + "Semantic code review checks whether a TypeScript pull request preserves approved business and architecture intent, not only syntax, style, or security patterns.", + hero: "Semantic code review catches code changes that are technically valid but semantically wrong for the system.", + definition: + "Semantic code review evaluates whether code preserves the meaning a team already approved in documentation, architecture decisions, and product rules. IntentGuard implements this with approved SemanticRule YAML, deterministic TypeScript analysis, and proof-carrying findings.", + proofPoints: [ + "Approved SemanticRules are the source of truth.", + "Deterministic symbolic evidence creates PROVEN findings.", + "Only approved critical rules in block mode can stop a merge." + ], + useCases: [ + "Prevent auth code from importing billing code.", + "Catch read-only flows that write to a database or emit events.", + "Flag value literals that exceed an approved product threshold." + ], + faq: [ + { + question: "How is semantic code review different from linting?", + answer: + "Linting checks generic style and syntax rules. Semantic code review checks project-specific intent, such as domain boundaries, side-effect rules, and business invariants." + }, + { + question: "Can semantic code review block a pull request?", + answer: + "IntentGuard can block only when an approved critical SemanticRule produces a PROVEN deterministic finding in block mode." + } + ] + }, + { + slug: "intent-aware-code-review", + keyword: "intent-aware code review", + title: "Intent-Aware Code Review Guardrails", + description: + "Intent-aware code review verifies that every pull request preserves documented business, product, and architecture rules.", + hero: "Intent-aware code review gives every pull request a memory of the rules your team already agreed to follow.", + definition: + "Intent-aware code review checks code changes against approved intent from CLAUDE.md, READMEs, ADRs, and architecture notes. IntentGuard turns those approved rules into deterministic TypeScript checks with evidence a reviewer can audit.", + proofPoints: [ + "Candidate rules can come from documentation, but a human approves enforcement.", + "The YAML rule file remains the enforceable source of truth.", + "Findings include the violated invariant, changed file, evidence, status, and severity." + ], + useCases: [ + "Turn repeated staff-engineer review comments into executable rules.", + "Keep product invariants visible during refactors.", + "Make architecture decisions enforceable in CI." + ], + faq: [ + { + question: "What does intent-aware code review check?", + answer: + "It checks whether a change violates approved intent, including layer boundaries, forbidden side effects, and value invariants." + }, + { + question: "Does intent-aware code review rely on an LLM?", + answer: + "IntentGuard does not use an LLM as the source of truth for blocking. LLMs may suggest candidate rules or explanations, but approved SemanticRules decide enforcement." + } + ] + }, + { + slug: "ai-code-review-guardrails", + keyword: "AI code review guardrails", + title: "AI Code Review Guardrails for Generated Code", + description: + "AI code review guardrails help teams keep AI-generated and refactored code aligned with approved business and architecture rules.", + hero: "AI-generated code can pass tests and still violate business intent. Guardrails make those rules explicit before merge.", + definition: + "AI code review guardrails are deterministic checks that constrain AI-assisted changes with approved project rules. IntentGuard verifies TypeScript pull requests against SemanticRules so AI-written code must respect the same intent as human-written code.", + proofPoints: [ + "Prompts and repository context are helpful, but they are not enforceable policy.", + "Approved rules create auditable findings with deterministic evidence.", + "Heuristic suspicions can inform review, but only proof can block." + ], + useCases: [ + "Review AI-generated PRs for domain boundary drift.", + "Protect billing, auth, entitlement, and pricing flows from plausible but wrong edits.", + "Give platform teams a deterministic layer beside AI reviewers." + ], + faq: [ + { + question: "Why do AI-generated pull requests need guardrails?", + answer: + "AI-generated code can be syntactically correct while missing business context. Guardrails check approved rules that prompts and tests may not enforce." + }, + { + question: "Is IntentGuard an AI reviewer?", + answer: + "No. IntentGuard is deterministic-first. It can complement AI reviewers, but blocking findings come from approved SemanticRules and symbolic evidence." + } + ] + }, + { + slug: "architecture-drift-prevention", + keyword: "architecture drift prevention", + title: "Architecture Drift Prevention for Pull Requests", + description: + "Architecture drift prevention catches pull requests that violate documented module boundaries and approved architecture decisions.", + hero: "Architecture drift starts with one reasonable import. IntentGuard catches boundary violations before they become the new normal.", + definition: + "Architecture drift prevention keeps code changes aligned with approved architecture decisions. IntentGuard checks TypeScript imports and scoped rules so teams can stop layer boundary violations before they merge.", + proofPoints: [ + "Rules can encode boundaries such as auth must not import billing.", + "Findings show the importing file, resolved edge, violated invariant, and status.", + "The CLI can fail only on approved critical rules with PROVEN evidence." + ], + useCases: [ + "Protect package direction in a TypeScript monorepo.", + "Keep UI code from reaching into persistence layers.", + "Preserve architecture decisions during modernization projects." + ], + faq: [ + { + question: "What is architecture drift?", + answer: + "Architecture drift happens when code gradually diverges from approved design decisions, often through small dependencies, shortcuts, or refactors that look harmless in isolation." + }, + { + question: "How does IntentGuard prevent architecture drift?", + answer: + "IntentGuard encodes approved boundaries as SemanticRules, analyzes TypeScript changes, and reports proof-carrying findings when a pull request violates those boundaries." + } + ] + }, + { + slug: "business-logic-regression-prevention", + keyword: "business logic regression prevention", + title: "Business Logic Regression Prevention in Code Review", + description: + "Business logic regression prevention checks pull requests for rule violations such as unsafe side effects, broken product invariants, and invalid thresholds.", + hero: "Business logic regressions are often valid code with the wrong meaning. IntentGuard checks the rules tests and linters miss.", + definition: + "Business logic regression prevention protects product rules such as pricing limits, entitlement assumptions, approval flows, and read-only behavior. IntentGuard turns those rules into deterministic checks over TypeScript changes.", + proofPoints: [ + "Value invariants can flag obvious numeric thresholds that exceed approved limits.", + "Forbidden side-effect rules can identify writes or emitted events in read-only flows.", + "Every finding carries business and technical explanations." + ], + useCases: [ + "Prevent discounts from exceeding approved thresholds.", + "Keep reporting and read-model functions from writing to persistence.", + "Protect billing, entitlement, and compliance-sensitive modules during refactors." + ], + faq: [ + { + question: "Why do business logic regressions escape normal tests?", + answer: + "Tests usually cover known examples. Business logic regressions can appear when a change is type-correct but violates an assumption documented outside the code path being tested." + }, + { + question: "What business rules can IntentGuard check today?", + answer: + "The MVP focuses on layer boundary violations, forbidden side effects, forbidden imports, and obvious value invariant violations in TypeScript projects." + } + ] + } +] as const; + +export const seoClusterSlugs = seoClusterPages.map((page) => page.slug); + +export const seoLastUpdated = pageMetadata.lastUpdated; diff --git a/apps/site/src/pages/[slug].astro b/apps/site/src/pages/[slug].astro new file mode 100644 index 0000000..73a3c1f --- /dev/null +++ b/apps/site/src/pages/[slug].astro @@ -0,0 +1,171 @@ +--- +import { brand, pageMetadata, siteMetadata } from "../content/landing"; +import { seoClusterPages, type SeoClusterPage } from "../content/seo-pages"; +import "../styles/landing.css"; + +export function getStaticPaths() { + return seoClusterPages.map((page) => ({ + params: { slug: page.slug }, + props: { page } + })); +} + +interface Props { + page: SeoClusterPage; +} + +const { page } = Astro.props; +const siteBase = Astro.site ?? new URL(siteMetadata.productionUrl); +const canonicalUrl = new URL(`/${page.slug}`, siteBase).toString(); +const ogImageUrl = new URL(siteMetadata.ogImagePath, siteBase).toString(); +const pageTitle = `${page.title} | ${brand.product}`; +const relatedPages = seoClusterPages.filter((item) => item.slug !== page.slug); +const articleSchema = { + "@context": "https://schema.org", + "@type": "Article", + headline: page.title, + description: page.description, + dateModified: pageMetadata.lastUpdated, + mainEntityOfPage: canonicalUrl, + publisher: { + "@type": "Organization", + name: brand.product, + sameAs: siteMetadata.githubUrl + }, + sameAs: siteMetadata.githubUrl +}; +const faqSchema = { + "@context": "https://schema.org", + "@type": "FAQPage", + mainEntity: page.faq.map((item) => ({ + "@type": "Question", + name: item.question, + acceptedAnswer: { + "@type": "Answer", + text: item.answer + } + })) +}; +--- + + + + + + + + + + + + + + + + + + + + +