From e95a76dac538900b88b28178056baf3f1d6904df Mon Sep 17 00:00:00 2001 From: Elliott Johnson Date: Tue, 6 Oct 2026 13:11:39 -0600 Subject: [PATCH] feat: unevalStream playground (warp-simple) --- .prettierignore | 2 + .prettierrc | 7 + package.json | 1 + playground/uneval-stream/.gitignore | 23 + playground/uneval-stream/.npmrc | 1 + .../uneval-stream/.vscode/extensions.json | 3 + .../uneval-stream/.vscode/settings.json | 5 + playground/uneval-stream/README.md | 55 + playground/uneval-stream/components.json | 20 + playground/uneval-stream/package.json | 43 + playground/uneval-stream/src/app.css | 700 +++++++++ playground/uneval-stream/src/app.d.ts | 13 + playground/uneval-stream/src/app.html | 12 + .../uneval-stream/src/lib/CodeEditor.svelte | 56 + .../uneval-stream/src/lib/CodeViewer.svelte | 51 + .../uneval-stream/src/lib/ObjectTree.svelte | 61 + .../uneval-stream/src/lib/StreamBlock.svelte | 95 ++ .../uneval-stream/src/lib/assets/favicon.svg | 1 + .../uneval-stream/src/lib/codemirror.ts | 24 + .../src/lib/components/ui/badge/badge.svelte | 50 + .../src/lib/components/ui/badge/index.ts | 2 + .../lib/components/ui/button/button.svelte | 89 ++ .../src/lib/components/ui/button/index.ts | 17 + .../lib/components/ui/scroll-area/index.ts | 10 + .../scroll-area/scroll-area-scrollbar.svelte | 30 + .../ui/scroll-area/scroll-area.svelte | 43 + .../src/lib/components/ui/separator/index.ts | 7 + .../components/ui/separator/separator.svelte | 23 + .../src/lib/components/ui/tabs/index.ts | 18 + .../components/ui/tabs/tabs-content.svelte | 17 + .../lib/components/ui/tabs/tabs-list.svelte | 40 + .../components/ui/tabs/tabs-trigger.svelte | 23 + .../src/lib/components/ui/tabs/tabs.svelte | 19 + .../src/lib/components/ui/tooltip/index.ts | 19 + .../ui/tooltip/tooltip-content.svelte | 52 + .../ui/tooltip/tooltip-portal.svelte | 7 + .../ui/tooltip/tooltip-provider.svelte | 7 + .../ui/tooltip/tooltip-trigger.svelte | 7 + .../lib/components/ui/tooltip/tooltip.svelte | 7 + .../uneval-stream/src/lib/format-source.ts | 36 + playground/uneval-stream/src/lib/index.ts | 1 + playground/uneval-stream/src/lib/snapshot.ts | 178 +++ .../uneval-stream/src/lib/stream-types.ts | 36 + .../uneval-stream/src/lib/stream.worker.ts | 137 ++ playground/uneval-stream/src/lib/utils.ts | 13 + .../uneval-stream/src/routes/+layout.svelte | 16 + .../uneval-stream/src/routes/+page.svelte | 235 +++ playground/uneval-stream/static/robots.txt | 3 + playground/uneval-stream/tsconfig.json | 20 + playground/uneval-stream/vite.config.ts | 22 + pnpm-lock.yaml | 1313 ++++++++++++++++- pnpm-workspace.yaml | 3 + 52 files changed, 3661 insertions(+), 12 deletions(-) create mode 100644 playground/uneval-stream/.gitignore create mode 100644 playground/uneval-stream/.npmrc create mode 100644 playground/uneval-stream/.vscode/extensions.json create mode 100644 playground/uneval-stream/.vscode/settings.json create mode 100644 playground/uneval-stream/README.md create mode 100644 playground/uneval-stream/components.json create mode 100644 playground/uneval-stream/package.json create mode 100644 playground/uneval-stream/src/app.css create mode 100644 playground/uneval-stream/src/app.d.ts create mode 100644 playground/uneval-stream/src/app.html create mode 100644 playground/uneval-stream/src/lib/CodeEditor.svelte create mode 100644 playground/uneval-stream/src/lib/CodeViewer.svelte create mode 100644 playground/uneval-stream/src/lib/ObjectTree.svelte create mode 100644 playground/uneval-stream/src/lib/StreamBlock.svelte create mode 100644 playground/uneval-stream/src/lib/assets/favicon.svg create mode 100644 playground/uneval-stream/src/lib/codemirror.ts create mode 100644 playground/uneval-stream/src/lib/components/ui/badge/badge.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/badge/index.ts create mode 100644 playground/uneval-stream/src/lib/components/ui/button/button.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/button/index.ts create mode 100644 playground/uneval-stream/src/lib/components/ui/scroll-area/index.ts create mode 100644 playground/uneval-stream/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/scroll-area/scroll-area.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/separator/index.ts create mode 100644 playground/uneval-stream/src/lib/components/ui/separator/separator.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/tabs/index.ts create mode 100644 playground/uneval-stream/src/lib/components/ui/tabs/tabs-content.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/tabs/tabs-list.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/tabs/tabs-trigger.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/tabs/tabs.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/tooltip/index.ts create mode 100644 playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-content.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-portal.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-provider.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-trigger.svelte create mode 100644 playground/uneval-stream/src/lib/components/ui/tooltip/tooltip.svelte create mode 100644 playground/uneval-stream/src/lib/format-source.ts create mode 100644 playground/uneval-stream/src/lib/index.ts create mode 100644 playground/uneval-stream/src/lib/snapshot.ts create mode 100644 playground/uneval-stream/src/lib/stream-types.ts create mode 100644 playground/uneval-stream/src/lib/stream.worker.ts create mode 100644 playground/uneval-stream/src/lib/utils.ts create mode 100644 playground/uneval-stream/src/routes/+layout.svelte create mode 100644 playground/uneval-stream/src/routes/+page.svelte create mode 100644 playground/uneval-stream/static/robots.txt create mode 100644 playground/uneval-stream/tsconfig.json create mode 100644 playground/uneval-stream/vite.config.ts diff --git a/.prettierignore b/.prettierignore index 101e4990..378817ef 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,6 +2,8 @@ CHANGELOG.md pnpm-lock.yaml **/node_modules +**/.svelte-kit +**/.vercel **/dist **/build **/test-results diff --git a/.prettierrc b/.prettierrc index ed855ae2..d8ff547d 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,7 +3,14 @@ "singleQuote": true, "trailingComma": "none", "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], "overrides": [ + { + "files": ["*.svelte"], + "options": { + "bracketSameLine": false + } + }, { "files": ["README.md", "**/README.md", "**/package.json"], "options": { diff --git a/package.json b/package.json index b191446f..1cb44dc7 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@js-temporal/polyfill": "^0.5.1", "@types/node": "^24.12.0", "prettier": "^3.2.4", + "prettier-plugin-svelte": "^3.4.0", "publint": "^0.3.12", "typescript": "^7.0.2", "vite": "8.3.0", diff --git a/playground/uneval-stream/.gitignore b/playground/uneval-stream/.gitignore new file mode 100644 index 00000000..3b462cb0 --- /dev/null +++ b/playground/uneval-stream/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/playground/uneval-stream/.npmrc b/playground/uneval-stream/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/playground/uneval-stream/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/playground/uneval-stream/.vscode/extensions.json b/playground/uneval-stream/.vscode/extensions.json new file mode 100644 index 00000000..42ca69cb --- /dev/null +++ b/playground/uneval-stream/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode", "bradlc.vscode-tailwindcss"] +} diff --git a/playground/uneval-stream/.vscode/settings.json b/playground/uneval-stream/.vscode/settings.json new file mode 100644 index 00000000..bc31e155 --- /dev/null +++ b/playground/uneval-stream/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "*.css": "tailwindcss" + } +} diff --git a/playground/uneval-stream/README.md b/playground/uneval-stream/README.md new file mode 100644 index 00000000..9a3081b2 --- /dev/null +++ b/playground/uneval-stream/README.md @@ -0,0 +1,55 @@ +# unevalStream protocol lab + +Interactive Svelte 5 playground for observing `devalue`'s streamed executable graph protocol. + +Pretty formats blocks for display only, while Raw shows the exact source received over the wire. + +## Setup and commands + +Install once from the repository root: + +```sh +pnpm install +pnpm --dir playground/uneval-stream dev +pnpm --dir playground/uneval-stream check +pnpm --dir playground/uneval-stream build +``` + +## Architecture + +- `+page.svelte` owns immutable worker-message snapshots and the block timeline. +- `CodeEditor.svelte` embeds CodeMirror 6 with TypeScript mode and Mod-Enter execution. +- `stream.worker.ts` transpiles TypeScript to CommonJS, evaluates the user module, calls workspace `unevalStream`, and evaluates head/tail source in order in the worker realm. +- `snapshot.ts` turns the reconstructed graph into a structured-cloneable identity/reference tree without JSON serialization. +- `ObjectTree.svelte` renders recursive expandable nodes and aliases. + +## User file contract + +The editor is a single TypeScript CommonJS-transpiled module. It must provide a graph as its default export, and may provide an `unevalStream` replacer as a named `replacer` export. The replacer receives the value and a `js` template tag; interpolated values are serialized by devalue (preserving identity), and returning `undefined` falls back to the default serialization: + +```ts +export class Point { + constructor( + readonly x: number, + readonly y: number + ) {} +} + +export const replacer = ( + value: unknown, + js: (strings: TemplateStringsArray, ...values: unknown[]) => unknown +) => { + if (value instanceof Point) return js`new Point(${value.x},${value.y})`; +}; + +const graph = { answer: Promise.resolve(new Point(3, 4)) }; +export default graph; +``` + +All other named exports are promoted onto the worker's global scope before head/tail blocks are evaluated, so custom constructor source emitted by the replacer (e.g. `new Point(…)`) can revive. The worker is discarded after every run, so promoted globals never leak across runs. + +Static/dynamic imports and dependencies are not exposed to the user module. + +## Security and limitations + +Execution is isolated from the page in a dedicated module Web Worker and Stop terminates it. This is an isolation boundary for UI responsiveness, **not a hardened sandbox**: code can use worker-global browser APIs, consume CPU/memory, and initiate network requests allowed by the browser/CSP. Infinite synchronous work requires termination. TypeScript uses `transpileModule`, so it strips types but does not perform full project type-checking. Snapshots enforce depth/item/byte-preview limits and represent functions, symbols, and inaccessible properties as markers. diff --git a/playground/uneval-stream/components.json b/playground/uneval-stream/components.json new file mode 100644 index 00000000..8a170a35 --- /dev/null +++ b/playground/uneval-stream/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "tailwind": { + "css": "src/app.css", + "baseColor": "neutral" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks", + "lib": "$lib" + }, + "typescript": true, + "registry": "https://shadcn-svelte.com/registry", + "style": "nova", + "iconLibrary": "remixicon", + "menuColor": "default", + "menuAccent": "subtle" +} diff --git a/playground/uneval-stream/package.json b/playground/uneval-stream/package.json new file mode 100644 index 00000000..9f3a7841 --- /dev/null +++ b/playground/uneval-stream/package.json @@ -0,0 +1,43 @@ +{ + "name": "uneval-stream", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, + "dependencies": { + "devalue": "workspace:*" + }, + "devDependencies": { + "@codemirror/lang-javascript": "^6.2.4", + "@codemirror/language": "^6.12.4", + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.38.6", + "@fontsource-variable/roboto": "^5.3.0", + "@internationalized/date": "^3.12.3", + "@lezer/highlight": "^1.2.3", + "@sveltejs/adapter-vercel": "^6.3.4", + "@sveltejs/kit": "^2.63.0", + "@sveltejs/vite-plugin-svelte": "^7.1.2", + "@tailwindcss/vite": "^4.3.0", + "bits-ui": "^2.18.1", + "clsx": "^2.1.1", + "prettier": "^3.9.6", + "remixicon-svelte": "^0.0.5", + "shadcn-svelte": "^1.5.0", + "svelte": "^5.56.1", + "svelte-check": "^4.6.0", + "tailwind-merge": "^3.6.0", + "tailwind-variants": "^3.3.1", + "tailwindcss": "^4.3.0", + "tw-animate-css": "^1.4.0", + "typescript": "^6.0.3", + "vite": "^8.0.16" + } +} diff --git a/playground/uneval-stream/src/app.css b/playground/uneval-stream/src/app.css new file mode 100644 index 00000000..5ca9f4c1 --- /dev/null +++ b/playground/uneval-stream/src/app.css @@ -0,0 +1,700 @@ +@import 'tailwindcss'; +@import 'tw-animate-css'; +@import 'shadcn-svelte/tailwind.css'; +@import '@fontsource-variable/roboto'; + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: oklch(0.12 0.008 255); + --foreground: oklch(0.91 0.012 90); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.841 0.238 128.85); + --primary-foreground: oklch(0.405 0.101 131.063); + --secondary: oklch(0.967 0.001 286.375); + --secondary-foreground: oklch(0.21 0.006 285.885); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.87 0 0); + --chart-2: oklch(0.556 0 0); + --chart-3: oklch(0.439 0 0); + --chart-4: oklch(0.371 0 0); + --chart-5: oklch(0.269 0 0); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.648 0.2 131.684); + --sidebar-primary-foreground: oklch(0.986 0.031 120.757); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.768 0.233 130.85); + --primary-foreground: oklch(0.405 0.101 131.063); + --secondary: oklch(0.274 0.006 286.033); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.87 0 0); + --chart-2: oklch(0.556 0 0); + --chart-3: oklch(0.439 0 0); + --chart-4: oklch(0.371 0 0); + --chart-5: oklch(0.269 0 0); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.768 0.233 130.85); + --sidebar-primary-foreground: oklch(0.274 0.072 132.109); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@theme inline { + --font-sans: 'Roboto Variable', sans-serif; + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --color-foreground: var(--foreground); + --color-background: var(--background); + --radius-sm: calc(var(--radius) * 0.6); + --radius-md: calc(var(--radius) * 0.8); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) * 1.4); + --radius-2xl: calc(var(--radius) * 1.8); + --radius-3xl: calc(var(--radius) * 2.2); + --radius-4xl: calc(var(--radius) * 2.6); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + margin: 0; + min-width: 320px; + background: + radial-gradient(circle at 78% -10%, rgba(55, 72, 60, 0.16), transparent 31rem), #0d0f11; + font-family: 'Roboto Variable', system-ui, sans-serif; + } + html { + @apply font-sans; + } +} + +* { + box-sizing: border-box; +} +button, +a { + -webkit-tap-highlight-color: transparent; +} +button:focus-visible, +a:focus-visible { + outline: 2px solid #d49a45; + outline-offset: 2px; +} +::selection { + background: #a66c2f66; +} +::-webkit-scrollbar { + width: 9px; + height: 9px; +} +::-webkit-scrollbar-thumb { + background: #32373b; + border: 2px solid #111416; + border-radius: 8px; +} +::-webkit-scrollbar-track { + background: #111416; +} +main { + min-height: 100svh; + display: flex; + flex-direction: column; + padding: 0 20px; +} +.topbar { + min-height: 72px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; +} +.brand { + display: flex; + align-items: center; + gap: 12px; +} +.brand-mark { + color: #e0a558; + border: 1px solid #765b35; + background: #231c13; + padding: 6px 8px; + border-radius: 5px; + font: + 700 14px ui-monospace, + monospace; +} +h1 { + font: + 650 16px ui-monospace, + monospace; + letter-spacing: -0.02em; + margin: 0; +} +.brand p { + color: #727a80; + font: + 10px ui-monospace, + monospace; + letter-spacing: 0.08em; + text-transform: uppercase; + margin: 3px 0 0; +} +.header-stats { + display: flex; + gap: 16px; + align-items: center; + color: #747c82; + font: + 11px ui-monospace, + monospace; +} +.workspace { + flex: 1; + display: grid; + grid-template-columns: minmax(360px, 0.95fr) minmax(420px, 1.05fr); + gap: 12px; + padding: 12px 0; + min-height: 0; + height: calc(100svh - 111px); +} +.panel { + min-height: 0; + overflow: hidden; + border: 1px solid #292d30; + border-radius: 8px; + background: #111416; + box-shadow: 0 12px 38px #0005; +} +.editor-panel { + display: flex; + flex-direction: column; +} +.panel-header, +.result-header { + min-height: 47px; + border-bottom: 1px solid #292d30; + background: #15181a; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 12px; + gap: 10px; +} +.file-label, +.actions, +.block-meta { + display: flex; + align-items: center; + gap: 9px; +} +.ts-icon { + font: + 700 10px ui-monospace, + monospace; + color: #7ab4d8; + background: #15242d; + border: 1px solid #254252; + border-radius: 3px; + padding: 3px; +} +.file-label strong { + font: + 12px ui-monospace, + monospace; +} +.dirty-dot, +.live-dot { + width: 5px; + height: 5px; + border-radius: 50%; + background: #d99c4b; +} +.status { + font: + 10px ui-monospace, + monospace; + color: #7e878d; + text-transform: uppercase; + display: flex; + align-items: center; + gap: 6px; +} +.status i, +.pending-row i, +.page-footer i { + width: 6px; + height: 6px; + border-radius: 50%; + background: #62696d; +} +.status-streaming i, +.status-complete i { + background: #55ad78; + box-shadow: 0 0 8px #55ad78aa; +} +.status-compiling i, +.status-stopped i { + background: #d49a45; +} +.status-error i { + background: #e06c69; +} +kbd { + font: + 9px ui-monospace, + monospace; + opacity: 0.7; + border-left: 1px solid #0004; + padding-left: 6px; +} +.editor-wrap { + flex: 1; + min-height: 0; +} +.editor-shell { + height: 100%; +} +.editor-footer { + min-height: 30px; + border-top: 1px solid #292d30; + display: flex; + align-items: center; + gap: 18px; + padding: 0 12px; + color: #687177; + font: + 10px ui-monospace, + monospace; +} +.cm-editor { + background: #101315; + color: #c9ccca; + font: + 12px/1.7 ui-monospace, + SFMono-Regular, + Consolas, + monospace; +} +.cm-editor.cm-focused { + outline: none; +} +.cm-gutters { + background: #101315 !important; + color: #454c51 !important; + border: 0 !important; +} +.cm-activeLine, +.cm-activeLineGutter { + background: #1a1e2055 !important; +} +.cm-content { + padding: 12px 0; + caret-color: #e0a558; +} +.cm-selectionBackground { + background: #37424b !important; +} +.results-tabs { + height: 100%; + gap: 0 !important; +} +.result-header { + padding-left: 6px; +} +.result-header-tools { + display: flex; + align-items: center; + gap: 10px; +} +.protocol { + color: #596167; + font: + 9px ui-monospace, + monospace; + text-transform: uppercase; + letter-spacing: 0.06em; +} +.display-toggle { + display: flex; + align-items: center; + padding: 2px; + border: 1px solid #303539; + border-radius: 7px; + background: #0f1214; +} +.display-toggle button { + height: 22px; + min-width: 48px; + border-radius: 5px; + font: + 10px ui-monospace, + monospace; +} +.tab-content { + flex: 1; + min-height: 0; + margin: 0 !important; +} +.result-scroll { + height: 100%; +} +.timeline, +.object-pane { + padding: 14px; + min-height: 100%; +} +.stream-block { + border: 1px solid #292e31; + border-left: 2px solid #3b4145; + border-radius: 6px; + margin-bottom: 10px; + background: #0e1113; + overflow: hidden; + transition: + border-color 0.2s, + box-shadow 0.2s; +} +.stream-block.latest { + border-left-color: #d69a49; + box-shadow: inset 0 0 24px #bd7f2210; +} +.stream-block header { + min-height: 38px; + background: #15191b; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 8px; +} +.block-toggle { + color: #c4c8c6; + border: 0; + background: none; + font: + 11px ui-monospace, + monospace; + display: flex; + gap: 8px; + cursor: pointer; +} +.block-toggle span { + color: #858d92; +} +.block-meta { + color: #6e777c; + font: + 10px ui-monospace, + monospace; +} +.formatting-state { + color: #8c795e; +} +.code-viewer { + border-top: 1px solid #24282b; + background: #0e1113; +} +.code-viewer .cm-editor { + height: auto; + background: transparent; + font-size: 11px; + line-height: 1.6; +} +.code-viewer .cm-content { + padding: 13px; + caret-color: transparent; + white-space: pre-wrap; + word-break: break-word; +} +.code-viewer .cm-line { + padding: 0; +} +.code-viewer .cm-gutters { + background: transparent !important; + border-right: 1px solid #24282b !important; +} +.code-viewer .cm-scroller { + overflow: visible; +} +.error-box pre { + margin: 0; + padding: 13px; + overflow: auto; + color: #aebbb4; + font: + 11px/1.6 ui-monospace, + monospace; + border-top: 1px solid #24282b; + white-space: pre-wrap; + word-break: break-word; +} +.pending-row { + color: #767f84; + display: flex; + align-items: center; + gap: 9px; + font: + 10px ui-monospace, + monospace; + padding: 12px; +} +.pending-row i { + background: #d49a45; + animation: pulse 1.2s infinite; +} +.error-box { + border: 1px solid #6f3738; + background: #211415; + color: #ef8f8c; + border-radius: 6px; + padding-top: 10px; +} +.error-box strong { + padding: 12px; + font-size: 12px; +} +.empty { + min-height: 360px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + color: #666e73; +} +.empty > span { + font: + 30px ui-monospace, + monospace; + color: #9c7541; +} +.empty h2 { + color: #a2a8a8; + font: + 500 13px ui-monospace, + monospace; + margin: 12px 0 4px; +} +.empty p { + max-width: 360px; + font-size: 12px; + line-height: 1.6; +} +.empty code { + color: #c8904d; +} +.object-note { + border: 1px solid #2d3932; + background: #101913; + color: #748078; + border-radius: 5px; + padding: 9px 11px; + margin-bottom: 12px; + font: + 10px/1.5 ui-monospace, + monospace; +} +.object-note span { + color: #64a87a; + margin-right: 8px; +} +.tree-node { + font: + 11px/1.8 ui-monospace, + monospace; +} +.tree-row { + min-height: 25px; + display: flex; + align-items: center; + gap: 6px; +} +.tree-toggle { + width: 18px; + height: 18px; + border: 0; + color: #7f898e; + background: transparent; + cursor: pointer; +} +.tree-spacer { + width: 18px; +} +.tree-key { + color: #9aaab3; +} +.punct, +.tree-meta { + color: #515b61; +} +.tree-value { + color: #c5c7bf; +} +.kind-string { + color: #80ab78; +} +.kind-number, +.kind-bigint, +.kind-boolean { + color: #d1a363; +} +.kind-ref { + color: #d79b4e; + text-decoration: underline; +} +.kind-undefined, +.kind-null { + color: #797f83; + font-style: italic; +} +.identity { + color: #d49a45 !important; + border-color: #57452e !important; + height: 17px !important; + padding: 0 5px !important; +} +.tree-children { + margin-left: 9px; + padding-left: 13px; + border-left: 1px solid #292e31; +} +.page-footer { + min-height: 27px; + display: flex; + align-items: center; + gap: 18px; + color: #5f686d; + font: + 9px ui-monospace, + monospace; + text-transform: uppercase; +} +.page-footer span { + display: flex; + align-items: center; + gap: 6px; +} +.page-footer .green { + background: #54a873; +} +.page-footer .amber { + background: #d49a45; +} +.page-footer .spacer { + flex: 1; +} +.page-footer a { + color: #747d82; + text-decoration: none; +} +@keyframes pulse { + 50% { + opacity: 0.3; + } +} +@media (max-width: 850px) { + main { + padding: 0 10px; + } + .header-stats span:not(:first-child), + .protocol { + display: none; + } + .workspace { + height: auto; + grid-template-columns: 1fr; + } + .panel { + min-height: 560px; + } + .results-panel { + min-height: 650px; + } + .page-footer { + flex-wrap: wrap; + } + .topbar { + min-height: 64px; + } + .brand p { + display: none; + } + .result-header { + padding-right: 6px; + } + .display-toggle button { + min-width: 42px; + } +} +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + transition-duration: 0.01ms !important; + } +} diff --git a/playground/uneval-stream/src/app.d.ts b/playground/uneval-stream/src/app.d.ts new file mode 100644 index 00000000..da08e6da --- /dev/null +++ b/playground/uneval-stream/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/playground/uneval-stream/src/app.html b/playground/uneval-stream/src/app.html new file mode 100644 index 00000000..6a2bb582 --- /dev/null +++ b/playground/uneval-stream/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/playground/uneval-stream/src/lib/CodeEditor.svelte b/playground/uneval-stream/src/lib/CodeEditor.svelte new file mode 100644 index 00000000..7a9d99ec --- /dev/null +++ b/playground/uneval-stream/src/lib/CodeEditor.svelte @@ -0,0 +1,56 @@ + + +
diff --git a/playground/uneval-stream/src/lib/CodeViewer.svelte b/playground/uneval-stream/src/lib/CodeViewer.svelte new file mode 100644 index 00000000..f0330e69 --- /dev/null +++ b/playground/uneval-stream/src/lib/CodeViewer.svelte @@ -0,0 +1,51 @@ + + +
diff --git a/playground/uneval-stream/src/lib/ObjectTree.svelte b/playground/uneval-stream/src/lib/ObjectTree.svelte new file mode 100644 index 00000000..30acba7d --- /dev/null +++ b/playground/uneval-stream/src/lib/ObjectTree.svelte @@ -0,0 +1,61 @@ + + +
+
+ {#if expandable} + + {:else}{/if} + {name}: + {node.ref ? `↗ #${node.ref}` : (node.value ?? node.kind)} + {#if node.id}#{node.id}{/if} + {#if node.state}{node.state}{/if} + {#if node.meta}{node.meta}{/if} +
+ {#if open && node.children} +
+ {#each node.children as child, index (`${child.key}-${index}`)} + + {/each} +
+ {/if} +
+ + diff --git a/playground/uneval-stream/src/lib/StreamBlock.svelte b/playground/uneval-stream/src/lib/StreamBlock.svelte new file mode 100644 index 00000000..f6aee3b9 --- /dev/null +++ b/playground/uneval-stream/src/lib/StreamBlock.svelte @@ -0,0 +1,95 @@ + + +
+
+ + {#if mode === 'pretty'} + {#await prettySource} +
+ formatting…{block.bytes} B+{block.elapsed.toFixed(0)} ms{copied ? 'Copied' : 'Copy source'} +
+ {:then formatted} +
+ {block.bytes} B+{block.elapsed.toFixed(0)} ms{copied ? 'Copied' : 'Copy source'} +
+ {/await} + {:else} +
+ {block.bytes} B+{block.elapsed.toFixed(0)} ms{copied ? 'Copied' : 'Copy source'} +
+ {/if} +
+ {#if open} + {#if mode === 'pretty'} + {#await prettySource}{:then formatted}{/await} + {:else}{/if} + {/if} +
diff --git a/playground/uneval-stream/src/lib/assets/favicon.svg b/playground/uneval-stream/src/lib/assets/favicon.svg new file mode 100644 index 00000000..cc5dc66a --- /dev/null +++ b/playground/uneval-stream/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/playground/uneval-stream/src/lib/codemirror.ts b/playground/uneval-stream/src/lib/codemirror.ts new file mode 100644 index 00000000..cade90c9 --- /dev/null +++ b/playground/uneval-stream/src/lib/codemirror.ts @@ -0,0 +1,24 @@ +import { HighlightStyle, syntaxHighlighting } from '@codemirror/language'; +import { tags } from '@lezer/highlight'; + +export const javascriptHighlightStyle = HighlightStyle.define([ + { tag: [tags.keyword, tags.controlKeyword, tags.moduleKeyword], color: '#f5a524' }, + { tag: [tags.typeName, tags.className, tags.namespace], color: '#5eead4' }, + { tag: [tags.string, tags.special(tags.string)], color: '#86d98b' }, + { tag: [tags.number, tags.bool, tags.null], color: '#f6c85f' }, + { + tag: [tags.lineComment, tags.blockComment, tags.docComment], + color: '#7f8c9f', + fontStyle: 'italic' + }, + { tag: [tags.function(tags.variableName), tags.function(tags.propertyName)], color: '#c4b5fd' }, + { tag: tags.propertyName, color: '#7dd3fc' }, + { tag: [tags.variableName, tags.definition(tags.variableName)], color: '#e5e7eb' }, + { + tag: [tags.operator, tags.updateOperator, tags.logicOperator, tags.compareOperator], + color: '#fb7185' + }, + { tag: [tags.punctuation, tags.bracket, tags.separator], color: '#94a3b8' } +]); + +export const javascriptSyntaxHighlighting = syntaxHighlighting(javascriptHighlightStyle); diff --git a/playground/uneval-stream/src/lib/components/ui/badge/badge.svelte b/playground/uneval-stream/src/lib/components/ui/badge/badge.svelte new file mode 100644 index 00000000..9018911d --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/badge/badge.svelte @@ -0,0 +1,50 @@ + + + + + + {@render children?.()} + diff --git a/playground/uneval-stream/src/lib/components/ui/badge/index.ts b/playground/uneval-stream/src/lib/components/ui/badge/index.ts new file mode 100644 index 00000000..f05fb87f --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/badge/index.ts @@ -0,0 +1,2 @@ +export { default as Badge } from './badge.svelte'; +export { badgeVariants, type BadgeVariant } from './badge.svelte'; diff --git a/playground/uneval-stream/src/lib/components/ui/button/button.svelte b/playground/uneval-stream/src/lib/components/ui/button/button.svelte new file mode 100644 index 00000000..c6c43b0d --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/button/button.svelte @@ -0,0 +1,89 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/playground/uneval-stream/src/lib/components/ui/button/index.ts b/playground/uneval-stream/src/lib/components/ui/button/index.ts new file mode 100644 index 00000000..5414d9d3 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/button/index.ts @@ -0,0 +1,17 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants +} from './button.svelte'; + +export { + Root, + type ButtonProps as Props, + // + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant +}; diff --git a/playground/uneval-stream/src/lib/components/ui/scroll-area/index.ts b/playground/uneval-stream/src/lib/components/ui/scroll-area/index.ts new file mode 100644 index 00000000..d5468067 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/scroll-area/index.ts @@ -0,0 +1,10 @@ +import Scrollbar from './scroll-area-scrollbar.svelte'; +import Root from './scroll-area.svelte'; + +export { + Root, + Scrollbar, + //, + Root as ScrollArea, + Scrollbar as ScrollAreaScrollbar +}; diff --git a/playground/uneval-stream/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte b/playground/uneval-stream/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte new file mode 100644 index 00000000..9c257230 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte @@ -0,0 +1,30 @@ + + + + {@render children?.()} + + diff --git a/playground/uneval-stream/src/lib/components/ui/scroll-area/scroll-area.svelte b/playground/uneval-stream/src/lib/components/ui/scroll-area/scroll-area.svelte new file mode 100644 index 00000000..ef3a87d8 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/scroll-area/scroll-area.svelte @@ -0,0 +1,43 @@ + + + + + {@render children?.()} + + {#if orientation === 'vertical' || orientation === 'both'} + + {/if} + {#if orientation === 'horizontal' || orientation === 'both'} + + {/if} + + diff --git a/playground/uneval-stream/src/lib/components/ui/separator/index.ts b/playground/uneval-stream/src/lib/components/ui/separator/index.ts new file mode 100644 index 00000000..768efac9 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from './separator.svelte'; + +export { + Root, + // + Root as Separator +}; diff --git a/playground/uneval-stream/src/lib/components/ui/separator/separator.svelte b/playground/uneval-stream/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 00000000..40dcb92a --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,23 @@ + + + diff --git a/playground/uneval-stream/src/lib/components/ui/tabs/index.ts b/playground/uneval-stream/src/lib/components/ui/tabs/index.ts new file mode 100644 index 00000000..c5a15a0b --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tabs/index.ts @@ -0,0 +1,18 @@ +import Content from './tabs-content.svelte'; +import Trigger from './tabs-trigger.svelte'; +import Root from './tabs.svelte'; +import List, { tabsListVariants, type TabsListVariant } from './tabs-list.svelte'; + +export { + Root, + Content, + List, + Trigger, + tabsListVariants, + type TabsListVariant, + // + Root as Tabs, + Content as TabsContent, + List as TabsList, + Trigger as TabsTrigger +}; diff --git a/playground/uneval-stream/src/lib/components/ui/tabs/tabs-content.svelte b/playground/uneval-stream/src/lib/components/ui/tabs/tabs-content.svelte new file mode 100644 index 00000000..b3f21369 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tabs/tabs-content.svelte @@ -0,0 +1,17 @@ + + + diff --git a/playground/uneval-stream/src/lib/components/ui/tabs/tabs-list.svelte b/playground/uneval-stream/src/lib/components/ui/tabs/tabs-list.svelte new file mode 100644 index 00000000..74e39a0e --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tabs/tabs-list.svelte @@ -0,0 +1,40 @@ + + + + + diff --git a/playground/uneval-stream/src/lib/components/ui/tabs/tabs-trigger.svelte b/playground/uneval-stream/src/lib/components/ui/tabs/tabs-trigger.svelte new file mode 100644 index 00000000..81916fae --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tabs/tabs-trigger.svelte @@ -0,0 +1,23 @@ + + + diff --git a/playground/uneval-stream/src/lib/components/ui/tabs/tabs.svelte b/playground/uneval-stream/src/lib/components/ui/tabs/tabs.svelte new file mode 100644 index 00000000..4adebd07 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tabs/tabs.svelte @@ -0,0 +1,19 @@ + + + diff --git a/playground/uneval-stream/src/lib/components/ui/tooltip/index.ts b/playground/uneval-stream/src/lib/components/ui/tooltip/index.ts new file mode 100644 index 00000000..b98d5771 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tooltip/index.ts @@ -0,0 +1,19 @@ +import Content from './tooltip-content.svelte'; +import Portal from './tooltip-portal.svelte'; +import Provider from './tooltip-provider.svelte'; +import Trigger from './tooltip-trigger.svelte'; +import Root from './tooltip.svelte'; + +export { + Root, + Trigger, + Content, + Provider, + Portal, + // + Root as Tooltip, + Content as TooltipContent, + Trigger as TooltipTrigger, + Provider as TooltipProvider, + Portal as TooltipPortal +}; diff --git a/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-content.svelte b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-content.svelte new file mode 100644 index 00000000..4a687949 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-content.svelte @@ -0,0 +1,52 @@ + + + + + {@render children?.()} + + {#snippet child({ props })} +
+ {/snippet} +
+
+
diff --git a/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-portal.svelte b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-portal.svelte new file mode 100644 index 00000000..7d328f01 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-provider.svelte b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-provider.svelte new file mode 100644 index 00000000..fde5bb28 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-provider.svelte @@ -0,0 +1,7 @@ + + + diff --git a/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-trigger.svelte b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-trigger.svelte new file mode 100644 index 00000000..0f041627 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip-trigger.svelte @@ -0,0 +1,7 @@ + + + diff --git a/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip.svelte b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip.svelte new file mode 100644 index 00000000..16eeb706 --- /dev/null +++ b/playground/uneval-stream/src/lib/components/ui/tooltip/tooltip.svelte @@ -0,0 +1,7 @@ + + + diff --git a/playground/uneval-stream/src/lib/format-source.ts b/playground/uneval-stream/src/lib/format-source.ts new file mode 100644 index 00000000..5960e055 --- /dev/null +++ b/playground/uneval-stream/src/lib/format-source.ts @@ -0,0 +1,36 @@ +import type { Plugin } from 'prettier'; + +let prettierPromise: + | Promise<{ + format: (source: string, options: Record) => Promise; + babel: Plugin; + estree: Plugin; + }> + | undefined; + +function loadPrettier() { + return (prettierPromise ??= Promise.all([ + import('prettier/standalone'), + import('prettier/plugins/babel'), + import('prettier/plugins/estree') + ]).then(([prettier, babel, estree]) => ({ + format: prettier.format, + babel: babel.default, + estree: estree.default + }))); +} + +export async function formatSource(source: string): Promise { + try { + const prettier = await loadPrettier(); + return await prettier.format(source, { + parser: 'babel', + plugins: [prettier.babel, prettier.estree], + useTabs: true, + singleQuote: true, + printWidth: 90 + }); + } catch { + return source; + } +} diff --git a/playground/uneval-stream/src/lib/index.ts b/playground/uneval-stream/src/lib/index.ts new file mode 100644 index 00000000..856f2b6c --- /dev/null +++ b/playground/uneval-stream/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/playground/uneval-stream/src/lib/snapshot.ts b/playground/uneval-stream/src/lib/snapshot.ts new file mode 100644 index 00000000..34c4d9a5 --- /dev/null +++ b/playground/uneval-stream/src/lib/snapshot.ts @@ -0,0 +1,178 @@ +import type { SnapshotEntry, SnapshotNode } from './stream-types'; + +const MAX_DEPTH = 9; +const MAX_ITEMS = 80; + +export interface SnapshotContext { + identities: WeakMap; + nextId: number; +} + +export function createSnapshotContext(): SnapshotContext { + return { identities: new WeakMap(), nextId: 1 }; +} + +export function snapshotGraph(root: unknown, context = createSnapshotContext()): SnapshotNode { + const visited = new Set(); + + function primitive(value: unknown): SnapshotNode | undefined { + if (value === null) return { kind: 'null', value: 'null' }; + switch (typeof value) { + case 'undefined': + return { kind: 'undefined', value: 'undefined' }; + case 'string': + return { kind: 'string', value }; + case 'boolean': + return { kind: 'boolean', value: String(value) }; + case 'number': + return { kind: 'number', value: Object.is(value, -0) ? '-0' : String(value) }; + case 'bigint': + return { kind: 'bigint', value: `${value}n` }; + case 'symbol': + return { kind: 'symbol', value: String(value) }; + case 'function': + return { kind: 'function', value: `[Function ${(value as Function).name || 'anonymous'}]` }; + } + } + + function visit(value: unknown, depth: number): SnapshotNode { + const leaf = primitive(value); + if (leaf) return leaf; + const object = value as object; + let id = context.identities.get(object); + if (id === undefined) { + id = context.nextId++; + context.identities.set(object, id); + } + if (visited.has(object)) return { kind: 'ref', ref: id }; + visited.add(object); + if (depth >= MAX_DEPTH) return { kind: 'truncated', id, value: 'depth limit' }; + + if (value instanceof Promise) { + const tracker = ( + value as Promise & { __unevalTracker?: { state: string; value?: unknown } } + ).__unevalTracker; + return tracker + ? { + kind: 'Promise', + id, + state: tracker.state as 'pending' | 'fulfilled' | 'rejected', + children: + tracker.state === 'pending' + ? [] + : [ + { + key: tracker.state === 'rejected' ? 'reason' : 'value', + value: visit(tracker.value, depth + 1) + } + ] + } + : { kind: 'Promise', id, state: 'pending' }; + } + if (value instanceof Date) + return { + kind: 'Date', + id, + value: Number.isNaN(value.getTime()) ? 'Invalid Date' : value.toISOString() + }; + if (value instanceof RegExp) return { kind: 'RegExp', id, value: String(value) }; + if (value instanceof URL) return { kind: 'URL', id, value: value.href }; + if (value instanceof URLSearchParams) + return { kind: 'URLSearchParams', id, value: value.toString() }; + if (value instanceof ArrayBuffer) + return { + kind: 'ArrayBuffer', + id, + meta: `${value.byteLength} bytes`, + value: bytes(new Uint8Array(value)) + }; + if (ArrayBuffer.isView(value)) { + const view = value as ArrayBufferView; + return { + kind: value.constructor.name, + id, + meta: `${view.byteLength} bytes`, + value: bytes(new Uint8Array(view.buffer, view.byteOffset, view.byteLength)) + }; + } + if (value instanceof Map) { + const children: SnapshotEntry[] = []; + let index = 0; + for (const [key, item] of value) { + if (index >= MAX_ITEMS) break; + children.push({ + key: `entry ${index}`, + value: { + kind: 'entry', + children: [ + { key: 'key', value: visit(key, depth + 1) }, + { key: 'value', value: visit(item, depth + 1) } + ] + } + }); + index++; + } + return { + kind: 'Map', + id, + meta: `${value.size} entries`, + children: truncate(children, value.size) + }; + } + if (value instanceof Set) { + const children = Array.from(value) + .slice(0, MAX_ITEMS) + .map((item, index) => ({ key: String(index), value: visit(item, depth + 1) })); + return { + kind: 'Set', + id, + meta: `${value.size} values`, + children: truncate(children, value.size) + }; + } + if (value instanceof Error) + return { + kind: value.name, + id, + value: value.message, + children: + value.cause === undefined ? [] : [{ key: 'cause', value: visit(value.cause, depth + 1) }] + }; + const keys = Reflect.ownKeys(object); + const children: SnapshotEntry[] = []; + for (const key of keys.slice(0, MAX_ITEMS)) { + try { + children.push({ + key: typeof key === 'symbol' ? String(key) : key, + value: visit(Reflect.get(object, key), depth + 1) + }); + } catch (error) { + children.push({ + key: String(key), + value: { kind: 'Thrown', value: error instanceof Error ? error.message : String(error) } + }); + } + } + return { + kind: Array.isArray(value) ? 'Array' : value?.constructor?.name || 'Object', + id, + meta: Array.isArray(value) ? `${value.length} items` : undefined, + children: truncate(children, keys.length) + }; + } + + return visit(root, 0); +} + +function bytes(value: Uint8Array): string { + const shown = Array.from(value.slice(0, 32), (byte) => byte.toString(16).padStart(2, '0')).join( + ' ' + ); + return value.length > 32 ? `${shown} …` : shown; +} + +function truncate(children: SnapshotEntry[], size: number): SnapshotEntry[] { + return size > MAX_ITEMS + ? [...children, { key: '…', value: { kind: 'truncated', value: `${size - MAX_ITEMS} more` } }] + : children; +} diff --git a/playground/uneval-stream/src/lib/stream-types.ts b/playground/uneval-stream/src/lib/stream-types.ts new file mode 100644 index 00000000..893ef659 --- /dev/null +++ b/playground/uneval-stream/src/lib/stream-types.ts @@ -0,0 +1,36 @@ +export type RunStatus = 'idle' | 'compiling' | 'streaming' | 'complete' | 'error' | 'stopped'; + +export type SnapshotNode = { + kind: string; + id?: number; + ref?: number; + label?: string; + value?: string; + meta?: string; + state?: 'pending' | 'fulfilled' | 'rejected'; + children?: SnapshotEntry[]; +}; + +export type SnapshotEntry = { key: string; value: SnapshotNode }; + +export type WorkerMessage = + | { type: 'status'; runId: number; status: RunStatus; elapsed: number } + | { + type: 'block'; + runId: number; + kind: 'head' | 'tail'; + index: number; + source: string; + bytes: number; + elapsed: number; + } + | { type: 'snapshot'; runId: number; snapshot: SnapshotNode; elapsed: number } + | { type: 'error'; runId: number; message: string; stack?: string; elapsed: number } + | { type: 'done'; runId: number; elapsed: number }; + +export type WorkerPayload = + | { type: 'status'; status: RunStatus } + | { type: 'block'; kind: 'head' | 'tail'; index: number; source: string; bytes: number } + | { type: 'snapshot'; snapshot: SnapshotNode } + | { type: 'error'; message: string; stack?: string } + | { type: 'done' }; diff --git a/playground/uneval-stream/src/lib/stream.worker.ts b/playground/uneval-stream/src/lib/stream.worker.ts new file mode 100644 index 00000000..9c3a94bd --- /dev/null +++ b/playground/uneval-stream/src/lib/stream.worker.ts @@ -0,0 +1,137 @@ +/// +import { unevalStream } from 'devalue'; +import ts from 'typescript'; +import { createSnapshotContext, snapshotGraph } from './snapshot'; +import type { WorkerPayload } from './stream-types'; + +const scope: DedicatedWorkerGlobalScope = self as unknown as DedicatedWorkerGlobalScope; + +scope.onmessage = async ({ data }: MessageEvent<{ runId: number; source: string }>) => { + const { runId, source } = data; + const start = performance.now(); + const post = (message: WorkerPayload) => + scope.postMessage({ ...message, runId, elapsed: performance.now() - start }); + try { + post({ type: 'status', status: 'compiling' }); + const output = ts.transpileModule(source, { + compilerOptions: { + module: ts.ModuleKind.CommonJS, + target: ts.ScriptTarget.ES2022, + esModuleInterop: true + }, + reportDiagnostics: true + }); + const errors = + output.diagnostics?.filter( + (diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error + ) ?? []; + if (errors.length) + throw new Error( + errors + .map((diagnostic) => ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')) + .join('\n') + ); + const module = { exports: {} as Record }; + new Function('module', 'exports', `${output.outputText}\n//# sourceURL=example.ts`)( + module, + module.exports + ); + const graph = module.exports.default; + if (graph === undefined) throw new Error('example.ts must export a default graph'); + const replacer = module.exports.replacer; + if (replacer !== undefined && typeof replacer !== 'function') + throw new Error('example.ts `replacer` export must be a function'); + // Custom replacer output may reference module-scope constructors (e.g. `new Point(…)`). + // Head/tail blocks are evaluated in the worker's global scope, so named exports are + // promoted onto it, letting users revive custom sources by exporting their classes. + // The worker is discarded after every run, so this cannot leak across runs. + for (const [key, value] of Object.entries(module.exports)) { + if (key !== 'default' && key !== 'replacer') + (scope as unknown as Record)[key] = value; + } + + const stream = unevalStream(graph, replacer as Parameters[1], { + id: `playground-${runId}` + }); + post({ type: 'status', status: 'streaming' }); + post({ + type: 'block', + kind: 'head', + index: 0, + source: stream.head, + bytes: new Blob([stream.head]).size + }); + const root = new Function(`return (${stream.head})`)(); + const snapshotContext = createSnapshotContext(); + const discover = createTrackerDiscovery(); + discover(root); + await settleTrackers(); + post({ type: 'snapshot', snapshot: snapshotGraph(root, snapshotContext) }); + let index = 1; + for await (const block of stream.tail) { + post({ type: 'block', kind: 'tail', index, source: block, bytes: new Blob([block]).size }); + new Function(block)(); + await settleTrackers(); + post({ type: 'snapshot', snapshot: snapshotGraph(root, snapshotContext) }); + index++; + } + await settleTrackers(); + post({ type: 'snapshot', snapshot: snapshotGraph(root, snapshotContext) }); + post({ type: 'done' }); + } catch (error) { + post({ + type: 'error', + message: error instanceof Error ? error.message : String(error), + stack: error instanceof Error ? error.stack : undefined + }); + } +}; + +function createTrackerDiscovery(): (root: unknown) => void { + const seen = new WeakSet(); + function visit(value: unknown): void { + if ( + (typeof value !== 'object' && typeof value !== 'function') || + value === null || + seen.has(value as object) + ) + return; + seen.add(value as object); + if (value instanceof Promise) { + const tracked = value as Promise & { + __unevalTracker?: { state: string; value?: unknown }; + }; + tracked.__unevalTracker = { state: 'pending' }; + value.then( + (result) => { + tracked.__unevalTracker = { state: 'fulfilled', value: result }; + visit(result); + }, + (reason) => { + tracked.__unevalTracker = { state: 'rejected', value: reason }; + } + ); + return; + } + if (value instanceof Map) + for (const [key, item] of value) { + visit(key); + visit(item); + } + else if (value instanceof Set) for (const item of value) visit(item); + else + for (const key of Reflect.ownKeys(value as object)) { + try { + visit(Reflect.get(value as object, key)); + } catch { + /* snapshot reports inaccessible values */ + } + } + } + return visit; +} + +async function settleTrackers(): Promise { + await Promise.resolve(); + await Promise.resolve(); +} diff --git a/playground/uneval-stream/src/lib/utils.ts b/playground/uneval-stream/src/lib/utils.ts new file mode 100644 index 00000000..f92bfcbb --- /dev/null +++ b/playground/uneval-stream/src/lib/utils.ts @@ -0,0 +1,13 @@ +import { clsx, type ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChild = T extends { child?: any } ? Omit : T; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChildren = T extends { children?: any } ? Omit : T; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithElementRef = T & { ref?: U | null }; diff --git a/playground/uneval-stream/src/routes/+layout.svelte b/playground/uneval-stream/src/routes/+layout.svelte new file mode 100644 index 00000000..032be8f6 --- /dev/null +++ b/playground/uneval-stream/src/routes/+layout.svelte @@ -0,0 +1,16 @@ + + + + + unevalStream · protocol lab + + +{@render children()} diff --git a/playground/uneval-stream/src/routes/+page.svelte b/playground/uneval-stream/src/routes/+page.svelte new file mode 100644 index 00000000..6cb2ff9d --- /dev/null +++ b/playground/uneval-stream/src/routes/+page.svelte @@ -0,0 +1,235 @@ + + + +
+
+
+ d/ +
+

unevalStream

+

executable graph transport · protocol lab

+
+
+
+ worker isolate{blocks.length} blocks{blockBytes} bytes{elapsed.toFixed(0)} ms +
+
+ +
+
+
+
+ TSexample.ts +
+
+ {status} + {#if running}{/if} + +
+
+
+
+ TypeScript · ES2022export default graph · optional replacerisolated worker +
+
+ +
+ +
+ Stream {blocks.length}Object graph {#if snapshot}{/if} +
+ chronological · source before eval +
+ +
+
+
+ +
+ {#each blocks as block (block.kind + block.index)}{:else}
+ ∿ +

Awaiting protocol blocks

+

+ Run example.ts to emit the head expression and asynchronous tails. +

+ +
{/each} + {#if error}
+ Worker error +
{error}
+
{/if} + {#if running && blocks.length}
+ waiting for the next async settlement… +
{/if} +
+
+
+ {#if snapshot}
+ LIVE SNAPSHOT Stable identities preserve aliases and cycles. +
+ {:else}
+ { } +

No reconstructed graph

+

The object view updates after the head and every evaluated tail block.

+
{/if} +
+
+
+
+ +
+
diff --git a/playground/uneval-stream/static/robots.txt b/playground/uneval-stream/static/robots.txt new file mode 100644 index 00000000..b6dd6670 --- /dev/null +++ b/playground/uneval-stream/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/playground/uneval-stream/tsconfig.json b/playground/uneval-stream/tsconfig.json new file mode 100644 index 00000000..2c2ed3c4 --- /dev/null +++ b/playground/uneval-stream/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/playground/uneval-stream/vite.config.ts b/playground/uneval-stream/vite.config.ts new file mode 100644 index 00000000..2bb3b7e5 --- /dev/null +++ b/playground/uneval-stream/vite.config.ts @@ -0,0 +1,22 @@ +import tailwindcss from '@tailwindcss/vite'; +import adapter from '@sveltejs/adapter-vercel'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [ + tailwindcss(), + sveltekit({ + compilerOptions: { + // Force runes mode for the project, except for libraries. Can be removed in svelte 6. + runes: ({ filename }) => + filename.split(/[/\\]/).includes('node_modules') ? undefined : true + }, + + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter() + }) + ] +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ea44575..2d9ff7a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: prettier: specifier: ^3.2.4 version: 3.9.6 + prettier-plugin-svelte: + specifier: ^3.4.0 + version: 3.5.2(prettier@3.9.6)(svelte@5.57.1) publint: specifier: ^0.3.12 version: 0.3.21 @@ -28,10 +31,89 @@ importers: version: 7.0.2 vite: specifier: 8.3.0 - version: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2) + version: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0) vitest: specifier: 5.0.1 - version: 5.0.1(@types/node@24.12.4)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)) + version: 5.0.1(@types/node@24.12.4)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)) + + playground/uneval-stream: + dependencies: + devalue: + specifier: workspace:* + version: link:../.. + devDependencies: + '@codemirror/lang-javascript': + specifier: ^6.2.4 + version: 6.2.5 + '@codemirror/language': + specifier: ^6.12.4 + version: 6.12.4 + '@codemirror/state': + specifier: ^6.5.2 + version: 6.7.6 + '@codemirror/view': + specifier: ^6.38.6 + version: 6.43.13 + '@fontsource-variable/roboto': + specifier: ^5.3.0 + version: 5.3.0 + '@internationalized/date': + specifier: ^3.12.3 + version: 3.12.4 + '@lezer/highlight': + specifier: ^1.2.3 + version: 1.2.5 + '@sveltejs/adapter-vercel': + specifier: ^6.3.4 + version: 6.3.4(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0))) + '@sveltejs/kit': + specifier: ^2.63.0 + version: 2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)) + '@sveltejs/vite-plugin-svelte': + specifier: ^7.1.2 + version: 7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)) + '@tailwindcss/vite': + specifier: ^4.3.0 + version: 4.3.3(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)) + bits-ui: + specifier: ^2.18.1 + version: 2.19.5(@internationalized/date@3.12.4)(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + prettier: + specifier: ^3.9.6 + version: 3.9.6 + remixicon-svelte: + specifier: ^0.0.5 + version: 0.0.5(svelte@5.57.1) + shadcn-svelte: + specifier: ^1.5.0 + version: 1.7.0(svelte@5.57.1) + svelte: + specifier: ^5.56.1 + version: 5.57.1 + svelte-check: + specifier: ^4.6.0 + version: 4.7.6(picomatch@4.0.7)(svelte@5.57.1)(typescript@6.0.3) + tailwind-merge: + specifier: ^3.6.0 + version: 3.7.0 + tailwind-variants: + specifier: ^3.3.1 + version: 3.3.1(tailwind-merge@3.7.0)(tailwindcss@4.3.3) + tailwindcss: + specifier: ^4.3.0 + version: 4.3.3 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vite: + specifier: ^8.0.16 + version: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0) packages: @@ -94,6 +176,24 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@codemirror/autocomplete@6.20.3': + resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==} + + '@codemirror/lang-javascript@6.2.5': + resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==} + + '@codemirror/language@6.12.4': + resolution: {integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==} + + '@codemirror/lint@6.9.7': + resolution: {integrity: sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==} + + '@codemirror/state@6.7.6': + resolution: {integrity: sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==} + + '@codemirror/view@6.43.13': + resolution: {integrity: sha512-sihaFrUzAsYBQsL9J2t69y8nfMQGwcYmggAZsk+kjPbjYZMyuf2hU8tUNTZ+P+isb6XRr8JE22TZlJxBoVdH1A==} + '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} @@ -250,6 +350,18 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} + + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} + + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} + + '@fontsource-variable/roboto@5.3.0': + resolution: {integrity: sha512-BoaaZiQf8fgtxv07KXkTwx1bKz/EoqIlTXq2OOKKXINxp6qXWdnlChqV+hSaDANS49yyUASFl3OVBMMDTCIHFA==} + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -259,6 +371,19 @@ packages: '@types/node': optional: true + '@internationalized/date@3.12.4': + resolution: {integrity: sha512-M1dEn4c1U1HsSlaVR8upZtSqvXrTkHDfv18H01uCSJyjVLDxnBR38v/fMxecmlwXKR4i9HeZcmgQAPE6A+aGJQ==} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -276,12 +401,32 @@ packages: resolution: {integrity: sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ==} engines: {node: '>=12'} + '@lezer/common@1.5.3': + resolution: {integrity: sha512-H0iErY4e43LpXbYDyBci5W4v/RwTgGV3YzYOlJPiGZ8RY8w51kVE+xLn1tg3Z6UmSfyETvtsUK3r7YsgDQEI7Q==} + + '@lezer/highlight@1.2.5': + resolution: {integrity: sha512-O1GMVKgtf5YspFaRzpmqkVgMtIk2HG9uMAbH6wdAIdNh3TVzCsch/+cRi+6l2//UGDKe6NB9BW3cvuR5ezMQ0w==} + + '@lezer/javascript@1.5.6': + resolution: {integrity: sha512-sEvOqpl4vJQca0NugSQK02vQPbc5KrvoojnYGoqqFgFO0MtcYhwGiHKVEB+LuXYJnfyXo4QPA8ztbrEa4Fw5NA==} + + '@lezer/lr@1.4.10': + resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + + '@marijn/find-cluster-break@1.0.4': + resolution: {integrity: sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -297,6 +442,9 @@ packages: '@oxc-project/types@0.150.0': resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@publint/pack@0.1.4': resolution: {integrity: sha512-HDVTWq3H0uTXiU0eeSQntcVUTPP3GamzeXI41+x7uU9J65JgWQh3qWZHblR1i0npXfFtF+mxBiU2nJH8znxWnQ==} engines: {node: '>=18'} @@ -400,9 +548,159 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@sveltejs/acorn-typescript@1.0.13': + resolution: {integrity: sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-vercel@6.3.4': + resolution: {integrity: sha512-MxEgTqIlmNg4qy5Rz4vwDKs2vNUrsL+DjcfegUVr/spPWSvWrSYFTUPY7tLbHsi8RxdUqpxC9UN/yzkOzZeMGA==} + engines: {node: '>=20.0'} + peerDependencies: + '@sveltejs/kit': ^2.4.0 + + '@sveltejs/kit@2.70.3': + resolution: {integrity: sha512-UDvEYuZqAMbfB/oXIoqKvbKcb7YczK5zYrzmsGV1zRJk03jntwp8dXiYoIJotxAndsKvcPFtx9H1GRSKFdSHgg==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.3.3 || ^6.0.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + typescript: + optional: true + + '@sveltejs/load-config@0.2.3': + resolution: {integrity: sha512-VT3qmUb8pRV2QrZjd8iAmtg8lf4W0TIjZbvXtz5MKei/q96teWZgGJyyidJzOjzZzvdq616eSRVeMYIQChUTAQ==} + engines: {node: '>= 18.0.0'} + + '@sveltejs/vite-plugin-svelte@7.3.1': + resolution: {integrity: sha512-ZPsLN8B1e/En+Ak5s4V7srFDT532oS0qieLsQwu63NGKsS+iAjoO2Js1BochlHlglcU+Pt7WAO3C5Ee+4f6gVA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.46.4 + vite: ^8.0.0-beta.7 || ^8.0.0 + + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + + '@tailwindcss/node@4.3.3': + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} + + '@tailwindcss/oxide-android-arm64@4.3.3': + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.3': + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.3': + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.3': + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.3': + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.3': + resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -535,6 +833,11 @@ packages: cpu: [x64] os: [win32] + '@vercel/nft@1.11.0': + resolution: {integrity: sha512-m1QFg+U+3yPOnP1xSYJ73UIRxLOXdts1JOhiOiyPYqEsALgrXFFINvgUaD6R6iNvaBFAjHllBCbkfx4FuOdpaA==} + engines: {node: '>=20'} + hasBin: true + '@vitest/mocker@5.0.1': resolution: {integrity: sha512-6K1DoBNAPGvuOcSsGA4D6x+5zEEff/KmOOP3uetT2TrGpVfI+HRHRnJJfKi5ib/g1vx8IYHQD8s0pbJz8WQI7Q==} peerDependencies: @@ -549,6 +852,24 @@ packages: '@vitest/spy@5.0.1': resolution: {integrity: sha512-rbto/mF/SGERxEgYOek7Xm6B9b+y+mVoo+f4b2LymYO8zM1b7uB5nHuhVMTP2hxdzgxvGiZYGxGIaMvL5y180Q==} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -563,6 +884,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -571,10 +896,35 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bits-ui@2.19.5: + resolution: {integrity: sha512-TEwkLSYElE5SE0fIdcItiFPfyg9vrR67N1Mt6VvZCqZo24dwTA1MpGVV3WeyIg7rfVAaZ0So8a0/dcnPngCoew==} + engines: {node: '>=20'} + peerDependencies: + '@internationalized/date': ^3.8.1 + svelte: ^5.33.0 + + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -586,10 +936,59 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cn@0.3.3: + resolution: {integrity: sha512-OEiyJkSpYm2kOuNOKQ+c2wmzZRG8orrb9fnObtHTbCGNx/E9KLnGcmcocItOzREKk5KzQN5I2e3BUCj563KEpw==} + engines: {node: '>=20'} + hasBin: true + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + crelt@1.0.7: + resolution: {integrity: sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -598,10 +997,17 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devalue@5.9.4: + resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + enhanced-resolve@5.26.0: + resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -614,11 +1020,25 @@ packages: engines: {node: '>=18'} hasBin: true + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esrap@2.4.0: + resolution: {integrity: sha512-CQPcneEHw/czj32uwQC52nYnax8H4SXt25FCM+LIwGZ49cMIxpOj3bP8wmzcI+Z0HIy5KkClaPhRLfCySzwHPA==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -645,6 +1065,9 @@ packages: picomatch: optional: true + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -670,6 +1093,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -677,6 +1104,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-id@4.1.3: resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} hasBin: true @@ -689,6 +1120,9 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -701,6 +1135,9 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -712,6 +1149,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + js-yaml@3.15.2: resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} hasBin: true @@ -726,36 +1167,77 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-arm64@1.33.0: resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-darwin-x64@1.33.0: resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-freebsd-x64@1.33.0: resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm-gnueabihf@1.33.0: resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + lightningcss-linux-arm64-gnu@1.33.0: resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} @@ -763,6 +1245,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + lightningcss-linux-arm64-musl@1.33.0: resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} @@ -770,6 +1259,13 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + lightningcss-linux-x64-gnu@1.33.0: resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} @@ -777,6 +1273,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + lightningcss-linux-x64-musl@1.33.0: resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} @@ -784,22 +1287,41 @@ packages: os: [linux] libc: [musl] + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-arm64-msvc@1.33.0: resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss-win32-x64-msvc@1.33.0: resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + lightningcss@1.33.0: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -807,6 +1329,17 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.4.1: resolution: {integrity: sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==} @@ -818,15 +1351,55 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nanoid@3.3.19: resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + obug@2.2.1: resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} engines: {node: '>=12.20.0'} @@ -868,6 +1441,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -891,6 +1468,12 @@ packages: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} + prettier-plugin-svelte@3.5.2: + resolution: {integrity: sha512-ItFouLvzSFE3ulNl4DKoWM3BGcbDCNVpIyy/Y3F2gC3aNiGLxtFUdffVqO5Z5hhYG+DFT5KULWaxmeFFpdbvaQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -916,6 +1499,15 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + remixicon-svelte@0.0.5: + resolution: {integrity: sha512-a7tnkBeA6P/ItRc2Q/jOgF+Xoh6Fj7hKrr/E6ZUCmOM4XBFi+mBDR95hqdRHWVf2s8sK85ycGXg+AAFZv87s+Q==} + peerDependencies: + svelte: ^5.0.0 + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -932,6 +1524,15 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + runed@0.35.1: + resolution: {integrity: sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==} + peerDependencies: + '@sveltejs/kit': ^2.21.0 + svelte: ^5.7.0 + peerDependenciesMeta: + '@sveltejs/kit': + optional: true + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -944,6 +1545,15 @@ packages: engines: {node: '>=10'} hasBin: true + set-cookie-parser@3.1.2: + resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} + + shadcn-svelte@1.7.0: + resolution: {integrity: sha512-AK3ZsYOL8PN/RxcEBCHGvQj2TrLfaaBsbw0QohyEb3nn/yPNDRC/+9iSjnTp/uKEe+tAi0tBxB/Yhzno0N7EEg==} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -959,6 +1569,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -987,6 +1601,59 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + style-mod@4.1.4: + resolution: {integrity: sha512-XXWIQt633/EpAFx8aZDOTjBzrCaGmhvEQlQo6MVPfa2OzO2cWo+4hV9h+6UkHYlXGfy+ODXKUdP7Pthmcu5ATw==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + + svelte-check@4.7.6: + resolution: {integrity: sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.0.0 || ^6.0.0 + + svelte-toolbelt@0.10.6: + resolution: {integrity: sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.30.2 + + svelte@5.57.1: + resolution: {integrity: sha512-Uqj49lWKB+iSSnneuwiYYJ7MZgkB+eXr0LXBhv4uDuAkXqnWmq65Sxflfvp0Lc6MdKjMUxGaeOKWJqz5SNiVIA==} + engines: {node: '>=18'} + + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + + tailwind-merge@3.7.0: + resolution: {integrity: sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==} + + tailwind-variants@3.3.1: + resolution: {integrity: sha512-4pAvwUtM4HKBiRZftncAbpn6V9Hhwoa5Fl7O2u5zbp7Z5Cvu+/o/6+176WY3WCEES209543quG8zFIcXCsc5Jw==} + engines: {node: '>=16.9.x', pnpm: '>=7.x'} + peerDependencies: + tailwind-merge: '>=3.0.0' + tailwindcss: '*' + peerDependenciesMeta: + tailwind-merge: + optional: true + tailwindcss: + optional: true + + tailwindcss@4.3.3: + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} + engines: {node: '>=18'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -1007,9 +1674,27 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - typescript@7.0.2: - resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} - engines: {node: '>=16.20.0'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} hasBin: true undici-types@7.16.0: @@ -1062,6 +1747,14 @@ packages: yaml: optional: true + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@5.0.1: resolution: {integrity: sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} @@ -1103,6 +1796,15 @@ packages: jsdom: optional: true + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1113,6 +1815,13 @@ packages: engines: {node: '>=8'} hasBin: true + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + zimmerframe@1.1.5: + resolution: {integrity: sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==} + snapshots: '@babel/runtime@7.29.2': {} @@ -1260,6 +1969,49 @@ snapshots: human-id: 4.1.3 prettier: 2.8.8 + '@codemirror/autocomplete@6.20.3': + dependencies: + '@codemirror/language': 6.12.4 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 + '@lezer/common': 1.5.3 + + '@codemirror/lang-javascript@6.2.5': + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/language': 6.12.4 + '@codemirror/lint': 6.9.7 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 + '@lezer/common': 1.5.3 + '@lezer/javascript': 1.5.6 + + '@codemirror/language@6.12.4': + dependencies: + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 + '@lezer/common': 1.5.3 + '@lezer/highlight': 1.2.5 + '@lezer/lr': 1.4.10 + style-mod: 4.1.4 + + '@codemirror/lint@6.9.7': + dependencies: + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 + crelt: 1.0.7 + + '@codemirror/state@6.7.6': + dependencies: + '@marijn/find-cluster-break': 1.0.4 + + '@codemirror/view@6.43.13': + dependencies: + '@codemirror/state': 6.7.6 + crelt: 1.0.7 + style-mod: 4.1.4 + w3c-keyname: 2.2.8 + '@esbuild/aix-ppc64@0.28.2': optional: true @@ -1338,6 +2090,19 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true + '@floating-ui/core@1.8.0': + dependencies: + '@floating-ui/utils': 0.2.12 + + '@floating-ui/dom@1.8.0': + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 + + '@floating-ui/utils@0.2.12': {} + + '@fontsource-variable/roboto@5.3.0': {} + '@inquirer/external-editor@1.0.3(@types/node@24.12.4)': dependencies: chardet: 2.1.1 @@ -1345,6 +2110,24 @@ snapshots: optionalDependencies: '@types/node': 24.12.4 + '@internationalized/date@3.12.4': + dependencies: + '@swc/helpers': 0.5.23 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -1360,6 +2143,22 @@ snapshots: dependencies: jsbi: 4.3.2 + '@lezer/common@1.5.3': {} + + '@lezer/highlight@1.2.5': + dependencies: + '@lezer/common': 1.5.3 + + '@lezer/javascript@1.5.6': + dependencies: + '@lezer/common': 1.5.3 + '@lezer/highlight': 1.2.5 + '@lezer/lr': 1.4.10 + + '@lezer/lr@1.4.10': + dependencies: + '@lezer/common': 1.5.3 + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.29.2 @@ -1376,6 +2175,21 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.8.0 + tar: 7.5.22 + transitivePeerDependencies: + - encoding + - supports-color + + '@marijn/find-cluster-break@1.0.4': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1390,6 +2204,8 @@ snapshots: '@oxc-project/types@0.150.0': {} + '@polka/url@1.0.0-next.29': {} + '@publint/pack@0.1.4': {} '@rolldown/binding-android-arm-eabi@1.2.9': @@ -1439,11 +2255,138 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@rollup/pluginutils@5.4.0': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.7 + + '@standard-schema/spec@1.1.0': {} + + '@sveltejs/acorn-typescript@1.0.13(acorn@8.18.0)': + dependencies: + acorn: 8.18.0 + + '@sveltejs/adapter-vercel@6.3.4(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))': + dependencies: + '@sveltejs/kit': 2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)) + '@vercel/nft': 1.11.0 + esbuild: 0.28.2 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) + '@sveltejs/vite-plugin-svelte': 7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)) + '@types/cookie': 0.6.0 + acorn: 8.18.0 + cookie: 0.6.0 + devalue: 5.9.4 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + set-cookie-parser: 3.1.2 + sirv: 3.0.2 + svelte: 5.57.1 + vite: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0) + optionalDependencies: + typescript: 6.0.3 + + '@sveltejs/load-config@0.2.3': {} + + '@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0))': + dependencies: + deepmerge: 4.3.1 + magic-string: 1.4.1 + obug: 2.2.1 + svelte: 5.57.1 + vite: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0) + vitefu: 1.1.3(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)) + + '@swc/helpers@0.5.23': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.3.3': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.26.0 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.3 + + '@tailwindcss/oxide-android-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide@4.3.3': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-x64': 4.3.3 + '@tailwindcss/oxide-freebsd-x64': 4.3.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 + + '@tailwindcss/vite@4.3.3(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0))': + dependencies: + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + tailwindcss: 4.3.3 + vite: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0) + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/cookie@0.6.0': {} + '@types/deep-eql@4.0.2': {} '@types/estree@1.0.9': {} @@ -1514,17 +2457,46 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true - '@vitest/mocker@5.0.1(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2))': + '@vercel/nft@1.11.0': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.4.0 + acorn: 8.18.0 + acorn-import-attributes: 1.9.5(acorn@8.18.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.7 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vitest/mocker@5.0.1(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.1 estree-walker: 3.0.3 magic-string: 1.4.1 optionalDependencies: - vite: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2) + vite: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0) '@vitest/spy@5.0.1': {} + abbrev@3.0.1: {} + + acorn-import-attributes@1.9.5(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + + acorn@8.18.0: {} + + agent-base@7.1.4: {} + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -1535,14 +2507,43 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.1: {} + array-union@2.1.0: {} assertion-error@2.0.1: {} + async-sema@3.1.1: {} + + axobject-query@4.1.0: {} + + balanced-match@4.0.4: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bits-ui@2.19.5(@internationalized/date@3.12.4)(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1): + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/dom': 1.8.0 + '@internationalized/date': 3.12.4 + esm-env: 1.2.2 + runed: 0.35.1(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1) + svelte: 5.57.1 + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1) + tabbable: 6.5.0 + transitivePeerDependencies: + - '@sveltejs/kit' + + brace-expansion@5.0.12: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -1551,20 +2552,53 @@ snapshots: chardet@2.1.1: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@3.0.0: {} + + clsx@2.1.1: {} + + cn@0.3.3: {} + + commander@14.0.3: {} + + consola@3.4.2: {} + + cookie@0.6.0: {} + + crelt@1.0.7: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deepmerge@4.3.1: {} + + dequal@2.0.3: {} + detect-indent@6.1.0: {} detect-libc@2.1.2: {} + devalue@5.9.4: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 + enhanced-resolve@5.26.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -1600,10 +2634,17 @@ snapshots: '@esbuild/win32-arm64': 0.28.2 '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 - optional: true + + esm-env@1.2.2: {} esprima@4.0.1: {} + esrap@2.4.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -1628,6 +2669,8 @@ snapshots: optionalDependencies: picomatch: 4.0.7 + file-uri-to-path@1.0.0: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -1656,6 +2699,12 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@13.0.6: + dependencies: + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -1667,6 +2716,13 @@ snapshots: graceful-fs@4.2.11: {} + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-id@4.1.3: {} iconv-lite@0.7.2: @@ -1675,6 +2731,8 @@ snapshots: ignore@5.3.2: {} + inline-style-parser@0.2.7: {} + is-extglob@2.1.1: {} is-glob@4.0.3: @@ -1683,6 +2741,10 @@ snapshots: is-number@7.0.0: {} + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.9 + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -1691,6 +2753,8 @@ snapshots: isexe@2.0.0: {} + jiti@2.7.0: {} + js-yaml@3.15.2: dependencies: argparse: 1.0.10 @@ -1706,39 +2770,90 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + kleur@4.1.5: {} + + lightningcss-android-arm64@1.32.0: + optional: true + lightningcss-android-arm64@1.33.0: optional: true + lightningcss-darwin-arm64@1.32.0: + optional: true + lightningcss-darwin-arm64@1.33.0: optional: true + lightningcss-darwin-x64@1.32.0: + optional: true + lightningcss-darwin-x64@1.33.0: optional: true + lightningcss-freebsd-x64@1.32.0: + optional: true + lightningcss-freebsd-x64@1.33.0: optional: true + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + lightningcss-linux-arm64-gnu@1.33.0: optional: true + lightningcss-linux-arm64-musl@1.32.0: + optional: true + lightningcss-linux-arm64-musl@1.33.0: optional: true + lightningcss-linux-x64-gnu@1.32.0: + optional: true + lightningcss-linux-x64-gnu@1.33.0: optional: true + lightningcss-linux-x64-musl@1.32.0: + optional: true + lightningcss-linux-x64-musl@1.33.0: optional: true + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + lightningcss-win32-arm64-msvc@1.33.0: optional: true + lightningcss-win32-x64-msvc@1.32.0: + optional: true + lightningcss-win32-x64-msvc@1.33.0: optional: true + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 @@ -1755,12 +2870,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 + locate-character@3.0.0: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 lodash.startcase@4.4.0: {} + lru-cache@11.5.3: {} + + lz-string@1.5.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + magic-string@1.4.1: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -1772,10 +2897,36 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.12 + + minipass@7.1.3: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + mri@1.2.0: {} + mrmime@2.0.1: {} + + ms@2.1.3: {} + nanoid@3.3.19: {} + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + obug@2.2.1: {} outdent@0.5.0: {} @@ -1806,6 +2957,11 @@ snapshots: path-key@3.1.1: {} + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.3 + minipass: 7.1.3 + path-type@4.0.0: {} picocolors@1.1.1: {} @@ -1822,6 +2978,11 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prettier-plugin-svelte@3.5.2(prettier@3.9.6)(svelte@5.57.1): + dependencies: + prettier: 3.9.6 + svelte: 5.57.1 + prettier@2.8.8: {} prettier@3.9.6: {} @@ -1844,6 +3005,12 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readdirp@4.1.2: {} + + remixicon-svelte@0.0.5(svelte@5.57.1): + dependencies: + svelte: 5.57.1 + resolve-from@5.0.0: {} reusify@1.1.0: {} @@ -1873,6 +3040,15 @@ snapshots: dependencies: queue-microtask: 1.2.3 + runed@0.35.1(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1): + dependencies: + dequal: 2.0.3 + esm-env: 1.2.2 + lz-string: 1.5.0 + svelte: 5.57.1 + optionalDependencies: + '@sveltejs/kit': 2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)) + sade@1.8.1: dependencies: mri: 1.2.0 @@ -1881,6 +3057,16 @@ snapshots: semver@7.8.0: {} + set-cookie-parser@3.1.2: {} + + shadcn-svelte@1.7.0(svelte@5.57.1): + dependencies: + cn: 0.3.3 + commander: 14.0.3 + node-fetch-native: 1.6.7 + postcss: 8.5.28 + svelte: 5.57.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -1891,6 +3077,12 @@ snapshots: signal-exit@4.1.0: {} + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + slash@3.0.0: {} source-map-js@1.2.1: {} @@ -1912,6 +3104,75 @@ snapshots: strip-bom@3.0.0: {} + style-mod@4.1.4: {} + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + + svelte-check@4.7.6(picomatch@4.0.7)(svelte@5.57.1)(typescript@6.0.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@sveltejs/load-config': 0.2.3 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.7) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.57.1 + typescript: 6.0.3 + transitivePeerDependencies: + - picomatch + + svelte-toolbelt@0.10.6(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1): + dependencies: + clsx: 2.1.1 + runed: 0.35.1(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1)(typescript@6.0.3)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.1) + style-to-object: 1.0.14 + svelte: 5.57.1 + transitivePeerDependencies: + - '@sveltejs/kit' + + svelte@5.57.1: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.6.0 + '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) + '@types/estree': 1.0.9 + acorn: 8.18.0 + aria-query: 5.3.1 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.9.4 + esm-env: 1.2.2 + esrap: 2.4.0 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.5 + transitivePeerDependencies: + - '@typescript-eslint/types' + + tabbable@6.5.0: {} + + tailwind-merge@3.7.0: {} + + tailwind-variants@3.3.1(tailwind-merge@3.7.0)(tailwindcss@4.3.3): + optionalDependencies: + tailwind-merge: 3.7.0 + tailwindcss: 4.3.3 + + tailwindcss@4.3.3: {} + + tapable@2.3.3: {} + + tar@7.5.22: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + term-size@2.2.1: {} tinybench@6.1.4: {} @@ -1927,6 +3188,16 @@ snapshots: dependencies: is-number: 7.0.0 + totalist@3.0.1: {} + + tr46@0.0.3: {} + + tslib@2.8.1: {} + + tw-animate-css@1.4.0: {} + + typescript@6.0.3: {} + typescript@7.0.2: optionalDependencies: '@typescript/typescript-aix-ppc64': 7.0.2 @@ -1954,7 +3225,7 @@ snapshots: universalify@0.1.2: {} - vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2): + vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -1965,11 +3236,16 @@ snapshots: '@types/node': 24.12.4 esbuild: 0.28.2 fsevents: 2.3.3 + jiti: 2.7.0 - vitest@5.0.1(@types/node@24.12.4)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)): + vitefu@1.1.3(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)): + optionalDependencies: + vite: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0) + + vitest@5.0.1(@types/node@24.12.4)(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.1(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)) + '@vitest/mocker': 5.0.1(vite@8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)) chai: 6.2.2 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -1980,13 +3256,22 @@ snapshots: tinybench: 6.1.4 tinyexec: 1.3.0 tinyglobby: 0.2.17 - vite: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2) + vite: 8.3.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.12.4 transitivePeerDependencies: - msw + w3c-keyname@2.2.8: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -1995,3 +3280,7 @@ snapshots: dependencies: siginfo: 2.0.0 stackback: 0.0.2 + + yallist@5.0.0: {} + + zimmerframe@1.1.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1d40a2fd..e62ffb0f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,5 @@ +packages: + - playground/* + minimumReleaseAge: 2880 blockExoticSubdeps: true