diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5de7030..2954522 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,12 +42,18 @@ jobs: - name: Type check run: pnpm typecheck + - name: API docs coverage (TSDoc) + run: pnpm docs:api:check + - name: Test (Vitest) run: pnpm test - name: Build run: pnpm build + - name: Validate package exports (attw + publint) + run: pnpm check:exports + worker: name: Validate Worker runs-on: ubuntu-latest diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 25a64c9..785a4a1 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -5,11 +5,13 @@ on: branches: [main] paths: - "docs/**" + - "widget/**" - ".github/workflows/docs.yml" pull_request: branches: [main] paths: - "docs/**" + - "widget/**" - ".github/workflows/docs.yml" workflow_dispatch: @@ -40,6 +42,17 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + # The hosted API reference is generated from the widget's TSDoc and copied + # into docs/public/api by the docs build (scripts/copy-api.mjs). Generate + # it here first so it ships with this deploy. + - name: Install widget dependencies + working-directory: widget + run: pnpm install --frozen-lockfile + + - name: Generate API reference (TypeDoc) + working-directory: widget + run: pnpm docs:api + - name: Build (includes Pagefind index) run: pnpm build diff --git a/docs/.gitignore b/docs/.gitignore index 6240da8..9decad7 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -2,6 +2,8 @@ dist/ # generated types .astro/ +# generated TypeDoc API reference (copied from ../widget/dist/api by scripts/copy-api.mjs) +public/api/ # dependencies node_modules/ diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index c6d72f8..dbf737e 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -69,7 +69,15 @@ export default defineConfig({ }, { label: "API Reference", - items: [{ autogenerate: { directory: "api" } }], + items: [ + { autogenerate: { directory: "api" } }, + { + label: "Generated Reference (TypeDoc)", + link: "/api/", + attrs: { target: "_blank", rel: "noopener noreferrer" }, + badge: { text: "typedoc", variant: "tip" }, + }, + ], }, { label: "Migration Guides", diff --git a/docs/package.json b/docs/package.json index b80cd0c..645a9c7 100644 --- a/docs/package.json +++ b/docs/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "astro dev", "start": "astro dev", - "build": "astro build", + "build": "node scripts/copy-api.mjs && astro build", "preview": "astro preview", "astro": "astro" }, diff --git a/docs/plans/2026-06-16-typescript-types-api-reference-design.md b/docs/plans/2026-06-16-typescript-types-api-reference-design.md new file mode 100644 index 0000000..dde4700 --- /dev/null +++ b/docs/plans/2026-06-16-typescript-types-api-reference-design.md @@ -0,0 +1,122 @@ +# Design: TypeScript Types + Hosted API Reference + +Date: 2026-06-16 +Issue: #44 — ship `.d.ts` types and generate an API reference with TypeDoc +Branch: `44-ship-dts-types-and-generate-an-api-reference-with-typedoc` + +## Goal + +Guarantee that consumers of the `claudius-chat-widget` npm package get full +TypeScript IntelliSense, and auto-generate a hosted API reference from +TSDoc comments that is published under the existing docs domain. + +## Background (current state) + +- `widget` publishes as `claudius-chat-widget`. It already declares + `types: "./dist/index.d.ts"` and ships declarations, but the build runs + `tsc --emitDeclarationOnly`, which emits a **37-file tree** (including + dev-only `main.d.ts`, `embed.d.ts`, and `test-utils/`) rather than one + bundled entry. +- The public surface is the barrel `widget/src/index.ts`: `ChatWidget` + + `ChatWidgetProps`, `WidgetPosition`, translations API, locales API, + `Trigger`/`TriggerAction`/`UrlPattern`, themes + theme token types, + `ChatApiClient` + options, error classes, and the `Source`/`ChatMessage`/ + `Chat*` request/response types. Only the `theme` prop currently has a + TSDoc comment. +- Docs are an Astro + Starlight site in `docs/`, deployed to the + `claudius-docs` Cloudflare Pages project by `.github/workflows/docs.yml`. + The sidebar already has an **API Reference** group, and there is an + existing precedent for linking a sibling Pages site (Storybook, with + `target: _blank` and a badge). +- `ci.yml` runs the widget job: lint, format:check, typecheck, test, build. + There is no TypeDoc and no doc-coverage gate yet. + +## Decisions (validated with user) + +1. **Type bundling:** single rolled-up `dist/index.d.ts` via + `vite-plugin-dts` (`rollupTypes: true`), replacing `tsc --emitDeclarationOnly`. +2. **API-reference hosting:** TypeDoc emits **HTML** to `widget/dist/api`; + that HTML is copied into the Astro site and deployed with the existing + `claudius-docs` Pages project at **`/api/`**. One domain, one deploy, + one nav link, no new Pages project or secrets. +3. **Export-correctness guarantee (beyond AC):** add `@arethetypeswrong/cli` + + `publint` to prove ESM/CJS consumers resolve types correctly. +4. **Visual verification (beyond AC):** screenshot the rendered `/api/` + reference and the docs sidebar link as part of verification. + +## Components + +### 1. Single bundled `index.d.ts` +- Add `vite-plugin-dts` to `widget`; configure in `vite.config.ts` (lib build + only) with `rollupTypes: true`, `tsconfigPath: './tsconfig.json'`, + `include: ['src']`, excluding tests and stories. +- Remove `tsc --emitDeclarationOnly` from `build` / `build:lib`. Keep + `typecheck: tsc --noEmit`. Simplify `tsconfig.json` emit options that the + plugin now owns. +- Outcome: one `dist/index.d.ts` containing only the public surface. + +### 2. TSDoc on every public export +- Document each symbol reachable from `src/index.ts`, and each member of + exported interfaces (props, theme inputs, client options, message/source + types). Use `@param`, `@returns`, `@defaultValue`, `@example`, `@see`. +- Mark genuinely-internal helpers `@internal` so they are excluded from both + the generated docs and the coverage gate. + +### 3. TypeDoc generation — `pnpm docs:api` +- Add `typedoc` to `widget`; `typedoc.json` with `entryPoints: ["src/index.ts"]`, + `out: "dist/api"` (HTML), `excludeInternal/Private/Externals: true`, exclude + tests/stories, `validation.notDocumented: true`, `treatWarningsAsErrors: true`. +- Scripts: `docs:api` (full HTML) and `docs:api:check` (`typedoc --emit none`, + fast validation-only). + +### 4. Host under the docs domain at `/api/` +- `docs/scripts/copy-api.mjs` (run as docs `prebuild`): copy `../widget/dist/api` + into `docs/public/api/` when present; warn and skip when absent so docs-only + local builds still succeed. +- `docs.yml`: add steps to install the widget and run `pnpm docs:api` before the + docs build; add `widget/**` to the path triggers so the reference rebuilds + when the public API changes. +- Add a sidebar item to the existing **API Reference** group: + `{ label: "Generated Reference (TypeDoc)", link: "/api/", attrs: { target: "_blank", rel: "noopener noreferrer" }, badge: { text: "typedoc" } }`. +- `.gitignore`: add `docs/public/api/` (generated, not committed). + +### 5. CI doc-coverage gate +- `treatWarningsAsErrors` + `validation.notDocumented` make `docs:api:check` + exit non-zero on any undocumented public symbol or broken `@link`. +- `ci.yml` widget job gains a **TSDoc coverage** step (`pnpm docs:api:check`) + and an export-correctness step (`attw` + `publint`). The existing Build step + now also exercises `vite-plugin-dts`. + +### 6. Verification (including visual) +- After `pnpm build`: assert a single `dist/index.d.ts` with no leftover + `dist/components/*.d.ts`; run `attw` + `publint` on the packed tarball. +- Build docs, then screenshot the rendered `/api/` reference and the docs + sidebar link to confirm rendering and wiring. + +## Acceptance-criteria mapping + +| Acceptance criterion | Component | +|---|---| +| Vite build emits a single `index.d.ts` bundle | 1 | +| All public exports have TSDoc comments | 2, 5 (enforced) | +| `pnpm docs:api` runs TypeDoc -> HTML in `dist/api` | 3 | +| Generated reference published to Cloudflare Pages + linked from docs | 4 | +| CI fails if any public export lacks a TSDoc summary | 5 | + +## Risks / notes + +- `rollupTypes` uses `@microsoft/api-extractor` under the hood; complex type + constructs can produce warnings. The public types here are simple (string + unions + interfaces), so risk is low. Verify the single-file output and + consumer resolution with `attw`. +- Hosting at bare `/api/` is collision-free with the existing `/api/rest` and + `/api/widget` content routes (no shared file/route names). Confirmed. +- Local docs `dev`/`build` without first generating the widget API will show + no `/api/`; the tolerant copy script makes this a warning, not a failure. + +## Out of scope + +- Auto-generating Markdown prop tables into the hand-written docs (that was the + "Markdown in Starlight" option, not chosen). The generated reference is the + canonical source; hand-written pages may link to it. +- Worker package API docs (the npm consumer surface is the widget). diff --git a/docs/plans/2026-06-16-typescript-types-api-reference.md b/docs/plans/2026-06-16-typescript-types-api-reference.md new file mode 100644 index 0000000..65482de --- /dev/null +++ b/docs/plans/2026-06-16-typescript-types-api-reference.md @@ -0,0 +1,421 @@ +# TypeScript Types + Hosted API Reference Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Ship a single bundled `dist/index.d.ts` for full consumer IntelliSense and auto-generate a TypeDoc HTML API reference hosted at `claudius-docs.pages.dev/api/`, with CI gating undocumented public exports. + +**Architecture:** Replace `tsc --emitDeclarationOnly` with `vite-plugin-dts` (`rollupTypes`) so the Vite lib build emits one `index.d.ts` (+ a `.d.cts` twin for correct CJS type resolution). TSDoc every public export reachable from `src/index.ts`. TypeDoc reads that barrel, emits HTML to `widget/dist/api`, validates documentation coverage, and the Astro docs build copies the HTML into `public/api/` so it ships with the existing Pages project. CI runs the coverage gate + `attw`/`publint` export check. + +**Tech Stack:** Vite 6, vite-plugin-dts, TypeDoc, @arethetypeswrong/cli, publint, Astro + Starlight, GitHub Actions, Cloudflare Pages, pnpm. + +**Design doc:** `docs/plans/2026-06-16-typescript-types-api-reference-design.md` + +--- + +## Phase 1: Single bundled `index.d.ts` via vite-plugin-dts + +### Task 1.1: Add vite-plugin-dts and configure the lib build + +**Files:** +- Modify: `widget/package.json` (devDeps + scripts) +- Modify: `widget/vite.config.ts` +- Create: `widget/scripts/emit-dts-cts.mjs` + +**Step 1:** Install deps. +```bash +cd widget && pnpm add -D vite-plugin-dts @arethetypeswrong/cli publint +``` + +**Step 2:** Edit `widget/vite.config.ts` — import and register the plugin (lib build only): +```ts +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import dts from "vite-plugin-dts"; +import { resolve } from "path"; + +export default defineConfig({ + plugins: [ + react(), + dts({ + rollupTypes: true, + tsconfigPath: "./tsconfig.json", + include: ["src"], + exclude: [ + "src/**/*.test.ts", + "src/**/*.test.tsx", + "src/**/*.stories.tsx", + "src/test-setup.ts", + "src/test-utils/**", + "src/main.tsx", + "src/embed.tsx", + ], + insertTypesEntry: true, + }), + ], + // ...rest unchanged +}); +``` + +**Step 3:** Create `widget/scripts/emit-dts-cts.mjs` (CJS type twin so `attw` passes the `require` condition): +```js +import { copyFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { dirname, resolve } from "node:path"; + +const here = dirname(fileURLToPath(import.meta.url)); +const dist = resolve(here, "../dist"); +await copyFile(resolve(dist, "index.d.ts"), resolve(dist, "index.d.cts")); +console.log("[emit-dts-cts] wrote dist/index.d.cts"); +``` + +**Step 4:** Update `widget/package.json` scripts and exports: +```jsonc +"build": "vite build && vite build --config vite.config.embed.ts && node scripts/emit-dts-cts.mjs", +"build:lib": "vite build && node scripts/emit-dts-cts.mjs", +"check:exports": "publint --strict && attw --pack .", +``` +Exports map (per-condition types): +```jsonc +"main": "./dist/claudius.cjs", +"module": "./dist/claudius.js", +"types": "./dist/index.d.ts", +"exports": { + ".": { + "import": { "types": "./dist/index.d.ts", "default": "./dist/claudius.js" }, + "require": { "types": "./dist/index.d.cts", "default": "./dist/claudius.cjs" } + }, + "./embed": "./dist/claudius.iife.js", + "./style.css": "./dist/claudius.css" +} +``` + +**Step 5:** Build and verify single bundle. +```bash +cd widget && rm -rf dist && pnpm build +find dist -name "*.d.ts" -o -name "*.d.cts" +``` +Expected: only `dist/index.d.ts` and `dist/index.d.cts` (no `dist/components/*.d.ts`). + +**Step 6:** Verify export correctness. +```bash +cd widget && pnpm check:exports +``` +Expected: publint clean; attw reports types resolve for both `import` and `require` (no FalseCJS/FalseESM). If attw still flags an issue, inspect and adjust the exports map / `.d.cts`. + +**Step 7:** Confirm types compile in isolation. +```bash +cd widget && npx tsc --noEmit dist/index.d.ts +``` +Expected: no errors. + +**Step 8:** Commit. +```bash +git add widget/vite.config.ts widget/package.json widget/scripts/emit-dts-cts.mjs widget/pnpm-lock.yaml +git commit -m "build(widget): emit single bundled index.d.ts via vite-plugin-dts" +``` + +--- + +## Phase 2: TypeDoc + doc-coverage gate (the failing test) + +### Task 2.1: Add TypeDoc with strict validation + +**Files:** +- Modify: `widget/package.json` (devDep + scripts) +- Create: `widget/typedoc.json` + +**Step 1:** Install. +```bash +cd widget && pnpm add -D typedoc +``` + +**Step 2:** Create `widget/typedoc.json`: +```jsonc +{ + "$schema": "https://typedoc.org/schema.json", + "name": "claudius-chat-widget", + "entryPoints": ["src/index.ts"], + "out": "dist/api", + "tsconfig": "tsconfig.json", + "readme": "none", + "githubPages": false, + "excludeInternal": true, + "excludePrivate": true, + "excludeExternals": true, + "exclude": [ + "**/*.test.ts", + "**/*.test.tsx", + "**/*.stories.tsx", + "**/__tests__/**", + "**/test-utils/**" + ], + "validation": { + "notExported": true, + "invalidLink": true, + "notDocumented": true + }, + "requiredToBeDocumented": [ + "Class", "Interface", "Function", "Variable", "TypeAlias", + "Property", "Method", "Accessor", "EnumMember", "Constructor" + ], + "treatWarningsAsErrors": true +} +``` + +**Step 3:** Add scripts to `widget/package.json`: +```jsonc +"docs:api": "typedoc", +"docs:api:check": "typedoc --emit none", +``` + +**Step 4:** Run the gate to get RED (the worklist of undocumented exports). +```bash +cd widget && pnpm docs:api:check +``` +Expected: FAIL — warnings-as-errors listing every public symbol/member without a TSDoc summary (this is the Phase 3 checklist). + +**Step 5:** Commit the harness. +```bash +git add widget/typedoc.json widget/package.json widget/pnpm-lock.yaml +git commit -m "docs(widget): add TypeDoc config with strict doc-coverage validation" +``` + +--- + +## Phase 3: TSDoc every public export (make the gate GREEN) + +**Approach (TDD loop):** `pnpm docs:api:check` is the failing test. Document the symbols it reports, rerun, repeat until it exits 0. Use a consistent voice: a one-line summary, then `@param`/`@returns`/`@defaultValue`/`@example`/`@see` as relevant. Mark internal-only helpers `@internal`. + +**Files (public surface from `src/index.ts`):** +- `widget/src/components/ChatWidget.tsx` — `ChatWidget`, `ChatWidgetProps` (+ every prop), `WidgetPosition` +- `widget/src/i18n.ts` (or `i18n/index.ts`) — `ClaudiusTranslations`, `defaultTranslations`, `createTranslations` +- `widget/src/locales/index.ts` — `locales`, `detectLocale`, `resolveTranslations`, `LocaleCode` +- `widget/src/hooks/useTriggers.ts` — `Trigger`, `TriggerAction`, `UrlPattern` +- `widget/src/theme/index.ts` / `widget/src/theme/types.ts` / `widget/src/theme/themes.ts` — `builtinThemes`, `ClaudiusTheme`, `ClaudiusThemeInput`, `BuiltinThemeName`, `ThemeColorToken`, `ThemeRadiusToken`, `ThemeShadowToken`, `ThemeFontToken` +- `widget/src/api/client.ts` — `ChatApiClient`, `ChatApiClientOptions` +- `widget/src/api/errors.ts` — `ChatApiError`, `DebounceError` +- `widget/src/api/types.ts` — `Source`, `ChatMessage`, `ChatRequest`, `ChatResponse`, `ChatErrorResponse` + +**Worked example — `ChatWidgetProps` in `ChatWidget.tsx`:** +```ts +/** + * Configuration for the {@link ChatWidget} component. + */ +export interface ChatWidgetProps { + /** Absolute URL of the Worker chat endpoint (e.g. `https://api.example.com/api/chat`). */ + apiUrl: string; + /** Header title. Falls back to the active locale's default title. */ + title?: string; + /** Header subtitle shown beneath the title. */ + subtitle?: string; + /** First assistant message shown when the chat opens. */ + welcomeMessage?: string; + /** Placeholder text for the message input. */ + placeholder?: string; + /** Persist the conversation to storage so it survives reloads. @defaultValue `false` */ + persistMessages?: boolean; + /** Prefix for the storage key used when {@link ChatWidgetProps.persistMessages} is set. */ + storageKeyPrefix?: string; + /** Abort a chat request after this many milliseconds. */ + requestTimeoutMs?: number; + /** + * Color-scheme mode (`"light" | "dark" | "auto"`), a built-in theme name, + * an inline {@link ClaudiusTheme} object, or a URL to a theme JSON file. + * @defaultValue `"light"` + */ + theme?: ClaudiusThemeInput; + /** Accent color override; wins over the theme's accent in light and dark. */ + accentColor?: string; + /** Corner the widget docks to. @defaultValue `"bottom-right"` */ + position?: WidgetPosition; + /** BCP-47 locale used to pick built-in translations. */ + locale?: LocaleCode; + /** Partial overrides merged over the resolved locale translations. */ + translations?: Partial; + /** Proactive open/greeting rules evaluated against the current page. */ + triggers?: Trigger[]; +} +``` +Document `ChatWidget` itself with a summary + `@param props` + an `@example` JSX block, and `WidgetPosition` with a one-line summary. + +**Step (repeat):** +```bash +cd widget && pnpm docs:api:check +``` +until: PASS (exit 0). + +**Then generate the HTML and sanity-check:** +```bash +cd widget && pnpm docs:api && ls dist/api/index.html +``` + +**Commit** (logical chunks, e.g. one per area or one for all TSDoc): +```bash +git add widget/src +git commit -m "docs(widget): add TSDoc to all public exports" +``` + +--- + +## Phase 4: Host the reference under the docs domain at `/api/` + +### Task 4.1: Copy script + docs build wiring + +**Files:** +- Create: `docs/scripts/copy-api.mjs` +- Modify: `docs/package.json` (build script) +- Modify: `.gitignore` + +**Step 1:** Create `docs/scripts/copy-api.mjs`: +```js +import { cp, access, rm } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { dirname, resolve } from "node:path"; + +const here = dirname(fileURLToPath(import.meta.url)); +const src = resolve(here, "../../widget/dist/api"); +const dest = resolve(here, "../public/api"); + +try { + await access(src); +} catch { + console.warn( + "[copy-api] ../widget/dist/api not found; skipping. " + + "Run `pnpm --dir ../widget docs:api` to include the API reference.", + ); + process.exit(0); +} +await rm(dest, { recursive: true, force: true }); +await cp(src, dest, { recursive: true }); +console.log("[copy-api] copied widget/dist/api -> docs/public/api"); +``` + +**Step 2:** `docs/package.json` — make the copy run before the Astro build: +```jsonc +"build": "node scripts/copy-api.mjs && astro build", +``` + +**Step 3:** `.gitignore` — add: +``` +docs/public/api/ +``` + +### Task 4.2: Sidebar link + +**Files:** +- Modify: `docs/astro.config.mjs` (API Reference group) + +Add to the existing `API Reference` group's `items`: +```js +{ + label: "API Reference", + items: [ + { autogenerate: { directory: "api" } }, + { + label: "Generated Reference (TypeDoc)", + link: "/api/", + attrs: { target: "_blank", rel: "noopener noreferrer" }, + badge: { text: "typedoc", variant: "tip" }, + }, + ], +}, +``` + +**Step:** Build docs end-to-end and verify. +```bash +cd widget && pnpm docs:api +cd ../docs && pnpm build && ls dist/api/index.html +``` +Expected: `docs/dist/api/index.html` exists. + +**Commit:** +```bash +git add docs/scripts/copy-api.mjs docs/package.json docs/astro.config.mjs .gitignore +git commit -m "docs: host generated TypeDoc reference at /api/ and link it in the sidebar" +``` + +--- + +## Phase 5: CI wiring + +### Task 5.1: Doc-coverage + export gates in widget CI + +**Files:** +- Modify: `.github/workflows/ci.yml` (widget job) + +Add after the `Type check` step and after `Build` respectively: +```yaml + - name: API docs coverage (TSDoc) + run: pnpm docs:api:check + + # (existing) Build step here ... + + - name: Validate package exports (attw + publint) + run: pnpm check:exports +``` +Order: lint -> format check -> typecheck -> **docs:api:check** -> test -> build -> **check:exports**. + +### Task 5.2: Generate the reference in the docs workflow + +**Files:** +- Modify: `.github/workflows/docs.yml` + +1. Add `widget/**` to both `push.paths` and `pull_request.paths`. +2. In the `build` job, before `Build (includes Pagefind index)`, add: +```yaml + - name: Install widget deps + working-directory: widget + run: pnpm install --frozen-lockfile + + - name: Generate API reference (TypeDoc) + working-directory: widget + run: pnpm docs:api +``` +(The docs `build` script's `copy-api.mjs` then picks up `widget/dist/api`.) + +**Commit:** +```bash +git add .github/workflows/ci.yml .github/workflows/docs.yml +git commit -m "ci: gate undocumented exports + bad exports, generate API reference in docs build" +``` + +--- + +## Phase 6: Full verification (including visual) + +**Step 1:** Clean widget build + assertions. +```bash +cd widget && rm -rf dist && pnpm build +find dist -name "*.d.*ts" | sort # expect only index.d.ts + index.d.cts +pnpm check:exports # attw + publint clean +pnpm docs:api:check # coverage gate green +``` + +**Step 2:** Docs build + serve + visual check. +```bash +cd widget && pnpm docs:api +cd ../docs && pnpm build && pnpm preview # serves http://localhost:4321 +``` +Then with chrome-devtools MCP: +- Navigate to `http://localhost:4321/api/` and screenshot — confirm the TypeDoc reference renders with `ChatWidget`, props, hooks, types. +- Navigate to a Starlight page and screenshot the sidebar — confirm the "Generated Reference (TypeDoc)" link with the `typedoc` badge appears under API Reference. + +**Step 3:** Regression + pre-push checks (per project memory: scoped prettier, e2e). +```bash +cd widget && pnpm test # expect 257 passing +pnpm lint +pnpm exec prettier --check # scoped, NOT format:check (CRLF artifact) +pnpm e2e:install && pnpm e2e # per memory: run before pushing widget changes +``` + +**Step 4:** Finish the branch (per CLAUDE.md auto-PR rule): push and open a PR with `Closes #44` if all criteria are met. + +--- + +## Acceptance-criteria checklist + +- [ ] Vite build emits a single `index.d.ts` bundle (Phase 1) +- [ ] All public exports have TSDoc comments (Phase 3, enforced Phase 5) +- [ ] `pnpm docs:api` runs TypeDoc -> HTML in `dist/api` (Phase 2/3) +- [ ] Generated reference published to Cloudflare Pages + linked from docs (Phase 4/5) +- [ ] CI fails if any public export lacks a TSDoc summary (Phase 5) diff --git a/docs/scripts/copy-api.mjs b/docs/scripts/copy-api.mjs new file mode 100644 index 0000000..318c32f --- /dev/null +++ b/docs/scripts/copy-api.mjs @@ -0,0 +1,25 @@ +// Copy the widget's generated TypeDoc HTML into the Astro site so it ships +// with the docs deploy at /api/. Tolerant by design: if the reference has not +// been generated yet (e.g. a docs-only local build), warn and skip so the +// docs build still succeeds. CI generates it first (see .github/workflows/docs.yml). +import { cp, access, rm } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { dirname, resolve } from "node:path"; + +const here = dirname(fileURLToPath(import.meta.url)); +const src = resolve(here, "../../widget/dist/api"); +const dest = resolve(here, "../public/api"); + +try { + await access(src); +} catch { + console.warn( + "[copy-api] ../widget/dist/api not found; skipping. " + + "Run `pnpm --dir ../widget docs:api` to include the API reference.", + ); + process.exit(0); +} + +await rm(dest, { recursive: true, force: true }); +await cp(src, dest, { recursive: true }); +console.log("[copy-api] copied widget/dist/api -> docs/public/api"); diff --git a/widget/package.json b/widget/package.json index cdd34b8..8bad41a 100644 --- a/widget/package.json +++ b/widget/package.json @@ -33,9 +33,14 @@ "types": "./dist/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/claudius.js", - "require": "./dist/claudius.cjs" + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/claudius.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/claudius.cjs" + } }, "./embed": "./dist/claudius.iife.js", "./style.css": "./dist/claudius.css" @@ -48,9 +53,11 @@ }, "scripts": { "dev": "vite", - "build": "vite build && vite build --config vite.config.embed.ts && tsc --emitDeclarationOnly", - "build:lib": "vite build && tsc --emitDeclarationOnly", + "build": "vite build && vite build --config vite.config.embed.ts && node scripts/emit-dts-cts.mjs", + "build:lib": "vite build && node scripts/emit-dts-cts.mjs", "build:embed": "vite build --config vite.config.embed.ts", + "docs:api": "typedoc", + "docs:api:check": "typedoc --emit none", "test": "vitest run", "test:watch": "vitest", "test:coverage": "vitest run --coverage", @@ -62,6 +69,7 @@ "format": "prettier --write \"src/**/*.{ts,tsx,css}\"", "format:check": "prettier --check \"src/**/*.{ts,tsx,css}\"", "typecheck": "tsc --noEmit", + "check:exports": "publint --strict && attw --pack . --exclude-entrypoints ./embed ./style.css", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" }, @@ -70,7 +78,9 @@ "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { + "@arethetypeswrong/cli": "^0.18.3", "@eslint/js": "^9.24.0", + "@microsoft/api-extractor": "^7.58.9", "@playwright/test": "^1.59.1", "@storybook/react-vite": "10.4.1", "@testing-library/jest-dom": "^6.6.0", @@ -90,13 +100,16 @@ "jsdom": "^26.0.0", "postcss": "^8.5.0", "prettier": "^3.5.0", + "publint": "^0.3.21", "react": "^18.3.0", "react-dom": "^18.3.0", "storybook": "10.4.1", "tailwindcss": "^3.4.0", + "typedoc": "^0.28.19", "typescript": "^5.8.0", "typescript-eslint": "^8.30.0", "vite": "^6.2.0", + "vite-plugin-dts": "^5.0.2", "vitest": "^4.1.0" } } diff --git a/widget/pnpm-lock.yaml b/widget/pnpm-lock.yaml index 83b2e9f..9a97b31 100644 --- a/widget/pnpm-lock.yaml +++ b/widget/pnpm-lock.yaml @@ -8,15 +8,21 @@ importers: .: devDependencies: + '@arethetypeswrong/cli': + specifier: ^0.18.3 + version: 0.18.3 '@eslint/js': specifier: ^9.24.0 version: 9.39.4 + '@microsoft/api-extractor': + specifier: ^7.58.9 + version: 7.58.9 '@playwright/test': specifier: ^1.59.1 version: 1.59.1 '@storybook/react-vite': specifier: 10.4.1 - version: 10.4.1(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.25.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)) + version: 10.4.1(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.25.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) '@testing-library/jest-dom': specifier: ^6.6.0 version: 6.9.1 @@ -34,10 +40,10 @@ importers: version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: ^4.4.0 - version: 4.7.0(vite@6.4.1(jiti@1.21.7)) + version: 4.7.0(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: ^4.1.5 - version: 4.1.5(vitest@4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7))) + version: 4.1.5(vitest@4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0))) ajv: specifier: ^8.20.0 version: 8.20.0 @@ -68,6 +74,9 @@ importers: prettier: specifier: ^3.5.0 version: 3.8.1 + publint: + specifier: ^0.3.21 + version: 0.3.21 react: specifier: ^18.3.0 version: 18.3.1 @@ -79,7 +88,10 @@ importers: version: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwindcss: specifier: ^3.4.0 - version: 3.4.19 + version: 3.4.19(yaml@2.9.0) + typedoc: + specifier: ^0.28.19 + version: 0.28.19(typescript@5.9.3) typescript: specifier: ^5.8.0 version: 5.9.3 @@ -88,10 +100,13 @@ importers: version: 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) vite: specifier: ^6.2.0 - version: 6.4.1(jiti@1.21.7) + version: 6.4.1(jiti@1.21.7)(yaml@2.9.0) + vite-plugin-dts: + specifier: ^5.0.2 + version: 5.0.2(@microsoft/api-extractor@7.58.9)(esbuild@0.25.12)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) vitest: specifier: ^4.1.0 - version: 4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7)) + version: 4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) packages: @@ -102,6 +117,18 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + '@andrewbranch/untar.js@1.0.3': + resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} + + '@arethetypeswrong/cli@0.18.3': + resolution: {integrity: sha512-GeAlc+lUD4gKHD/LDQNvQY30FfQ+xAXg2inbQKUjFZgTOdI5ygEweaOnGHGBPSKXSLGQC7VLhpXu9zMnYk/4sQ==} + engines: {node: '>=20'} + hasBin: true + + '@arethetypeswrong/core@0.18.3': + resolution: {integrity: sha512-sWBB/tdIktaT5xMq0Dz6CJyqcf6oMNdmiKiuPU1lWoJLTL6gjRSsksBuSgqot21hylkklBQY1wiSu+PkZhW7sw==} + engines: {node: '>=20'} + '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} @@ -196,6 +223,13 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@braidai/lang@1.1.2': + resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} @@ -427,6 +461,9 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@gerrit0/mini-shiki@3.23.0': + resolution: {integrity: sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -468,6 +505,22 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@loaderkit/resolve@1.0.6': + resolution: {integrity: sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==} + + '@microsoft/api-extractor-model@7.33.8': + resolution: {integrity: sha512-aIcoQggPyer3B6Ze3usz0YWC/oBwUHfRH5ETUsr+oT2BRA6SfTJl7IKPcPZkX4UR+PohowzW4uMxsvjrn8vm+w==} + + '@microsoft/api-extractor@7.58.9': + resolution: {integrity: sha512-S2UF4yza5GoxCmf7hJQNxJNZN9ltOVuOQv8Dy+Z21aol5ERoBNMdWcQHm4MJMPPItW4H/4rZD906iaf4mUojJA==} + hasBin: true + + '@microsoft/tsdoc-config@0.18.1': + resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==} + + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: @@ -533,56 +586,48 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.127.0': resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-riscv64-musl@0.127.0': resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [musl] '@oxc-parser/binding-linux-s390x-gnu@0.127.0': resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.127.0': resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.127.0': resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@oxc-parser/binding-openharmony-arm64@0.127.0': resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} @@ -655,49 +700,41 @@ packages: resolution: {integrity: sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-arm64-musl@11.19.1': resolution: {integrity: sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': resolution: {integrity: sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==} cpu: [ppc64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': resolution: {integrity: sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': resolution: {integrity: sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==} cpu: [riscv64] os: [linux] - libc: [musl] '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': resolution: {integrity: sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-x64-gnu@11.19.1': resolution: {integrity: sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-x64-musl@11.19.1': resolution: {integrity: sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==} cpu: [x64] os: [linux] - libc: [musl] '@oxc-resolver/binding-openharmony-arm64@11.19.1': resolution: {integrity: sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==} @@ -729,6 +766,10 @@ packages: engines: {node: '>=18'} hasBin: true + '@publint/pack@0.1.4': + resolution: {integrity: sha512-HDVTWq3H0uTXiU0eeSQntcVUTPP3GamzeXI41+x7uU9J65JgWQh3qWZHblR1i0npXfFtF+mxBiU2nJH8znxWnQ==} + engines: {node: '>=18'} + '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -775,79 +816,66 @@ packages: resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.59.0': resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.59.0': resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.59.0': resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} @@ -879,6 +907,55 @@ packages: cpu: [x64] os: [win32] + '@rushstack/node-core-library@5.23.1': + resolution: {integrity: sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/problem-matcher@0.2.1': + resolution: {integrity: sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.7.3': + resolution: {integrity: sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==} + + '@rushstack/terminal@0.24.0': + resolution: {integrity: sha512-8ZQS4MMaGsv27EXCBiH7WMPkRZrffeDoIevs6z9TM5dzqiY6+Hn4evfK/G+gvgBTjfvfkHIZPQQmalmI2sM4TQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@5.3.10': + resolution: {integrity: sha512-fwI076HYknC0IrMXdY6UmjDv+PH7NHhNJX3/pY2UblSE5XrXgndXZPiOe/6ZtuFpn6DvVDVNhtkIzQ+Qu/MhVQ==} + + '@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==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -986,6 +1063,9 @@ packages: '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -1013,6 +1093,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1030,6 +1113,9 @@ packages: '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript-eslint/eslint-plugin@8.57.1': resolution: {integrity: sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1151,6 +1237,15 @@ packages: '@vitest/utils@4.1.5': resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + '@webcontainer/env@1.1.1': resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} @@ -1168,16 +1263,43 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + 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@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1196,6 +1318,9 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1286,6 +1411,10 @@ packages: resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1334,6 +1463,14 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} @@ -1342,6 +1479,21 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1349,13 +1501,26 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1443,6 +1608,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + 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==} @@ -1463,17 +1632,31 @@ packages: electron-to-chromium@1.5.321: resolution: {integrity: sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + empathic@2.0.1: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} + 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'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + es-abstract@1.24.2: resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} @@ -1602,6 +1785,9 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1630,6 +1816,9 @@ packages: picomatch: optional: true + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1656,6 +1845,10 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fs-extra@11.3.5: + resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + engines: {node: '>=14.14'} + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1684,6 +1877,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1720,6 +1917,9 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -1747,6 +1947,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -1778,6 +1981,10 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -1839,6 +2046,10 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -1933,6 +2144,9 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -1974,6 +2188,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -1981,6 +2198,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -1999,6 +2219,13 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkify-it@5.0.1: + resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} + + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2023,6 +2250,9 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -2037,10 +2267,28 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + markdown-it@14.2.0: + resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} + hasBin: true + + marked-terminal@7.3.0: + resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} + engines: {node: '>=16.0.0'} + peerDependencies: + marked: '>=1 <16' + + marked@9.1.6: + resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} + engines: {node: '>= 16'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2053,10 +2301,18 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + minimatch@10.2.3: + resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} + engines: {node: 18 || 20 || >=22} + minimatch@10.2.4: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} @@ -2067,6 +2323,13 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2081,6 +2344,10 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + node-releases@2.0.36: resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} @@ -2149,13 +2416,28 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + + parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2197,6 +2479,12 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + playwright-core@1.59.1: resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} engines: {node: '>=18'} @@ -2271,10 +2559,22 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + publint@0.3.21: + resolution: {integrity: sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ==} + engines: {node: '>=18'} + hasBin: true + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2326,6 +2626,10 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -2358,6 +2662,10 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -2428,6 +2736,10 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2436,6 +2748,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2461,6 +2776,14 @@ packages: vite-plus: optional: true + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + string.prototype.includes@2.0.1: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} @@ -2477,6 +2800,10 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -2502,6 +2829,14 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -2606,6 +2941,13 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typedoc@0.28.19: + resolution: {integrity: sha512-wKh+lhdmMFivMlc6vRRcMGXeGEHGU2g8a2CkPTJjJlwRf1iXbimWIPcFolCqe4E0d/FRtGszpIrsp3WLpDB8Pw==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x + typescript-eslint@8.57.1: resolution: {integrity: sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2613,15 +2955,64 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' + typescript@5.6.1-rc: + resolution: {integrity: sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin-dts@1.0.2: + resolution: {integrity: sha512-VbNiMD0LMl/t6nJueGtrCp79N7ZO1nquxj/FUybJDnKwZGsnW2wjdwBSzA3QEHujoxmxZIptsG43hL7LzXE96w==} + peerDependencies: + '@microsoft/api-extractor': '>=7' + '@rspack/core': ^1 + '@vue/language-core': ~3.1.5 + esbuild: '*' + rolldown: '*' + rollup: '>=3' + typescript: '>=4' + vite: '>=3' + webpack: ^4 || ^5 + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@rspack/core': + optional: true + '@vue/language-core': + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + unplugin@2.3.11: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} @@ -2643,6 +3034,24 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vite-plugin-dts@5.0.2: + resolution: {integrity: sha512-lNeHS+dwGju6eRmNvZQt8Shwv9j3m98hbHse/lIbLq9q3yE2DcIOBBYQEVUF6tS0kOmv+VA9Z5FqmzFnGe4U8g==} + peerDependencies: + '@microsoft/api-extractor': '>=7' + rollup: '>=3' + vite: '>=3' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + rollup: + optional: true + vite: + optional: true + vite@6.4.1: resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2718,6 +3127,9 @@ packages: jsdom: optional: true + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -2772,6 +3184,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + ws@8.19.0: resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} @@ -2795,9 +3211,26 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2808,6 +3241,29 @@ snapshots: '@alloc/quick-lru@5.2.0': {} + '@andrewbranch/untar.js@1.0.3': {} + + '@arethetypeswrong/cli@0.18.3': + dependencies: + '@arethetypeswrong/core': 0.18.3 + chalk: 4.1.2 + cli-table3: 0.6.5 + commander: 10.0.1 + marked: 9.1.6 + marked-terminal: 7.3.0(marked@9.1.6) + semver: 7.7.4 + + '@arethetypeswrong/core@0.18.3': + dependencies: + '@andrewbranch/untar.js': 1.0.3 + '@loaderkit/resolve': 1.0.6 + cjs-module-lexer: 1.4.3 + fflate: 0.8.3 + lru-cache: 11.5.0 + semver: 7.7.4 + typescript: 5.6.1-rc + validate-npm-package-name: 5.0.1 + '@asamuzakjp/css-color@3.2.0': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) @@ -2932,6 +3388,11 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@braidai/lang@1.1.2': {} + + '@colors/colors@1.5.0': + optional: true + '@csstools/color-helpers@5.1.0': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -3092,6 +3553,14 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@gerrit0/mini-shiki@3.23.0': + dependencies: + '@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 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -3103,11 +3572,11 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 6.4.1(jiti@1.21.7) + vite: 6.4.1(jiti@1.21.7)(yaml@2.9.0) optionalDependencies: typescript: 5.9.3 @@ -3130,6 +3599,45 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@loaderkit/resolve@1.0.6': + dependencies: + '@braidai/lang': 1.1.2 + + '@microsoft/api-extractor-model@7.33.8': + dependencies: + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.23.1 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.58.9': + dependencies: + '@microsoft/api-extractor-model': 7.33.8 + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.23.1 + '@rushstack/rig-package': 0.7.3 + '@rushstack/terminal': 0.24.0 + '@rushstack/ts-command-line': 5.3.10 + diff: 8.0.4 + minimatch: 10.2.3 + resolve: 1.22.11 + semver: 7.7.4 + source-map: 0.6.1 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.18.1': + dependencies: + '@microsoft/tsdoc': 0.16.0 + ajv: 8.18.0 + jju: 1.4.0 + resolve: 1.22.11 + + '@microsoft/tsdoc@0.16.0': {} + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 @@ -3284,6 +3792,8 @@ snapshots: dependencies: playwright: 1.59.1 + '@publint/pack@0.1.4': {} + '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/pluginutils@5.3.0(rollup@4.59.0)': @@ -3369,27 +3879,82 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true + '@rushstack/node-core-library@5.23.1': + dependencies: + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + ajv-formats: 3.0.1(ajv@8.18.0) + fs-extra: 11.3.5 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.11 + semver: 7.7.4 + + '@rushstack/problem-matcher@0.2.1': {} + + '@rushstack/rig-package@0.7.3': + dependencies: + jju: 1.4.0 + resolve: 1.22.11 + + '@rushstack/terminal@0.24.0': + dependencies: + '@rushstack/node-core-library': 5.23.1 + '@rushstack/problem-matcher': 0.2.1 + supports-color: 8.1.1 + + '@rushstack/ts-command-line@5.3.10': + dependencies: + '@rushstack/terminal': 0.24.0 + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@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': {} + + '@sindresorhus/is@4.6.0': {} + '@standard-schema/spec@1.1.0': {} - '@storybook/builder-vite@10.4.1(esbuild@0.25.12)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(jiti@1.21.7))': + '@storybook/builder-vite@10.4.1(esbuild@0.25.12)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0))': dependencies: - '@storybook/csf-plugin': 10.4.1(esbuild@0.25.12)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(jiti@1.21.7)) + '@storybook/csf-plugin': 10.4.1(esbuild@0.25.12)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-dedent: 2.2.0 - vite: 6.4.1(jiti@1.21.7) + vite: 6.4.1(jiti@1.21.7)(yaml@2.9.0) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.4.1(esbuild@0.25.12)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(jiti@1.21.7))': + '@storybook/csf-plugin@10.4.1(esbuild@0.25.12)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0))': dependencies: storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) unplugin: 2.3.11 optionalDependencies: esbuild: 0.25.12 rollup: 4.59.0 - vite: 6.4.1(jiti@1.21.7) + vite: 6.4.1(jiti@1.21.7)(yaml@2.9.0) '@storybook/global@5.0.0': {} @@ -3407,11 +3972,11 @@ snapshots: '@types/react': 18.3.28 '@types/react-dom': 18.3.7(@types/react@18.3.28) - '@storybook/react-vite@10.4.1(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.25.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7))': + '@storybook/react-vite@10.4.1(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.25.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - '@storybook/builder-vite': 10.4.1(esbuild@0.25.12)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(jiti@1.21.7)) + '@storybook/builder-vite': 10.4.1(esbuild@0.25.12)(rollup@4.59.0)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) '@storybook/react': 10.4.1(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3) empathic: 2.0.1 magic-string: 0.30.21 @@ -3421,7 +3986,7 @@ snapshots: resolve: 1.22.11 storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@testing-library/dom@10.4.1)(@types/react@18.3.28)(prettier@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tsconfig-paths: 4.2.0 - vite: 6.4.1(jiti@1.21.7) + vite: 6.4.1(jiti@1.21.7)(yaml@2.9.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -3486,6 +4051,8 @@ snapshots: tslib: 2.8.1 optional: true + '@types/argparse@1.0.38': {} + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -3520,6 +4087,10 @@ snapshots: '@types/estree@1.0.8': {} + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} '@types/prop-types@15.7.15': {} @@ -3535,6 +4106,8 @@ snapshots: '@types/resolve@1.20.6': {} + '@types/unist@3.0.3': {} + '@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -3626,7 +4199,7 @@ snapshots: '@typescript-eslint/types': 8.57.1 eslint-visitor-keys: 5.0.1 - '@vitejs/plugin-react@4.7.0(vite@6.4.1(jiti@1.21.7))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -3634,11 +4207,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(jiti@1.21.7) + vite: 6.4.1(jiti@1.21.7)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.1.5(vitest@4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7)))': + '@vitest/coverage-v8@4.1.5(vitest@4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.5 @@ -3650,7 +4223,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7)) + vitest: 4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) '@vitest/expect@3.2.4': dependencies: @@ -3669,13 +4242,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.0(vite@6.4.1(jiti@1.21.7))': + '@vitest/mocker@4.1.0(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.0 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.1(jiti@1.21.7) + vite: 6.4.1(jiti@1.21.7)(yaml@2.9.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -3725,6 +4298,18 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + '@webcontainer/env@1.1.1': {} acorn-jsx@5.3.2(acorn@8.16.0): @@ -3735,6 +4320,14 @@ snapshots: agent-base@7.1.4: {} + ajv-draft-04@1.0.0(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 @@ -3742,6 +4335,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 @@ -3749,8 +4349,14 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -3766,6 +4372,10 @@ snapshots: arg@5.0.2: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} aria-query@5.3.0: @@ -3864,6 +4474,10 @@ snapshots: dependencies: balanced-match: 4.0.4 + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -3918,6 +4532,10 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + + char-regex@1.0.2: {} + check-error@2.1.3: {} chokidar@3.6.0: @@ -3932,16 +4550,47 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + cjs-module-lexer@1.4.3: {} + + cli-highlight@2.1.11: + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.0 + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} + commander@10.0.1: {} + commander@4.1.1: {} + compare-versions@6.1.1: {} + concat-map@0.0.1: {} + confbox@0.1.8: {} + + confbox@0.2.4: {} + convert-source-map@2.0.0: {} cross-spawn@7.0.6: @@ -4021,6 +4670,8 @@ snapshots: didyoumean@1.2.2: {} + diff@8.0.4: {} + dlv@1.1.3: {} doctrine@3.0.0: @@ -4039,12 +4690,20 @@ snapshots: electron-to-chromium@1.5.321: {} + emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + emojilib@2.4.0: {} + empathic@2.0.1: {} + entities@4.5.0: {} + entities@6.0.1: {} + environment@1.1.0: {} + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 @@ -4273,6 +4932,8 @@ snapshots: expect-type@1.3.0: {} + exsolve@1.0.8: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -4297,6 +4958,8 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fflate@0.8.3: {} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -4323,6 +4986,12 @@ snapshots: fraction.js@5.3.4: {} + fs-extra@11.3.5: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + fsevents@2.3.2: optional: true @@ -4346,6 +5015,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4393,6 +5064,8 @@ snapshots: gopd@1.2.0: {} + graceful-fs@4.2.11: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -4415,6 +5088,8 @@ snapshots: dependencies: function-bind: 1.1.2 + highlight.js@10.7.3: {} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -4448,6 +5123,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-lazy@4.0.0: {} + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -4510,6 +5187,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -4601,6 +5280,8 @@ snapshots: jiti@1.21.7: {} + jju@1.4.0: {} + js-tokens@10.0.0: {} js-tokens@4.0.0: {} @@ -4648,6 +5329,12 @@ snapshots: json5@2.2.3: {} + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -4659,6 +5346,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kolorist@1.8.0: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -4674,6 +5363,16 @@ snapshots: lines-and-columns@1.2.4: {} + linkify-it@5.0.1: + dependencies: + uc.micro: 2.1.0 + + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 + quansync: 0.2.11 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -4694,6 +5393,8 @@ snapshots: dependencies: yallist: 3.1.1 + lunr@2.3.9: {} + lz-string@1.5.0: {} magic-string@0.30.21: @@ -4710,8 +5411,32 @@ snapshots: dependencies: semver: 7.7.4 + markdown-it@14.2.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.1 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + marked-terminal@7.3.0(marked@9.1.6): + dependencies: + ansi-escapes: 7.3.0 + ansi-regex: 6.2.2 + chalk: 5.6.2 + cli-highlight: 2.1.11 + cli-table3: 0.6.5 + marked: 9.1.6 + node-emoji: 2.2.0 + supports-hyperlinks: 3.2.0 + + marked@9.1.6: {} + math-intrinsics@1.1.0: {} + mdurl@2.0.0: {} + merge2@1.4.1: {} micromatch@4.0.8: @@ -4721,10 +5446,18 @@ snapshots: min-indent@1.0.1: {} + minimatch@10.2.3: + dependencies: + brace-expansion: 5.0.6 + minimatch@10.2.4: dependencies: brace-expansion: 5.0.4 + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + minimatch@3.1.5: dependencies: brace-expansion: 1.1.12 @@ -4733,6 +5466,15 @@ snapshots: minipass@7.1.3: {} + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + mri@1.2.0: {} + ms@2.1.3: {} mz@2.7.0: @@ -4745,6 +5487,13 @@ snapshots: natural-compare@1.4.0: {} + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + node-releases@2.0.36: {} normalize-path@3.0.0: {} @@ -4865,14 +5614,26 @@ snapshots: dependencies: p-limit: 3.1.0 + package-manager-detector@1.6.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 + parse5-htmlparser2-tree-adapter@6.0.1: + dependencies: + parse5: 6.0.1 + + parse5@5.1.1: {} + + parse5@6.0.1: {} + parse5@7.3.0: dependencies: entities: 6.0.1 + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -4898,6 +5659,18 @@ snapshots: pirates@4.0.7: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.0.8 + pathe: 2.0.3 + playwright-core@1.59.1: {} playwright@1.59.1: @@ -4920,12 +5693,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.8 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.8): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.8)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.8 + yaml: 2.9.0 postcss-nested@6.2.0(postcss@8.5.8): dependencies: @@ -4955,8 +5729,19 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + publint@0.3.21: + dependencies: + '@publint/pack': 0.1.4 + package-manager-detector: 1.6.0 + picocolors: 1.1.1 + sade: 1.8.1 + + punycode.js@2.3.1: {} + punycode@2.3.1: {} + quansync@0.2.11: {} + queue-microtask@1.2.3: {} react-docgen-typescript@2.4.0(typescript@5.9.3): @@ -5033,6 +5818,8 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + require-directory@2.1.1: {} + require-from-string@2.0.2: {} resolve-from@4.0.0: {} @@ -5084,6 +5871,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.9 @@ -5175,10 +5966,16 @@ snapshots: siginfo@2.0.0: {} + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + source-map-js@1.2.1: {} source-map@0.6.1: {} + sprintf-js@1.0.3: {} + stackback@0.0.2: {} std-env@4.0.0: {} @@ -5217,6 +6014,14 @@ snapshots: - react-dom - utf-8-validate + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + string.prototype.includes@2.0.1: dependencies: call-bind: 1.0.9 @@ -5246,6 +6051,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + strip-bom@3.0.0: {} strip-indent@3.0.0: @@ -5270,11 +6079,20 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.2.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} symbol-tree@3.2.4: {} - tailwindcss@3.4.19: + tailwindcss@3.4.19(yaml@2.9.0): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -5293,7 +6111,7 @@ snapshots: postcss: 8.5.8 postcss-import: 15.1.0(postcss@8.5.8) postcss-js: 4.1.0(postcss@8.5.8) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.8) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.8)(yaml@2.9.0) postcss-nested: 6.2.0(postcss@8.5.8) postcss-selector-parser: 6.1.2 resolve: 1.22.11 @@ -5398,6 +6216,15 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typedoc@0.28.19(typescript@5.9.3): + dependencies: + '@gerrit0/mini-shiki': 3.23.0 + lunr: 2.3.9 + markdown-it: 14.2.0 + minimatch: 10.2.5 + typescript: 5.9.3 + yaml: 2.9.0 + typescript-eslint@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) @@ -5409,8 +6236,14 @@ snapshots: transitivePeerDependencies: - supports-color + typescript@5.6.1-rc: {} + typescript@5.9.3: {} + uc.micro@2.1.0: {} + + ufo@1.6.4: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -5418,6 +6251,29 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + unicode-emoji-modifier-base@1.0.0: {} + + universalify@2.0.1: {} + + unplugin-dts@1.0.2(@microsoft/api-extractor@7.58.9)(esbuild@0.25.12)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@volar/typescript': 2.4.28 + compare-versions: 6.1.1 + debug: 4.4.3 + kolorist: 1.8.0 + local-pkg: 1.2.1 + magic-string: 0.30.21 + typescript: 5.9.3 + unplugin: 2.3.11 + optionalDependencies: + '@microsoft/api-extractor': 7.58.9 + esbuild: 0.25.12 + rollup: 4.59.0 + vite: 6.4.1(jiti@1.21.7)(yaml@2.9.0) + transitivePeerDependencies: + - supports-color + unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 @@ -5441,7 +6297,25 @@ snapshots: util-deprecate@1.0.2: {} - vite@6.4.1(jiti@1.21.7): + validate-npm-package-name@5.0.1: {} + + vite-plugin-dts@5.0.2(@microsoft/api-extractor@7.58.9)(esbuild@0.25.12)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)): + dependencies: + unplugin-dts: 1.0.2(@microsoft/api-extractor@7.58.9)(esbuild@0.25.12)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) + optionalDependencies: + '@microsoft/api-extractor': 7.58.9 + rollup: 4.59.0 + vite: 6.4.1(jiti@1.21.7)(yaml@2.9.0) + transitivePeerDependencies: + - '@rspack/core' + - '@vue/language-core' + - esbuild + - rolldown + - supports-color + - typescript + - webpack + + vite@6.4.1(jiti@1.21.7)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -5452,11 +6326,12 @@ snapshots: optionalDependencies: fsevents: 2.3.3 jiti: 1.21.7 + yaml: 2.9.0 - vitest@4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7)): + vitest@4.1.0(jsdom@26.1.0)(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@6.4.1(jiti@1.21.7)) + '@vitest/mocker': 4.1.0(vite@6.4.1(jiti@1.21.7)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.0 '@vitest/runner': 4.1.0 '@vitest/snapshot': 4.1.0 @@ -5473,13 +6348,15 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 6.4.1(jiti@1.21.7) + vite: 6.4.1(jiti@1.21.7)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: jsdom: 26.1.0 transitivePeerDependencies: - msw + vscode-uri@3.1.0: {} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -5551,6 +6428,12 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + ws@8.19.0: {} wsl-utils@0.1.0: @@ -5561,6 +6444,22 @@ snapshots: xmlchars@2.2.0: {} + y18n@5.0.8: {} + yallist@3.1.1: {} + yaml@2.9.0: {} + + yargs-parser@20.2.9: {} + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yocto-queue@0.1.0: {} diff --git a/widget/scripts/emit-dts-cts.mjs b/widget/scripts/emit-dts-cts.mjs new file mode 100644 index 0000000..5f82487 --- /dev/null +++ b/widget/scripts/emit-dts-cts.mjs @@ -0,0 +1,12 @@ +// Emit a CommonJS declaration twin (index.d.cts) alongside the rolled-up +// index.d.ts. The two files are byte-identical; the .cts extension tells +// TypeScript to resolve types for the `require` export condition, which keeps +// @arethetypeswrong/cli happy (no FalseCJS masquerade). +import { copyFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { dirname, resolve } from "node:path"; + +const here = dirname(fileURLToPath(import.meta.url)); +const dist = resolve(here, "../dist"); +await copyFile(resolve(dist, "index.d.ts"), resolve(dist, "index.d.cts")); +console.log("[emit-dts-cts] wrote dist/index.d.cts"); diff --git a/widget/src/api/client.ts b/widget/src/api/client.ts index bb9d117..24a3a90 100644 --- a/widget/src/api/client.ts +++ b/widget/src/api/client.ts @@ -1,19 +1,46 @@ import type { ChatMessage, ChatResponse, ChatErrorResponse } from "./types"; import { ChatApiError, DebounceError } from "./errors"; +/** + * Options for {@link ChatApiClient}. + */ export interface ChatApiClientOptions { + /** + * Maximum retries after the first attempt, for retryable failures (HTTP + * 429/503, network errors, timeouts). + * @defaultValue `2` + */ maxRetries?: number; + /** + * Minimum gap between sends, in milliseconds. A send inside this window + * rejects with {@link DebounceError}. Set to 0 to disable. + * @defaultValue `300` + */ debounceMs?: number; /** * Per-attempt request timeout in milliseconds. Aborts the in-flight fetch - * via AbortController and surfaces a retryable ChatApiError with code - * "TIMEOUT". Set to 0 to disable. Defaults to 30000 (30s). + * via `AbortController` and surfaces a retryable {@link ChatApiError} with + * code `"TIMEOUT"`. Set to 0 to disable. + * @defaultValue `30000` */ timeoutMs?: number; } const DEFAULT_TIMEOUT_MS = 30_000; +/** + * Typed client for the Claudius Worker chat API. Handles debouncing, + * per-attempt timeouts, and automatic retries with backoff for transient + * failures (HTTP 429/503, network errors, timeouts). + * + * @example + * ```ts + * const client = new ChatApiClient("https://api.example.com"); + * const { reply } = await client.sendMessage([ + * { id: "1", role: "user", content: "Hello" }, + * ]); + * ``` + */ export class ChatApiClient { private readonly baseUrl: string; private readonly maxRetries: number; @@ -21,6 +48,12 @@ export class ChatApiClient { private readonly timeoutMs: number; private lastSendTime = 0; + /** + * Create a chat client for the given Worker base URL. + * + * @param baseUrl - Base URL of the Worker. Requests post to `${baseUrl}/api/chat`. + * @param options - Optional retry, debounce, and timeout settings. + */ constructor(baseUrl: string, options?: ChatApiClientOptions) { this.baseUrl = baseUrl; this.maxRetries = options?.maxRetries ?? 2; @@ -28,6 +61,16 @@ export class ChatApiClient { this.timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS; } + /** + * Send the conversation to the chat endpoint and return the assistant's + * reply, retrying transient failures with backoff up to + * {@link ChatApiClientOptions.maxRetries} times. + * + * @param messages - The full conversation so far, oldest message first. + * @returns The assistant's reply and any cited sources. + * @throws {@link DebounceError} when called within the debounce window. + * @throws {@link ChatApiError} when the request fails after all retries. + */ async sendMessage(messages: ChatMessage[]): Promise { if ( this.debounceMs > 0 && diff --git a/widget/src/api/errors.ts b/widget/src/api/errors.ts index d444e78..9fe3de5 100644 --- a/widget/src/api/errors.ts +++ b/widget/src/api/errors.ts @@ -1,8 +1,23 @@ +/** + * Error thrown by {@link ChatApiClient} when a chat request ultimately fails: + * either after exhausting retries, or immediately for a non-retryable status. + */ export class ChatApiError extends Error { + /** + * Create a {@link ChatApiError}. + * + * @param message - Human-readable error message. + * @param status - HTTP status code, or `0` for network and timeout failures. + * @param code - Optional machine-readable error code (e.g. `"TIMEOUT"`, `"NETWORK_ERROR"`). + * @param retryAfter - Seconds to wait before retrying, from the `Retry-After` header. + */ constructor( message: string, + /** HTTP status code, or `0` for network and timeout failures. */ public readonly status: number, + /** Machine-readable error code, when available (e.g. `"TIMEOUT"`). */ public readonly code?: string, + /** Seconds to wait before retrying, parsed from the `Retry-After` header. */ public readonly retryAfter?: number, ) { super(message); @@ -10,7 +25,12 @@ export class ChatApiError extends Error { } } +/** + * Error thrown by {@link ChatApiClient.sendMessage} when a send is rejected + * for arriving within the configured debounce window. + */ export class DebounceError extends Error { + /** Creates a `DebounceError` with a fixed message. */ constructor() { super("Request debounced"); this.name = "DebounceError"; diff --git a/widget/src/api/types.ts b/widget/src/api/types.ts index ca3b214..b4ba54d 100644 --- a/widget/src/api/types.ts +++ b/widget/src/api/types.ts @@ -1,26 +1,54 @@ +/** + * A cited source the assistant referenced when answering. Rendered as a link + * in the chat and grouped in the sources sidebar. + */ export interface Source { + /** Absolute URL of the source. */ url: string; + /** Human-readable link title shown to the user. */ title: string; + /** Origin category, used to group and label the source. */ type: "blog" | "page" | "external"; } +/** + * A single chat message exchanged between the user and the assistant. + */ export interface ChatMessage { + /** Stable unique identifier, used as the React list key. */ id: string; + /** Who authored the message. */ role: "user" | "assistant"; + /** Plain-text message body. */ content: string; + /** Sources cited by the assistant for this message, when any. */ sources?: Source[]; } +/** + * Request payload sent to the Worker `POST /api/chat` endpoint. + */ export interface ChatRequest { + /** The full conversation so far, oldest message first. */ messages: ChatMessage[]; } +/** + * Successful response body from `POST /api/chat`. + */ export interface ChatResponse { + /** The assistant's reply text. */ reply: string; + /** Sources the assistant cited, when any. */ sources?: Source[]; } +/** + * Error response body returned by the Worker when a chat request fails. + */ export interface ChatErrorResponse { + /** Human-readable error message. */ error: string; + /** Optional machine-readable error code (e.g. `"RATE_LIMITED"`). */ code?: string; } diff --git a/widget/src/components/ChatWidget.tsx b/widget/src/components/ChatWidget.tsx index 6eca2fa..8fb1877 100644 --- a/widget/src/components/ChatWidget.tsx +++ b/widget/src/components/ChatWidget.tsx @@ -14,6 +14,7 @@ import { resolveTranslations, type LocaleCode } from "../locales"; import { useTheme } from "../theme/useTheme"; import type { ClaudiusThemeInput } from "../theme/types"; +/** Corner of the viewport the widget docks to. */ export type WidgetPosition = | "bottom-right" | "bottom-left" @@ -22,25 +23,48 @@ export type WidgetPosition = const DISMISS_STORAGE_KEY = "claudius:triggers:dismissed"; +/** + * Props for the {@link ChatWidget} component. + */ export interface ChatWidgetProps { + /** Absolute URL of the Worker chat endpoint (e.g. `https://api.example.com`). */ apiUrl: string; + /** Header title. Falls back to the active locale's default title. */ title?: string; + /** Header subtitle shown beneath the title. */ subtitle?: string; + /** First assistant message shown when the chat opens. */ welcomeMessage?: string; + /** Placeholder text for the message input. */ placeholder?: string; + /** + * Persist the conversation to storage so it survives reloads. + * @defaultValue `false` + */ persistMessages?: boolean; + /** Prefix for the storage key used when {@link ChatWidgetProps.persistMessages} is enabled. */ storageKeyPrefix?: string; + /** Abort a chat request after this many milliseconds. */ requestTimeoutMs?: number; /** * Color-scheme mode ("light" | "dark" | "auto"), a built-in theme name * ("default" | "minimal" | "playful" | "corporate"), an inline * ClaudiusTheme object, or a URL to a theme JSON file. + * @defaultValue `"light"` */ theme?: ClaudiusThemeInput; + /** Accent color override; wins over the theme's accent in both light and dark. */ accentColor?: string; + /** + * Corner of the viewport the widget docks to. + * @defaultValue `"bottom-right"` + */ position?: WidgetPosition; + /** BCP-47 locale used to select built-in translations. */ locale?: LocaleCode; + /** Partial overrides merged over the resolved locale translations. */ translations?: Partial; + /** Proactive open/greeting rules evaluated against the current page. */ triggers?: Trigger[]; } @@ -62,6 +86,16 @@ function writeDismissed(): void { } } +/** + * Root Claudius chat widget: a floating toggle button that opens a chat window + * backed by the Worker chat API. Render a single instance on the page. + * + * @param props - See {@link ChatWidgetProps}. + * @example + * ```tsx + * + * ``` + */ export function ChatWidget({ apiUrl, title, diff --git a/widget/src/hooks/useTriggers.ts b/widget/src/hooks/useTriggers.ts index 5ce2316..05c0e5e 100644 --- a/widget/src/hooks/useTriggers.ts +++ b/widget/src/hooks/useTriggers.ts @@ -1,30 +1,58 @@ import { useEffect } from "react"; +/** A URL match: a case-insensitive substring, or a regular expression. */ export type UrlPattern = string | RegExp; -export type TriggerAction = "open" | { greeting: string }; +/** + * What a {@link Trigger} does when it fires: open the chat, or show a greeting + * bubble with the given message. + */ +export type TriggerAction = + | "open" + | { + /** Greeting bubble message to display. */ + greeting: string; + }; +/** + * A proactive engagement rule. Each variant fires at most once per page on a + * different signal: elapsed time, scroll depth, exit intent, or URL match. + */ export type Trigger = | { + /** Fire after a fixed dwell time. */ on: "time"; + /** Seconds to wait before firing. */ seconds: number; + /** Only fire when the current URL matches this pattern. */ matchUrl?: UrlPattern; + /** Action to run when the trigger fires. */ action: TriggerAction; } | { + /** Fire once the user scrolls past a depth threshold. */ on: "scroll"; + /** Scroll depth (0-100) that fires the trigger. */ percent: number; + /** Only fire when the current URL matches this pattern. */ matchUrl?: UrlPattern; + /** Action to run when the trigger fires. */ action: TriggerAction; } | { + /** Fire when the pointer leaves the top of the viewport (exit intent). */ on: "exit-intent"; + /** Only fire when the current URL matches this pattern. */ matchUrl?: UrlPattern; + /** Action to run when the trigger fires. */ action: TriggerAction; } | { + /** Fire immediately when the current URL matches. */ on: "url"; + /** URL pattern that must match for the trigger to fire. */ pattern: UrlPattern; + /** Action to run when the trigger fires. */ action: TriggerAction; }; diff --git a/widget/src/i18n.ts b/widget/src/i18n.ts index 8cd40cf..18fd674 100644 --- a/widget/src/i18n.ts +++ b/widget/src/i18n.ts @@ -1,37 +1,58 @@ +// English is the single source of truth, defined in locales/en.ts. +import { en } from "./locales/en"; + +/** + * Every user-facing string the widget renders. Pass a {@link ClaudiusTranslations} + * (or a partial override) to localize the UI. English is the source of truth; + * see {@link defaultTranslations}. + */ export interface ClaudiusTranslations { - // ChatWindow + /** Chat window header title. */ title: string; + /** Chat window header subtitle. */ subtitle: string; + /** First assistant message shown when the chat opens. */ welcomeMessage: string; + /** Accessible label for the close button. */ closeChat: string; + /** Accessible label for the message list region. */ chatMessages: string; + /** Accessible label for the typing indicator. */ typingIndicator: string; - - // ChatInput + /** Placeholder text for the message input. */ placeholder: string; + /** Accessible label for the send button. */ sendMessage: string; + /** Accessible label for the message input field. */ typeYourMessage: string; - - // ChatToggleButton + /** Accessible label for the button that opens the chat. */ openChat: string; - - // GreetingBubble + /** Accessible label for dismissing the greeting bubble. */ dismissGreeting: string; - - // Errors + /** Generic fallback error message. */ errorGeneric: string; + /** Error shown when the network request fails. */ errorConnection: string; + /** Error shown when a request times out. */ errorTimeout: string; + /** Error shown when rate-limited (per-minute limit). */ errorRateLimitMinute: string; + /** Error shown when rate-limited (per-hour limit). */ errorRateLimitHour: string; + /** Label for the retry action on a failed message. */ errorRetry: string; } -// English is the single source of truth, defined in locales/en.ts. -import { en } from "./locales/en"; - +/** The default (English) translations, used when no locale or override applies. */ export const defaultTranslations: ClaudiusTranslations = en; +/** + * Build a complete {@link ClaudiusTranslations} from the English defaults, + * applying the given overrides. + * + * @param overrides - Strings to override on top of {@link defaultTranslations}. + * @returns A complete translations object. + */ export function createTranslations( overrides?: Partial, ): ClaudiusTranslations { diff --git a/widget/src/index.ts b/widget/src/index.ts index 2d69cde..43a73f9 100644 --- a/widget/src/index.ts +++ b/widget/src/index.ts @@ -6,7 +6,7 @@ export type { } from "./components/ChatWidget"; export { defaultTranslations, createTranslations } from "./i18n"; export { locales, detectLocale, resolveTranslations } from "./locales"; -export type { LocaleCode } from "./locales"; +export type { LocaleCode, ResolveTranslationsOptions } from "./locales"; export type { Trigger, TriggerAction, UrlPattern } from "./hooks/useTriggers"; export { builtinThemes } from "./theme"; export type { diff --git a/widget/src/locales/index.ts b/widget/src/locales/index.ts index 36e647e..1a3655f 100644 --- a/widget/src/locales/index.ts +++ b/widget/src/locales/index.ts @@ -4,8 +4,10 @@ import { es } from "./es"; import { fr } from "./fr"; import { de } from "./de"; +/** BCP-47 primary language subtags the widget ships built-in translations for. */ export type LocaleCode = "en" | "es" | "fr" | "de"; +/** Built-in translations keyed by {@link LocaleCode}. */ export const locales: Record = { en, es, @@ -21,6 +23,12 @@ function normalize(tag: string | undefined | null): LocaleCode | undefined { : undefined; } +/** + * Detect the best {@link LocaleCode} for the current environment: the document + * `lang` attribute first, then the browser language, falling back to `"en"`. + * + * @returns The detected locale code. + */ export function detectLocale(): LocaleCode { const fromHtml = typeof document !== "undefined" @@ -37,11 +45,21 @@ export function detectLocale(): LocaleCode { return "en"; } +/** Options for {@link resolveTranslations}. */ export interface ResolveTranslationsOptions { + /** Locale to use. Defaults to the result of {@link detectLocale}. */ locale?: LocaleCode; + /** Per-string overrides layered over the chosen locale's translations. */ translations?: Partial; } +/** + * Resolve the final translations for a locale, applying any per-string + * overrides on top of the chosen locale's defaults. + * + * @param options - Locale and override settings. + * @returns A complete translations object. + */ export function resolveTranslations( options: ResolveTranslationsOptions = {}, ): ClaudiusTranslations { diff --git a/widget/src/theme/types.ts b/widget/src/theme/types.ts index 0e76196..913e4ac 100644 --- a/widget/src/theme/types.ts +++ b/widget/src/theme/types.ts @@ -30,9 +30,13 @@ export const THEME_SHADOW_TOKENS = [ export const THEME_FONT_TOKENS = ["heading", "body"] as const; +/** Names of the color tokens a theme can override (e.g. `accent`, `surface`, `text`). */ export type ThemeColorToken = (typeof THEME_COLOR_TOKENS)[number]; +/** Names of the border-radius tokens a theme can override. */ export type ThemeRadiusToken = (typeof THEME_RADIUS_TOKENS)[number]; +/** Names of the box-shadow tokens a theme can override. */ export type ThemeShadowToken = (typeof THEME_SHADOW_TOKENS)[number]; +/** Names of the font-family tokens a theme can override. */ export type ThemeFontToken = (typeof THEME_FONT_TOKENS)[number]; /** @@ -44,17 +48,25 @@ export type ThemeFontToken = (typeof THEME_FONT_TOKENS)[number]; * https://claudius-docs.pages.dev/schema/theme.v1.json */ export interface ClaudiusTheme { + /** Optional JSON Schema URL, for editor validation and autocomplete. */ $schema?: string; + /** Human-readable theme name. */ name?: string; /** Initial color scheme this theme is designed for. Defaults to "light". */ colorScheme?: "light" | "dark" | "auto"; + /** Color token overrides applied in both light and dark mode. */ colors?: Partial>; + /** Color token overrides applied only in dark mode, layered over {@link ClaudiusTheme.colors}. */ colorsDark?: Partial>; + /** Border-radius token overrides. */ radii?: Partial>; + /** Box-shadow token overrides. */ shadows?: Partial>; + /** Font-family token overrides. */ fonts?: Partial>; } +/** Names of the built-in themes shipped in {@link builtinThemes}. */ export type BuiltinThemeName = "default" | "minimal" | "playful" | "corporate"; /** diff --git a/widget/typedoc.json b/widget/typedoc.json new file mode 100644 index 0000000..435b9fd --- /dev/null +++ b/widget/typedoc.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "name": "claudius-chat-widget", + "entryPoints": ["src/index.ts"], + "out": "dist/api", + "tsconfig": "tsconfig.json", + "readme": "none", + "githubPages": false, + "excludeInternal": true, + "excludePrivate": true, + "excludeExternals": true, + "exclude": [ + "**/*.test.ts", + "**/*.test.tsx", + "**/*.stories.tsx", + "**/__tests__/**", + "**/test-utils/**" + ], + "validation": { + "notExported": true, + "invalidLink": true, + "notDocumented": true + }, + "requiredToBeDocumented": [ + "Class", + "Interface", + "Function", + "Variable", + "TypeAlias", + "Property", + "Method", + "Accessor", + "EnumMember", + "Constructor" + ], + "intentionallyNotExported": [ + "THEME_COLOR_TOKENS", + "THEME_RADIUS_TOKENS", + "THEME_SHADOW_TOKENS", + "THEME_FONT_TOKENS" + ], + "treatWarningsAsErrors": true +} diff --git a/widget/vite.config.ts b/widget/vite.config.ts index 68fa12f..576dc6b 100644 --- a/widget/vite.config.ts +++ b/widget/vite.config.ts @@ -1,9 +1,37 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; +import dts from "vite-plugin-dts"; import { resolve } from "path"; export default defineConfig({ - plugins: [react()], + plugins: [ + react(), + // Storybook's Vite builder also loads this config, but it builds to its own + // output (not dist/), so the declaration bundler would fail looking for + // dist/index.d.ts. Emit declarations only for the library build. + ...(process.env.STORYBOOK + ? [] + : [ + dts({ + // unplugin-dts (vite-plugin-dts v5) calls declaration bundling + // `bundleTypes` (the old `rollupTypes` name is ignored). This rolls + // the whole public surface into a single dist/index.d.ts via + // api-extractor. + bundleTypes: true, + tsconfigPath: "./tsconfig.json", + include: ["src"], + exclude: [ + "src/**/*.test.ts", + "src/**/*.test.tsx", + "src/**/*.stories.tsx", + "src/test-setup.ts", + "src/test-utils/**", + "src/main.tsx", + "src/embed.tsx", + ], + }), + ]), + ], server: { port: 5173, strictPort: true,