From 6acb66e2fa5de16d34dc8873367660d8da8bd662 Mon Sep 17 00:00:00 2001 From: Valerii Strilets Date: Thu, 11 Jun 2026 21:16:14 +0300 Subject: [PATCH] add solid and svelte --- _artifacts/domain_map.yaml | 130 +- _artifacts/skill_tree.yaml | 39 +- docs/content/docs/index.mdx | 2 +- docs/content/docs/solid/components.mdx | 58 + docs/content/docs/solid/hooks.mdx | 117 ++ docs/content/docs/solid/meta.json | 5 + docs/content/docs/svelte/hooks.mdx | 77 + docs/content/docs/svelte/meta.json | 5 + docs/package.json | 2 +- eslint.config.ts | 12 +- package.json | 4 +- pnpm-lock.yaml | 1302 +++++++++-------- pnpm-workspace.yaml | 10 + seitu/package.json | 34 +- seitu/skills/README.md | 13 + seitu/skills/create-computed/SKILL.md | 2 +- seitu/skills/create-debounced-fn/SKILL.md | 2 +- seitu/skills/create-debounced/SKILL.md | 2 +- .../skills/create-indexed-db-storage/SKILL.md | 2 +- seitu/skills/create-is-online/SKILL.md | 2 +- seitu/skills/create-media-query/SKILL.md | 2 +- .../create-readable-subscription/SKILL.md | 2 +- seitu/skills/create-schema-store/SKILL.md | 2 +- seitu/skills/create-scroll-state/SKILL.md | 2 +- seitu/skills/create-store/SKILL.md | 2 +- seitu/skills/create-subscription/SKILL.md | 2 +- seitu/skills/create-throttled-fn/SKILL.md | 2 +- seitu/skills/create-throttled/SKILL.md | 2 +- .../skills/create-web-storage-value/SKILL.md | 2 +- seitu/skills/create-web-storage/SKILL.md | 2 +- seitu/skills/seitu-overview/SKILL.md | 27 +- seitu/skills/subscription-react/SKILL.md | 2 +- seitu/skills/subscription-solid/SKILL.md | 97 ++ seitu/skills/use-subscription-react/SKILL.md | 2 +- seitu/skills/use-subscription-solid/SKILL.md | 144 ++ seitu/skills/use-subscription-svelte/SKILL.md | 134 ++ seitu/skills/use-subscription-vue/SKILL.md | 2 +- seitu/src/solid/components.test.tsx | 117 ++ seitu/src/solid/components.ts | 65 + seitu/src/solid/hooks.test.tsx | 273 ++++ seitu/src/solid/hooks.ts | 144 ++ seitu/src/solid/index.ts | 2 + seitu/src/svelte/hooks.test.ts | 128 ++ seitu/src/svelte/hooks.ts | 109 ++ seitu/src/svelte/index.ts | 1 + seitu/tsdown.config.ts | 2 + seitu/vitest.config.ts | 29 +- 47 files changed, 2473 insertions(+), 645 deletions(-) create mode 100644 docs/content/docs/solid/components.mdx create mode 100644 docs/content/docs/solid/hooks.mdx create mode 100644 docs/content/docs/solid/meta.json create mode 100644 docs/content/docs/svelte/hooks.mdx create mode 100644 docs/content/docs/svelte/meta.json create mode 100644 seitu/skills/subscription-solid/SKILL.md create mode 100644 seitu/skills/use-subscription-solid/SKILL.md create mode 100644 seitu/skills/use-subscription-svelte/SKILL.md create mode 100644 seitu/src/solid/components.test.tsx create mode 100644 seitu/src/solid/components.ts create mode 100644 seitu/src/solid/hooks.test.tsx create mode 100644 seitu/src/solid/hooks.ts create mode 100644 seitu/src/solid/index.ts create mode 100644 seitu/src/svelte/hooks.test.ts create mode 100644 seitu/src/svelte/hooks.ts create mode 100644 seitu/src/svelte/index.ts diff --git a/_artifacts/domain_map.yaml b/_artifacts/domain_map.yaml index 54d21ce..e35cbaf 100644 --- a/_artifacts/domain_map.yaml +++ b/_artifacts/domain_map.yaml @@ -1,15 +1,15 @@ # domain_map.yaml # Generated by skill-domain-discovery # Library: seitu -# Version: 0.15.1 +# Version: 0.16.0 # Date: 2026-06-11 # Status: reviewed library: name: seitu - version: 0.15.1 + version: 0.16.0 repository: https://github.com/letstri/seitu - description: Type-safe reactive primitives with a shared get/subscribe API for core, web, React, and Vue. + description: Type-safe reactive primitives with a shared get/subscribe API for core, web, React, Vue, Solid, and Svelte. primary_framework: framework-agnostic coverage: ignored_packages: @@ -26,7 +26,7 @@ domains: description: Persistence, DOM APIs, and SSR-safe defaults for web environments. - name: framework bindings slug: framework-bindings - description: React and Vue hooks that subscribe to any Seitu primitive. + description: React, Vue, Solid, and Svelte bindings that subscribe to any Seitu primitive. - name: library orientation slug: orientation description: Module map, mental model, and primitive selection for new adopters. @@ -550,6 +550,125 @@ skills: source: seitu/src/vue/index.ts priority: CRITICAL status: active + - name: use-subscription-solid + slug: use-subscription-solid + domain: framework-bindings + description: Solid primitive returning an Accessor for any Seitu primitive. + type: framework + packages: + - seitu + covers: + - useSubscription + tasks: + - subscribe to Seitu state in Solid + failure_modes: + - mistake: Reading the accessor without calling it + mechanism: useSubscription returns a Solid Accessor; it must be called to read and track. + wrong_pattern: | + const value = useSubscription(store) + return
{value}
+ correct_pattern: | + const value = useSubscription(store) + return
{value()}
+ source: seitu/src/solid/hooks.ts + priority: CRITICAL + status: active + - mistake: Passing reactive props directly instead of a getter + mechanism: Reading props outside a tracked scope loses reactivity; the getter form re-subscribes. + wrong_pattern: | + useSubscription(props.store) + correct_pattern: | + useSubscription(() => props.store) + source: seitu/src/solid/hooks.ts + priority: HIGH + status: active + - mistake: Importing from seitu/react in Solid + mechanism: Solid apps must use the seitu/solid primitive; the React hook relies on useSyncExternalStore. + wrong_pattern: | + import { useSubscription } from 'seitu/react' + correct_pattern: | + import { useSubscription } from 'seitu/solid' + source: seitu/src/solid/index.ts + priority: CRITICAL + status: active + - name: subscription-solid + slug: subscription-solid + domain: framework-bindings + description: Render-prop component alternative to useSubscription for Solid. + type: framework + packages: + - seitu + covers: + - Subscription + tasks: + - subscribe via component children render prop in Solid + failure_modes: + - mistake: Treating children's argument as a value, not an accessor + mechanism: The children function runs once and receives a Solid Accessor; call it inside JSX. + wrong_pattern: | + {value =>
{value.count}
}
+ correct_pattern: | + {value =>
{value().count}
}
+ source: seitu/src/solid/components.ts + priority: CRITICAL + status: active + - mistake: Preferring the component over the primitive without reason + mechanism: useSubscription is simpler for most cases; Subscription is for render-prop composition. + wrong_pattern: | + {v => } + correct_pattern: | + const v = useSubscription(s); return + source: docs/content/docs/solid/components.mdx + priority: LOW + status: active + - mistake: Importing from seitu/react in Solid + mechanism: The React component relies on React internals; Solid apps must use seitu/solid. + wrong_pattern: | + import { Subscription } from 'seitu/react' + correct_pattern: | + import { Subscription } from 'seitu/solid' + source: seitu/src/solid/index.ts + priority: CRITICAL + status: active + - name: use-subscription-svelte + slug: use-subscription-svelte + domain: framework-bindings + description: Svelte binding returning a Readable store for any Seitu primitive. + type: framework + packages: + - seitu + covers: + - useSubscription + tasks: + - subscribe to Seitu state in Svelte + failure_modes: + - mistake: Reading the store without the `$` prefix + mechanism: useSubscription returns a Svelte store; the $ prefix auto-subscribes and reads the value. + wrong_pattern: | +
{value}
+ correct_pattern: | +
{$value}
+ source: seitu/src/svelte/hooks.ts + priority: CRITICAL + status: active + - mistake: Passing a factory expecting reactivity to a changing source + mechanism: The factory is a one-time initializer; it does not re-run when external values change. + wrong_pattern: | + const value = useSubscription(() => createWebStorageValue({ key: `user:${id}`, ... })) + correct_pattern: | + const value = useSubscription(createWebStorageValue({ key: `user:${id}`, ... })) + source: seitu/src/svelte/hooks.ts + priority: MEDIUM + status: active + - mistake: Importing from seitu/react in Svelte + mechanism: The React hook relies on useSyncExternalStore; Svelte apps must use seitu/svelte. + wrong_pattern: | + import { useSubscription } from 'seitu/react' + correct_pattern: | + import { useSubscription } from 'seitu/svelte' + source: seitu/src/svelte/index.ts + priority: CRITICAL + status: active - name: create-debounced slug: create-debounced domain: reactive-state @@ -852,4 +971,7 @@ cross_references: - from: use-subscription-react to: create-scroll-state reason: Scroll tracking requires factory + ref pattern in React. + - from: use-subscription-solid + to: create-scroll-state + reason: Scroll tracking uses the getter + ref pattern in Solid. gaps: [] diff --git a/_artifacts/skill_tree.yaml b/_artifacts/skill_tree.yaml index b4ed595..c1c4c79 100644 --- a/_artifacts/skill_tree.yaml +++ b/_artifacts/skill_tree.yaml @@ -1,7 +1,7 @@ # skill_tree.yaml library: name: seitu - version: 0.15.1 + version: 0.16.0 repository: https://github.com/letstri/seitu description: Type-safe reactive primitives with shared get/subscribe API generated_from: @@ -236,6 +236,43 @@ skills: sources: - letstri/seitu:docs/content/docs/vue/composables.mdx - letstri/seitu:seitu/src/vue/composables.ts + - name: use-subscription-solid + slug: use-subscription-solid + type: framework + domain: framework-bindings + path: seitu/skills/use-subscription-solid/SKILL.md + package: seitu + description: Solid primitive returning an Accessor for any Seitu primitive. + requires: + - seitu-overview + sources: + - letstri/seitu:docs/content/docs/solid/hooks.mdx + - letstri/seitu:seitu/src/solid/hooks.ts + - name: subscription-solid + slug: subscription-solid + type: framework + domain: framework-bindings + path: seitu/skills/subscription-solid/SKILL.md + package: seitu + description: Render-prop Subscription component for Solid. + requires: + - seitu-overview + - use-subscription-solid + sources: + - letstri/seitu:docs/content/docs/solid/components.mdx + - letstri/seitu:seitu/src/solid/components.ts + - name: use-subscription-svelte + slug: use-subscription-svelte + type: framework + domain: framework-bindings + path: seitu/skills/use-subscription-svelte/SKILL.md + package: seitu + description: Svelte binding returning a Readable store for any Seitu primitive. + requires: + - seitu-overview + sources: + - letstri/seitu:docs/content/docs/svelte/hooks.mdx + - letstri/seitu:seitu/src/svelte/hooks.ts coverage: ignored_packages: diff --git a/docs/content/docs/index.mdx b/docs/content/docs/index.mdx index bcba2dc..0f4d318 100644 --- a/docs/content/docs/index.mdx +++ b/docs/content/docs/index.mdx @@ -15,7 +15,7 @@ So I created a library based on shadcn/cli and called it Hookas. But it was Reac ## Solution -That's why I built **Seitu** _(word "utils" reversed, with the letter L replaced by E)_. It's a type-safe, framework-agnostic library for working with familiar hooks. I brought together my experience with TypeScript and different frameworks, so you can use Seitu with React or without any framework at all. +That's why I built **Seitu** _(word "utils" reversed, with the letter L replaced by E)_. It's a type-safe, framework-agnostic library for working with familiar hooks. I brought together my experience with TypeScript and different frameworks, so you can use Seitu with React, Vue, Solid, Svelte, or without any framework at all. ## Examples diff --git a/docs/content/docs/solid/components.mdx b/docs/content/docs/solid/components.mdx new file mode 100644 index 0000000..0ce7859 --- /dev/null +++ b/docs/content/docs/solid/components.mdx @@ -0,0 +1,58 @@ +--- +title: Components +--- + +## Subscription() +Declarative component that subscribes to a reactive value and passes an accessor to a render function. +Unlike React, the children function runs once and receives a Solid `Accessor` — call it (`value()`) +inside the returned JSX so updates stay fine-grained. Use when you prefer a component API over the +useSubscription primitive. + +### Examples + +#### Basic usage + +```tsx +import { createWebStorage } from 'seitu/web' +import { Subscription } from 'seitu/solid' +import * as z from 'zod' + +const sessionStorage = createWebStorage({ + type: 'sessionStorage', + schemas: { count: z.number(), name: z.string() }, + defaultValues: { count: 0, name: '' }, +}) + +function Page() { + return ( + + {value =>
{value().count}
} +
+ ) +} +``` + +#### With selector + +```tsx +import { createWebStorage } from 'seitu/web' +import { Subscription } from 'seitu/solid' +import * as z from 'zod' + +const sessionStorage = createWebStorage({ + type: 'sessionStorage', + schemas: { count: z.number(), name: z.string() }, + defaultValues: { count: 0, name: '' }, +}) + +function Page() { + return ( + v.count}> + {count =>
{count()}
} +
+ ) +} +``` + +* * * + diff --git a/docs/content/docs/solid/hooks.mdx b/docs/content/docs/solid/hooks.mdx new file mode 100644 index 0000000..3a9380d --- /dev/null +++ b/docs/content/docs/solid/hooks.mdx @@ -0,0 +1,117 @@ +--- +title: Hooks +--- + +## useSubscription() +Use this primitive to subscribe to a reactive value. Accepts a subscription object +directly, or an accessor/getter that returns one. The getter is reactive — when it +reads a signal, the subscription is recreated and re-subscribed automatically. + +Returns a Solid `Accessor`: call it (`value()`) to read the current value inside JSX +or another reactive scope. + +### Examples + +#### Inline subscription + +```tsx +import { createWebStorageValue } from 'seitu/web' +import { useSubscription } from 'seitu/solid' +import * as z from 'zod' + +function Counter() { + const value = useSubscription(() => createWebStorageValue({ + type: 'sessionStorage', + key: 'test', + defaultValue: 0, + schema: z.number(), + })) + + return
{value()}
+} +``` + +#### Instance outside of component + +```tsx +import { createWebStorage } from 'seitu/web' +import { useSubscription } from 'seitu/solid' +import * as z from 'zod' + +const sessionStorage = createWebStorage({ + type: 'sessionStorage', + schemas: { count: z.number(), name: z.string() }, + defaultValues: { count: 0, name: '' }, +}) + +function Counter() { + const value = useSubscription(sessionStorage) + return
{value().count}
+} +``` + +#### Subscription with selector + +```tsx +import { createWebStorage } from 'seitu/web' +import { useSubscription } from 'seitu/solid' +import * as z from 'zod' + +const sessionStorage = createWebStorage({ + type: 'sessionStorage', + schemas: { + count: z.number(), + name: z.string(), + }, + defaultValues: { count: 0, name: '' }, +}) + +function Counter() { + // Usage with selector, the accessor only updates when count changes + const count = useSubscription(sessionStorage, { selector: value => value.count }) + + return
{count()}
+} +``` + +#### Reactive source (re-subscribes when a signal changes) + +```tsx +import { createSignal } from 'solid-js' +import { createWebStorageValue } from 'seitu/web' +import { useSubscription } from 'seitu/solid' +import * as z from 'zod' + +function User() { + const [userId, setUserId] = createSignal('user-1') + const data = useSubscription(() => createWebStorageValue({ + type: 'localStorage', + key: `user:${userId()}`, + schema: z.object({ name: z.string() }), + defaultValue: { name: '' }, + })) + + return
{data().name}
+} +``` + +#### Ref example + +```tsx +import { createScrollState } from 'seitu/web' +import { useSubscription } from 'seitu/solid' + +function Page() { + let ref: HTMLDivElement | undefined + const state = useSubscription(() => createScrollState({ element: () => ref, direction: 'vertical' })) + + return ( +
+ {String(state().top.reached)} +
+ ) +} +``` + +* * * + diff --git a/docs/content/docs/solid/meta.json b/docs/content/docs/solid/meta.json new file mode 100644 index 0000000..f8e26e5 --- /dev/null +++ b/docs/content/docs/solid/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Solid", + "collapsible": false, + "defaultOpen": true +} diff --git a/docs/content/docs/svelte/hooks.mdx b/docs/content/docs/svelte/hooks.mdx new file mode 100644 index 0000000..ae092b2 --- /dev/null +++ b/docs/content/docs/svelte/hooks.mdx @@ -0,0 +1,77 @@ +--- +title: Hooks +--- + +## useSubscription() +Use this function to subscribe to a reactive value. Accepts a subscription object +directly, or a factory function that is called once to create one. + +It returns a Svelte [`Readable`](https://svelte.dev/docs/svelte-store#readable) store — +read it with the `$` auto-subscription (`$value`) in markup. The underlying subscription +is created lazily on the first subscriber and torn down when the last one leaves, so it is +SSR-safe and cleans up automatically. + +### Examples + +#### Inline subscription + +```svelte + + +
{$value}
+``` + +#### Instance outside of component + +```svelte + + +
{$value.count}
+``` + +#### With selector + +```svelte + + +
{$count}
+``` + +* * * + diff --git a/docs/content/docs/svelte/meta.json b/docs/content/docs/svelte/meta.json new file mode 100644 index 0000000..869b5f8 --- /dev/null +++ b/docs/content/docs/svelte/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Svelte", + "collapsible": false, + "defaultOpen": true +} diff --git a/docs/package.json b/docs/package.json index 4c315d1..4b09afb 100644 --- a/docs/package.json +++ b/docs/package.json @@ -33,7 +33,7 @@ "devDependencies": { "@tailwindcss/vite": "^4.3.0", "@types/mdx": "^2.0.14", - "@types/node": "^22.19.20", + "@types/node": "^25.9.2", "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.2", diff --git a/eslint.config.ts b/eslint.config.ts index 3c9512e..2b52098 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -3,6 +3,7 @@ import antfu from '@antfu/eslint-config' export default antfu( { react: true, + vue: true, rules: { 'node/prefer-global/process': 'off', 'react/no-use-context': 'off', @@ -19,10 +20,19 @@ export default antfu( }, }, { - files: ['seitu/src/vue/**/*'], + files: ['seitu/src/vue/**/*', 'seitu/src/svelte/**/*'], rules: { 'react/rules-of-hooks': 'off', 'react/no-unnecessary-use-prefix': 'off', }, }, + { + files: ['seitu/src/solid/**/*'], + rules: { + 'react/rules-of-hooks': 'off', + 'react/no-unnecessary-use-prefix': 'off', + 'react/no-context-provider': 'off', + 'react/no-missing-key': 'off', + }, + }, ) diff --git a/package.json b/package.json index 2301763..fcc9836 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,12 @@ "@antfu/eslint-config": "^9.0.0", "@eslint-react/eslint-plugin": "^5.8.17", "@types/jsdoc-to-markdown": "^7.0.6", - "@types/node": "^22.19.20", + "@types/node": "^25.9.2", "eslint": "^10.4.1", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.2", + "eslint-plugin-solid": "^0.14.5", + "eslint-plugin-svelte": "^3.19.0", "husky": "^9.1.7", "jsdoc-to-markdown": "^9.1.3", "npm-run-all2": "^9.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bec5c3f..89b600b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^9.0.0 - version: 9.0.0(@eslint-react/eslint-plugin@5.8.17(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/rule-tester@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.61.0(typescript@6.0.3))(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.35)(eslint-plugin-react-refresh@0.5.2(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@3.2.6(@types/debug@4.1.13)(@types/node@22.19.20)(happy-dom@20.10.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + version: 9.0.0(@eslint-react/eslint-plugin@5.8.17(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/rule-tester@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.61.0(typescript@6.0.3))(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.6.0-beta.14)(eslint-plugin-react-refresh@0.5.2(eslint@10.4.1(jiti@2.7.0)))(eslint-plugin-solid@0.14.5(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-plugin-svelte@3.19.0(eslint@10.4.1(jiti@2.7.0))(svelte@5.56.3(@typescript-eslint/types@8.61.0)))(eslint@10.4.1(jiti@2.7.0))(svelte-eslint-parser@1.8.0(svelte@5.56.3(@typescript-eslint/types@8.61.0)))(typescript@6.0.3)(vitest@4.1.8(@types/node@25.9.2)(happy-dom@20.10.2)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))) '@eslint-react/eslint-plugin': specifier: ^5.8.17 version: 5.8.17(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) @@ -18,8 +18,8 @@ importers: specifier: ^7.0.6 version: 7.0.6 '@types/node': - specifier: ^22.19.20 - version: 22.19.20 + specifier: ^25.9.2 + version: 25.9.2 eslint: specifier: ^10.4.1 version: 10.4.1(jiti@2.7.0) @@ -29,6 +29,12 @@ importers: eslint-plugin-react-refresh: specifier: ^0.5.2 version: 0.5.2(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-solid: + specifier: ^0.14.5 + version: 0.14.5(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-svelte: + specifier: ^3.19.0 + version: 3.19.0(eslint@10.4.1(jiti@2.7.0))(svelte@5.56.3(@typescript-eslint/types@8.61.0)) husky: specifier: ^9.1.7 version: 9.1.7 @@ -58,16 +64,16 @@ importers: version: 1.167.0(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@tanstack/router-core@1.171.13)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/react-start': specifier: ^1.168.25 - version: 1.168.25(crossws@0.4.6(srvx@0.11.16))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + version: 1.168.25(crossws@0.4.6(srvx@0.11.16))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) '@vercel/analytics': specifier: ^2.0.1 - version: 2.0.1(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(vue@3.5.35(typescript@6.0.3)) + version: 2.0.1(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(svelte@5.56.3(@typescript-eslint/types@8.61.0))(vue@3.5.38(typescript@6.0.3)) fumadocs-core: specifier: ^16.10.0 version: 16.10.0(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.17.0(react@19.2.7))(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3) fumadocs-mdx: specifier: ^15.0.12 - version: 15.0.12(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.10.0(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.17.0(react@19.2.7))(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(rolldown@1.1.0)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + version: 15.0.12(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.10.0(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.17.0(react@19.2.7))(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(rolldown@1.1.0)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) fumadocs-twoslash: specifier: ^3.2.0 version: 3.2.0(d644bddab51c862d29861e87cd88acd4) @@ -98,13 +104,13 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.3.0 - version: 4.3.0(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.3.0(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) '@types/mdx': specifier: ^2.0.14 version: 2.0.14 '@types/node': - specifier: ^22.19.20 - version: 22.19.20 + specifier: ^25.9.2 + version: 25.9.2 '@types/react': specifier: ^19.2.17 version: 19.2.17 @@ -113,10 +119,10 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: ^6.0.2 - version: 6.0.2(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + version: 6.0.2(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) nitro: specifier: ^3.0.260603-beta - version: 3.0.260603-beta(chokidar@5.0.0)(jiti@2.7.0)(rollup@4.61.1)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + version: 3.0.260603-beta(chokidar@5.0.0)(jiti@2.7.0)(rollup@4.61.1)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) tailwindcss: specifier: ^4.3.0 version: 4.3.0 @@ -125,7 +131,7 @@ importers: version: 6.0.3 vite: specifier: ^8.0.16 - version: 8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + version: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) playground: dependencies: @@ -170,6 +176,9 @@ importers: specifier: '>=19' version: 19.2.7 devDependencies: + '@solidjs/testing-library': + specifier: ^0.8.10 + version: 0.8.10(solid-js@1.9.13) '@standard-schema/spec': specifier: ^1.1.0 version: 1.1.0 @@ -185,6 +194,9 @@ importers: '@types/react': specifier: ^19.2.17 version: 19.2.17 + '@vitejs/plugin-react': + specifier: ^6.0.2 + version: 6.0.2(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) fake-indexeddb: specifier: ^6.2.5 version: 6.2.5 @@ -194,6 +206,12 @@ importers: react-dom: specifier: ^19.2.7 version: 19.2.7(react@19.2.7) + solid-js: + specifier: ^1.9.13 + version: 1.9.13 + svelte: + specifier: ^5.56.3 + version: 5.56.3(@typescript-eslint/types@8.61.0) tsdown: specifier: ^0.22.2 version: 0.22.2(typescript@6.0.3) @@ -204,16 +222,19 @@ importers: specifier: ^6.0.3 version: 6.0.3 vite: - specifier: ^6.4.3 - version: 6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + specifier: ^8.0.16 + version: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vite-plugin-solid: + specifier: ^2.11.12 + version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) vitest: - specifier: ^3.2.6 - version: 3.2.6(@types/debug@4.1.13)(@types/node@22.19.20)(happy-dom@20.10.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + specifier: ^4.1.8 + version: 4.1.8(@types/node@25.9.2)(happy-dom@20.10.2)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) vue: - specifier: ^3.5.35 - version: 3.5.35(typescript@6.0.3) + specifier: ^3.5.38 + version: 3.5.38(typescript@6.0.3) yaml: - specifier: ^2.8.3 + specifier: ^2.9.0 version: 2.9.0 zod: specifier: ^4.4.3 @@ -329,6 +350,10 @@ packages: resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.18.6': + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.29.7': resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} @@ -339,6 +364,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} @@ -373,6 +402,12 @@ packages: engines: {node: ^22.18.0 || >=24.11.0} hasBin: true + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} @@ -436,312 +471,156 @@ packages: resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.28.0': resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.28.0': resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.28.0': resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.28.0': resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.28.0': resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.28.0': resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.28.0': resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.28.0': resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.28.0': resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.28.0': resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.28.0': resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.28.0': resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.28.0': resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.28.0': resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.28.0': resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.28.0': resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.28.0': resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.28.0': resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.28.0': resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.28.0': resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.28.0': resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.28.0': resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.28.0': resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} engines: {node: '>=18'} @@ -1923,6 +1802,16 @@ packages: resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} + '@solidjs/testing-library@0.8.10': + resolution: {integrity: sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==} + engines: {node: '>= 14'} + peerDependencies: + '@solidjs/router': '>=0.9.0' + solid-js: '>=1.0.0' + peerDependenciesMeta: + '@solidjs/router': + optional: true + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1932,6 +1821,11 @@ packages: peerDependencies: eslint: ^9.0.0 || ^10.0.0 + '@sveltejs/acorn-typescript@1.0.10': + resolution: {integrity: sha512-4WfKk68eTih+MiJD4fSbxN7E8kVBmTMPWHUPYjvl2N0rMs53YLTT8/YjKU5Dtnz5LqDjl7LEw4U7lXR2W3J5WA==} + peerDependencies: + acorn: ^8.9.0 + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -2250,6 +2144,18 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -2304,6 +2210,9 @@ packages: '@types/node@22.19.20': resolution: {integrity: sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw==} + '@types/node@25.9.2': + resolution: {integrity: sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -2312,6 +2221,9 @@ packages: '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -2456,63 +2368,81 @@ packages: vitest: optional: true - '@vitest/expect@3.2.6': - resolution: {integrity: sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==} + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} - '@vitest/mocker@3.2.6': - resolution: {integrity: sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==} + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.6': - resolution: {integrity: sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==} + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} + + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} + + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} + + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} + + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} - '@vitest/runner@3.2.6': - resolution: {integrity: sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==} + '@vue/compiler-core@3.5.38': + resolution: {integrity: sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==} - '@vitest/snapshot@3.2.6': - resolution: {integrity: sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==} + '@vue/compiler-core@3.6.0-beta.14': + resolution: {integrity: sha512-W5n98uClMiwW9U8Ca7dqBhU9wUudeW/vX35sH8dWu5tEEzHRRw4Nf3dy1Kl946GBOu1lU4nZpdeJ/I6wgZjvRA==} - '@vitest/spy@3.2.6': - resolution: {integrity: sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==} + '@vue/compiler-dom@3.5.38': + resolution: {integrity: sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==} - '@vitest/utils@3.2.6': - resolution: {integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==} + '@vue/compiler-dom@3.6.0-beta.14': + resolution: {integrity: sha512-iOIGydWrFpOJm5DLOGH5qHEptxv/0ZtWbgPhGiqd0dn1MzJlUJ5yIy0v45dSx6jhawPybWXu+43vO8lrIOBheQ==} - '@vue/compiler-core@3.5.35': - resolution: {integrity: sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==} + '@vue/compiler-sfc@3.5.38': + resolution: {integrity: sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==} - '@vue/compiler-dom@3.5.35': - resolution: {integrity: sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==} + '@vue/compiler-sfc@3.6.0-beta.14': + resolution: {integrity: sha512-CIXQE9A+zsPLR7OD38Cws+RZKhfa2iQuPcJhPyZQdyBnm+yZBCmP+Cv3y/aaMG+OLATwTa4VZL5EBlO/VBcI9g==} - '@vue/compiler-sfc@3.5.35': - resolution: {integrity: sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==} + '@vue/compiler-ssr@3.5.38': + resolution: {integrity: sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==} - '@vue/compiler-ssr@3.5.35': - resolution: {integrity: sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==} + '@vue/compiler-ssr@3.6.0-beta.14': + resolution: {integrity: sha512-qCxgZYkKJGSwUCVRqGLUtuXP/A8mHqbiA1Ie3fQAEQMRc1ID7FI2IfKf/N7K40Jd0m3SEFtk3SOba4In8ghMFQ==} - '@vue/reactivity@3.5.35': - resolution: {integrity: sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==} + '@vue/compiler-vapor@3.6.0-beta.14': + resolution: {integrity: sha512-EoCsMmx3B/gD/RI1IQhHivJxw4jFfAEmCgWlKIwf9QkCd8fsrlEaJwScQWNiTeZlprAFmpn0IVILhq1a9I4UaA==} - '@vue/runtime-core@3.5.35': - resolution: {integrity: sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==} + '@vue/reactivity@3.5.38': + resolution: {integrity: sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==} - '@vue/runtime-dom@3.5.35': - resolution: {integrity: sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==} + '@vue/runtime-core@3.5.38': + resolution: {integrity: sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==} - '@vue/server-renderer@3.5.35': - resolution: {integrity: sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==} + '@vue/runtime-dom@3.5.38': + resolution: {integrity: sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==} + + '@vue/server-renderer@3.5.38': + resolution: {integrity: sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==} peerDependencies: - vue: 3.5.35 + vue: 3.5.38 + + '@vue/shared@3.5.38': + resolution: {integrity: sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==} - '@vue/shared@3.5.35': - resolution: {integrity: sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==} + '@vue/shared@3.6.0-beta.14': + resolution: {integrity: sha512-eQF60wnz4KzWreP1tMVhzoCRJW5zkNwBxre5XeZXAwZaaPJV3vpZjubRH8eRo4KZ2JCn2xR5C6ystcGIfSR5SA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -2561,6 +2491,10 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -2581,9 +2515,27 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + babel-dead-code-elimination@1.0.12: resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + babel-plugin-jsx-dom-expressions@0.40.7: + resolution: {integrity: sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ==} + peerDependencies: + '@babel/core': ^7.20.12 + + babel-preset-solid@1.9.12: + resolution: {integrity: sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg==} + peerDependencies: + '@babel/core': ^7.0.0 + solid-js: ^1.9.12 + peerDependenciesMeta: + solid-js: + optional: true + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -2656,8 +2608,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk-template@0.4.0: @@ -2683,10 +2635,6 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} @@ -2845,10 +2793,6 @@ packages: decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2869,6 +2813,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devalue@5.8.1: + resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -2942,8 +2889,8 @@ packages: miniflare: optional: true - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -2951,11 +2898,6 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.28.0: resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} @@ -3135,6 +3077,23 @@ packages: peerDependencies: eslint: '>=9.38.0' + eslint-plugin-solid@0.14.5: + resolution: {integrity: sha512-nfuYK09ah5aJG/oEN6P1qziy1zLgW4PDWe75VNPi4CEFYk1x2AEqwFeQfEPR7gNn0F2jOeqKhx2E+5oNCOBYWQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + typescript: '>=4.8.4' + + eslint-plugin-svelte@3.19.0: + resolution: {integrity: sha512-t3rNaZeXz4d2gG4uJyMEYfJCFKf22+SWbSizIIXIWKu4wM+XPLiMWuSSr/C5821JmFeN9ogK+eExbG+z+twyxw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 || ^10.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + eslint-plugin-toml@1.4.0: resolution: {integrity: sha512-3ErTnfUjXq/23f72XeyRcE0Y4Sd/ME1lsZeezczqpn2R4tE7+Sgco/NUKDXm0xAMz15tzcRz/9RfJRm6AqRO+A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -3182,6 +3141,10 @@ packages: '@vue/compiler-sfc': ^3.3.0 eslint: '>=9.0.0' + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -3208,6 +3171,9 @@ packages: jiti: optional: true + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3220,6 +3186,14 @@ packages: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} + esrap@2.2.11: + resolution: {integrity: sha512-gPdx+I+BjYEinNMQaBXFjbaJVyoPMU4ZODg5mE+M4DqVG9VusAVHHjcBX+zqyITlI0DIARwDMMzZwAWj36dRoQ==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3537,6 +3511,10 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + globals@17.6.0: resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} @@ -3621,9 +3599,16 @@ packages: hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -3686,6 +3671,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-html@2.0.0: + resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} + engines: {node: '>=8'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3694,6 +3683,13 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + isbot@5.1.42: resolution: {integrity: sha512-/SXsVh7KpPRISrD4ffrGSxnTLlUBzEQUfWIusaJPrpJ93FW1P0YEZri5vAUkFsA0m2HRUhQRQadk2wJ+EeKowQ==} engines: {node: '>=18'} @@ -3712,9 +3708,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.2.0: resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true @@ -3792,12 +3785,21 @@ packages: resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} hasBin: true + kebab-case@1.0.2: + resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} klaw@3.0.0: resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} + known-css-properties@0.30.0: + resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3876,6 +3878,10 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + linkify-it@5.0.1: resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} @@ -3883,6 +3889,9 @@ packages: resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} engines: {node: '>=14'} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3899,9 +3908,6 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4000,6 +4006,10 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} + merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -4338,10 +4348,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4371,6 +4377,30 @@ packages: pnpm-workspace-yaml@1.6.1: resolution: {integrity: sha512-yTeZntGWi8m9WNuhoVsP0DpFc4sC1U0+rr/qR6Zi9n2g3sxXY+JfccjXjjruNz96tM8I09yaJUA86doRnNLkbg==} + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + postcss-selector-parser@7.1.2: resolution: {integrity: sha512-Wjvt4scRFouioIInHf51IFNP4ltJ2EngJM+cZPGiqbKetBfmP3vpdPV8ID2S6JS6/jdo74N8+aEYH9lQr2C6sA==} engines: {node: '>=4'} @@ -4650,6 +4680,14 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + solid-js@1.9.13: + resolution: {integrity: sha512-6hJeJMOcEX8ktqjpDoJZEmld3ijvcvWBDtiXBm7f4332SiFN66QeAQI1REQshvyUoISsSeJ4PHDauKYbwao9JQ==} + + solid-refresh@0.6.3: + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} + peerDependencies: + solid-js: ^1.3 + sort-array@5.1.1: resolution: {integrity: sha512-EltS7AIsNlAFIM9cayrgKrM6XP94ATWwXP4LCL4IQbvbYhELSt2hZTrixg+AaQwnWFs/JGJgqU3rxMcNNWxGAA==} engines: {node: '>=12.17'} @@ -4691,8 +4729,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} string-ts@2.3.1: resolution: {integrity: sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==} @@ -4712,9 +4750,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -4738,6 +4773,19 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + svelte-eslint-parser@1.8.0: + resolution: {integrity: sha512-mikR1qwIVy3t5WthUoAXkMwxkXvabZP9FJgdx35Ei7EbGWmctva1Pih16Koeor/bdNNq8NXHlwKGS6NkYTawLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.34.1} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svelte@5.56.3: + resolution: {integrity: sha512-w7JvrM5IFl5cmfbY0TLik9o7mjRUJmRMhOR51tBPu708Gr/MjbGs7VnJnr/B0CaXeI4vtnOh7RKxDr0cwhMdDA==} + engines: {node: '>=18'} + synckit@0.11.13: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4767,9 +4815,6 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.2.4: resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} @@ -4778,16 +4823,8 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} to-regex-range@5.0.1: @@ -4910,6 +4947,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} @@ -5061,49 +5101,14 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite@6.4.3: - resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true + vite-plugin-solid@2.11.12: + resolution: {integrity: sha512-FgjPcx2OwX9h6f28jli7A4bG7PP3te8uyakE5iqsmpq3Jqi1TWLgSroC9N6cMfGRU2zXsl4Q6ISvTr2VL0QHpA==} peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: + '@testing-library/jest-dom': optional: true vite@8.0.16: @@ -5157,26 +5162,39 @@ packages: vite: optional: true - vitest@3.2.6: - resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.6 - '@vitest/ui': 3.2.6 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -5191,8 +5209,8 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - vue@3.5.35: - resolution: {integrity: sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==} + vue@3.5.38: + resolution: {integrity: sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -5278,6 +5296,10 @@ packages: resolution: {integrity: sha512-h0uDm97wvT2bokfwwTmY6kJ1hp6YDFL0nRHwNKz8s/VD1FH/vvZjAKoMUE+un0eaYBSG7/c6h+lJTP+31tjgTw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + yaml@2.8.3: resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} engines: {node: '>= 14.6'} @@ -5292,6 +5314,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} @@ -5310,7 +5335,7 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@antfu/eslint-config@9.0.0(@eslint-react/eslint-plugin@5.8.17(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/rule-tester@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.61.0(typescript@6.0.3))(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.35)(eslint-plugin-react-refresh@0.5.2(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@3.2.6(@types/debug@4.1.13)(@types/node@22.19.20)(happy-dom@20.10.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + '@antfu/eslint-config@9.0.0(@eslint-react/eslint-plugin@5.8.17(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/rule-tester@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.61.0(typescript@6.0.3))(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.6.0-beta.14)(eslint-plugin-react-refresh@0.5.2(eslint@10.4.1(jiti@2.7.0)))(eslint-plugin-solid@0.14.5(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-plugin-svelte@3.19.0(eslint@10.4.1(jiti@2.7.0))(svelte@5.56.3(@typescript-eslint/types@8.61.0)))(eslint@10.4.1(jiti@2.7.0))(svelte-eslint-parser@1.8.0(svelte@5.56.3(@typescript-eslint/types@8.61.0)))(typescript@6.0.3)(vitest@4.1.8(@types/node@25.9.2)(happy-dom@20.10.2)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 1.5.1 @@ -5320,7 +5345,7 @@ snapshots: '@stylistic/eslint-plugin': 5.10.0(eslint@10.4.1(jiti@2.7.0)) '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/parser': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@vitest/eslint-plugin': 1.6.19(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@3.2.6(@types/debug@4.1.13)(@types/node@22.19.20)(happy-dom@20.10.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + '@vitest/eslint-plugin': 1.6.19(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8(@types/node@25.9.2)(happy-dom@20.10.2)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))) ansis: 4.3.1 cac: 7.0.0 eslint: 10.4.1(jiti@2.7.0) @@ -5342,7 +5367,7 @@ snapshots: eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-vue: 10.9.2(@stylistic/eslint-plugin@5.10.0(eslint@10.4.1(jiti@2.7.0)))(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.4.1(jiti@2.7.0))) eslint-plugin-yml: 3.4.0(eslint@10.4.1(jiti@2.7.0)) - eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.35)(eslint@10.4.1(jiti@2.7.0)) + eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.6.0-beta.14)(eslint@10.4.1(jiti@2.7.0)) globals: 17.6.0 local-pkg: 1.2.1 parse-gitignore: 2.0.0 @@ -5352,6 +5377,9 @@ snapshots: optionalDependencies: '@eslint-react/eslint-plugin': 5.8.17(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) eslint-plugin-react-refresh: 0.5.2(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-solid: 0.14.5(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-svelte: 3.19.0(eslint@10.4.1(jiti@2.7.0))(svelte@5.56.3(@typescript-eslint/types@8.61.0)) + svelte-eslint-parser: 1.8.0(svelte@5.56.3(@typescript-eslint/types@8.61.0)) transitivePeerDependencies: - '@eslint/json' - '@typescript-eslint/rule-tester' @@ -5437,6 +5465,10 @@ snapshots: '@babel/helper-globals@7.29.7': {} + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.29.7 + '@babel/helper-module-imports@7.29.7': dependencies: '@babel/traverse': 7.29.7 @@ -5453,6 +5485,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-plugin-utils@7.29.7': {} + '@babel/helper-string-parser@7.29.7': {} '@babel/helper-string-parser@8.0.0-rc.6': {} @@ -5476,6 +5510,11 @@ snapshots: dependencies: '@babel/types': 8.0.0-rc.6 + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/runtime@7.29.7': {} '@babel/template@7.29.7': @@ -5565,159 +5604,81 @@ snapshots: '@es-joy/resolve.exports@1.2.0': {} - '@esbuild/aix-ppc64@0.25.12': - optional: true - '@esbuild/aix-ppc64@0.28.0': optional: true - '@esbuild/android-arm64@0.25.12': - optional: true - '@esbuild/android-arm64@0.28.0': optional: true - '@esbuild/android-arm@0.25.12': - optional: true - '@esbuild/android-arm@0.28.0': optional: true - '@esbuild/android-x64@0.25.12': - optional: true - '@esbuild/android-x64@0.28.0': optional: true - '@esbuild/darwin-arm64@0.25.12': - optional: true - '@esbuild/darwin-arm64@0.28.0': optional: true - '@esbuild/darwin-x64@0.25.12': - optional: true - '@esbuild/darwin-x64@0.28.0': optional: true - '@esbuild/freebsd-arm64@0.25.12': - optional: true - '@esbuild/freebsd-arm64@0.28.0': optional: true - '@esbuild/freebsd-x64@0.25.12': - optional: true - '@esbuild/freebsd-x64@0.28.0': optional: true - '@esbuild/linux-arm64@0.25.12': - optional: true - '@esbuild/linux-arm64@0.28.0': optional: true - '@esbuild/linux-arm@0.25.12': - optional: true - '@esbuild/linux-arm@0.28.0': optional: true - '@esbuild/linux-ia32@0.25.12': - optional: true - '@esbuild/linux-ia32@0.28.0': optional: true - '@esbuild/linux-loong64@0.25.12': - optional: true - '@esbuild/linux-loong64@0.28.0': optional: true - '@esbuild/linux-mips64el@0.25.12': - optional: true - '@esbuild/linux-mips64el@0.28.0': optional: true - '@esbuild/linux-ppc64@0.25.12': - optional: true - '@esbuild/linux-ppc64@0.28.0': optional: true - '@esbuild/linux-riscv64@0.25.12': - optional: true - '@esbuild/linux-riscv64@0.28.0': optional: true - '@esbuild/linux-s390x@0.25.12': - optional: true - '@esbuild/linux-s390x@0.28.0': optional: true - '@esbuild/linux-x64@0.25.12': - optional: true - '@esbuild/linux-x64@0.28.0': optional: true - '@esbuild/netbsd-arm64@0.25.12': - optional: true - '@esbuild/netbsd-arm64@0.28.0': optional: true - '@esbuild/netbsd-x64@0.25.12': - optional: true - '@esbuild/netbsd-x64@0.28.0': optional: true - '@esbuild/openbsd-arm64@0.25.12': - optional: true - '@esbuild/openbsd-arm64@0.28.0': optional: true - '@esbuild/openbsd-x64@0.25.12': - optional: true - '@esbuild/openbsd-x64@0.28.0': optional: true - '@esbuild/openharmony-arm64@0.25.12': - optional: true - '@esbuild/openharmony-arm64@0.28.0': optional: true - '@esbuild/sunos-x64@0.25.12': - optional: true - '@esbuild/sunos-x64@0.28.0': optional: true - '@esbuild/win32-arm64@0.25.12': - optional: true - '@esbuild/win32-arm64@0.28.0': optional: true - '@esbuild/win32-ia32@0.25.12': - optional: true - '@esbuild/win32-ia32@0.28.0': optional: true - '@esbuild/win32-x64@0.25.12': - optional: true - '@esbuild/win32-x64@0.28.0': optional: true @@ -6717,6 +6678,11 @@ snapshots: '@sindresorhus/base62@1.0.0': {} + '@solidjs/testing-library@0.8.10(solid-js@1.9.13)': + dependencies: + '@testing-library/dom': 10.4.1 + solid-js: 1.9.13 + '@standard-schema/spec@1.1.0': {} '@stylistic/eslint-plugin@5.10.0(eslint@10.4.1(jiti@2.7.0))': @@ -6729,6 +6695,10 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.4 + '@sveltejs/acorn-typescript@1.0.10(acorn@8.16.0)': + dependencies: + acorn: 8.16.0 + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -6802,12 +6772,12 @@ snapshots: postcss: 8.5.15 tailwindcss: 4.3.0 - '@tailwindcss/vite@4.3.0(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.0(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.0 '@tailwindcss/oxide': 4.3.0 tailwindcss: 4.3.0 - vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) '@tanstack/history@1.162.0': {} @@ -6846,14 +6816,14 @@ snapshots: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - '@tanstack/react-start-rsc@0.1.24(crossws@0.4.6(srvx@0.11.16))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': + '@tanstack/react-start-rsc@0.1.24(crossws@0.4.6(srvx@0.11.16))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@tanstack/react-router': 1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/router-core': 1.171.13 '@tanstack/router-utils': 1.162.2 '@tanstack/start-client-core': 1.170.12 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.17(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.6(srvx@0.11.16))(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/start-plugin-core': 1.171.17(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.6(srvx@0.11.16))(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) '@tanstack/start-server-core': 1.169.14(crossws@0.4.6(srvx@0.11.16)) '@tanstack/start-storage-context': 1.167.15 pathe: 2.0.3 @@ -6877,21 +6847,21 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.25(crossws@0.4.6(srvx@0.11.16))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': + '@tanstack/react-start@1.168.25(crossws@0.4.6(srvx@0.11.16))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@tanstack/react-router': 1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/react-start-client': 1.168.13(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tanstack/react-start-rsc': 0.1.24(crossws@0.4.6(srvx@0.11.16))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/react-start-rsc': 0.1.24(crossws@0.4.6(srvx@0.11.16))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) '@tanstack/react-start-server': 1.167.19(crossws@0.4.6(srvx@0.11.16))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/router-utils': 1.162.2 '@tanstack/start-client-core': 1.170.12 - '@tanstack/start-plugin-core': 1.171.17(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.6(srvx@0.11.16))(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/start-plugin-core': 1.171.17(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.6(srvx@0.11.16))(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) '@tanstack/start-server-core': 1.169.14(crossws@0.4.6(srvx@0.11.16)) pathe: 2.0.3 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: - vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - '@rspack/core' - crossws @@ -6935,7 +6905,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': + '@tanstack/router-plugin@1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 @@ -6948,7 +6918,8 @@ snapshots: zod: 4.4.3 optionalDependencies: '@tanstack/react-router': 1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vite-plugin-solid: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color @@ -6974,14 +6945,14 @@ snapshots: '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.17(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.6(srvx@0.11.16))(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': + '@tanstack/start-plugin-core@1.171.17(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.6(srvx@0.11.16))(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.7 '@babel/types': 7.29.7 '@tanstack/router-core': 1.171.13 '@tanstack/router-generator': 1.167.17 - '@tanstack/router-plugin': 1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/router-plugin': 1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) '@tanstack/router-utils': 1.162.2 '@tanstack/start-server-core': 1.169.14(crossws@0.4.6(srvx@0.11.16)) exsolve: 1.0.8 @@ -6993,11 +6964,11 @@ snapshots: srvx: 0.11.16 tinyglobby: 0.2.17 ufo: 1.6.4 - vitefu: 1.1.3(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + vitefu: 1.1.3(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) xmlbuilder2: 4.0.3 zod: 4.4.3 optionalDependencies: - vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - '@tanstack/react-router' - crossws @@ -7080,6 +7051,27 @@ snapshots: '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.7 + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -7132,6 +7124,10 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@25.9.2': + dependencies: + undici-types: 7.24.6 + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: '@types/react': 19.2.17 @@ -7140,6 +7136,8 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/trusted-types@2.0.7': {} + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -7264,18 +7262,19 @@ snapshots: '@ungap/structured-clone@1.3.1': {} - '@vercel/analytics@2.0.1(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(vue@3.5.35(typescript@6.0.3))': + '@vercel/analytics@2.0.1(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(svelte@5.56.3(@typescript-eslint/types@8.61.0))(vue@3.5.38(typescript@6.0.3))': optionalDependencies: next: 16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 - vue: 3.5.35(typescript@6.0.3) + svelte: 5.56.3(@typescript-eslint/types@8.61.0) + vue: 3.5.38(typescript@6.0.3) - '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': + '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/eslint-plugin@1.6.19(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@3.2.6(@types/debug@4.1.13)(@types/node@22.19.20)(happy-dom@20.10.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + '@vitest/eslint-plugin@1.6.19(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8(@types/node@25.9.2)(happy-dom@20.10.2)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)))': dependencies: '@typescript-eslint/scope-manager': 8.61.0 '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) @@ -7283,105 +7282,145 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 - vitest: 3.2.6(@types/debug@4.1.13)(@types/node@22.19.20)(happy-dom@20.10.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vitest: 4.1.8(@types/node@25.9.2)(happy-dom@20.10.2)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.6': + '@vitest/expect@4.1.8': dependencies: + '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 - chai: 5.3.3 - tinyrainbow: 2.0.0 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vitest/mocker@3.2.6(vite@6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.8(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 3.2.6 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/pretty-format@3.2.6': + '@vitest/pretty-format@4.1.8': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.0 - '@vitest/runner@3.2.6': + '@vitest/runner@4.1.8': dependencies: - '@vitest/utils': 3.2.6 + '@vitest/utils': 4.1.8 pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/snapshot@3.2.6': + '@vitest/snapshot@4.1.8': dependencies: - '@vitest/pretty-format': 3.2.6 + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.6': + '@vitest/spy@4.1.8': {} + + '@vitest/utils@4.1.8': dependencies: - tinyspy: 4.0.4 + '@vitest/pretty-format': 4.1.8 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 - '@vitest/utils@3.2.6': + '@vue/compiler-core@3.5.38': dependencies: - '@vitest/pretty-format': 3.2.6 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.38 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 - '@vue/compiler-core@3.5.35': + '@vue/compiler-core@3.6.0-beta.14': dependencies: '@babel/parser': 7.29.7 - '@vue/shared': 3.5.35 + '@vue/shared': 3.6.0-beta.14 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.35': + '@vue/compiler-dom@3.5.38': + dependencies: + '@vue/compiler-core': 3.5.38 + '@vue/shared': 3.5.38 + + '@vue/compiler-dom@3.6.0-beta.14': + dependencies: + '@vue/compiler-core': 3.6.0-beta.14 + '@vue/shared': 3.6.0-beta.14 + + '@vue/compiler-sfc@3.5.38': dependencies: - '@vue/compiler-core': 3.5.35 - '@vue/shared': 3.5.35 + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.38 + '@vue/compiler-dom': 3.5.38 + '@vue/compiler-ssr': 3.5.38 + '@vue/shared': 3.5.38 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.15 + source-map-js: 1.2.1 - '@vue/compiler-sfc@3.5.35': + '@vue/compiler-sfc@3.6.0-beta.14': dependencies: '@babel/parser': 7.29.7 - '@vue/compiler-core': 3.5.35 - '@vue/compiler-dom': 3.5.35 - '@vue/compiler-ssr': 3.5.35 - '@vue/shared': 3.5.35 + '@vue/compiler-core': 3.6.0-beta.14 + '@vue/compiler-dom': 3.6.0-beta.14 + '@vue/compiler-ssr': 3.6.0-beta.14 + '@vue/compiler-vapor': 3.6.0-beta.14 + '@vue/shared': 3.6.0-beta.14 estree-walker: 2.0.2 magic-string: 0.30.21 postcss: 8.5.15 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.35': + '@vue/compiler-ssr@3.5.38': + dependencies: + '@vue/compiler-dom': 3.5.38 + '@vue/shared': 3.5.38 + + '@vue/compiler-ssr@3.6.0-beta.14': dependencies: - '@vue/compiler-dom': 3.5.35 - '@vue/shared': 3.5.35 + '@vue/compiler-dom': 3.6.0-beta.14 + '@vue/shared': 3.6.0-beta.14 - '@vue/reactivity@3.5.35': + '@vue/compiler-vapor@3.6.0-beta.14': dependencies: - '@vue/shared': 3.5.35 + '@babel/parser': 7.29.7 + '@vue/compiler-dom': 3.6.0-beta.14 + '@vue/shared': 3.6.0-beta.14 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/reactivity@3.5.38': + dependencies: + '@vue/shared': 3.5.38 - '@vue/runtime-core@3.5.35': + '@vue/runtime-core@3.5.38': dependencies: - '@vue/reactivity': 3.5.35 - '@vue/shared': 3.5.35 + '@vue/reactivity': 3.5.38 + '@vue/shared': 3.5.38 - '@vue/runtime-dom@3.5.35': + '@vue/runtime-dom@3.5.38': dependencies: - '@vue/reactivity': 3.5.35 - '@vue/runtime-core': 3.5.35 - '@vue/shared': 3.5.35 + '@vue/reactivity': 3.5.38 + '@vue/runtime-core': 3.5.38 + '@vue/shared': 3.5.38 csstype: 3.2.3 - '@vue/server-renderer@3.5.35(vue@3.5.35(typescript@6.0.3))': + '@vue/server-renderer@3.5.38(vue@3.5.38(typescript@6.0.3))': dependencies: - '@vue/compiler-ssr': 3.5.35 - '@vue/shared': 3.5.35 - vue: 3.5.35(typescript@6.0.3) + '@vue/compiler-ssr': 3.5.38 + '@vue/shared': 3.5.38 + vue: 3.5.38(typescript@6.0.3) + + '@vue/shared@3.5.38': {} - '@vue/shared@3.5.35': {} + '@vue/shared@3.6.0-beta.14': {} acorn-jsx@5.3.2(acorn@8.16.0): dependencies: @@ -7420,6 +7459,8 @@ snapshots: dependencies: dequal: 2.0.3 + aria-query@5.3.1: {} + aria-query@5.3.2: {} array-back@6.2.3: {} @@ -7434,6 +7475,8 @@ snapshots: astring@1.9.0: {} + axobject-query@4.1.0: {} + babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.29.7 @@ -7443,6 +7486,22 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.7 + html-entities: 2.3.3 + parse5: 7.3.0 + + babel-preset-solid@1.9.12(@babel/core@7.29.7)(solid-js@1.9.13): + dependencies: + '@babel/core': 7.29.7 + babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@7.29.7) + optionalDependencies: + solid-js: 1.9.13 + bail@2.0.2: {} balanced-match@4.0.4: {} @@ -7495,13 +7554,7 @@ snapshots: ccount@2.0.1: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + chai@6.2.2: {} chalk-template@0.4.0: dependencies: @@ -7522,8 +7575,6 @@ snapshots: character-reference-invalid@2.0.1: {} - check-error@2.1.3: {} - chokidar@5.0.0: dependencies: readdirp: 5.0.0 @@ -7626,8 +7677,6 @@ snapshots: dependencies: character-entities: 2.0.2 - deep-eql@5.0.2: {} - deep-is@0.1.4: {} defu@6.1.7: {} @@ -7640,6 +7689,8 @@ snapshots: detect-node-es@1.1.0: {} + devalue@5.8.1: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -7686,7 +7737,7 @@ snapshots: httpxy: 0.5.3 srvx: 0.11.16 - es-module-lexer@1.7.0: {} + es-module-lexer@2.1.0: {} esast-util-from-estree@2.0.0: dependencies: @@ -7702,35 +7753,6 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 - esbuild@0.25.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - esbuild@0.28.0: optionalDependencies: '@esbuild/aix-ppc64': 0.28.0 @@ -8009,6 +8031,37 @@ snapshots: regexp-ast-analysis: 0.7.1 scslre: 0.3.0 + eslint-plugin-solid@0.14.5(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + estraverse: 5.3.0 + is-html: 2.0.0 + kebab-case: 1.0.2 + known-css-properties: 0.30.0 + style-to-object: 1.0.14 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-svelte@3.19.0(eslint@10.4.1(jiti@2.7.0))(svelte@5.56.3(@typescript-eslint/types@8.61.0)): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@jridgewell/sourcemap-codec': 1.5.5 + eslint: 10.4.1(jiti@2.7.0) + esutils: 2.0.3 + globals: 16.5.0 + known-css-properties: 0.37.0 + postcss: 8.5.15 + postcss-load-config: 3.1.4(postcss@8.5.15) + postcss-safe-parser: 7.0.1(postcss@8.5.15) + semver: 7.8.3 + svelte-eslint-parser: 1.8.0(svelte@5.56.3(@typescript-eslint/types@8.61.0)) + optionalDependencies: + svelte: 5.56.3(@typescript-eslint/types@8.61.0) + transitivePeerDependencies: + - ts-node + eslint-plugin-toml@1.4.0(eslint@10.4.1(jiti@2.7.0)): dependencies: '@eslint/core': 1.2.1 @@ -8071,11 +8124,16 @@ snapshots: natural-compare: 1.4.0 yaml-eslint-parser: 2.0.0 - eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.35)(eslint@10.4.1(jiti@2.7.0)): + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.6.0-beta.14)(eslint@10.4.1(jiti@2.7.0)): dependencies: - '@vue/compiler-sfc': 3.5.35 + '@vue/compiler-sfc': 3.6.0-beta.14 eslint: 10.4.1(jiti@2.7.0) + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 @@ -8126,6 +8184,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-env@1.2.2: {} + espree@10.4.0: dependencies: acorn: 8.16.0 @@ -8142,6 +8202,12 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@2.2.11(@typescript-eslint/types@8.61.0): + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + optionalDependencies: + '@typescript-eslint/types': 8.61.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -8315,7 +8381,7 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@15.0.12(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.10.0(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.17.0(react@19.2.7))(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(rolldown@1.1.0)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)): + fumadocs-mdx@15.0.12(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.10.0(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.17.0(react@19.2.7))(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(rolldown@1.1.0)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 @@ -8341,7 +8407,7 @@ snapshots: next: 16.2.9(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 rolldown: 1.1.0 - vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -8429,6 +8495,8 @@ snapshots: globals@15.15.0: {} + globals@16.5.0: {} + globals@17.6.0: {} globrex@0.1.2: {} @@ -8593,8 +8661,12 @@ snapshots: hookable@6.1.1: {} + html-entities@2.3.3: {} + html-entities@2.6.0: {} + html-tags@3.3.1: {} + html-void-elements@3.0.0: {} httpxy@0.5.3: {} @@ -8636,10 +8708,20 @@ snapshots: is-hexadecimal@2.0.1: {} + is-html@2.0.0: + dependencies: + html-tags: 3.3.1 + is-number@7.0.0: {} is-plain-obj@4.1.0: {} + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + is-what@4.1.16: {} + isbot@5.1.42: {} isexe@2.0.0: {} @@ -8650,8 +8732,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.1: {} - js-yaml@4.2.0: dependencies: argparse: 2.0.1 @@ -8735,6 +8815,8 @@ snapshots: dependencies: commander: 8.3.0 + kebab-case@1.0.2: {} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -8743,6 +8825,10 @@ snapshots: dependencies: graceful-fs: 4.2.11 + known-css-properties@0.30.0: {} + + known-css-properties@0.37.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -8797,6 +8883,8 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + lilconfig@2.1.0: {} + linkify-it@5.0.1: dependencies: uc.micro: 2.1.0 @@ -8807,6 +8895,8 @@ snapshots: pkg-types: 2.3.1 quansync: 0.2.11 + locate-character@3.0.0: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -8819,8 +8909,6 @@ snapshots: longest-streak@3.1.0: {} - loupe@3.2.1: {} - lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -9045,6 +9133,10 @@ snapshots: memorystream@0.3.1: {} + merge-anything@5.1.7: + dependencies: + is-what: 4.1.16 + merge2@1.4.1: {} micromark-core-commonmark@2.0.3: @@ -9409,7 +9501,7 @@ snapshots: nf3@0.3.17: {} - nitro@3.0.260603-beta(chokidar@5.0.0)(jiti@2.7.0)(rollup@4.61.1)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)): + nitro@3.0.260603-beta(chokidar@5.0.0)(jiti@2.7.0)(rollup@4.61.1)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)): dependencies: consola: 3.4.2 crossws: 0.4.6(srvx@0.11.16) @@ -9428,7 +9520,7 @@ snapshots: optionalDependencies: jiti: 2.7.0 rollup: 4.61.1 - vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -9560,8 +9652,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -9588,6 +9678,21 @@ snapshots: dependencies: yaml: 2.9.0 + postcss-load-config@3.1.4(postcss@8.5.15): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.3 + optionalDependencies: + postcss: 8.5.15 + + postcss-safe-parser@7.0.1(postcss@8.5.15): + dependencies: + postcss: 8.5.15 + + postcss-scss@4.0.9(postcss@8.5.15): + dependencies: + postcss: 8.5.15 + postcss-selector-parser@7.1.2: dependencies: cssesc: 3.0.0 @@ -9896,6 +10001,7 @@ snapshots: '@rollup/rollup-win32-x64-gnu': 4.61.1 '@rollup/rollup-win32-x64-msvc': 4.61.1 fsevents: 2.3.3 + optional: true rou3@0.8.1: {} @@ -9982,6 +10088,21 @@ snapshots: sisteransi@1.0.5: {} + solid-js@1.9.13: + dependencies: + csstype: 3.2.3 + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) + + solid-refresh@0.6.3(solid-js@1.9.13): + dependencies: + '@babel/generator': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/types': 7.29.7 + solid-js: 1.9.13 + transitivePeerDependencies: + - supports-color + sort-array@5.1.1: dependencies: array-back: 6.2.3 @@ -10008,7 +10129,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.10.0: {} + std-env@4.1.0: {} string-ts@2.3.1: {} @@ -10025,10 +10146,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -10048,6 +10165,39 @@ snapshots: dependencies: has-flag: 4.0.0 + svelte-eslint-parser@1.8.0(svelte@5.56.3(@typescript-eslint/types@8.61.0)): + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.15 + postcss-scss: 4.0.9(postcss@8.5.15) + postcss-selector-parser: 7.1.2 + semver: 7.8.3 + optionalDependencies: + svelte: 5.56.3(@typescript-eslint/types@8.61.0) + + svelte@5.56.3(@typescript-eslint/types@8.61.0): + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.10(acorn@8.16.0) + '@types/estree': 1.0.9 + '@types/trusted-types': 2.0.7 + acorn: 8.16.0 + aria-query: 5.3.1 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.8.1 + esm-env: 1.2.2 + esrap: 2.2.11(@typescript-eslint/types@8.61.0) + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + transitivePeerDependencies: + - '@typescript-eslint/types' + synckit@0.11.13: dependencies: '@pkgr/core': 0.3.6 @@ -10082,8 +10232,6 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.2: {} - tinyexec@1.2.4: {} tinyglobby@0.2.17: @@ -10091,11 +10239,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.4: {} + tinyrainbow@3.1.0: {} to-regex-range@5.0.1: dependencies: @@ -10204,6 +10348,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.24.6: {} + unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3 @@ -10308,43 +10454,22 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): + vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)): dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + '@babel/core': 7.29.7 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.12(@babel/core@7.29.7)(solid-js@1.9.13) + merge-anything: 5.1.7 + solid-js: 1.9.13 + solid-refresh: 0.6.3(solid-js@1.9.13) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + optionalDependencies: + '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - supports-color - - terser - - tsx - - yaml - vite@6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): - dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.15 - rollup: 4.61.1 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 22.19.20 - fsevents: 2.3.3 - jiti: 2.7.0 - lightningcss: 1.32.0 - yaml: 2.9.0 - - vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0): + vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -10352,58 +10477,43 @@ snapshots: rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 22.19.20 + '@types/node': 25.9.2 esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.7.0 yaml: 2.9.0 - vitefu@1.1.3(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)): + vitefu@1.1.3(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)): optionalDependencies: - vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) - - vitest@3.2.6(@types/debug@4.1.13)(@types/node@22.19.20)(happy-dom@20.10.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) - '@vitest/pretty-format': 3.2.6 - '@vitest/runner': 3.2.6 - '@vitest/snapshot': 3.2.6 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 - chai: 5.3.3 - debug: 4.4.3 + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) + + vitest@4.1.8(@types/node@25.9.2)(happy-dom@20.10.2)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 + obug: 2.1.2 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 3.10.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.2.4 tinyglobby: 0.2.17 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - vite-node: 3.2.4(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + tinyrainbow: 3.1.0 + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.28.0)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.13 - '@types/node': 22.19.20 + '@types/node': 25.9.2 happy-dom: 20.10.2 transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml vue-eslint-parser@10.4.1(eslint@10.4.1(jiti@2.7.0)): dependencies: @@ -10417,13 +10527,13 @@ snapshots: transitivePeerDependencies: - supports-color - vue@3.5.35(typescript@6.0.3): + vue@3.5.38(typescript@6.0.3): dependencies: - '@vue/compiler-dom': 3.5.35 - '@vue/compiler-sfc': 3.5.35 - '@vue/runtime-dom': 3.5.35 - '@vue/server-renderer': 3.5.35(vue@3.5.35(typescript@6.0.3)) - '@vue/shared': 3.5.35 + '@vue/compiler-dom': 3.5.38 + '@vue/compiler-sfc': 3.5.38 + '@vue/runtime-dom': 3.5.38 + '@vue/server-renderer': 3.5.38(vue@3.5.38(typescript@6.0.3)) + '@vue/shared': 3.5.38 optionalDependencies: typescript: 6.0.3 @@ -10476,12 +10586,16 @@ snapshots: eslint-visitor-keys: 5.0.1 yaml: 2.9.0 + yaml@1.10.3: {} + yaml@2.8.3: {} yaml@2.9.0: {} yocto-queue@0.1.0: {} + zimmerframe@1.1.4: {} + zod-validation-error@4.0.2(zod@4.4.3): dependencies: zod: 4.4.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 63ffbbc..b7f0315 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -25,6 +25,16 @@ minimumReleaseAgeExclude: - fumadocs-core@16.10.0 - fumadocs-mdx@15.0.12 - fumadocs-ui@16.10.0 + - '@vue/compiler-core@3.5.38' + - '@vue/compiler-dom@3.5.38' + - '@vue/compiler-sfc@3.5.38' + - '@vue/compiler-ssr@3.5.38' + - '@vue/reactivity@3.5.38' + - '@vue/runtime-core@3.5.38' + - '@vue/runtime-dom@3.5.38' + - '@vue/server-renderer@3.5.38' + - '@vue/shared@3.5.38' + - vue@3.5.38 shellEmulator: true packages: - seitu diff --git a/seitu/package.json b/seitu/package.json index 20b161c..901cf76 100644 --- a/seitu/package.json +++ b/seitu/package.json @@ -2,7 +2,7 @@ "name": "seitu", "displayName": "Seitu", "type": "module", - "version": "0.15.1", + "version": "0.16.0", "private": false, "packageManager": "pnpm@11.5.3", "author": "Valerii Strilets", @@ -21,6 +21,9 @@ "typescript", "react", "vue", + "solid", + "solid-js", + "svelte", "utils", "type-safe", "tanstack-intent" @@ -46,6 +49,14 @@ "types": "./dist/vue/index.d.mts", "import": "./dist/vue.mjs" }, + "./solid": { + "types": "./dist/solid/index.d.mts", + "import": "./dist/solid.mjs" + }, + "./svelte": { + "types": "./dist/svelte/index.d.mts", + "import": "./dist/svelte.mjs" + }, "./utils": { "types": "./dist/utils/index.d.mts", "import": "./dist/utils.mjs" @@ -72,6 +83,8 @@ "peerDependencies": { "react": ">=19", "react-dom": ">=19", + "solid-js": ">=1.9", + "svelte": ">=5", "vue": ">=3.5" }, "peerDependenciesMeta": { @@ -81,6 +94,12 @@ "react-dom": { "optional": true }, + "solid-js": { + "optional": true + }, + "svelte": { + "optional": true + }, "vue": { "optional": true } @@ -89,21 +108,26 @@ "fast-equals": "^6.0.0" }, "devDependencies": { + "@solidjs/testing-library": "^0.8.10", "@standard-schema/spec": "^1.1.0", "@tanstack/intent": "^0.0.42", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/react": "^19.2.17", + "@vitejs/plugin-react": "^6.0.2", "fake-indexeddb": "^6.2.5", "happy-dom": "^20.10.2", "react-dom": "^19.2.7", + "solid-js": "^1.9.13", + "svelte": "^5.56.3", "tsdown": "^0.22.2", "type-fest": "^5.7.0", "typescript": "^6.0.3", - "vite": "^6.4.3", - "vitest": "^3.2.6", - "vue": "^3.5.35", - "yaml": "^2.8.3", + "vite": "^8.0.16", + "vite-plugin-solid": "^2.11.12", + "vitest": "^4.1.8", + "vue": "^3.5.38", + "yaml": "^2.9.0", "zod": "^4.4.3" } } diff --git a/seitu/skills/README.md b/seitu/skills/README.md index 0f395fc..9bd91db 100644 --- a/seitu/skills/README.md +++ b/seitu/skills/README.md @@ -78,6 +78,19 @@ Restart Cursor or start a new agent chat so skills are picked up. |-------|-----------|-------------| | [use-subscription-vue](./use-subscription-vue/SKILL.md) | `seitu#use-subscription-vue` | Composable for any Seitu primitive | +### Solid (`seitu/solid`) + +| Skill | Intent id | When to use | +|-------|-----------|-------------| +| [use-subscription-solid](./use-subscription-solid/SKILL.md) | `seitu#use-subscription-solid` | Primitive returning an accessor for any Seitu primitive | +| [subscription-solid](./subscription-solid/SKILL.md) | `seitu#subscription-solid` | Render-prop component | + +### Svelte (`seitu/svelte`) + +| Skill | Intent id | When to use | +|-------|-----------|-------------| +| [use-subscription-svelte](./use-subscription-svelte/SKILL.md) | `seitu#use-subscription-svelte` | Binding returning a Svelte `Readable` store for any Seitu primitive | + ## Registry and version history The package includes the `tanstack-intent` npm keyword. Published versions are indexed on the [Agent Skills Registry](https://tanstack.com/intent/registry) with skill history per release. diff --git a/seitu/skills/create-computed/SKILL.md b/seitu/skills/create-computed/SKILL.md index 1249a4e..4754b4e 100644 --- a/seitu/skills/create-computed/SKILL.md +++ b/seitu/skills/create-computed/SKILL.md @@ -4,7 +4,7 @@ description: >- Derived read-only subscription from one or many sources. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-debounced-fn/SKILL.md b/seitu/skills/create-debounced-fn/SKILL.md index 884d87e..9a685bc 100644 --- a/seitu/skills/create-debounced-fn/SKILL.md +++ b/seitu/skills/create-debounced-fn/SKILL.md @@ -4,7 +4,7 @@ description: >- Debounced callable with reactive return value. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-debounced/SKILL.md b/seitu/skills/create-debounced/SKILL.md index cb1268e..1a7fb86 100644 --- a/seitu/skills/create-debounced/SKILL.md +++ b/seitu/skills/create-debounced/SKILL.md @@ -4,7 +4,7 @@ description: >- Debounce updates from a source subscribable. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-indexed-db-storage/SKILL.md b/seitu/skills/create-indexed-db-storage/SKILL.md index 75c2b84..a0bd4a3 100644 --- a/seitu/skills/create-indexed-db-storage/SKILL.md +++ b/seitu/skills/create-indexed-db-storage/SKILL.md @@ -4,7 +4,7 @@ description: >- Async IndexedDB persistence with cached sync reads. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-is-online/SKILL.md b/seitu/skills/create-is-online/SKILL.md index f008ad9..d11abff 100644 --- a/seitu/skills/create-is-online/SKILL.md +++ b/seitu/skills/create-is-online/SKILL.md @@ -4,7 +4,7 @@ description: >- Reactive navigator.onLine status. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-media-query/SKILL.md b/seitu/skills/create-media-query/SKILL.md index dd6e5e1..aa1cd89 100644 --- a/seitu/skills/create-media-query/SKILL.md +++ b/seitu/skills/create-media-query/SKILL.md @@ -4,7 +4,7 @@ description: >- Reactive CSS media query with SSR defaultMatches. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-readable-subscription/SKILL.md b/seitu/skills/create-readable-subscription/SKILL.md index d4670c9..0b98fcd 100644 --- a/seitu/skills/create-readable-subscription/SKILL.md +++ b/seitu/skills/create-readable-subscription/SKILL.md @@ -4,7 +4,7 @@ description: >- Compose get + subscribe + notify into standard Readable & Subscribable. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview - create-subscription diff --git a/seitu/skills/create-schema-store/SKILL.md b/seitu/skills/create-schema-store/SKILL.md index ada075f..d38e8cd 100644 --- a/seitu/skills/create-schema-store/SKILL.md +++ b/seitu/skills/create-schema-store/SKILL.md @@ -4,7 +4,7 @@ description: >- Standard Schema validated store with default fallback on invalid data. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-scroll-state/SKILL.md b/seitu/skills/create-scroll-state/SKILL.md index caf677e..e06058b 100644 --- a/seitu/skills/create-scroll-state/SKILL.md +++ b/seitu/skills/create-scroll-state/SKILL.md @@ -4,7 +4,7 @@ description: >- Scroll position, edges, and remaining distance for an element. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-store/SKILL.md b/seitu/skills/create-store/SKILL.md index 69dc66d..bffc44e 100644 --- a/seitu/skills/create-store/SKILL.md +++ b/seitu/skills/create-store/SKILL.md @@ -4,7 +4,7 @@ description: >- Minimal in-memory reactive store with get, set, and subscribe. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-subscription/SKILL.md b/seitu/skills/create-subscription/SKILL.md index 369a990..8f664e6 100644 --- a/seitu/skills/create-subscription/SKILL.md +++ b/seitu/skills/create-subscription/SKILL.md @@ -4,7 +4,7 @@ description: >- Low-level subscribe/notify for custom primitives. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-throttled-fn/SKILL.md b/seitu/skills/create-throttled-fn/SKILL.md index 5f1e877..5c55dc5 100644 --- a/seitu/skills/create-throttled-fn/SKILL.md +++ b/seitu/skills/create-throttled-fn/SKILL.md @@ -4,7 +4,7 @@ description: >- Throttled callable with reactive return value. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-throttled/SKILL.md b/seitu/skills/create-throttled/SKILL.md index ddda5be..a7efbca 100644 --- a/seitu/skills/create-throttled/SKILL.md +++ b/seitu/skills/create-throttled/SKILL.md @@ -4,7 +4,7 @@ description: >- Throttle updates from a source subscribable. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-web-storage-value/SKILL.md b/seitu/skills/create-web-storage-value/SKILL.md index 3e632e1..1cdabfc 100644 --- a/seitu/skills/create-web-storage-value/SKILL.md +++ b/seitu/skills/create-web-storage-value/SKILL.md @@ -4,7 +4,7 @@ description: >- Single-key localStorage/sessionStorage with schema validation. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/create-web-storage/SKILL.md b/seitu/skills/create-web-storage/SKILL.md index 3e40973..4c29fb9 100644 --- a/seitu/skills/create-web-storage/SKILL.md +++ b/seitu/skills/create-web-storage/SKILL.md @@ -4,7 +4,7 @@ description: >- Multi-key localStorage/sessionStorage with per-key schemas. type: core library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview - create-web-storage-value diff --git a/seitu/skills/seitu-overview/SKILL.md b/seitu/skills/seitu-overview/SKILL.md index 6f0b57b..ec01223 100644 --- a/seitu/skills/seitu-overview/SKILL.md +++ b/seitu/skills/seitu-overview/SKILL.md @@ -4,7 +4,7 @@ description: >- Module map, mental model, decision tree, SSR — read before other Seitu skills. type: lifecycle library: seitu -library_version: "0.15.1" +library_version: "0.16.0" sources: - letstri/seitu:docs/content/docs/index.mdx - letstri/seitu:seitu/src/core/index.ts @@ -13,7 +13,7 @@ sources: # Seitu Overview Seitu is a type-safe reactive primitives library. Framework-agnostic core with -React and Vue bindings. Every primitive shares the same `get()` / `subscribe()` +React, Vue, Solid, and Svelte bindings. Every primitive shares the same `get()` / `subscribe()` API — no actions, no reducers, no context providers. ## Module map @@ -24,9 +24,11 @@ API — no actions, no reducers, no context providers. | `seitu/web` | Browser persistence (localStorage, sessionStorage, IndexedDB) and DOM state | | `seitu/react` | `useSubscription` hook + `Subscription` component | | `seitu/vue` | `useSubscription` composable | +| `seitu/solid` | `useSubscription` primitive (returns `Accessor`) + `Subscription` component | +| `seitu/svelte` | `useSubscription` (returns a Svelte `Readable` store) | | `seitu/utils` | Helpers (`repairValueObjectWithDefault`) | -ESM-only. Node >= 22. React >= 19 and Vue >= 3.5 are optional peer deps. +ESM-only. Node >= 22. React >= 19, Vue >= 3.5, Solid >= 1.9, and Svelte >= 5 are optional peer deps. ## Mental model @@ -101,7 +103,9 @@ What do you need? │ └─ Framework integration ├─ React → useSubscription (hook) or Subscription (component) - └─ Vue → useSubscription (composable) + ├─ Vue → useSubscription (composable) + ├─ Solid → useSubscription (returns Accessor) or Subscription (component) + └─ Svelte → useSubscription (returns a Readable store, read with $value) ``` ## Framework binding @@ -122,6 +126,21 @@ const value = useSubscription(store) const data = useSubscription(computed(() => createWebStorageValue({ ... }))) ``` +```tsx +// Solid — instance or reactive getter; returns an Accessor, read with value() +const value = useSubscription(store) +const data = useSubscription(() => createWebStorageValue({ ... })) +``` + +```svelte + + +
{$value}
+``` + ## SSR All `seitu/web` primitives return defaults when `window` / `navigator` is diff --git a/seitu/skills/subscription-react/SKILL.md b/seitu/skills/subscription-react/SKILL.md index d9e6dcd..f0160a8 100644 --- a/seitu/skills/subscription-react/SKILL.md +++ b/seitu/skills/subscription-react/SKILL.md @@ -4,7 +4,7 @@ description: >- Render-prop Subscription component for React. type: framework library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview - use-subscription-react diff --git a/seitu/skills/subscription-solid/SKILL.md b/seitu/skills/subscription-solid/SKILL.md new file mode 100644 index 0000000..b3b287f --- /dev/null +++ b/seitu/skills/subscription-solid/SKILL.md @@ -0,0 +1,97 @@ +--- +name: subscription-solid +description: >- + Render-prop Subscription component for Solid. +type: framework +library: seitu +library_version: "0.16.0" +requires: + - seitu-overview + - use-subscription-solid +sources: + - letstri/seitu:docs/content/docs/solid/components.mdx + - letstri/seitu:seitu/src/solid/components.ts +--- + +# Subscription (Solid component) + +Declarative render-prop component from `seitu/solid`. The children function runs once and +receives a Solid `Accessor` — read it with `value()` so updates stay fine-grained. + +```tsx +import { Subscription } from 'seitu/solid' + + + {value =>
{value().count}
} +
+ + v.count}> + {count =>
{count()}
} +
+``` + +## Props + +| Prop | Type | Description | +|------|------|-------------| +| `value` | `Subscribable & Readable` | The reactive source | +| `selector?` | `(value) => R` | Optional selector for granular updates | +| `children` | `(value: Accessor) => JSX.Element` | Render function receiving an accessor | + +## Common Mistakes + +### [CRITICAL] Treating children's argument as a value, not an accessor + +Wrong: + +```tsx + + {value =>
{value.count}
} +
+``` + +Correct: + +```tsx + + {value =>
{value().count}
} +
+``` + +Unlike React, the children function runs once and receives a Solid `Accessor`; call it (`value()`) inside JSX. + +### [LOW] Preferring the component over the primitive without reason + +Wrong: + +```tsx +{v => } +``` + +Correct: + +```tsx +const v = useSubscription(s); return +``` + +`useSubscription` is simpler for most cases; `Subscription` is for render-prop composition. + +### [CRITICAL] Importing from seitu/react in Solid + +Wrong: + +```ts +import { Subscription } from 'seitu/react' +``` + +Correct: + +```ts +import { Subscription } from 'seitu/solid' +``` + +The React component relies on React internals; Solid apps must use `seitu/solid`. + +## Source + +`src/solid/components.ts` diff --git a/seitu/skills/use-subscription-react/SKILL.md b/seitu/skills/use-subscription-react/SKILL.md index 1e39ccd..50a4b82 100644 --- a/seitu/skills/use-subscription-react/SKILL.md +++ b/seitu/skills/use-subscription-react/SKILL.md @@ -4,7 +4,7 @@ description: >- React hook for any Seitu primitive via useSyncExternalStore. type: framework library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/skills/use-subscription-solid/SKILL.md b/seitu/skills/use-subscription-solid/SKILL.md new file mode 100644 index 0000000..93cee02 --- /dev/null +++ b/seitu/skills/use-subscription-solid/SKILL.md @@ -0,0 +1,144 @@ +--- +name: use-subscription-solid +description: >- + Solid primitive returning an Accessor for any Seitu primitive. +type: framework +library: seitu +library_version: "0.16.0" +requires: + - seitu-overview +sources: + - letstri/seitu:docs/content/docs/solid/hooks.mdx + - letstri/seitu:seitu/src/solid/hooks.ts +--- + +# useSubscription (Solid) + +Core Solid primitive from `seitu/solid`. Returns a Solid `Accessor` (`() => T`) that stays in sync with the source. Works with any `Subscribable & Readable`. Accepts a raw instance or a reactive getter. + +## Basic usage (module-level instance) + +```tsx +import { useSubscription } from 'seitu/solid' +import { createStore } from 'seitu' + +const count = createStore(0) + +function Counter() { + const value = useSubscription(count) + return +} +``` + +## Inline subscription (getter form) + +```tsx +import { useSubscription } from 'seitu/solid' +import { createScrollState } from 'seitu/web' + +function ScrollTracker() { + let ref: HTMLDivElement | undefined + const state = useSubscription(() => + createScrollState({ element: () => ref, direction: 'vertical' }) + ) + return
{state().top.reached ? 'at top' : 'scrolled'}
+} +``` + +## Reactive source (re-subscribes when a signal changes) + +```tsx +import { createSignal } from 'solid-js' +import { useSubscription } from 'seitu/solid' +import { createWebStorageValue } from 'seitu/web' + +function UserStorage(props: { userId: string }) { + const data = useSubscription(() => + createWebStorageValue({ type: 'localStorage', key: `user:${props.userId}`, schema, defaultValue }) + ) + return
{data().name}
+} +``` + +## With selector (granular updates) + +```tsx +const count = useSubscription(storage, { selector: v => v.count }) +// count() only changes when the selected value changes +``` + +## Options + +| Option | Type | Description | +|--------|------|-------------| +| `selector?` | `(value) => R` | Derive subset; the accessor updates only when it changes | +| `isEqual?` | `(prev, next) => boolean` | Custom equality (default: `deepEqual`) | + +## Returns + +`Accessor` — a getter function. Read it with `value()` inside JSX or any tracked scope. + +## Common Mistakes + +### [CRITICAL] Reading the accessor without calling it + +Wrong: + +```tsx +const value = useSubscription(store) +return
{value}
+``` + +Correct: + +```tsx +const value = useSubscription(store) +return
{value()}
+``` + +`useSubscription` returns a Solid `Accessor`; you must call it (`value()`) to read and track the value. + +### [HIGH] Passing reactive props directly instead of a getter + +Wrong: + +```tsx +function Item(props: { store: Store }) { + const value = useSubscription(props.store) +} +``` + +Correct: + +```tsx +function Item(props: { store: Store }) { + const value = useSubscription(() => props.store) +} +``` + +Reading `props.store` outside a tracked scope loses reactivity; the getter form re-subscribes when the prop changes. + +### [CRITICAL] Importing from seitu/react in Solid + +Wrong: + +```ts +import { useSubscription } from 'seitu/react' +``` + +Correct: + +```ts +import { useSubscription } from 'seitu/solid' +``` + +Solid apps must use the `seitu/solid` primitive — the React hook relies on `useSyncExternalStore`. + +## See also + +- [`subscription-solid`](../subscription-solid/SKILL.md) — Render-prop component alternative. +- [`create-scroll-state`](../create-scroll-state/SKILL.md) — Scroll tracking uses the getter + ref pattern in Solid. + +## Source + +`src/solid/hooks.ts` diff --git a/seitu/skills/use-subscription-svelte/SKILL.md b/seitu/skills/use-subscription-svelte/SKILL.md new file mode 100644 index 0000000..9fa1d93 --- /dev/null +++ b/seitu/skills/use-subscription-svelte/SKILL.md @@ -0,0 +1,134 @@ +--- +name: use-subscription-svelte +description: >- + Svelte binding returning a Readable store for any Seitu primitive. +type: framework +library: seitu +library_version: "0.16.0" +requires: + - seitu-overview +sources: + - letstri/seitu:docs/content/docs/svelte/hooks.mdx + - letstri/seitu:seitu/src/svelte/hooks.ts +--- + +# useSubscription (Svelte) + +Binding from `seitu/svelte`. Returns a Svelte [`Readable`](https://svelte.dev/docs/svelte-store#readable) +store that stays in sync with any `Subscribable & Readable`. Read it with the `$` +auto-subscription (`$value`) in markup. The source subscription is created lazily on the +first subscriber and torn down when the last one leaves (SSR-safe, auto-cleanup). + +## Basic usage (module-level instance) + +```svelte + + + +``` + +## Inline subscription (factory form) + +```svelte + + +
{$value}
+``` + +## With selector (granular updates) + +```svelte + + +
{$count}
+``` + +## Options + +| Option | Type | Description | +|--------|------|-------------| +| `selector?` | `(value) => R` | Derive a subset; the store updates only when it changes | +| `isEqual?` | `(prev, next) => boolean` | Custom equality (default: `deepEqual`) | + +## Returns + +`Readable` (from `svelte/store`) — read it as `$value` in markup, or with `get(value)` in scripts. + +## Common Mistakes + +### [CRITICAL] Reading the store without the `$` prefix + +Wrong: + +```svelte +
{value}
+``` + +Correct: + +```svelte +
{$value}
+``` + +`useSubscription` returns a Svelte store; the `$` prefix auto-subscribes and reads the current value. + +### [MEDIUM] Passing a factory expecting reactivity to a changing source + +Wrong: + +```svelte + +``` + +Correct: + +```svelte + +``` + +The factory is a one-time initializer; for a source that changes over time, recreate the binding (e.g. in a `{#key}` block). + +### [CRITICAL] Importing from seitu/react in Svelte + +Wrong: + +```ts +import { useSubscription } from 'seitu/react' +``` + +Correct: + +```ts +import { useSubscription } from 'seitu/svelte' +``` + +The React hook relies on `useSyncExternalStore`; Svelte apps must use the `seitu/svelte` binding. + +## Source + +`src/svelte/hooks.ts` diff --git a/seitu/skills/use-subscription-vue/SKILL.md b/seitu/skills/use-subscription-vue/SKILL.md index c5e75e0..ea7d532 100644 --- a/seitu/skills/use-subscription-vue/SKILL.md +++ b/seitu/skills/use-subscription-vue/SKILL.md @@ -4,7 +4,7 @@ description: >- Vue composable returning readonly ShallowRef. type: framework library: seitu -library_version: "0.15.1" +library_version: "0.16.0" requires: - seitu-overview sources: diff --git a/seitu/src/solid/components.test.tsx b/seitu/src/solid/components.test.tsx new file mode 100644 index 0000000..5c6f111 --- /dev/null +++ b/seitu/src/solid/components.test.tsx @@ -0,0 +1,117 @@ +import { cleanup, render, waitFor } from '@solidjs/testing-library' +import { createEffect } from 'solid-js' +import { afterEach, describe, expect, it } from 'vitest' +import * as z from 'zod' +import { createWebStorage } from '../web/web-storage' +import { createWebStorageValue } from '../web/web-storage-value' +import { Subscription } from './components' +import '@testing-library/jest-dom/vitest' + +afterEach(() => { + cleanup() + window.sessionStorage.clear() +}) + +const TEST_KEY = 'seitu-solid-components-test-key' + +describe('subscription', () => { + describe('without selector', () => { + it('should render children with the current value', () => { + const storage = createWebStorageValue({ + type: 'sessionStorage', + schema: z.number(), + key: TEST_KEY, + defaultValue: 42, + }) + + const { getByTestId } = render(() => ( + + {value => {value()}} + + )) + expect(getByTestId('subscription-value')).toHaveTextContent('42') + }) + + it('should update children when subscription value changes', async () => { + const storage = createWebStorageValue({ + type: 'sessionStorage', + schema: z.number(), + key: TEST_KEY, + defaultValue: 0, + }) + + const { getByTestId } = render(() => ( + + {value => {value()}} + + )) + expect(getByTestId('subscription-value')).toHaveTextContent('0') + + storage.set(99) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('99')) + }) + }) + + describe('with selector', () => { + it('should render children with the selected value', () => { + const storage = createWebStorage({ + type: 'sessionStorage', + schemas: { count: z.number() }, + defaultValues: { count: 10 }, + }) + + const { getByTestId } = render(() => ( + value.count}> + {value => {value()}} + + )) + expect(getByTestId('subscription-value')).toHaveTextContent('10') + }) + + it('should update children when subscription value changes', async () => { + const storage = createWebStorage({ + type: 'sessionStorage', + schemas: { count: z.number() }, + defaultValues: { count: 0 }, + }) + + const { getByTestId } = render(() => ( + value.count}> + {value => {value()}} + + )) + expect(getByTestId('subscription-value')).toHaveTextContent('0') + + storage.set({ count: 42 }) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('42')) + }) + + it('should not update when value is the same', async () => { + const storage = createWebStorage({ + type: 'sessionStorage', + schemas: { count: z.number(), name: z.string() }, + defaultValues: { count: 0, name: '' }, + }) + + let runs = 0 + const { getByTestId } = render(() => ( + value.count}> + {(value) => { + createEffect(() => { + value() + runs++ + }) + return {value()} + }} + + )) + expect(getByTestId('subscription-value')).toHaveTextContent('0') + expect(runs).toBe(1) + + storage.set({ count: 0, name: 'test' }) + await Promise.resolve() + expect(getByTestId('subscription-value')).toHaveTextContent('0') + expect(runs).toBe(1) + }) + }) +}) diff --git a/seitu/src/solid/components.ts b/seitu/src/solid/components.ts new file mode 100644 index 0000000..77ff2c1 --- /dev/null +++ b/seitu/src/solid/components.ts @@ -0,0 +1,65 @@ +import type { Accessor, JSX } from 'solid-js' +import type { Readable, Subscribable } from '../core/index' +import type { UseSubscriptionOptions } from './hooks' +import { useSubscription } from './hooks' + +export interface SubscriptionProps & Readable, R = S['~']['output']> extends Pick, 'selector'> { + value: S + children: (value: Accessor) => JSX.Element +} + +/** + * Declarative component that subscribes to a reactive value and passes an accessor to a render function. + * Unlike React, the children function runs once and receives a Solid `Accessor` — call it (`value()`) + * inside the returned JSX so updates stay fine-grained. Use when you prefer a component API over the + * useSubscription primitive. + * + * @example Basic usage + * ```tsx + * import { createWebStorage } from 'seitu/web' + * import { Subscription } from 'seitu/solid' + * import * as z from 'zod' + * + * const sessionStorage = createWebStorage({ + * type: 'sessionStorage', + * schemas: { count: z.number(), name: z.string() }, + * defaultValues: { count: 0, name: '' }, + * }) + * + * function Page() { + * return ( + * + * {value =>
{value().count}
} + *
+ * ) + * } + * ``` + * + * @example With selector + * ```tsx + * import { createWebStorage } from 'seitu/web' + * import { Subscription } from 'seitu/solid' + * import * as z from 'zod' + * + * const sessionStorage = createWebStorage({ + * type: 'sessionStorage', + * schemas: { count: z.number(), name: z.string() }, + * defaultValues: { count: 0, name: '' }, + * }) + * + * function Page() { + * return ( + * v.count}> + * {count =>
{count()}
} + *
+ * ) + * } + * ``` + */ +export function Subscription & Readable, R = S['~']['output']>( + props: SubscriptionProps, +): JSX.Element { + const value = useSubscription(() => props.value, { selector: props.selector }) + + return props.children(value) +} diff --git a/seitu/src/solid/hooks.test.tsx b/seitu/src/solid/hooks.test.tsx new file mode 100644 index 0000000..c868614 --- /dev/null +++ b/seitu/src/solid/hooks.test.tsx @@ -0,0 +1,273 @@ +import type { WebStorage } from '../web/web-storage' +import type { WebStorageValue } from '../web/web-storage-value' +import { cleanup, render, renderHook, waitFor } from '@solidjs/testing-library' +import { createEffect, createSignal } from 'solid-js' +import { afterEach, describe, expect, it, vi } from 'vitest' +import * as z from 'zod' +import { createStore } from '../core/store' +import { createMediaQuery } from '../web/media-query' +import { createWebStorage } from '../web/web-storage' +import { createWebStorageValue } from '../web/web-storage-value' +import { useSubscription } from './hooks' +import '@testing-library/jest-dom/vitest' + +afterEach(() => { + cleanup() + window.sessionStorage.clear() +}) + +const TEST_KEY = 'seitu-solid-hooks-test-key' + +function TestComponent(props: { storage: WebStorageValue }) { + const value = useSubscription(() => props.storage) + return {value()} +} + +function TestComponentWithSelector(props: { storage: WebStorage<{ count: number }> }) { + const value = useSubscription(() => props.storage, { selector: value => value.count }) + return {value()} +} + +describe('useSubscription no selector', () => { + it('should return the value', () => { + const subscription = { + 'get': () => 1, + 'subscribe': () => () => {}, + '~': { + notify: () => {}, + output: null as unknown as number, + }, + } + const { result } = renderHook(() => useSubscription(() => subscription)) + expect(result()).toBe(1) + }) + + it('should update when session storage value changes', async () => { + const storage = createWebStorageValue({ type: 'sessionStorage', schema: z.number(), key: TEST_KEY, defaultValue: 0 }) + + const { getByTestId } = render(() => ) + expect(getByTestId('subscription-value')).toHaveTextContent('0') + + storage.set(42) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('42')) + }) +}) + +describe('useSubscription with selector', () => { + it('should update when selector value changes', async () => { + const storage = createWebStorage({ type: 'sessionStorage', schemas: { count: z.number() }, defaultValues: { count: 0 } }) + + const { getByTestId } = render(() => ) + expect(getByTestId('subscription-value')).toHaveTextContent('0') + + storage.set({ count: 42 }) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('42')) + }) + + it('should not update when value is the same', async () => { + const storage = createWebStorage({ type: 'sessionStorage', schemas: { count: z.number(), name: z.string() }, defaultValues: { count: 0, name: '' } }) + let runs = 0 + + function TestWithRunCount() { + const value = useSubscription(storage, { selector: value => value.count }) + createEffect(() => { + value() + runs++ + }) + return {value()} + } + + const { getByTestId } = render(() => ) + expect(getByTestId('subscription-value')).toHaveTextContent('0') + expect(runs).toBe(1) + + storage.set({ count: 1, name: 'test' }) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('1')) + expect(runs).toBe(2) + + storage.set({ count: 1, name: 'new test' }) + await Promise.resolve() + expect(getByTestId('subscription-value')).toHaveTextContent('1') + expect(runs).toBe(2) + }) +}) + +describe('useSubscription with direct object', () => { + it('should accept a stable subscription object', () => { + const storage = createWebStorageValue({ type: 'sessionStorage', schema: z.number(), key: TEST_KEY, defaultValue: 0 }) + + const { result } = renderHook(() => useSubscription(storage)) + expect(result()).toBe(0) + }) +}) + +describe('useSubscription with custom isEqual', () => { + it('should use custom comparator instead of deepEqual', async () => { + const storage = createWebStorage({ type: 'sessionStorage', schemas: { count: z.number(), name: z.string() }, defaultValues: { count: 0, name: '' } }) + let runs = 0 + + function TestCustomIsEqual() { + const value = useSubscription(storage, { isEqual: (a, b) => a.count === b.count }) + createEffect(() => { + value() + runs++ + }) + return {value().name} + } + + const { getByTestId } = render(() => ) + expect(runs).toBe(1) + expect(getByTestId('subscription-value')).toHaveTextContent('') + + storage.set({ count: 0, name: 'changed' }) + await Promise.resolve() + expect(runs).toBe(1) + expect(getByTestId('subscription-value')).toHaveTextContent('') + + storage.set({ count: 1, name: 'changed' }) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('changed')) + expect(runs).toBe(2) + }) + + it('should use Object.is when passed as comparator', async () => { + const storage = createWebStorage({ type: 'sessionStorage', schemas: { count: z.number() }, defaultValues: { count: 0 } }) + let runs = 0 + + function TestObjectIs() { + const value = useSubscription(storage, { selector: v => v.count, isEqual: Object.is }) + createEffect(() => { + value() + runs++ + }) + return {value()} + } + + render(() => ) + expect(runs).toBe(1) + + storage.set({ count: 1 }) + await waitFor(() => expect(runs).toBe(2)) + + storage.set({ count: 1 }) + await Promise.resolve() + expect(runs).toBe(2) + }) +}) + +describe('useSubscription with reactive source', () => { + it('should pick up a new subscription when the accessor returns a new source', async () => { + const storageA = createWebStorageValue({ type: 'sessionStorage', schema: z.number(), key: `${TEST_KEY}-a`, defaultValue: 1 }) + const storageB = createWebStorageValue({ type: 'sessionStorage', schema: z.number(), key: `${TEST_KEY}-b`, defaultValue: 2 }) + + const [current, setCurrent] = createSignal>(storageA) + + function TestReactiveSource() { + const value = useSubscription(() => current()) + return {value()} + } + + const { getByTestId } = render(() => ) + expect(getByTestId('subscription-value')).toHaveTextContent('1') + + setCurrent(storageB) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('2')) + + storageB.set(20) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('20')) + }) + + it('should not react to the old source after switching', async () => { + const storageA = createWebStorageValue({ type: 'sessionStorage', schema: z.number(), key: `${TEST_KEY}-a`, defaultValue: 0 }) + const storageB = createWebStorageValue({ type: 'sessionStorage', schema: z.number(), key: `${TEST_KEY}-b`, defaultValue: 10 }) + + const [current, setCurrent] = createSignal>(storageA) + let runs = 0 + + function TestReactiveSource() { + const value = useSubscription(() => current()) + createEffect(() => { + value() + runs++ + }) + return {value()} + } + + const { getByTestId } = render(() => ) + expect(getByTestId('subscription-value')).toHaveTextContent('0') + + setCurrent(storageB) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('10')) + const runsAfterSwitch = runs + + storageA.set(99) + await Promise.resolve() + expect(runs).toBe(runsAfterSwitch) + }) +}) + +describe('useSubscription with createStore', () => { + it('should work with a basic store', async () => { + const store = createStore(0) + + function TestStore() { + const value = useSubscription(store) + return {value()} + } + + const { getByTestId } = render(() => ) + expect(getByTestId('subscription-value')).toHaveTextContent('0') + + store.set(10) + await waitFor(() => expect(getByTestId('subscription-value')).toHaveTextContent('10')) + }) +}) + +describe('useSubscription cleanup', () => { + it('should unsubscribe on unmount', () => { + const unsubscribe = vi.fn() + const subscribe = vi.fn(() => unsubscribe) + const sub = { + 'get': () => 1, + 'subscribe': subscribe, + '~': { notify: () => {}, output: null as unknown as number }, + } + + const { cleanup: dispose } = renderHook(() => useSubscription(() => sub)) + expect(subscribe).toHaveBeenCalledTimes(1) + expect(unsubscribe).not.toHaveBeenCalled() + + dispose() + expect(unsubscribe).toHaveBeenCalledTimes(1) + }) +}) + +describe('createMediaQuery', () => { + it('should return the matches value for light and dark', async () => { + const originalMatchMedia = window.matchMedia + let listener: ((event: Event) => void) | null = null + + const mql = { + matches: true, + media: '(prefers-color-scheme: dark)', + addEventListener: vi.fn((_event: string, cb: (event: Event) => void) => { + listener = cb + }), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn((event: Event) => { + listener?.(event) + return true + }), + } + + window.matchMedia = vi.fn().mockReturnValue(mql) + + const { result } = renderHook(() => useSubscription(() => createMediaQuery({ query: '(prefers-color-scheme: dark)' }))) + expect(result()).toBe(true) + + mql.matches = false + listener?.(new Event('change')) + await waitFor(() => expect(result()).toBe(false)) + + window.matchMedia = originalMatchMedia + }) +}) diff --git a/seitu/src/solid/hooks.ts b/seitu/src/solid/hooks.ts new file mode 100644 index 0000000..fc467ca --- /dev/null +++ b/seitu/src/solid/hooks.ts @@ -0,0 +1,144 @@ +import type { Accessor } from 'solid-js' +import type { Readable, Subscribable } from '../core/index' +import { deepEqual } from 'fast-equals' +import { createEffect, createMemo, createSignal, onCleanup } from 'solid-js' + +export interface UseSubscriptionOptions & Readable, R = S['~']['output']> { + selector?: (value: S['~']['output']) => R + isEqual?: (prev: R, next: R) => boolean +} + +/** + * Use this primitive to subscribe to a reactive value. Accepts a subscription object + * directly, or an accessor/getter that returns one. The getter is reactive — when it + * reads a signal, the subscription is recreated and re-subscribed automatically. + * + * Returns a Solid `Accessor`: call it (`value()`) to read the current value inside JSX + * or another reactive scope. + * + * @example Inline subscription + * ```tsx + * import { createWebStorageValue } from 'seitu/web' + * import { useSubscription } from 'seitu/solid' + * import * as z from 'zod' + * + * function Counter() { + * const value = useSubscription(() => createWebStorageValue({ + * type: 'sessionStorage', + * key: 'test', + * defaultValue: 0, + * schema: z.number(), + * })) + * + * return
{value()}
+ * } + * ``` + * + * @example Instance outside of component + * ```tsx + * import { createWebStorage } from 'seitu/web' + * import { useSubscription } from 'seitu/solid' + * import * as z from 'zod' + * + * const sessionStorage = createWebStorage({ + * type: 'sessionStorage', + * schemas: { count: z.number(), name: z.string() }, + * defaultValues: { count: 0, name: '' }, + * }) + * + * function Counter() { + * const value = useSubscription(sessionStorage) + * return
{value().count}
+ * } + * ``` + * + * @example Subscription with selector + * ```tsx + * import { createWebStorage } from 'seitu/web' + * import { useSubscription } from 'seitu/solid' + * import * as z from 'zod' + * + * const sessionStorage = createWebStorage({ + * type: 'sessionStorage', + * schemas: { + * count: z.number(), + * name: z.string(), + * }, + * defaultValues: { count: 0, name: '' }, + * }) + * + * function Counter() { + * // Usage with selector, the accessor only updates when count changes + * const count = useSubscription(sessionStorage, { selector: value => value.count }) + * + * return
{count()}
+ * } + * ``` + * + * @example Reactive source (re-subscribes when a signal changes) + * ```tsx + * import { createSignal } from 'solid-js' + * import { createWebStorageValue } from 'seitu/web' + * import { useSubscription } from 'seitu/solid' + * import * as z from 'zod' + * + * function User() { + * const [userId, setUserId] = createSignal('user-1') + * const data = useSubscription(() => createWebStorageValue({ + * type: 'localStorage', + * key: `user:${userId()}`, + * schema: z.object({ name: z.string() }), + * defaultValue: { name: '' }, + * })) + * + * return
{data().name}
+ * } + * ``` + * + * @example Ref example + * ```tsx + * import { createScrollState } from 'seitu/web' + * import { useSubscription } from 'seitu/solid' + * + * function Page() { + * let ref: HTMLDivElement | undefined + * const state = useSubscription(() => createScrollState({ element: () => ref, direction: 'vertical' })) + * + * return ( + *
+ * {String(state().top.reached)} + *
+ * ) + * } + * ``` + */ +export function useSubscription< + S extends Subscribable & Readable, + R = S['~']['output'], +>( + source: S | Accessor, + options?: UseSubscriptionOptions, +): Accessor { + const { selector, isEqual = deepEqual } = options ?? {} + const getSource = (typeof source === 'function' ? source : () => source) as Accessor + + function getSnapshot(sub: S): R { + return selector ? selector(sub.get()) : sub.get() + } + + const sub = createMemo(() => getSource()) + const [state, setState] = createSignal(getSnapshot(sub()), { equals: isEqual }) + + createEffect(() => { + const current = sub() + setState(() => getSnapshot(current)) + + const unsubscribe = current.subscribe(() => { + setState(() => getSnapshot(current)) + }) + + onCleanup(unsubscribe) + }) + + return state +} diff --git a/seitu/src/solid/index.ts b/seitu/src/solid/index.ts new file mode 100644 index 0000000..7aea380 --- /dev/null +++ b/seitu/src/solid/index.ts @@ -0,0 +1,2 @@ +export * from './components' +export * from './hooks' diff --git a/seitu/src/svelte/hooks.test.ts b/seitu/src/svelte/hooks.test.ts new file mode 100644 index 0000000..6b50ebd --- /dev/null +++ b/seitu/src/svelte/hooks.test.ts @@ -0,0 +1,128 @@ +import { get } from 'svelte/store' +import { afterEach, describe, expect, it, vi } from 'vitest' +import * as z from 'zod' +import { createStore } from '../core/store' +import { createWebStorage } from '../web/web-storage' +import { createWebStorageValue } from '../web/web-storage-value' +import { useSubscription } from './hooks' + +afterEach(() => { + window.sessionStorage.clear() +}) + +const TEST_KEY = 'seitu-svelte-hooks-test-key' + +describe('useSubscription no selector', () => { + it('should return the initial value', () => { + const store = createStore(1) + const value = useSubscription(store) + expect(get(value)).toBe(1) + }) + + it('should accept a factory function', () => { + const value = useSubscription(() => createStore(5)) + expect(get(value)).toBe(5) + }) + + it('should emit updates to subscribers when the source changes', () => { + const store = createStore(0) + const value = useSubscription(store) + + const seen: number[] = [] + const unsubscribe = value.subscribe(v => seen.push(v)) + expect(seen).toEqual([0]) + + store.set(42) + expect(get(value)).toBe(42) + expect(seen).toEqual([0, 42]) + + unsubscribe() + }) + + it('should reflect createWebStorageValue updates', () => { + const storage = createWebStorageValue({ type: 'sessionStorage', schema: z.number(), key: TEST_KEY, defaultValue: 0 }) + const value = useSubscription(storage) + + const seen: number[] = [] + const unsubscribe = value.subscribe(v => seen.push(v)) + expect(seen).toEqual([0]) + + storage.set(7) + expect(get(value)).toBe(7) + expect(seen).toEqual([0, 7]) + + unsubscribe() + }) +}) + +describe('useSubscription with selector', () => { + it('should derive a subset of the value and skip unrelated changes', () => { + const storage = createWebStorage({ + type: 'sessionStorage', + schemas: { count: z.number(), name: z.string() }, + defaultValues: { count: 0, name: '' }, + }) + const count = useSubscription(storage, { selector: v => v.count }) + + const seen: number[] = [] + const unsubscribe = count.subscribe(v => seen.push(v)) + expect(seen).toEqual([0]) + + storage.set({ count: 5, name: 'a' }) + expect(get(count)).toBe(5) + expect(seen).toEqual([0, 5]) + + // Selected value unchanged -> no emission + storage.set({ count: 5, name: 'b' }) + expect(seen).toEqual([0, 5]) + + unsubscribe() + }) +}) + +describe('useSubscription with custom isEqual', () => { + it('should use the custom comparator instead of deepEqual', () => { + const storage = createWebStorage({ + type: 'sessionStorage', + schemas: { count: z.number(), name: z.string() }, + defaultValues: { count: 0, name: '' }, + }) + const value = useSubscription(storage, { isEqual: (a, b) => a.count === b.count }) + + const seen: { count: number, name: string }[] = [] + const unsubscribe = value.subscribe(v => seen.push(v)) + expect(seen).toHaveLength(1) + + // count unchanged -> treated as equal + storage.set({ count: 0, name: 'changed' }) + expect(seen).toHaveLength(1) + + storage.set({ count: 1, name: 'changed' }) + expect(seen).toHaveLength(2) + + unsubscribe() + }) +}) + +describe('useSubscription cleanup', () => { + it('should subscribe lazily and unsubscribe when the last subscriber leaves', () => { + const unsubscribe = vi.fn() + const subscribe = vi.fn(() => unsubscribe) + const sub = { + 'get': () => 1, + 'subscribe': subscribe, + '~': { notify: () => {}, output: null as unknown as number }, + } + + const value = useSubscription(sub) + // No subscriber yet -> the underlying source is not subscribed + expect(subscribe).not.toHaveBeenCalled() + + const dispose = value.subscribe(() => {}) + expect(subscribe).toHaveBeenCalledTimes(1) + expect(unsubscribe).not.toHaveBeenCalled() + + dispose() + expect(unsubscribe).toHaveBeenCalledTimes(1) + }) +}) diff --git a/seitu/src/svelte/hooks.ts b/seitu/src/svelte/hooks.ts new file mode 100644 index 0000000..b113701 --- /dev/null +++ b/seitu/src/svelte/hooks.ts @@ -0,0 +1,109 @@ +import type { Readable as SvelteReadable } from 'svelte/store' +import type { Readable, Subscribable } from '../core/index' +import { deepEqual } from 'fast-equals' +import { readable } from 'svelte/store' + +export interface UseSubscriptionOptions & Readable, R = S['~']['output']> { + selector?: (value: S['~']['output']) => R + isEqual?: (prev: R, next: R) => boolean +} + +/** + * Use this function to subscribe to a reactive value from a Svelte component. + * Accepts a subscription object directly, or a factory function that is called + * once to create one. + * + * Returns a Svelte `Readable` store — read it with the `$` auto-subscription + * (`$value`) in markup. The underlying subscription is created lazily on the + * first subscriber and torn down when the last one leaves. + * + * @example Inline subscription + * ```svelte + * + * + *
{$value}
+ * ``` + * + * @example Instance outside of component + * ```svelte + * + * + *
{$value.count}
+ * ``` + * + * @example With selector + * ```svelte + * + * + *
{$count}
+ * ``` + */ +export function useSubscription< + S extends Subscribable & Readable, + R = S['~']['output'], +>( + source: S | (() => S), + options?: UseSubscriptionOptions, +): SvelteReadable { + const { selector, isEqual = deepEqual } = options ?? {} + const sub = (typeof source === 'function' ? source() : source) as S + + function getSnapshot(): R { + return selector ? selector(sub.get()) : sub.get() + } + + const initial = getSnapshot() + + return readable(initial, (set) => { + let current = initial + + function refresh(): void { + const next = getSnapshot() + if (!isEqual(current, next)) { + current = next + set(next) + } + } + + // Re-sync in case the value changed between store creation and the first subscriber. + refresh() + + return sub.subscribe(refresh) + }) +} diff --git a/seitu/src/svelte/index.ts b/seitu/src/svelte/index.ts new file mode 100644 index 0000000..fc78d35 --- /dev/null +++ b/seitu/src/svelte/index.ts @@ -0,0 +1 @@ +export * from './hooks' diff --git a/seitu/tsdown.config.ts b/seitu/tsdown.config.ts index 8ec1e36..43cda4d 100644 --- a/seitu/tsdown.config.ts +++ b/seitu/tsdown.config.ts @@ -7,6 +7,8 @@ export default defineConfig(({ watch }) => ({ web: './src/web/index.ts', react: './src/react/index.ts', vue: './src/vue/index.ts', + solid: './src/solid/index.ts', + svelte: './src/svelte/index.ts', utils: './src/utils/index.ts', }, dts: true, diff --git a/seitu/vitest.config.ts b/seitu/vitest.config.ts index d3db777..80225cb 100644 --- a/seitu/vitest.config.ts +++ b/seitu/vitest.config.ts @@ -1,22 +1,21 @@ -import os from 'node:os' -import path from 'node:path' -import process from 'node:process' +import react from '@vitejs/plugin-react' +import solid from 'vite-plugin-solid' import { defineConfig } from 'vitest/config' -const localStorageArgs = [ - '--localstorage-file', - path.resolve(os.tmpdir(), `vitest-${process.pid}.localstorage`), -] - export default defineConfig({ + plugins: [ + react({ + include: ['**/src/react/*.ts?(x)'], + }), + solid({ + include: ['**/src/solid/*.ts?(x)'], + }), + ], test: { environment: 'happy-dom', - // https://github.com/capricorn86/happy-dom/issues/1950#issuecomment-3523878228 - pool: 'forks', - poolOptions: { - forks: { - execArgv: localStorageArgs, - }, - }, + exclude: ['**/node_modules/**', '**/dist/**'], + // Node 25+ ships Web Storage on by default, which shadows happy-dom's + // localStorage polyfill; disable it so the in-memory polyfill is used. + execArgv: ['--no-experimental-webstorage'], }, })