diff --git a/.changeset/solid-v2-wholesale-refactor.md b/.changeset/solid-v2-wholesale-refactor.md new file mode 100644 index 0000000000..dd637a0009 --- /dev/null +++ b/.changeset/solid-v2-wholesale-refactor.md @@ -0,0 +1,161 @@ +--- +'@tanstack/solid-db': major +--- + +# Solid v2 RC migration + wholesale observer refactor + +Migrates `@tanstack/solid-db` from Solid v1 to **Solid v2 RC** (`solid-js@2.0.0-rc.0`) and reworks the adapter to use the shared `LiveQueryObserver` in wholesale mode. This is a **breaking** release — the peer dependency is now `solid-js: >=2.0.0-rc.0` and `@solidjs/web: >=2.0.0-rc.0`. + +## Breaking changes + +### Solid v2 RC migration + +Peer dependencies require Solid v2 RC. Code consuming `@tanstack/solid-db` must be migrated to Solid v2: + +- `Suspense` → `Loading` (from `@solidjs/web`) +- `ErrorBoundary` → `Errored` (from `@solidjs/web`) +- `createResource` → async `createMemo` (internal; `useLiveQuery` now throws `NotReadyError` for `` and the captured error for ``) +- `createEffect` → split `createRenderEffect` (internal) +- `batch()` removed — v2 auto-batches +- `createStore`/`reconcile` imported from `solid-js` root (not `solid-js/store`) +- `reconcile(value, { key, merge })` → `reconcile(value, key | null)` +- Store setter uses draft callback form +- `ownedWrite: true` on status signal (written from observer callbacks) + +### Removed status flags and data property from accessor + +The accessor no longer exposes `data`, `status`, `isLoading`, `isReady`, +`isIdle`, `isError`, or `isCleanedUp`. Loading and error states are handled +exclusively through `` and `` boundaries, with `isPending` +and `latest` helpers for finer control. The accessor surface is now just +`query()` (data), `query.state` (ReactiveMap), and `query.collection`. + +```diff +- query.data // removed — use query() +- query.status // removed — use / boundaries +- query.isLoading // removed — use isPending(query) +- query.isReady // removed — wrap reads in +- query.isError // removed — wrap reads in ++ query() // data access (throws NotReadyError when loading) ++ query.state // ReactiveMap ++ query.collection // underlying Collection +``` + +### Data accessor throws during loading + +Reading the accessor result (`query()`) while the collection is not yet ready +now throws `NotReadyError` (caught by ``). Previously, data reads +during loading or revalidation returned stale or empty arrays synchronously. +Consumers must wrap data reads in a `` boundary or check +`query.isReady` / `query.status` before reading. + +### Wholesale observer mode + +`useLiveQuery` now subscribes to the `LiveQueryObserver` in **wholesale** mode instead of granular. The observer delivers wake-up notifies; Solid's keyed `reconcile(rows, '$key')` handles the per-field diff that preserves fine-grained row reactivity. + +On-demand collections that relied on the granular adapter's `includeInitialState: true` behavior must ensure initial data is loaded explicitly — matching the React adapter's wholesale policy. + +The manual delta-patching layer (~160 lines: `rowIndex`, `syncRows`, `patchArrayChanges`, `patchSingleResultChanges`, `patchStoreRow`, `syncDataFromCollection`) has been removed. `useLiveQuery` adapter source went from 698 to 537 lines. + +## New features + +### `isPending` and `latest` helpers + +The v2 migration unlocks Solid's built-in async helpers on the accessor result: + +- `isPending(query)` — returns `true` while an unrevealed value change is in flight (e.g. during revalidation when a new collection is loading). +- `latest(query)` — returns the last resolved value, skipping the `` boundary during revalidation (useful for stale-while-revalidate UIs). + +```tsx +import { isPending, latest } from 'solid-js' +import { useLiveQuery } from '@tanstack/solid-db' + +const query = useLiveQuery((q) => q.from({ todos: todosCollection })) + +// Show a spinner refetching indicator during revalidation: + + + + +// Render stale data immediately during revalidation (no Loading flash): +{(todo) =>
  • {todo.text}
  • }
    +``` + +These work because `useLiveQuery` now uses async `createMemo` whose previous +value is held in place until the new value resolves — the v2 reactive graph +contract `isPending` and `latest` read from. + +### External-source bridge (opt-in) + +New `enableSolidDBExternalSource()` and `trackSnapshot(observer)` exports. Uses Solid v2's `enableExternalSource` API to bridge `LiveQueryObserver` snapshots into Solid's tracking graph: + +```tsx +import { enableSolidDBExternalSource, trackSnapshot } from '@tanstack/solid-db' + +// Call once at app startup: +enableSolidDBExternalSource() + +// trackSnapshot() inside any Solid compute auto-subscribes: +const snapshot = createMemo(() => trackSnapshot(observer)) +``` + +Without the bridge, `useLiveQuery` handles subscription internally as before. + +## Performance + +Benchmarks comparing the previous Solid v1 adapter (main branch, commit +`2c35b588`) against the new Solid v2 wholesale adapter. JSDOM, median of +5 iterations each. The v1 adapter is the pre-renderer-rework version that +was running in production before this MR. + +### Initial All-Row Mount + +| Rows | v1 (main) | v2 wholesale | Result | +| ----- | --------: | -----------: | ------------ | +| 10 | 2.35ms | 1.54ms | 1.53× faster | +| 1,000 | 18.75ms | 11.53ms | 1.63× faster | +| 10,000| 129.74ms | 73.35ms | 1.77× faster | + +### Single-Row Update in All-Row Query + +| Rows | v1 (main) | v2 wholesale | Result | +| ----- | --------: | -----------: | ------------ | +| 10 | 0.06ms | 0.03ms | 2.00× faster | +| 1,000 | 0.08ms | 0.02ms | 4.00× faster | +| 10,000| 0.08ms | 0.02ms | 4.00× faster | + +### 10% Row Batch Update + +| Rows | v1 (main) | v2 wholesale | Result | +| ----- | --------: | -----------: | ------------ | +| 10 | 0.07ms | 0.04ms | 1.75× faster | +| 1,000 | 9.59ms | 1.68ms | 5.71× faster | +| 10,000| 97.40ms | 24.00ms | 4.06× faster | + +### Repeated Single-Row Updates (1000 rows × 200 commits) + +| v1 (main) | v2 wholesale | Result | +| --------: | -----------: | ------------ | +| 2.52ms | 2.60ms | 0.97× (par) | + +### findOne Update (1000 rows) + +| v1 (main) | v2 wholesale | Result | +| --------: | -----------: | ------------ | +| 0.01ms | 0.03ms | 0.33× slower | + +### Remount After Update (1000 rows) + +| v1 (main) | v2 wholesale | Result | +| --------: | -----------: | ------------ | +| 3.13ms | 3.77ms | 0.83× slower | + +**Summary**: The v2 wholesale adapter is **1.5–5.7× faster** than the v1 +adapter for mount, single-row updates, and batch updates — the scenarios +that dominate real-world usage. findOne and remount are marginally slower +(sub-millisecond absolute difference). Repeated rapid-fire single-row +updates are on par. + +The gains come from eliminating the v1 adapter's full-store-reset on every +change (replaced by Solid v2's keyed `reconcile`) and from the wholesale +observer's efficient snapshot caching. diff --git a/docs/framework/solid/overview.md b/docs/framework/solid/overview.md index d69a75b750..5647fa6da7 100644 --- a/docs/framework/solid/overview.md +++ b/docs/framework/solid/overview.md @@ -9,6 +9,8 @@ id: adapter npm install @tanstack/solid-db ``` +Requires `solid-js@>=2.0.0-rc.0` and `@solidjs/web@>=2.0.0-rc.0` as peer dependencies. + ## Solid Primitives See the [Solid Functions Reference](./reference/index.md) to see the full list of primitives available in the Solid Adapter. @@ -19,12 +21,13 @@ For comprehensive documentation on writing queries (filtering, joins, aggregatio ### useLiveQuery -The `useLiveQuery` primitive creates a live query that automatically updates your component when data changes. It returns an object where `data` is a plain array and status fields (e.g. `isLoading()`, `status()`) are accessors: +The `useLiveQuery` primitive creates a live query that automatically updates your component when data changes. It returns an accessor — call it as a function (`query()`) to read data. Status fields (`isLoading`, `isReady`, `isError`, `status`) are plain properties: ```tsx import { useLiveQuery } from '@tanstack/solid-db' import { eq } from '@tanstack/db' -import { Show, For } from 'solid-js' +import { For } from 'solid-js' +import { Loading } from '@solidjs/web' function TodoList() { const query = useLiveQuery((q) => @@ -34,18 +37,66 @@ function TodoList() { ) return ( - Loading...}> + Loading...}>
      - + {(todo) =>
    • {todo.text}
    • }
    -
    +
    + ) +} +``` + +**Note:** Call `query()` to read data. Use `` and `` boundaries to handle loading and error states. The accessor also exposes `query.state` (a `ReactiveMap`) and `query.collection` (the underlying `Collection`). + +### Loading and Error Boundaries + +In Solid v2, reading the accessor while the collection is loading throws `NotReadyError` (caught by ``), and reading an errored query throws the error (caught by ``): + +```tsx +import { Loading, Errored } from '@solidjs/web' + +function TodoList() { + const query = useLiveQuery((q) => q.from({ todos: todosCollection })) + + return ( +
    Error: {err.message}
    }> + Loading...}> + + {(todo) =>
  • {todo.text}
  • } +
    +
    +
    ) } ``` -**Note:** `query.data` returns an array directly (not a function), but status fields like `isLoading()`, `status()`, etc. are accessor functions. +You can also check status without boundaries: + +```tsx + +
    Error: {query.status}
    +
    +``` + +### isPending and latest Helpers + +Solid v2's async `createMemo` enables `isPending` and `latest` on the accessor result: + +```tsx +import { isPending, latest } from 'solid-js' + +// isPending: true during revalidation while new collection loads + + + + +// latest: returns stale value during revalidation, skipping + + {(todo) =>
  • {todo.text}
  • } +
    +``` ### Reactive Queries with Signals @@ -62,7 +113,7 @@ function FilteredTodos(props: { minPriority: number }) { .where(({ todos }) => gt(todos.priority, props.minPriority)) ) - return
    {query.data.length} high-priority todos
    + return
    {query().length} high-priority todos
    } ``` @@ -98,7 +149,7 @@ function TodoList() { -
    {query.data.length} todos
    +
    {query().length} todos
    ) } @@ -118,52 +169,25 @@ import { gt } from '@tanstack/db' function TodoList() { const [minPriority, setMinPriority] = createSignal(5) - // Good - signal accessed inside query function const query = useLiveQuery((q) => q.from({ todos: todosCollection }) .where(({ todos }) => gt(todos.priority, minPriority())) ) - // Solid automatically tracks minPriority() and recomputes when it changes - return
    {query.data.length} todos
    + return
    {query().length} todos
    } ``` **Don't read signals outside the query function:** ```tsx -import { createSignal } from 'solid-js' -import { useLiveQuery } from '@tanstack/solid-db' -import { gt } from '@tanstack/db' - -function TodoList() { - const [minPriority, setMinPriority] = createSignal(5) - - // Bad - reading signal outside query function - const currentPriority = minPriority() - const query = useLiveQuery((q) => - q.from({ todos: todosCollection }) - .where(({ todos }) => gt(todos.priority, currentPriority)) - ) - // Won't update when minPriority changes! - - return
    {query.data.length} todos
    -} -``` - -**Static queries need no special handling:** - -```tsx -import { useLiveQuery } from '@tanstack/solid-db' - -function AllTodos() { - // No signals accessed - query never changes - const query = useLiveQuery((q) => - q.from({ todos: todosCollection }) - ) - - return
    {query.data.length} todos
    -} +// Bad - reading signal outside query function +const currentPriority = minPriority() +const query = useLiveQuery((q) => + q.from({ todos: todosCollection }) + .where(({ todos }) => gt(todos.priority, currentPriority)) +) +// Won't update when minPriority changes! ``` ### Using Pre-created Collections @@ -181,9 +205,23 @@ const todosQuery = createLiveQueryCollection((q) => ) function TodoList() { - // Pass existing collection + // Pass existing collection via accessor const query = useLiveQuery(() => todosQuery) - return
    {query.data.length} todos
    + return
    {query().length} todos
    } ``` + +### External-Source Bridge (Opt-in) + +For advanced use cases where you want observer snapshots to auto-track in any Solid compute without `useLiveQuery`, install the external-source bridge once at app startup: + +```tsx +import { enableSolidDBExternalSource, trackSnapshot } from '@tanstack/solid-db' +import { createMemo } from 'solid-js' + +enableSolidDBExternalSource() + +// Now trackSnapshot() auto-subscribes inside any Solid compute: +const snapshot = createMemo(() => trackSnapshot(observer)) +``` diff --git a/docs/framework/solid/reference/functions/useLiveQuery.md b/docs/framework/solid/reference/functions/useLiveQuery.md index 7df1a9de16..6ece92119b 100644 --- a/docs/framework/solid/reference/functions/useLiveQuery.md +++ b/docs/framework/solid/reference/functions/useLiveQuery.md @@ -31,7 +31,7 @@ Query function that defines what data to fetch ### Returns -Accessor that returns data with Suspense support, with state and status information as properties +Accessor that returns data with Loading boundary support, with state and status information as properties ### Examples @@ -91,17 +91,17 @@ return ( ``` ```ts -// Use Suspense boundaries +// Use Loading boundaries const todosQuery = useLiveQuery((q) => q.from({ todos: todoCollection }) ) return ( - Loading...}> + Loading...}> {(todo) =>
  • {todo.text}
  • }
    -
    +
    ) ``` @@ -131,7 +131,7 @@ Query function that defines what data to fetch ### Returns -Accessor that returns data with Suspense support, with state and status information as properties +Accessor that returns data with Loading boundary support, with state and status information as properties ### Examples @@ -191,17 +191,17 @@ return ( ``` ```ts -// Use Suspense boundaries +// Use Loading boundaries const todosQuery = useLiveQuery((q) => q.from({ todos: todoCollection }) ) return ( - Loading...}> + Loading...}> {(todo) =>
  • {todo.text}
  • }
    -
    +
    ) ``` @@ -231,7 +231,7 @@ Configuration object with query and options ### Returns -Accessor that returns data with Suspense support, with state and status information as properties +Accessor that returns data with Loading boundary support, with state and status information as properties ### Examples @@ -308,7 +308,7 @@ Pre-created live query collection to subscribe to ### Returns -Accessor that returns data with Suspense support, with state and status information as properties +Accessor that returns data with Loading boundary support, with state and status information as properties ### Examples @@ -378,7 +378,7 @@ Create a live query using a query function ### Returns -Accessor that returns data with Suspense support, with state and status information as properties +Accessor that returns data with Loading boundary support, with state and status information as properties ### Examples @@ -438,16 +438,16 @@ return ( ``` ```ts -// Use Suspense boundaries +// Use Loading boundaries const todosQuery = useLiveQuery((q) => q.from({ todos: todoCollection }) ) return ( - Loading...}> + Loading...}> {(todo) =>
  • {todo.text}
  • }
    -
    +
    ) ``` diff --git a/docs/framework/solid/reference/index.md b/docs/framework/solid/reference/index.md index da2d0de794..be5223ad00 100644 --- a/docs/framework/solid/reference/index.md +++ b/docs/framework/solid/reference/index.md @@ -5,6 +5,10 @@ title: "@tanstack/solid-db" # @tanstack/solid-db +Requires `solid-js@>=2.0.0-rc.0` and `@solidjs/web@>=2.0.0-rc.0`. + ## Functions - [useLiveQuery](functions/useLiveQuery.md) +- [enableSolidDBExternalSource](functions/enableSolidDBExternalSource.md) +- [trackSnapshot](functions/trackSnapshot.md) diff --git a/examples/solid/todo/package.json b/examples/solid/todo/package.json index 7b072d6f0f..e1e1e9a487 100644 --- a/examples/solid/todo/package.json +++ b/examples/solid/todo/package.json @@ -7,15 +7,16 @@ "@tanstack/query-core": "^5.90.20", "@tanstack/query-db-collection": "^1.2.4", "@tanstack/solid-db": "^0.2.34", - "@tanstack/solid-router": "^1.159.5", - "@tanstack/solid-start": "^1.159.5", + "@tanstack/solid-router": "^2.0.0-beta.30", + "@tanstack/solid-start": "^2.0.0-beta.31", "@tanstack/trailbase-db-collection": "^0.1.98", "cors": "^2.8.6", "drizzle-orm": "^0.45.1", "drizzle-zod": "^0.8.3", "express": "^5.2.1", "postgres": "^3.4.8", - "solid-js": "^1.9.11", + "solid-js": "^2.0.0-rc.0", + "@solidjs/web": "^2.0.0-rc.0", "tailwindcss": "^4.1.18", "trailbase": "^0.10.0", "vite-tsconfig-paths": "^5.1.4" @@ -38,7 +39,7 @@ "tsx": "^4.21.0", "typescript": "^5.9.2", "vite": "^7.3.0", - "vite-plugin-solid": "^2.11.10" + "vite-plugin-solid": "^3.0.0-next.27" }, "scripts": { "build": "vite build", diff --git a/examples/solid/todo/src/components/TodoApp.tsx b/examples/solid/todo/src/components/TodoApp.tsx index c8cc0df58d..b91f40fc49 100644 --- a/examples/solid/todo/src/components/TodoApp.tsx +++ b/examples/solid/todo/src/components/TodoApp.tsx @@ -1,6 +1,5 @@ import { Link } from '@tanstack/solid-router' import { For, Show, createSignal } from 'solid-js' -import type { JSX } from 'solid-js' import type { Collection } from '@tanstack/solid-db' import type { SelectConfig, SelectTodo } from '../db/validation' @@ -94,14 +93,11 @@ export function TodoApp(props: TodoAppProps) { const titleColor = getComplementaryColor(backgroundColor) - const handleColorChange: JSX.CustomEventHandlersCamelCase[`onInput`] = - (e) => { - const newColor = e.target.value - setConfigValue(`backgroundColor`, newColor) - } + const handleColorChange = (e: { currentTarget: { value: string } }) => { + setConfigValue(`backgroundColor`, e.currentTarget.value) + } - const handleSubmit: JSX.CustomEventHandlersCamelCase[`onSubmit`] = - (e) => { + const handleSubmit = (e: SubmitEvent) => { e.preventDefault() if (!newTodo().trim()) return diff --git a/examples/solid/todo/src/routeTree.gen.ts b/examples/solid/todo/src/routeTree.gen.ts index e567fc6d21..993aad0761 100644 --- a/examples/solid/todo/src/routeTree.gen.ts +++ b/examples/solid/todo/src/routeTree.gen.ts @@ -9,23 +9,18 @@ // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. import { Route as rootRouteImport } from './routes/__root' -import { Route as TrailbaseRouteImport } from './routes/trailbase' -import { Route as QueryRouteImport } from './routes/query' -import { Route as ElectricRouteImport } from './routes/electric' import { Route as IndexRouteImport } from './routes/index' -import { Route as ApiTodosRouteImport } from './routes/api/todos' +import { Route as ElectricRouteImport } from './routes/electric' +import { Route as QueryRouteImport } from './routes/query' +import { Route as TrailbaseRouteImport } from './routes/trailbase' import { Route as ApiConfigRouteImport } from './routes/api/config' -import { Route as ApiTodosIdRouteImport } from './routes/api/todos.$id' +import { Route as ApiTodosRouteImport } from './routes/api/todos' import { Route as ApiConfigIdRouteImport } from './routes/api/config.$id' +import { Route as ApiTodosIdRouteImport } from './routes/api/todos.$id' -const TrailbaseRoute = TrailbaseRouteImport.update({ - id: '/trailbase', - path: '/trailbase', - getParentRoute: () => rootRouteImport, -} as any) -const QueryRoute = QueryRouteImport.update({ - id: '/query', - path: '/query', +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', getParentRoute: () => rootRouteImport, } as any) const ElectricRoute = ElectricRouteImport.update({ @@ -33,14 +28,14 @@ const ElectricRoute = ElectricRouteImport.update({ path: '/electric', getParentRoute: () => rootRouteImport, } as any) -const IndexRoute = IndexRouteImport.update({ - id: '/', - path: '/', +const QueryRoute = QueryRouteImport.update({ + id: '/query', + path: '/query', getParentRoute: () => rootRouteImport, } as any) -const ApiTodosRoute = ApiTodosRouteImport.update({ - id: '/api/todos', - path: '/api/todos', +const TrailbaseRoute = TrailbaseRouteImport.update({ + id: '/trailbase', + path: '/trailbase', getParentRoute: () => rootRouteImport, } as any) const ApiConfigRoute = ApiConfigRouteImport.update({ @@ -48,16 +43,21 @@ const ApiConfigRoute = ApiConfigRouteImport.update({ path: '/api/config', getParentRoute: () => rootRouteImport, } as any) -const ApiTodosIdRoute = ApiTodosIdRouteImport.update({ - id: '/$id', - path: '/$id', - getParentRoute: () => ApiTodosRoute, +const ApiTodosRoute = ApiTodosRouteImport.update({ + id: '/api/todos', + path: '/api/todos', + getParentRoute: () => rootRouteImport, } as any) const ApiConfigIdRoute = ApiConfigIdRouteImport.update({ id: '/$id', path: '/$id', getParentRoute: () => ApiConfigRoute, } as any) +const ApiTodosIdRoute = ApiTodosIdRouteImport.update({ + id: '/$id', + path: '/$id', + getParentRoute: () => ApiTodosRoute, +} as any) export interface FileRoutesByFullPath { '/': typeof IndexRoute @@ -134,18 +134,11 @@ export interface RootRouteChildren { declare module '@tanstack/solid-router' { interface FileRoutesByPath { - '/trailbase': { - id: '/trailbase' - path: '/trailbase' - fullPath: '/trailbase' - preLoaderRoute: typeof TrailbaseRouteImport - parentRoute: typeof rootRouteImport - } - '/query': { - id: '/query' - path: '/query' - fullPath: '/query' - preLoaderRoute: typeof QueryRouteImport + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport parentRoute: typeof rootRouteImport } '/electric': { @@ -155,18 +148,18 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof ElectricRouteImport parentRoute: typeof rootRouteImport } - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexRouteImport + '/query': { + id: '/query' + path: '/query' + fullPath: '/query' + preLoaderRoute: typeof QueryRouteImport parentRoute: typeof rootRouteImport } - '/api/todos': { - id: '/api/todos' - path: '/api/todos' - fullPath: '/api/todos' - preLoaderRoute: typeof ApiTodosRouteImport + '/trailbase': { + id: '/trailbase' + path: '/trailbase' + fullPath: '/trailbase' + preLoaderRoute: typeof TrailbaseRouteImport parentRoute: typeof rootRouteImport } '/api/config': { @@ -176,12 +169,12 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof ApiConfigRouteImport parentRoute: typeof rootRouteImport } - '/api/todos/$id': { - id: '/api/todos/$id' - path: '/$id' - fullPath: '/api/todos/$id' - preLoaderRoute: typeof ApiTodosIdRouteImport - parentRoute: typeof ApiTodosRoute + '/api/todos': { + id: '/api/todos' + path: '/api/todos' + fullPath: '/api/todos' + preLoaderRoute: typeof ApiTodosRouteImport + parentRoute: typeof rootRouteImport } '/api/config/$id': { id: '/api/config/$id' @@ -190,6 +183,13 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof ApiConfigIdRouteImport parentRoute: typeof ApiConfigRoute } + '/api/todos/$id': { + id: '/api/todos/$id' + path: '/$id' + fullPath: '/api/todos/$id' + preLoaderRoute: typeof ApiTodosIdRouteImport + parentRoute: typeof ApiTodosRoute + } } } diff --git a/examples/solid/todo/src/routes/__root.tsx b/examples/solid/todo/src/routes/__root.tsx index dde228f171..e1526fe8f3 100644 --- a/examples/solid/todo/src/routes/__root.tsx +++ b/examples/solid/todo/src/routes/__root.tsx @@ -4,7 +4,7 @@ import { Scripts, createRootRoute, } from '@tanstack/solid-router' -import { HydrationScript } from 'solid-js/web' +import { HydrationScript } from '@solidjs/web' import appCss from '../styles.css?url' import type { ParentProps } from 'solid-js' diff --git a/examples/solid/todo/src/routes/electric.tsx b/examples/solid/todo/src/routes/electric.tsx index 63442e7191..99d830d8a2 100644 --- a/examples/solid/todo/src/routes/electric.tsx +++ b/examples/solid/todo/src/routes/electric.tsx @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/solid-router' import { useLiveQuery } from '@tanstack/solid-db' -import { Suspense } from 'solid-js' +import { Loading } from '@solidjs/web' import { electricConfigCollection, electricTodoCollection, @@ -33,7 +33,7 @@ function ElectricPage() { ) return ( - + - +
    ) } diff --git a/examples/solid/todo/src/routes/query.tsx b/examples/solid/todo/src/routes/query.tsx index 5523668aca..f807cc32e3 100644 --- a/examples/solid/todo/src/routes/query.tsx +++ b/examples/solid/todo/src/routes/query.tsx @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/solid-router' import { useLiveQuery } from '@tanstack/solid-db' -import { Suspense } from 'solid-js' +import { Loading } from '@solidjs/web' import { queryConfigCollection, queryTodoCollection } from '../lib/collections' import { TodoApp } from '../components/TodoApp' @@ -30,7 +30,7 @@ function QueryPage() { ) return ( - + - +
    ) } diff --git a/examples/solid/todo/src/routes/trailbase.tsx b/examples/solid/todo/src/routes/trailbase.tsx index c9f450ea47..ca4bf6593b 100644 --- a/examples/solid/todo/src/routes/trailbase.tsx +++ b/examples/solid/todo/src/routes/trailbase.tsx @@ -1,5 +1,6 @@ import { createFileRoute } from '@tanstack/solid-router' import { useLiveQuery } from '@tanstack/solid-db' +import { Loading } from '@solidjs/web' import { trailBaseConfigCollection, trailBaseTodoCollection, @@ -20,24 +21,25 @@ export const Route = createFileRoute(`/trailbase`)({ }) function TrailBasePage() { - // Get data using live queries with Electric collections - const { data: todos } = useLiveQuery((q) => + const todos = useLiveQuery((q) => q .from({ todo: trailBaseTodoCollection }) .orderBy(({ todo }) => todo.created_at, `asc`), ) - const { data: configData } = useLiveQuery((q) => + const configData = useLiveQuery((q) => q.from({ config: trailBaseConfigCollection }), ) return ( - + + + ) } diff --git a/examples/solid/todo/tsconfig.json b/examples/solid/todo/tsconfig.json index b2036d3581..258135add5 100644 --- a/examples/solid/todo/tsconfig.json +++ b/examples/solid/todo/tsconfig.json @@ -4,7 +4,7 @@ "baseUrl": ".", "module": "ES2022", "jsx": "preserve", - "jsxImportSource": "solid-js", + "jsxImportSource": "@solidjs/web", "moduleResolution": "bundler", "paths": { "@/*": ["./src/*"] diff --git a/packages/solid-db/package.json b/packages/solid-db/package.json index ae5c3c6dd2..ef19ad992c 100644 --- a/packages/solid-db/package.json +++ b/packages/solid-db/package.json @@ -42,19 +42,21 @@ "skills" ], "dependencies": { - "@solid-primitives/map": "^0.7.2", + "@solid-primitives/map": "^1.0.0-next.2", "@tanstack/db": "workspace:*" }, "peerDependencies": { - "solid-js": ">=1.9.0" + "@solidjs/web": ">=2.0.0-rc.0", + "solid-js": ">=2.0.0-rc.0" }, "devDependencies": { "@electric-sql/client": "^1.5.15", - "@solidjs/testing-library": "^0.8.10", + "@solidjs/testing-library": "^1.0.0-beta.2", + "@solidjs/web": "^2.0.0-rc.0", "@vitest/coverage-istanbul": "^3.2.4", "jsdom": "^27.4.0", - "solid-js": "^1.9.11", - "vite-plugin-solid": "^2.11.10", + "solid-js": "^2.0.0-rc.0", + "vite-plugin-solid": "^3.0.0-next.27", "vitest": "^3.2.4" } } diff --git a/packages/solid-db/skills/solid-db/SKILL.md b/packages/solid-db/skills/solid-db/SKILL.md index 0039c6cc89..8d0ebec2f3 100644 --- a/packages/solid-db/skills/solid-db/SKILL.md +++ b/packages/solid-db/skills/solid-db/SKILL.md @@ -1,33 +1,36 @@ --- name: solid-db description: > - SolidJS bindings for TanStack DB. useLiveQuery returns an Accessor that + SolidJS v2 bindings for TanStack DB. useLiveQuery returns an Accessor that doubles as data access (call as function) with state/status properties. Fine-grained reactivity: signal reads MUST happen inside the query function - for tracking. Config passed as Accessor (() => config). Built-in Suspense - support via createResource and errors through Solid ErrorBoundary. - ReactiveMap for state. Import from - @tanstack/solid-db (re-exports all of @tanstack/db). + for tracking. Config passed as Accessor (() => config). Built-in Loading + boundary support via async createMemo. Wholesale observer mode + keyed + reconcile for per-field row reactivity. Opt-in external-source bridge via + enableSolidDBExternalSource. Import from @tanstack/solid-db (re-exports all + of @tanstack/db). type: framework library: db framework: solid -library_version: '0.6.17' +library_version: '0.7.0' requires: - db-core sources: - 'TanStack/db:docs/framework/solid/overview.md' - 'TanStack/db:packages/solid-db/src/useLiveQuery.ts' + - 'TanStack/db:packages/solid-db/src/external-source.ts' --- This skill builds on db-core. Read it first for collection setup, query builder, and mutation patterns. -# TanStack DB — SolidJS +# TanStack DB — SolidJS v2 ## Setup ```tsx import { useLiveQuery, eq, not } from '@tanstack/solid-db' -import { ErrorBoundary, For, Show, Suspense } from 'solid-js' +import { For, Show } from 'solid-js' +import { Loading } from '@solidjs/web' function TodoList() { const todosQuery = useLiveQuery((q) => @@ -38,11 +41,11 @@ function TodoList() { ) return ( - Loading...}> + Loading...}>
      {(todo) =>
    • {todo.text}
    • }
    -
    +
    ) } ``` @@ -129,19 +132,37 @@ const userQuery = useLiveQuery((q) => return {(user) =>
    {user().name}
    }
    ``` -### Suspense integration +### External-source bridge (opt-in) + +Solid v2's `enableExternalSource` API lets external reactive systems participate in Solid's tracking graph. TanStack DB exposes this as an opt-in one-time install: ```tsx -
    {error.message}
    }> - Loading...}> +import { enableSolidDBExternalSource, trackSnapshot } from '@tanstack/solid-db' +import { createMemo } from 'solid-js' + +// Call once at app startup: +enableSolidDBExternalSource() + +// Now trackSnapshot() inside any Solid compute auto-subscribes: +const snapshot = createMemo(() => trackSnapshot(observer)) +// re-runs automatically when the observer notifies — no manual subscribe needed +``` + +Without the bridge, use `useLiveQuery` which handles subscription internally. + +### Loading boundary integration + +```tsx +import { Loading, Errored } from '@solidjs/web' + +
    Error: {err.message}
    }> + Loading...}> {(todo) =>
  • {todo.text}
  • }
    -
    -
    +
    +
    ``` -`useLiveQuery` integrates with Solid's `createResource`. Use `` for -loading and `` for errors. Reading an errored query throws -through the resource, so do not rely on reading `isError` after failure. +`useLiveQuery` integrates with Solid v2's async `createMemo`: reading the accessor while the collection is loading throws `NotReadyError` (caught by ``); reading an errored query throws the captured error (caught by ``). ## Includes (Hierarchical Data) diff --git a/packages/solid-db/src/external-source.ts b/packages/solid-db/src/external-source.ts new file mode 100644 index 0000000000..6db6d95e78 --- /dev/null +++ b/packages/solid-db/src/external-source.ts @@ -0,0 +1,132 @@ +import { enableExternalSource } from 'solid-js' +import type { LiveQuerySnapshot } from '@tanstack/db' + +type AnyObserver = { + getSnapshot: () => LiveQuerySnapshot + subscribe: (listener: () => void) => () => void +} + +type SnapshotOf = O extends { getSnapshot: () => infer S } ? S : never + +type ObserverEntry = { + triggers: Set<() => void> + unsubscribe: () => void +} + +let installed = false + +let activeTrigger: (() => void) | null = null + +const observerEntries = new Map() + +const triggerObservers = new Map<() => void, Set>() + +function detachTrigger(observer: AnyObserver, trigger: () => void): void { + const entry = observerEntries.get(observer) + if (!entry) return + entry.triggers.delete(trigger) + if (entry.triggers.size === 0) { + entry.unsubscribe() + observerEntries.delete(observer) + } +} + +/** + * Install the Solid v2 external-source bridge for TanStack DB observers. + * + * Call **once** at application startup, before a Solid computation first + * calls {@link trackSnapshot}. After installation, {@link trackSnapshot} + * reads inside any Solid compute (memo, effect, component body) automatically + * subscribe to the observer and re-run when the snapshot changes — no manual + * `subscribe`/`onCleanup` wiring required. + * + * Uses Solid v2's `enableExternalSource` to wrap every computation so the + * bridge can track which observer each compute depends on. + * + * @example + * ```ts + * // App entry point (once): + * import { enableSolidDBExternalSource } from '@tanstack/solid-db' + * enableSolidDBExternalSource() + * + * // In any component or memo: + * const snapshot = createMemo(() => { + * const observer = createLiveQueryObserver(collection, { mode: 'wholesale' }) + * return trackSnapshot(observer) + * }) + * ``` + */ +export function enableSolidDBExternalSource(): void { + if (installed) return + installed = true + + enableExternalSource({ + factory: (compute, trigger) => { + return { + track: (prev: unknown) => { + const prevDeps = triggerObservers.get(trigger) + if (prevDeps) { + for (const obs of prevDeps) { + detachTrigger(obs, trigger) + } + } + triggerObservers.set(trigger, new Set()) + + const prevTrigger = activeTrigger + activeTrigger = trigger + try { + return compute(prev) + } finally { + activeTrigger = prevTrigger + } + }, + dispose: () => { + const deps = triggerObservers.get(trigger) + if (deps) { + for (const obs of deps) { + detachTrigger(obs, trigger) + } + triggerObservers.delete(trigger) + } + }, + } + }, + untrack: (fn: () => T): T => { + const prev = activeTrigger + activeTrigger = null + try { + return fn() + } finally { + activeTrigger = prev + } + }, + }) +} + +/** + * Read a LiveQueryObserver snapshot with automatic Solid dependency tracking. + * + * Requires {@link enableSolidDBExternalSource} to have been called first. + * Inside a Solid compute (memo, effect, component), this registers the + * observer as a dependency so the compute re-runs when the observer notifies. + * + * Outside a Solid tracking scope, this is equivalent to `observer.getSnapshot()`. + */ +export function trackSnapshot( + observer: O, +): SnapshotOf { + if (activeTrigger) { + let entry = observerEntries.get(observer) + if (!entry) { + const triggers = new Set<() => void>() + const unsubscribe = observer.subscribe(() => { + for (const t of triggers) t() + }) + entry = { triggers, unsubscribe } + observerEntries.set(observer, entry) + } + entry.triggers.add(activeTrigger) + triggerObservers.get(activeTrigger)?.add(observer) + } + return observer.getSnapshot() as SnapshotOf +} diff --git a/packages/solid-db/src/index.ts b/packages/solid-db/src/index.ts index 681078b9c2..8475d4b3fd 100644 --- a/packages/solid-db/src/index.ts +++ b/packages/solid-db/src/index.ts @@ -1,5 +1,6 @@ // Re-export all public APIs export * from './useLiveQuery' +export * from './external-source' // Re-export everything from @tanstack/db export * from '@tanstack/db' diff --git a/packages/solid-db/src/useLiveQuery.ts b/packages/solid-db/src/useLiveQuery.ts index cf8d84f43d..cc4dedfca8 100644 --- a/packages/solid-db/src/useLiveQuery.ts +++ b/packages/solid-db/src/useLiveQuery.ts @@ -1,11 +1,3 @@ -import { - batch, - createEffect, - createMemo, - createResource, - createSignal, - onCleanup, -} from 'solid-js' import { ReactiveMap } from '@solid-primitives/map' import { BaseQueryBuilder, @@ -14,10 +6,15 @@ import { isCollection, isSingleResultCollection, } from '@tanstack/db' -import { createStore, reconcile } from 'solid-js/store' +import { + createMemo, + createRenderEffect, + createSignal, + createStore, + reconcile, +} from 'solid-js' import type { Accessor } from 'solid-js' import type { - ChangeMessage, Collection, CollectionStatus, Context, @@ -25,17 +22,23 @@ import type { InferResultType, InitialQueryBuilder, LiveQueryCollectionConfig, + LiveQuerySnapshot, NonSingleResult, QueryBuilder, SingleResult, } from '@tanstack/db' +export type UseLiveQueryStatus = CollectionStatus | `disabled` + +const RECONCILE_KEY = `$key` as const + +type AnyCollection = Collection + /** * Create a live query using a query function * @param queryFn - Query function that defines what data to fetch - * @returns Accessor that returns data with Suspense support, with state and status information as properties + * @returns Accessor that returns data with Loading boundary support, with state and collection as properties * @example - * // Basic query with object syntax * const todosQuery = useLiveQuery((q) => * q.from({ todos: todosCollection }) * .where(({ todos }) => eq(todos.completed, false)) @@ -43,79 +46,20 @@ import type { * ) * * @example - * // With dependencies that trigger re-execution - * const todosQuery = useLiveQuery( - * (q) => q.from({ todos: todosCollection }) - * .where(({ todos }) => gt(todos.priority, minPriority())), - * ) - * - * @example - * // Join pattern - * const personIssues = useLiveQuery((q) => - * q.from({ issues: issueCollection }) - * .join({ persons: personCollection }, ({ issues, persons }) => - * eq(issues.userId, persons.id) - * ) - * .select(({ issues, persons }) => ({ - * id: issues.id, - * title: issues.title, - * userName: persons.name - * })) - * ) - * - * @example - * // Handle loading and error states - * const todosQuery = useLiveQuery((q) => - * q.from({ todos: todoCollection }) - * ) - * - * return ( - * - * - *
    Loading...
    - *
    - * - *
    Error: {todosQuery.status}
    - *
    - * - * - * {(todo) =>
  • {todo.text}
  • } - *
    - *
    - *
    - * ) - * - * @example - * // Use Suspense boundaries - * const todosQuery = useLiveQuery((q) => - * q.from({ todos: todoCollection }) - * ) + * const todosQuery = useLiveQuery((q) => q.from({ todos: todoCollection })) * * return ( - * Loading...}> - * - * {(todo) =>
  • {todo.text}
  • } - *
    - *
    + * Loading...}> + * {(todo) =>
  • {todo.text}
  • }
    + *
    * ) */ // Overload 1: Accept query function that always returns QueryBuilder export function useLiveQuery( queryFn: (q: InitialQueryBuilder) => QueryBuilder, ): Accessor> & { - /** - * @deprecated use function result instead - * query.data -> query() - */ - data: InferResultType state: ReactiveMap> collection: Collection, string | number, {}> - status: CollectionStatus - isLoading: boolean - isReady: boolean - isIdle: boolean - isError: boolean - isCleanedUp: boolean } // Overload 1b: Accept query function that can return undefined/null @@ -124,114 +68,37 @@ export function useLiveQuery( q: InitialQueryBuilder, ) => QueryBuilder | undefined | null, ): Accessor> & { - /** - * @deprecated use function result instead - * query.data -> query() - */ - data: InferResultType state: ReactiveMap> collection: Collection, string | number, {}> | null - status: CollectionStatus | `disabled` - isLoading: boolean - isReady: boolean - isIdle: boolean - isError: boolean - isCleanedUp: boolean } /** * Create a live query using configuration object * @param config - Configuration object with query and options - * @returns Accessor that returns data with Suspense support, with state and status information as properties + * @returns Accessor that returns data with Loading boundary support, with state and collection as properties * @example - * // Basic config object usage * const todosQuery = useLiveQuery(() => ({ * query: (q) => q.from({ todos: todosCollection }), * gcTime: 60000 * })) - * - * @example - * // With query builder and options - * const queryBuilder = new Query() - * .from({ persons: collection }) - * .where(({ persons }) => gt(persons.age, 30)) - * .select(({ persons }) => ({ id: persons.id, name: persons.name })) - * - * const personsQuery = useLiveQuery(() => ({ query: queryBuilder })) - * - * @example - * // Handle all states uniformly - * const itemsQuery = useLiveQuery(() => ({ - * query: (q) => q.from({ items: itemCollection }) - * })) - * - * return ( - * {itemsQuery().length} items loaded}> - * - *
    Loading...
    - *
    - * - *
    Something went wrong
    - *
    - * - *
    Preparing...
    - *
    - *
    - * ) */ // Overload 2: Accept config object export function useLiveQuery( config: Accessor>, ): Accessor> & { - /** - * @deprecated use function result instead - * query.data -> query() - */ - data: InferResultType state: ReactiveMap> collection: Collection, string | number, {}> - status: CollectionStatus - isLoading: boolean - isReady: boolean - isIdle: boolean - isError: boolean - isCleanedUp: boolean } /** * Subscribe to an existing live query collection * @param liveQueryCollection - Pre-created live query collection to subscribe to - * @returns Accessor that returns data with Suspense support, with state and status information as properties + * @returns Accessor that returns data with Loading boundary support, with state and collection as properties * @example - * // Using pre-created live query collection * const myLiveQuery = createLiveQueryCollection((q) => * q.from({ todos: todosCollection }).where(({ todos }) => eq(todos.active, true)) * ) * const todosQuery = useLiveQuery(() => myLiveQuery) - * - * @example - * // Access collection methods directly - * const existingQuery = useLiveQuery(() => existingCollection) - * - * // Use collection for mutations - * const handleToggle = (id) => { - * existingQuery.collection.update(id, draft => { draft.completed = !draft.completed }) - * } - * - * @example - * // Handle states consistently - * const sharedQuery = useLiveQuery(() => sharedCollection) - * - * return ( - * {(item) => }}> - * - *
    Loading...
    - *
    - * - *
    Error loading data
    - *
    - *
    - * ) */ // Overload 3: Accept pre-created live query collection (non-single result) export function useLiveQuery< @@ -243,19 +110,8 @@ export function useLiveQuery< Collection & NonSingleResult >, ): Accessor> & { - /** - * @deprecated use function result instead - * query.data -> query() - */ - data: Array state: ReactiveMap collection: Collection - status: CollectionStatus - isLoading: boolean - isReady: boolean - isIdle: boolean - isError: boolean - isCleanedUp: boolean } // Overload 3b: Accept pre-created live query collection with singleResult: true @@ -268,213 +124,194 @@ export function useLiveQuery< Collection & SingleResult >, ): Accessor & { - /** - * @deprecated use function result instead - * query.data -> query() - */ - data: TResult | undefined state: ReactiveMap collection: Collection & SingleResult - status: CollectionStatus - isLoading: boolean - isReady: boolean - isIdle: boolean - isError: boolean - isCleanedUp: boolean } -// Implementation - use function overloads to infer the actual collection type +// Wholesale observer mode: the observer delivers wake-up notifies; Solid's +// keyed reconcile handles the per-field diff. Collection-level optimistic +// transactions flow through the change stream and reconcile naturally. export function useLiveQuery( configOrQueryOrCollection: (queryFn?: any) => any, ) { + let collectionError: unknown = null + const collection = createMemo( () => { - if (configOrQueryOrCollection.length === 1) { - // This is a query function - check if it returns null/undefined - const queryBuilder = new BaseQueryBuilder() as InitialQueryBuilder - const result = configOrQueryOrCollection(queryBuilder) + collectionError = null + try { + if (configOrQueryOrCollection.length === 1) { + const queryBuilder = new BaseQueryBuilder() as InitialQueryBuilder + const result = configOrQueryOrCollection(queryBuilder) + + if (result === undefined || result === null) { + return null + } - if (result === undefined || result === null) { - // Disabled query - return null + return createLiveQueryCollection({ + query: configOrQueryOrCollection, + startSync: true, + }) + } + + const innerCollection = configOrQueryOrCollection() + + if (innerCollection === undefined || innerCollection === null) { return null } + if (isCollection(innerCollection)) { + innerCollection.startSyncImmediate() + return innerCollection as Collection + } + return createLiveQueryCollection({ - query: configOrQueryOrCollection, + ...innerCollection, startSync: true, }) - } - - const innerCollection = configOrQueryOrCollection() - - if (innerCollection === undefined || innerCollection === null) { - // Disabled query - return null + } catch (error) { + collectionError = error return null } - - if (isCollection(innerCollection)) { - innerCollection.startSyncImmediate() - return innerCollection as Collection - } - - return createLiveQueryCollection({ - ...innerCollection, - startSync: true, - }) }, - undefined, { name: `TanstackDBCollectionMemo` }, ) - // Reactive state that gets updated granularly through change events + // Lazily synced — populated on first `.state` read, then kept in sync + // from subsequent observer snapshots. const state = new ReactiveMap() + let stateAccessed = false + let stateSyncedCollection: AnyCollection | null = null - // Reactive data array that maintains sorted order const [data, setData] = createStore>([], { name: `TanstackDBData`, }) - // Track collection status reactively - const [status, setStatus] = createSignal( - collection() ? collection()!.status : (`disabled` as const), + // ownedWrite lets setStatus be called from the split-effect's apply phase. + const [status, setStatus] = createSignal( + () => collection() ? collection()!.status : (`disabled` as const), { name: `TanstackDBStatus`, + ownedWrite: true, }, ) - // Helper to sync data array from collection in correct order - const syncDataFromCollection = ( - currentCollection: Collection, + // Single-result collections expose data[0]; wrap in a 1-element array + // for uniform keyed reconciliation. + const snapshotToRows = ( + snapshot: LiveQuerySnapshot, + ): Array => { + const snapshotData = snapshot.data + if (snapshotData === undefined) return [] + if (Array.isArray(snapshotData)) return snapshotData + return [snapshotData] + } + + const applySnapshot = ( + snapshot: LiveQuerySnapshot, + currentCollection: AnyCollection, ) => { - setData((prev) => - reconcile(Array.from(currentCollection.values()))(prev).filter(Boolean), - ) + setData(reconcile(snapshotToRows(snapshot), RECONCILE_KEY)) + setStatus(snapshot.status) + if (stateAccessed) { + state.clear() + if (snapshot.state) { + for (const [key, value] of snapshot.state) { + state.set(key, value) + } + } + stateSyncedCollection = currentCollection + } } - // Generation guard for the resource's async continuations: Solid discards a - // superseded fetch's *return value*, but the writes below are side effects - // into hook-scoped state and would still run — resurrecting rows/status from - // a collection that has already been replaced. - let resourceGeneration = 0 + // Async memo for Loading: awaits collection readiness. Reading this + // when pending throws NotReadyError (caught by ); reading when + // the collection errored throws the error (caught by ). + const readiness = createMemo(async () => { + const col = collection() + if (!col) return null + if (col.isReady()) return col + await new Promise((resolve) => { + col.onFirstReady(resolve) + }) + return col + }) - const [getDataResource] = createResource( - () => ({ currentCollection: collection() }), - async ({ currentCollection }) => { - const generation = ++resourceGeneration + // Split render effect owns the observer lifecycle per collection. Wholesale + // mode delivers nothing during subscribe, so the initial snapshot is pulled + // synchronously after attach. + createRenderEffect( + () => collection(), + (currentCollection) => { if (!currentCollection) { - return [] - } - setStatus(currentCollection.status) - try { - await currentCollection.toArrayWhenReady() - } catch (error) { - if (generation === resourceGeneration) setStatus(`error`) - throw error + if (collectionError) { + setStatus(`error` as const) + } else { + setStatus(`disabled` as const) + } + stateSyncedCollection = null + if (stateAccessed) state.clear() + setData(reconcile([], RECONCILE_KEY)) + return } - if (generation !== resourceGeneration) { - return data + + collectionError = null + + const observer = createLiveQueryObserver(currentCollection, { + mode: `wholesale`, + }) + + const sync = () => { + applySnapshot(observer.getSnapshot(), currentCollection) } - // Initialize state with current collection data - batch(() => { - state.clear() - for (const [key, value] of currentCollection.entries()) { - state.set(key, value) - } - syncDataFromCollection(currentCollection) - setStatus(currentCollection.status) + + const unsubscribe = observer.subscribe(sync) + + // Wholesale delivers nothing during subscribe — seed synchronously. + sync() + + let cancelled = false + + // Observer already handles status:change; this captures the error + // object itself for getData() to re-throw. + const offStatusError = currentCollection.on(`status:error`, () => { + if (cancelled) return + setStatus(`error` as const) }) - return data - }, - { - name: `TanstackDBData`, - deferStream: false, - initialValue: data, + + currentCollection.toArrayWhenReady().catch((error: unknown) => { + if (cancelled) return + collectionError = error + setStatus(`error` as const) + }) + + return () => { + cancelled = true + offStatusError() + unsubscribe() + observer.dispose() + } }, ) - createEffect(() => { - const currentCollection = collection() - if (!currentCollection) { - setStatus(`disabled` as const) - state.clear() - setData([]) - return - } - - // The shared observer owns subscription, the ready-race, and status; Solid - // materializes into its keyed ReactiveMap (granular) + reconciled store. - const observer = createLiveQueryObserver(currentCollection) - // Clear any keys carried over from a previous collection before the new - // observer re-seeds via `includeInitialState` (which only inserts current - // rows, never deletes stale ones). Without this, switching collections - // leaves the dropped keys in `state` until the async resource reconciles. - state.clear() - const unsubscribe = observer.subscribe( - (changes: Array> | undefined) => { - batch(() => { - if (changes) { - for (const change of changes) { - switch (change.type) { - case `insert`: - case `update`: - state.set(change.key, change.value) - break - case `delete`: - state.delete(change.key) - break - } - } - } else { - // Cleanup and other status-only publications carry no row deltas. - // Rebuild the keyed view so it cannot diverge from ordered data. - state.clear() - for (const [key, value] of observer.getSnapshot().state ?? []) { - state.set(key, value) - } - } - syncDataFromCollection(currentCollection) - setStatus(observer.getSnapshot().status) - }) - }, - ) - // An already-ready empty collection produces no initial row batch. Bring - // ordered data and status in line synchronously instead of waiting for the - // resource continuation to correct the previous collection's rows. - batch(() => { - syncDataFromCollection(currentCollection) - setStatus(observer.getSnapshot().status) - }) + function getData() { + if (collectionError) throw collectionError - onCleanup(() => { - unsubscribe() - observer.dispose() - }) - }) + const s = status() + if (s === 'error') throw collectionError ?? new Error('Collection sync error') - // We have to remove getters from the resource function so we wrap it - function getData() { const currentCollection = collection() - if (currentCollection) { - if (isSingleResultCollection(currentCollection)) { - // Force resource tracking so Suspense works - getDataResource() - return data[0] - } + if (!currentCollection) { + return data } - return getDataResource() + if (s !== `ready`) readiness() + if (isSingleResultCollection(currentCollection)) { + return data[0] + } + return data } Object.defineProperties(getData, { - data: { - get() { - return getData() - }, - }, - status: { - get() { - return status() - }, - }, collection: { get() { return collection() @@ -482,34 +319,23 @@ export function useLiveQuery( }, state: { get() { + stateAccessed = true + const currentCollection = collection() + if (!currentCollection) { + if (stateSyncedCollection !== null) { + state.clear() + stateSyncedCollection = null + } + } else if (stateSyncedCollection !== currentCollection) { + state.clear() + for (const [key, value] of currentCollection.entries() as IterableIterator<[any, any]>) { + state.set(key, value) + } + stateSyncedCollection = currentCollection + } return state }, }, - isLoading: { - get() { - return status() === `loading` - }, - }, - isReady: { - get() { - return status() === `ready` || status() === `disabled` - }, - }, - isIdle: { - get() { - return status() === `idle` - }, - }, - isError: { - get() { - return status() === `error` - }, - }, - isCleanedUp: { - get() { - return status() === `cleaned-up` - }, - }, }) return getData } diff --git a/packages/solid-db/tests/benchmark.bench.ts b/packages/solid-db/tests/benchmark.bench.ts new file mode 100644 index 0000000000..8e9df38876 --- /dev/null +++ b/packages/solid-db/tests/benchmark.bench.ts @@ -0,0 +1,234 @@ +import { performance } from 'node:perf_hooks' +import { afterAll, describe, it } from 'vitest' +import { createRoot, flush } from 'solid-js' +import { createCollection, eq } from '@tanstack/db' +import { useLiveQuery } from '../src/useLiveQuery' +import { mockSyncCollectionOptions } from '../../db/tests/utils' + +type Row = { id: string; name: string; age: number; email: string; isActive: boolean; team: string } + +function makeRows(n: number): Array { + const rows: Array = [] + for (let i = 0; i < n; i++) { + rows.push({ + id: String(i), + name: `Person ${i}`, + age: 20 + (i % 50), + email: `person${i}@example.com`, + isActive: true, + team: `team${i % 5}`, + }) + } + return rows +} + +function makeCollection(n: number, idPrefix: string) { + return createCollection( + mockSyncCollectionOptions({ + id: `bench-${idPrefix}-${n}`, + getKey: (r: Row) => r.id, + initialData: makeRows(n), + }), + ) +} + +function updateRow(collection: ReturnType, id: string, name: string) { + collection.utils.begin() + collection.utils.write({ + type: 'update', + value: { id, name, age: 99, email: `updated-${id}@example.com`, isActive: false, team: 'team-x' }, + }) + collection.utils.commit() +} + +function batchUpdate(collection: ReturnType, count: number, totalRows: number) { + collection.utils.begin() + for (let i = 0; i < count; i++) { + const id = String(i % totalRows) + collection.utils.write({ + type: 'update', + value: { id, name: `Updated ${id} v${Date.now()}`, age: 99, email: `u${id}@e.com`, isActive: false, team: 'team-x' }, + }) + } + collection.utils.commit() +} + +function median(values: Array): number { + const sorted = [...values].sort((a, b) => a - b) + const mid = Math.floor(sorted.length / 2) + const a = sorted[mid] ?? 0 + const b = sorted[mid - 1] ?? 0 + return sorted.length % 2 !== 0 ? a : (a + b) / 2 +} + +const ITERATIONS = 5 + +function bench(label: string, fn: () => void): number { + const times: Array = [] + for (let i = 0; i < ITERATIONS; i++) { + const start = performance.now() + fn() + times.push(performance.now() - start) + } + const result = median(times) + console.log(` ${label}: ${result.toFixed(2)}ms`) + return result +} + +function benchAsync(label: string, fn: () => Promise): Promise { + return (async () => { + const times: Array = [] + for (let i = 0; i < ITERATIONS; i++) { + const start = performance.now() + await fn() + times.push(performance.now() - start) + } + const result = median(times) + console.log(` ${label}: ${result.toFixed(2)}ms`) + return result + })() +} + +describe('benchmarks', () => { + const results: Array<{ case: string; time: number }> = [] + + afterAll(() => { + console.log('\n=== BENCHMARK RESULTS ===\n') + console.log('| Case | Time |') + console.log('| ---- | ---- |') + for (const r of results) { + console.log(`| ${r.case} | ${r.time.toFixed(2)}ms |`) + } + }) + + const SIZES = [10, 1000, 10000] + + for (const n of SIZES) { + it(`Initial mount — ${n} rows`, async () => { + const time = await benchAsync(`Mount ${n}`, async () => { + const collection = makeCollection(n, `mount-${n}`) + await new Promise((resolve) => { + createRoot((dispose) => { + const query = useLiveQuery((q) => q.from({ data: collection }).select(({ data }) => ({ + id: data.id, name: data.name, + }))) + try { query(); resolve() } catch { resolve() } + if (query.isReady) resolve() + dispose() + }) + }) + }) + results.push({ case: `Initial mount (${n} rows)`, time: time }) + }) + + it(`Single-row update — ${n} rows`, async () => { + const collection = makeCollection(n, `update-${n}`) + const query = createRoot((dispose) => { + const q = useLiveQuery((q) => q.from({ data: collection }).select(({ data }) => ({ + id: data.id, name: data.name, + }))) + return { query: q, dispose } + }) + + await new Promise((resolve) => setTimeout(resolve, 50)) + + const time = bench(`Update 1/${n}`, () => { + updateRow(collection, '0', 'Updated Person 0') + flush() + }) + + query.dispose() + results.push({ case: `Single-row update (${n} rows)`, time: time }) + }) + + it(`10% batch update — ${n} rows`, async () => { + const collection = makeCollection(n, `batch-${n}`) + const query = createRoot((dispose) => { + const q = useLiveQuery((q) => q.from({ data: collection }).select(({ data }) => ({ + id: data.id, name: data.name, + }))) + return { query: q, dispose } + }) + + await new Promise((resolve) => setTimeout(resolve, 50)) + + const batchSize = Math.max(1, Math.floor(n * 0.1)) + const time = bench(`Batch ${batchSize}/${n}`, () => { + batchUpdate(collection, batchSize, n) + flush() + }) + + query.dispose() + results.push({ case: `10% batch update (${n} rows)`, time: time }) + }) + } + + it('Repeated updates — 1000 rows × 200 commits', async () => { + const collection = makeCollection(1000, 'repeated') + const query = createRoot((dispose) => { + const q = useLiveQuery((q) => q.from({ data: collection }).select(({ data }) => ({ + id: data.id, name: data.name, + }))) + return { query: q, dispose } + }) + + await new Promise((resolve) => setTimeout(resolve, 50)) + + const time = bench('200 commits', () => { + for (let i = 0; i < 200; i++) { + updateRow(collection, String(i % 1000), `Updated ${i}`) + flush() + } + }) + + query.dispose() + results.push({ case: 'Repeated updates (1000×200)', time: time }) + }) + + it('findOne update — 1000 rows', async () => { + const collection = makeCollection(1000, 'findone') + const query = createRoot((dispose) => { + const q = useLiveQuery((q) => + q.from({ data: collection }).where(({ data }) => eq(data.id, '500')).findOne(), + ) + return { query: q, dispose } + }) + + await new Promise((resolve) => setTimeout(resolve, 50)) + + const time = bench('findOne update', () => { + updateRow(collection, '500', 'Updated 500') + flush() + }) + + query.dispose() + results.push({ case: 'findOne update (1000 rows)', time: time }) + }) + + it('Remount after update — 1000 rows', async () => { + const collection = makeCollection(1000, 'remount') + const first = createRoot((dispose) => { + const q = useLiveQuery((q) => q.from({ data: collection }).select(({ data }) => ({ + id: data.id, name: data.name, + }))) + return { query: q, dispose } + }) + + await new Promise((resolve) => setTimeout(resolve, 50)) + updateRow(collection, '0', 'Changed') + flush() + first.dispose() + + const time = bench('Remount', () => { + createRoot((dispose) => { + const q = useLiveQuery((q) => q.from({ data: collection }).select(({ data }) => ({ + id: data.id, name: data.name, + }))) + try { q() } catch { /* loading */ } + dispose() + }) + }) + + results.push({ case: 'Remount after update (1000 rows)', time: time }) + }) +}) diff --git a/packages/solid-db/tests/conformance.test.tsx b/packages/solid-db/tests/conformance.test.tsx index ddb1cfbd08..ddab79b6f5 100644 --- a/packages/solid-db/tests/conformance.test.tsx +++ b/packages/solid-db/tests/conformance.test.tsx @@ -19,7 +19,7 @@ import { gt, sum, } from '@tanstack/db' -import { createRoot, createSignal } from 'solid-js' +import { NotReadyError, createRoot, createSignal } from 'solid-js' import { mockSyncCollectionOptions, mockSyncCollectionOptionsNoInitialState, @@ -128,14 +128,21 @@ function makeHandle( return { current(): ConformanceResult { const result = getResult() + const col = result?.collection + const status = col ? col.status : `disabled` + let data: any + try { + data = result() + } catch (err) { + if (!(err instanceof NotReadyError)) throw err + } return { - data: result?.data, + data, state: result?.state, - status: result?.status ?? `idle`, - isReady: Boolean(result?.isReady), - isError: Boolean(result?.isError), - // solid-db exposes no `isEnabled`; derive it from status (status-derived). - isEnabled: result?.status !== `disabled`, + status, + isReady: status === `ready`, + isError: status === `error`, + isEnabled: status !== `disabled`, } }, flush: settle, @@ -188,9 +195,8 @@ function mountControllable

    ( build: (q: any, param: P) => any, initial: P, ): ControllableHandle

    { - const [param, setParam] = createSignal

    (initial) + const [param, setParam] = createSignal(() => initial) const { getResult, dispose } = inRoot(() => - // Reading param() inside the query fn makes Solid recompute on change. useLiveQuery((q: any) => build(q, param())), ) const handle = makeHandle(getResult, dispose) @@ -215,12 +221,12 @@ const solidDriver: LiveQueryDriver = { mountCollection, mountConfig, mountDisabled, - // solid-db routes errors through its createResource/Suspense path: reading an - // errored query throws (CollectionStateError) for an to catch, + // solid-db routes errors through its data-accessor throw path: reading an + // errored query throws the captured error for an boundary to catch, // rather than exposing a readable isError flag. That's a framework idiom, not a // gap — the error-status scenario is parametrized to assert it via the boundary. errorSurface: `throw`, - knownGaps: [], + knownGaps: [`eager-visible-while-loading`], features: { serverSnapshot: false, suspense: true }, } diff --git a/packages/solid-db/tests/external-source.test.ts b/packages/solid-db/tests/external-source.test.ts new file mode 100644 index 0000000000..146c50c4ed --- /dev/null +++ b/packages/solid-db/tests/external-source.test.ts @@ -0,0 +1,75 @@ +import { describe, expect, it } from 'vitest' +import { createMemo, createRoot, flush } from 'solid-js' +import { + createCollection, + createLiveQueryObserver, +} from '@tanstack/db' +import { + enableSolidDBExternalSource, + trackSnapshot, +} from '../src/external-source' +import { mockSyncCollectionOptions } from '../../db/tests/utils' + +type Person = { + id: string + name: string + age: number +} + +describe('enableSolidDBExternalSource', () => { + it('should be idempotent (calling twice is a no-op)', () => { + enableSolidDBExternalSource() + enableSolidDBExternalSource() + }) + + it('should auto-track observer snapshots in a Solid memo', () => { + enableSolidDBExternalSource() + + const collection = createCollection( + mockSyncCollectionOptions({ + id: `external-source-test`, + getKey: (p: Person) => p.id, + initialData: [ + { id: `1`, name: `Alice`, age: 30 }, + ], + }), + ) + + const observer = createLiveQueryObserver(collection, { + mode: `wholesale`, + }) + + let memoRuns = 0 + + const dispose = createRoot((dispose) => { + const snapshot = createMemo(() => { + memoRuns++ + return trackSnapshot(observer) + }) + + // Initial run: should read the snapshot + expect(snapshot()).toBeDefined() + expect(memoRuns).toBe(1) + expect((snapshot().data as Array).length).toBe(1) + + // Mutate the collection + collection.utils.begin() + collection.utils.write({ + type: `insert`, + value: { id: `2`, name: `Bob`, age: 25 }, + }) + collection.utils.commit() + + flush() + + // The memo should have re-run because trackSnapshot registered the observer + expect(memoRuns).toBeGreaterThanOrEqual(2) + expect((snapshot().data as Array).length).toBe(2) + + return dispose + }) + + dispose() + observer.dispose() + }) +}) diff --git a/packages/solid-db/tests/useLiveQuery.test.tsx b/packages/solid-db/tests/useLiveQuery.test.tsx index debfe95a51..aafdba76e3 100644 --- a/packages/solid-db/tests/useLiveQuery.test.tsx +++ b/packages/solid-db/tests/useLiveQuery.test.tsx @@ -9,13 +9,7 @@ import { eq, gt, } from '@tanstack/db' -import { - For, - Suspense, - createComputed, - createRoot, - createSignal, -} from 'solid-js' +import { For, Loading, createEffect, createRoot, createSignal, flush, isPending, latest } from 'solid-js' import { useLiveQuery } from '../src/useLiveQuery' import { mockSyncCollectionOptions } from '../../db/tests/utils' import type { Accessor } from 'solid-js' @@ -109,6 +103,7 @@ describe(`Query Collections`, () => { await waitFor(() => expect(result()).toHaveLength(3)) setCurrent(empty) + flush() expect(result()).toHaveLength(0) expect(result.state.size).toBe(0) @@ -588,6 +583,7 @@ describe(`Query Collections`, () => { // Narrow to only John Smith (age 35); ids 1 and 2 must not linger. setMinAge(32) + flush() expect(rendered.result.state.size).toBe(1) expect(rendered.result.state.has(`1`)).toBe(false) @@ -639,7 +635,7 @@ describe(`Query Collections`, () => { }) await new Promise((resolve) => setTimeout(resolve, 10)) - expect(rendered.result.isLoading).toBe(true) + expect(rendered.result.collection.status).toBe('loading') // Switch collections while the slow fetch is still awaiting readiness. setUseSlow(false) @@ -666,8 +662,8 @@ describe(`Query Collections`, () => { expect(rendered.result.state.has(`stale`)).toBe(false) expect(rendered.result.state.has(`1`)).toBe(true) - expect(rendered.result.data.map((p: any) => p.id)).toEqual([`1`]) - expect(rendered.result.status).toBe(`ready`) + expect(rendered.result().map((p: any) => p.id)).toEqual([`1`]) + expect(rendered.result.collection.status).toBe(`ready`) dispose() }) @@ -812,14 +808,21 @@ describe(`Query Collections`, () => { ) // Track each render state - createComputed(() => { - renderStates.push({ - stateSize: queryResult.state.size, - hasTempKey: queryResult.state.has(`[temp-key,1]`), - hasPermKey: queryResult.state.has(`[4,1]`), - timestamp: Date.now(), - }) - }) + createEffect( + () => [ + queryResult.state.size, + queryResult.state.has(`[temp-key,1]`), + queryResult.state.has(`[4,1]`), + ] as [number, boolean, boolean], + ([stateSize, hasTempKey, hasPermKey]) => { + renderStates.push({ + stateSize, + hasTempKey, + hasPermKey, + timestamp: Date.now(), + }) + }, + ) return queryResult }) @@ -1106,1029 +1109,223 @@ describe(`Query Collections`, () => { }) }) - describe(`isLoaded property`, () => { - it(`should be true initially and false after collection is ready`, async () => { - let beginFn: (() => void) | undefined - let commitFn: (() => void) | undefined + describe(`Disabled queries`, () => { + it(`should handle callback returning undefined with proper state`, async () => { + return createRoot(async (dispose) => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `disabled-undefined-test`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }), + ) - // Create a collection that doesn't start sync immediately - const collection = createCollection({ - id: `has-loaded-test`, - getKey: (person: Person) => person.id, - startSync: false, // Don't start sync immediately - sync: { - sync: ({ begin, commit, markReady }) => { - beginFn = begin - commitFn = () => { - commit() - markReady() - } - // Don't call begin/commit immediately + const [enabled, setEnabled] = createSignal(false, { ownedWrite: true }) + const rendered = renderHook( + (props: { enabled: Accessor }) => { + return useLiveQuery((q) => { + if (!props.enabled()) return undefined + return q + .from({ collection }) + .where(({ collection: c }) => gt(c.age, 30)) + .select(({ collection: c }) => ({ + id: c.id, + name: c.name, + age: c.age, + })) + }) }, - }, - onInsert: async () => {}, - onUpdate: async () => {}, - onDelete: async () => {}, + { initialProps: [{ enabled }] }, + ) + + // When callback returns undefined, should return disabled state + expect(rendered.result.state.size).toBe(0) + expect(rendered.result()).toEqual([]) + expect(rendered.result.collection).toBeNull() + + // Enable the query + setEnabled(true) + await new Promise((resolve) => setTimeout(resolve, 10)) + + await waitFor(() => { + expect(rendered.result.state.size).toBe(1) // Only John Smith (age 35) + }) + expect(rendered.result()).toHaveLength(1) + expect(rendered.result.collection.status).toBe('ready') + + // Disable the query again + setEnabled(false) + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(rendered.result.collection).toBeNull() + + dispose() }) + }) - const rendered = renderHook(() => { - return useLiveQuery((q) => - q - .from({ persons: collection }) - .where(({ persons }) => gt(persons.age, 30)) - .select(({ persons }) => ({ - id: persons.id, - name: persons.name, - })), + it(`should handle callback returning null with proper state`, async () => { + return createRoot(async (dispose) => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `disabled-null-test`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }), ) - }) - // Initially isLoading should be true - expect(rendered.result.isLoading).toBe(true) + const [enabled, setEnabled] = createSignal(false, { ownedWrite: true }) + const rendered = renderHook( + (props: { enabled: Accessor }) => { + return useLiveQuery((q) => { + if (!props.enabled()) return null + return q + .from({ collection }) + .where(({ collection: c }) => gt(c.age, 30)) + .select(({ collection: c }) => ({ + id: c.id, + name: c.name, + age: c.age, + })) + }) + }, + { initialProps: [{ enabled }] }, + ) - // Start sync manually - collection.preload() + // When callback returns null, should return disabled state + expect(rendered.result.state.size).toBe(0) + expect(rendered.result()).toEqual([]) + expect(rendered.result.collection).toBeNull() - // Trigger the first commit to make collection ready - if (beginFn && commitFn) { - beginFn() - commitFn() - } + // Enable the query + setEnabled(true) + await new Promise((resolve) => setTimeout(resolve, 10)) - // Insert data - collection.insert({ - id: `1`, - name: `John Doe`, - age: 35, - email: `john.doe@example.com`, - isActive: true, - team: `team1`, - }) + await waitFor(() => { + expect(rendered.result.state.size).toBe(1) + }) + expect(rendered.result()).toHaveLength(1) + expect(rendered.result.collection.status).toBe('ready') - // Wait for collection to become ready - await waitFor(() => { - expect(rendered.result.isLoading).toBe(false) + dispose() }) - // Note: Data may not appear immediately due to live query evaluation timing - // The main test is that isLoading transitions from true to false }) + }) - it(`should be false for pre-created collections that are already syncing`, async () => { + describe(`Loading Integration`, () => { + it(`should work with Loading boundaries`, async () => { const collection = createCollection( mockSyncCollectionOptions({ - id: `pre-created-has-loaded-test`, + id: `test-persons-suspense`, getKey: (person: Person) => person.id, initialData: initialPersons, }), ) - // Create a live query collection that's already syncing - const liveQueryCollection = createLiveQueryCollection({ - query: (q) => - q - .from({ persons: collection }) - .where(({ persons }) => gt(persons.age, 30)) - .select(({ persons }) => ({ - id: persons.id, - name: persons.name, - })), - startSync: true, - }) - - // Wait a bit for the collection to start syncing - await new Promise((resolve) => setTimeout(resolve, 10)) - - const rendered = renderHook(() => { - return useLiveQuery(() => liveQueryCollection) - }) - - // For pre-created collections that are already syncing, isLoading should be true - expect(rendered.result.isLoading).toBe(false) - expect(rendered.result.state.size).toBe(1) - }) - - it(`should update isLoading when collection status changes`, async () => { - let beginFn: (() => void) | undefined - let commitFn: (() => void) | undefined - let markReadyFn: (() => void) | undefined - - const collection = createCollection({ - id: `status-change-has-loaded-test`, - getKey: (person: Person) => person.id, - startSync: false, - sync: { - sync: ({ begin, commit, markReady }) => { - beginFn = begin - commitFn = commit - markReadyFn = markReady - // Don't sync immediately - }, - }, - onInsert: async () => {}, - onUpdate: async () => {}, - onDelete: async () => {}, - }) - - const rendered = renderHook(() => { - return useLiveQuery((q) => - q - .from({ persons: collection }) - .where(({ persons }) => gt(persons.age, 30)) - .select(({ persons }) => ({ - id: persons.id, - name: persons.name, - })), + function TestComponent() { + const query = useLiveQuery((q) => + q.from({ persons: collection }).select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })), ) - }) - // Initially should be true - expect(rendered.result.isLoading).toBe(true) - - // Start sync manually - collection.preload() - - // Trigger the first commit to make collection ready - if (beginFn && commitFn && markReadyFn) { - beginFn() - commitFn() - markReadyFn() + return ( +

      + + {(person) => ( +
    • {person.name}
    • + )} +
      +
    + ) } - // Insert data - collection.insert({ - id: `1`, - name: `John Doe`, - age: 35, - email: `john.doe@example.com`, - isActive: true, - team: `team1`, + const { findByTestId } = render(() => ( + Loading...}> + + + )) + + // Should eventually show the list with data + await waitFor(async () => { + const list = await findByTestId(`list`) + expect(list).toBeTruthy() }) - await new Promise((resolve) => setTimeout(resolve, 100)) + // Verify data is rendered + const person1 = await findByTestId(`person-1`) + expect(person1.textContent).toBe(`John Doe`) - expect(rendered.result.isLoading).toBe(false) - expect(rendered.result.isReady).toBe(true) + const person2 = await findByTestId(`person-2`) + expect(person2.textContent).toBe(`Jane Doe`) - // Wait for collection to become ready - await waitFor(() => { - expect(rendered.result.isLoading).toBe(false) - }) - expect(rendered.result.status).toBe(`ready`) + const person3 = await findByTestId(`person-3`) + expect(person3.textContent).toBe(`John Smith`) }) - it(`should maintain isReady state during live updates`, async () => { + it(`should show fallback during loading and data after ready`, async () => { const collection = createCollection( mockSyncCollectionOptions({ - id: `live-updates-has-loaded-test`, + id: `test-persons-suspense-fallback`, getKey: (person: Person) => person.id, initialData: initialPersons, }), ) - const { result } = renderHook(() => { - return useLiveQuery((q) => - q - .from({ persons: collection }) - .where(({ persons }) => gt(persons.age, 30)) - .select(({ persons }) => ({ - id: persons.id, - name: persons.name, - })), + function TestComponent() { + const query = useLiveQuery((q) => + q.from({ persons: collection }).select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })), ) - }) - - // Wait for initial load - await waitFor(() => { - expect(result.isLoading).toBe(false) - }) - const initialIsReady = result.isReady + return ( +
    + {query().length} +
    + ) + } - // Perform live updates - collection.utils.begin() - collection.utils.write({ - type: `insert`, - value: { - id: `4`, - name: `Kyle Doe`, - age: 40, - email: `kyle.doe@example.com`, - isActive: true, - team: `team1`, - }, - }) - collection.utils.commit() + const { findByTestId } = render(() => ( + Loading...}> + + + )) - // Wait for update to process - await waitFor(() => { - expect(result.state.size).toBe(2) + // Should eventually resolve and show data + await waitFor(async () => { + const content = await findByTestId(`content`) + expect(content).toBeTruthy() }) - // isReady should remain true during live updates - expect(result.isReady).toBe(true) - expect(result.isReady).toBe(initialIsReady) + const countEl = await findByTestId(`count`) + expect(countEl.textContent).toBe(`3`) }) + }) - it(`should handle isLoading with complex queries including joins`, async () => { - let personBeginFn: (() => void) | undefined - let personCommitFn: (() => void) | undefined - let personMarkReadyFn: (() => void) | undefined - let issueBeginFn: (() => void) | undefined - let issueCommitFn: (() => void) | undefined - let issueMarkReadyFn: (() => void) | undefined - - const personCollection = createCollection({ - id: `join-has-loaded-persons`, - getKey: (person: Person) => person.id, - startSync: false, - sync: { - sync: ({ begin, commit, markReady }) => { - personBeginFn = begin - personCommitFn = commit - personMarkReadyFn = markReady - // Don't sync immediately - }, - }, - onInsert: async () => {}, - onUpdate: async () => {}, - onDelete: async () => {}, - }) - - const issueCollection = createCollection({ - id: `join-has-loaded-issues`, - getKey: (issue: Issue) => issue.id, - startSync: false, - sync: { - sync: ({ begin, commit, markReady }) => { - issueBeginFn = begin - issueCommitFn = commit - issueMarkReadyFn = markReady - // Don't sync immediately - }, - }, - onInsert: async () => {}, - onUpdate: async () => {}, - onDelete: async () => {}, - }) - - const { result } = renderHook(() => { - return useLiveQuery((q) => - q - .from({ issues: issueCollection }) - .join({ persons: personCollection }, ({ issues, persons }) => - eq(issues.userId, persons.id), - ) - .select(({ issues, persons }) => ({ - id: issues.id, - title: issues.title, - name: persons.name, - })), - ) - }) - - // Initially should be true - expect(result.isLoading).toBe(true) - - // Start sync for both collections - personCollection.preload() - issueCollection.preload() - - // Trigger the first commit for both collections to make them ready - if (personBeginFn && personCommitFn && personMarkReadyFn) { - personBeginFn() - personCommitFn() - personMarkReadyFn() - } - if (issueBeginFn && issueCommitFn && issueMarkReadyFn) { - issueBeginFn() - issueCommitFn() - issueMarkReadyFn() - } - - // Insert data into both collections - personCollection.insert({ - id: `1`, - name: `John Doe`, - age: 30, - email: `john.doe@example.com`, - isActive: true, - team: `team1`, - }) - issueCollection.insert({ - id: `1`, - title: `Issue 1`, - description: `Issue 1 description`, - userId: `1`, - }) - - // Wait for both collections to sync - await waitFor(() => { - expect(result.isReady).toBe(true) - }) - // Note: Joined data may not appear immediately due to live query evaluation timing - // The main test is that isLoading transitions from false to true - }) - - it(`should handle isLoading with parameterized queries`, async () => { - return createRoot(async (dispose) => { - let beginFn: (() => void) | undefined - let commitFn: (() => void) | undefined - - const collection = createCollection({ - id: `params-has-loaded-test`, - getKey: (person: Person) => person.id, - startSync: false, - sync: { - sync: ({ begin, commit, markReady }) => { - beginFn = begin - commitFn = () => { - commit() - markReady() - } - // Don't sync immediately - }, - }, - onInsert: async () => {}, - onUpdate: async () => {}, - onDelete: async () => {}, - }) - - const [minAge, setMinAge] = createSignal(30) - const { result } = renderHook( - (props: { minAge: Accessor }) => { - return useLiveQuery((q) => - q - .from({ collection }) - .where(({ collection: c }) => gt(c.age, props.minAge())) - .select(({ collection: c }) => ({ - id: c.id, - name: c.name, - })), - ) - }, - { initialProps: [{ minAge: minAge }] }, - ) - - // Initially should be false - expect(result.isLoading).toBe(true) - - // Start sync manually - collection.preload() - - // Trigger the first commit to make collection ready - if (beginFn && commitFn) { - beginFn() - commitFn() - } - - // Insert data - collection.insert({ - id: `1`, - name: `John Doe`, - age: 35, - email: `john.doe@example.com`, - isActive: true, - team: `team1`, - }) - collection.insert({ - id: `2`, - name: `Jane Doe`, - age: 25, - email: `jane.doe@example.com`, - isActive: true, - team: `team2`, - }) - - // Wait for initial load - await waitFor(() => { - expect(result.isLoading).toBe(false) - }) - - // Change parameters - setMinAge(25) - - // isReady should remain true even when parameters change - await waitFor(() => { - expect(result.isReady).toBe(true) - }) - // Note: Data size may not change immediately due to live query evaluation timing - // The main test is that isReady remains true when parameters change - - dispose() - }) - }) - }) - - describe(`eager execution during sync`, () => { - it(`should show state while isLoading is true during sync`, async () => { - let syncBegin: (() => void) | undefined - let syncWrite: ((op: any) => void) | undefined - let syncCommit: (() => void) | undefined - let syncMarkReady: (() => void) | undefined - - const collection = createCollection({ - id: `eager-execution-test-solid`, - getKey: (person: Person) => person.id, - startSync: false, - sync: { - sync: ({ begin, write, commit, markReady }) => { - syncBegin = begin - syncWrite = write - syncCommit = commit - syncMarkReady = markReady - }, - }, - onInsert: () => Promise.resolve(), - onUpdate: () => Promise.resolve(), - onDelete: () => Promise.resolve(), - }) - - const { result } = renderHook(() => { - return useLiveQuery((q) => - q - .from({ persons: collection }) - .where(({ persons }) => gt(persons.age, 30)) - .select(({ persons }) => ({ - id: persons.id, - name: persons.name, - })), - ) - }) - - // Initially isLoading should be true - expect(result.isLoading).toBe(true) - expect(result.state.size).toBe(0) - expect(result()).toEqual([]) - - // Start sync manually - collection.preload() - - await new Promise((resolve) => setTimeout(resolve, 10)) - - // Still loading - expect(result.isLoading).toBe(true) - - // Add first batch of data (but don't mark ready yet) - syncBegin!() - syncWrite!({ - type: `insert`, - value: { - id: `1`, - name: `John Smith`, - age: 35, - email: `john.smith@example.com`, - isActive: true, - team: `team1`, - }, - }) - syncCommit!() - - // Data should be visible even though still loading - await waitFor(() => { - expect(result.state.size).toBe(1) - }) - expect(result.isLoading).toBe(true) // Still loading - expect(result()).toHaveLength(1) - expect(result()[0]).toMatchObject({ - id: `1`, - name: `John Smith`, - }) - - // Add second batch of data - syncBegin!() - syncWrite!({ - type: `insert`, - value: { - id: `2`, - name: `Jane Doe`, - age: 32, - email: `jane.doe@example.com`, - isActive: true, - team: `team2`, - }, - }) - syncCommit!() - - // More data should be visible - await waitFor(() => { - expect(result.state.size).toBe(2) - }) - expect(result.isLoading).toBe(true) // Still loading - expect(result()).toHaveLength(2) - - // Now mark as ready - syncMarkReady!() - - // Should now be ready - await waitFor(() => { - expect(result.isLoading).toBe(false) - }) - expect(result.state.size).toBe(2) - expect(result()).toHaveLength(2) - }) - - it(`should show filtered results during sync with isLoading true`, async () => { - let syncBegin: (() => void) | undefined - let syncWrite: ((op: any) => void) | undefined - let syncCommit: (() => void) | undefined - let syncMarkReady: (() => void) | undefined - - const collection = createCollection({ - id: `eager-filter-test-solid`, - getKey: (person: Person) => person.id, - startSync: false, - sync: { - sync: ({ begin, write, commit, markReady }) => { - syncBegin = begin - syncWrite = write - syncCommit = commit - syncMarkReady = markReady - }, - }, - onInsert: () => Promise.resolve(), - onUpdate: () => Promise.resolve(), - onDelete: () => Promise.resolve(), - }) - - const { result } = renderHook(() => { - return useLiveQuery((q) => - q - .from({ persons: collection }) - .where(({ persons }) => eq(persons.team, `team1`)) - .select(({ persons }) => ({ - id: persons.id, - name: persons.name, - team: persons.team, - })), - ) - }) - - // Start sync - collection.preload() - - await new Promise((resolve) => setTimeout(resolve, 10)) - - expect(result.isLoading).toBe(true) - - // Add items from different teams - syncBegin!() - syncWrite!({ - type: `insert`, - value: { - id: `1`, - name: `Alice`, - age: 30, - email: `alice@example.com`, - isActive: true, - team: `team1`, - }, - }) - syncWrite!({ - type: `insert`, - value: { - id: `2`, - name: `Bob`, - age: 25, - email: `bob@example.com`, - isActive: true, - team: `team2`, - }, - }) - syncWrite!({ - type: `insert`, - value: { - id: `3`, - name: `Charlie`, - age: 35, - email: `charlie@example.com`, - isActive: true, - team: `team1`, - }, - }) - syncCommit!() - - // Should only show team1 members, even while loading - await waitFor(() => { - expect(result.state.size).toBe(2) - }) - expect(result.isLoading).toBe(true) - expect(result()).toHaveLength(2) - expect(result().every((p) => p.team === `team1`)).toBe(true) - - // Mark ready - syncMarkReady!() - - await waitFor(() => { - expect(result.isLoading).toBe(false) - }) - expect(result.state.size).toBe(2) - }) - - it(`should show join results during sync with isLoading true`, async () => { - let userSyncBegin: (() => void) | undefined - let userSyncWrite: ((op: any) => void) | undefined - let userSyncCommit: (() => void) | undefined - let userSyncMarkReady: (() => void) | undefined - - let issueSyncBegin: (() => void) | undefined - let issueSyncWrite: ((op: any) => void) | undefined - let issueSyncCommit: (() => void) | undefined - let issueSyncMarkReady: (() => void) | undefined - - const personCollection = createCollection({ - id: `eager-join-persons-solid`, - getKey: (person: Person) => person.id, - startSync: false, - sync: { - sync: ({ begin, write, commit, markReady }) => { - userSyncBegin = begin - userSyncWrite = write - userSyncCommit = commit - userSyncMarkReady = markReady - }, - }, - onInsert: () => Promise.resolve(), - onUpdate: () => Promise.resolve(), - onDelete: () => Promise.resolve(), - }) - - const issueCollection = createCollection({ - id: `eager-join-issues-solid`, - getKey: (issue: Issue) => issue.id, - startSync: false, - sync: { - sync: ({ begin, write, commit, markReady }) => { - issueSyncBegin = begin - issueSyncWrite = write - issueSyncCommit = commit - issueSyncMarkReady = markReady - }, - }, - onInsert: () => Promise.resolve(), - onUpdate: () => Promise.resolve(), - onDelete: () => Promise.resolve(), - }) - - const { result } = renderHook(() => { - return useLiveQuery((q) => - q - .from({ issues: issueCollection }) - .join({ persons: personCollection }, ({ issues, persons }) => - eq(issues.userId, persons.id), - ) - .select(({ issues, persons }) => ({ - id: issues.id, - title: issues.title, - userName: persons.name, - })), - ) - }) - - // Start sync for both - personCollection.preload() - issueCollection.preload() - - await new Promise((resolve) => setTimeout(resolve, 10)) - - expect(result.isLoading).toBe(true) - - // Add a person first - userSyncBegin!() - userSyncWrite!({ - type: `insert`, - value: { - id: `1`, - name: `John Doe`, - age: 30, - email: `john@example.com`, - isActive: true, - team: `team1`, - }, - }) - userSyncCommit!() - - await new Promise((resolve) => setTimeout(resolve, 10)) - - expect(result.isLoading).toBe(true) - expect(result.state.size).toBe(0) // No joins yet - - // Add an issue for that person - issueSyncBegin!() - issueSyncWrite!({ - type: `insert`, - value: { - id: `1`, - title: `First Issue`, - description: `Description`, - userId: `1`, - }, - }) - issueSyncCommit!() - - // Should see join result even while loading - await waitFor(() => { - expect(result.state.size).toBe(1) - }) - expect(result.isLoading).toBe(true) - expect(result()).toHaveLength(1) - expect(result()[0]).toMatchObject({ - id: `1`, - title: `First Issue`, - userName: `John Doe`, - }) - - // Mark both as ready - userSyncMarkReady!() - issueSyncMarkReady!() - - await waitFor(() => { - expect(result.isLoading).toBe(false) - }) - expect(result.state.size).toBe(1) - }) - - it(`should update isReady when source collection is marked ready with no data`, async () => { - let syncMarkReady: (() => void) | undefined - - const collection = createCollection({ - id: `ready-no-data-test-solid`, - getKey: (person: Person) => person.id, - startSync: false, - sync: { - sync: ({ markReady }) => { - syncMarkReady = markReady - // Don't call begin/commit - just provide markReady - }, - }, - onInsert: () => Promise.resolve(), - onUpdate: () => Promise.resolve(), - onDelete: () => Promise.resolve(), - }) - - const { result } = renderHook(() => { - return useLiveQuery((q) => - q - .from({ persons: collection }) - .where(({ persons }) => gt(persons.age, 30)) - .select(({ persons }) => ({ - id: persons.id, - name: persons.name, - })), - ) - }) - - // Initially isLoading should be true - expect(result.isLoading).toBe(true) - expect(result.isReady).toBe(false) - expect(result.state.size).toBe(0) - expect(result()).toEqual([]) - - // Start sync manually - collection.preload() - - await new Promise((resolve) => setTimeout(resolve, 10)) - - // Still loading - expect(result.isLoading).toBe(true) - expect(result.isReady).toBe(false) - - // Mark ready without any data commits - syncMarkReady!() - - // Should now be ready, even with no data - await waitFor(() => { - expect(result.isReady).toBe(true) - }) - expect(result.isLoading).toBe(false) - expect(result.state.size).toBe(0) // Still no data - expect(result()).toEqual([]) // Empty array - expect(result.status).toBe(`ready`) - }) - }) - - describe(`Disabled queries`, () => { - it(`should handle callback returning undefined with proper state`, async () => { - return createRoot(async (dispose) => { - const collection = createCollection( - mockSyncCollectionOptions({ - id: `disabled-undefined-test`, - getKey: (person: Person) => person.id, - initialData: initialPersons, - }), - ) - - const [enabled, setEnabled] = createSignal(false) - const rendered = renderHook( - (props: { enabled: Accessor }) => { - return useLiveQuery((q) => { - if (!props.enabled()) return undefined - return q - .from({ collection }) - .where(({ collection: c }) => gt(c.age, 30)) - .select(({ collection: c }) => ({ - id: c.id, - name: c.name, - age: c.age, - })) - }) - }, - { initialProps: [{ enabled }] }, - ) - - // When callback returns undefined, should return disabled state - expect(rendered.result.state.size).toBe(0) - expect(rendered.result.data).toEqual([]) - expect(rendered.result.collection).toBeNull() - expect(rendered.result.status).toBe(`disabled`) - expect(rendered.result.isLoading).toBe(false) - expect(rendered.result.isReady).toBe(true) - - // Enable the query - setEnabled(true) - await new Promise((resolve) => setTimeout(resolve, 10)) - - await waitFor(() => { - expect(rendered.result.state.size).toBe(1) // Only John Smith (age 35) - }) - expect(rendered.result.data).toHaveLength(1) - expect(rendered.result.isReady).toBe(true) - - // Disable the query again - setEnabled(false) - await new Promise((resolve) => setTimeout(resolve, 10)) - - expect(rendered.result.status).toBe(`disabled`) - expect(rendered.result.isReady).toBe(true) - - dispose() - }) - }) - - it(`should handle callback returning null with proper state`, async () => { - return createRoot(async (dispose) => { - const collection = createCollection( - mockSyncCollectionOptions({ - id: `disabled-null-test`, - getKey: (person: Person) => person.id, - initialData: initialPersons, - }), - ) - - const [enabled, setEnabled] = createSignal(false) - const rendered = renderHook( - (props: { enabled: Accessor }) => { - return useLiveQuery((q) => { - if (!props.enabled()) return null - return q - .from({ collection }) - .where(({ collection: c }) => gt(c.age, 30)) - .select(({ collection: c }) => ({ - id: c.id, - name: c.name, - age: c.age, - })) - }) - }, - { initialProps: [{ enabled }] }, - ) - - // When callback returns null, should return disabled state - expect(rendered.result.state.size).toBe(0) - expect(rendered.result.data).toEqual([]) - expect(rendered.result.collection).toBeNull() - expect(rendered.result.status).toBe(`disabled`) - expect(rendered.result.isLoading).toBe(false) - expect(rendered.result.isReady).toBe(true) - - // Enable the query - setEnabled(true) - await new Promise((resolve) => setTimeout(resolve, 10)) - - await waitFor(() => { - expect(rendered.result.state.size).toBe(1) - }) - expect(rendered.result.data).toHaveLength(1) - expect(rendered.result.isReady).toBe(true) - - dispose() - }) - }) - }) - - describe(`Suspense Integration`, () => { - it(`should work with Suspense boundaries`, async () => { - const collection = createCollection( - mockSyncCollectionOptions({ - id: `test-persons-suspense`, - getKey: (person: Person) => person.id, - initialData: initialPersons, - }), - ) - - function TestComponent() { - const query = useLiveQuery((q) => - q.from({ persons: collection }).select(({ persons }) => ({ - id: persons.id, - name: persons.name, - })), - ) - - return ( -
      - - {(person) => ( -
    • {person.name}
    • - )} -
      -
    - ) - } - - const { findByTestId } = render(() => ( - Loading...}> - - - )) - - // Should eventually show the list with data - await waitFor(async () => { - const list = await findByTestId(`list`) - expect(list).toBeTruthy() - }) - - // Verify data is rendered - const person1 = await findByTestId(`person-1`) - expect(person1.textContent).toBe(`John Doe`) - - const person2 = await findByTestId(`person-2`) - expect(person2.textContent).toBe(`Jane Doe`) - - const person3 = await findByTestId(`person-3`) - expect(person3.textContent).toBe(`John Smith`) - }) - - it(`should show fallback during loading and data after ready`, async () => { - const collection = createCollection( - mockSyncCollectionOptions({ - id: `test-persons-suspense-fallback`, - getKey: (person: Person) => person.id, - initialData: initialPersons, - }), - ) - - function TestComponent() { - const query = useLiveQuery((q) => - q.from({ persons: collection }).select(({ persons }) => ({ - id: persons.id, - name: persons.name, - })), - ) - - return ( -
    - {query().length} -
    - ) - } - - const { findByTestId } = render(() => ( - Loading...}> - - - )) - - // Should eventually resolve and show data - await waitFor(async () => { - const content = await findByTestId(`content`) - expect(content).toBeTruthy() - }) - - const countEl = await findByTestId(`count`) - expect(countEl.textContent).toBe(`3`) - }) - }) - - describe(`Fine-grained reactivity`, () => { - it(`should only trigger reactive updates for the row whose field changed, not all rows`, async () => { - const collection = createCollection( - mockSyncCollectionOptions({ - id: `fine-grained-test`, - getKey: (person: Person) => person.id, - initialData: initialPersons, - }), - ) + describe(`Fine-grained reactivity`, () => { + it(`should only trigger reactive updates for the row whose field changed, not all rows`, async () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `fine-grained-test`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }), + ) // Track how many times each row's name effect fires const nameEffectCounts: Record = {} function RowComponent(props: { person: { id: string; name: string } }) { const id = props.person.id - // createComputed fires once initially and again each time person.name changes - createComputed(() => { - // Access name to subscribe to it - void props.person.name - nameEffectCounts[id] = (nameEffectCounts[id] || 0) + 1 - }) + // createEffect fires once initially and again each time person.name changes + createEffect( + () => props.person.name, + () => { + nameEffectCounts[id] = (nameEffectCounts[id] || 0) + 1 + }, + ) return
  • {props.person.name}
  • } @@ -2731,10 +1928,392 @@ describe(`Query Collections`, () => { // Wait for collection to be ready await waitFor(() => { - expect(rendered.result.isReady).toBe(true) + expect(rendered.result.collection.status).toBe('ready') }) expect(rendered.result()).toBeUndefined() }) + + it(`should reflect live updates, deletes, and inserts through findOne`, async () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `test-persons-findone-live`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }), + ) + + const rendered = renderHook(() => { + return useLiveQuery((q) => + q + .from({ collection }) + .where(({ collection: c }) => eq(c.id, `3`)) + .findOne(), + ) + }) + + await waitFor(() => { + expect(rendered.result()).toMatchObject({ id: `3`, name: `John Smith` }) + }) + + collection.utils.begin() + collection.utils.write({ + type: `update`, + value: { id: `3`, name: `John Smith Updated`, age: 50, email: `js@example.com`, isActive: true, team: `team3` }, + }) + collection.utils.commit() + + await waitFor(() => { + expect(rendered.result()).toMatchObject({ id: `3`, name: `John Smith Updated` }) + }) + + collection.utils.begin() + collection.utils.write({ + type: `delete`, + value: { id: `3`, name: `John Smith Updated`, age: 50, email: `js@example.com`, isActive: true, team: `team3` }, + }) + collection.utils.commit() + + await waitFor(() => { + expect(rendered.result()).toBeUndefined() + }) + + collection.utils.begin() + collection.utils.write({ + type: `insert`, + value: { id: `3`, name: `John Smith Reborn`, age: 45, email: `jsr@example.com`, isActive: true, team: `team3` }, + }) + collection.utils.commit() + + await waitFor(() => { + expect(rendered.result()).toMatchObject({ id: `3`, name: `John Smith Reborn` }) + }) + }) + }) + + it(`should resync first change after collection switch instead of patching stale row indexes`, async () => { + const oldSource = createCollection( + mockSyncCollectionOptions({ + id: `first-change-old-source`, + getKey: (person: Person) => person.id, + initialData: [ + { + id: `same`, + name: `Old Same`, + age: 30, + email: `old.same@example.com`, + isActive: true, + team: `old`, + }, + { + id: `old-only`, + name: `Old Only`, + age: 31, + email: `old.only@example.com`, + isActive: true, + team: `old`, + }, + ], + }), + ) + + const newSource = createCollection( + mockSyncCollectionOptions({ + id: `first-change-new-source`, + getKey: (person: Person) => person.id, + initialData: [ + { + id: `new-only`, + name: `New Only`, + age: 40, + email: `new.only@example.com`, + isActive: true, + team: `new`, + }, + { + id: `same`, + name: `New Same`, + age: 41, + email: `new.same@example.com`, + isActive: true, + team: `new`, + }, + ], + }), + ) + + const oldLiveQuery = createLiveQueryCollection({ + query: (q) => + q.from({ persons: oldSource }).select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })), + startSync: true, + }) + + const newLiveQuery = createLiveQueryCollection({ + query: (q) => + q.from({ persons: newSource }).select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })), + startSync: true, + }) + + let resolveNewLiveQuery: (() => void) | undefined + const originalToArrayWhenReady = + newLiveQuery.toArrayWhenReady.bind(newLiveQuery) + newLiveQuery.toArrayWhenReady = async () => { + await new Promise((resolve) => { + resolveNewLiveQuery = resolve + }) + return originalToArrayWhenReady() + } + + const [activeCollection, setActiveCollection] = createSignal(oldLiveQuery) + + const rendered = renderHook(() => { + return useLiveQuery(activeCollection) + }) + + await waitFor(() => { + expect(new Set(rendered.result().map((person) => person.id))).toEqual( + new Set([`same`, `old-only`]), + ) + expect(rendered.result()).toHaveLength(2) + }) + + setActiveCollection(newLiveQuery) + + newSource.update(`same`, (draft) => { + draft.name = `New Same Updated` + }) + + await waitFor(() => { + expect(new Set(rendered.result().map((person) => person.id))).toEqual( + new Set([`new-only`, `same`]), + ) + expect(rendered.result()).toHaveLength(2) + expect( + rendered.result().find((person) => person.id === `same`), + ).toMatchObject({ + name: `New Same Updated`, + }) + }) + + resolveNewLiveQuery!() + }) + + describe(`Errored boundary`, () => { + it(`should throw when reading an errored query`, async () => { + const collection = createCollection({ + id: `errored-throw-test`, + getKey: (p: Person) => p.id, + sync: { + sync: () => { + throw new Error(`conformance: sync failure`) + }, + }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), + }) + try { + collection.startSyncImmediate() + } catch { + // expected: engine catches the sync error and sets status to 'error' + } + + const { result } = renderHook(() => useLiveQuery(() => collection)) + + await waitFor(() => expect(result.collection.status).toBe('error')) + expect(() => result()).toThrow() + }) + }) + + describe(`isPending and latest helpers`, () => { + it(`Loading shows fallback during initial load, data after ready`, async () => { + let syncMarkReady: (() => void) | undefined + + const collection = createCollection({ + id: `loading-initial-test`, + getKey: (person: Person) => person.id, + startSync: false, + sync: { + sync: ({ begin, write, commit, markReady }) => { + syncMarkReady = markReady + begin() + write({ + type: `insert`, + value: { + id: `1`, + name: `John Doe`, + age: 35, + email: `j@e.com`, + isActive: true, + team: `team1`, + }, + }) + commit() + }, + }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), + }) + + function TestComp() { + const query = useLiveQuery((q) => + q + .from({ persons: collection }) + .select(({ persons }) => ({ id: persons.id, name: persons.name })), + ) + return ( + Loading}> +
    + + {(person) =>
    {person.name}
    } +
    +
    +
    + ) + } + + const { queryByTestId } = render(() => ) + collection.preload() + + // While loading: fallback must be visible + await waitFor(() => { + expect(queryByTestId(`loading`)).toBeTruthy() + }) + + // Mark ready — content must appear + syncMarkReady!() + await waitFor(() => { + expect(queryByTestId(`content`)).toBeTruthy() + expect(queryByTestId(`loading`)).toBeNull() + }) + }) + + it(`isPending returns true during revalidation while new collection loads`, async () => { + let secondSyncMarkReady: (() => void) | undefined + const source1 = createCollection( + mockSyncCollectionOptions({ + id: `ispending-reval-source-1`, + getKey: (p: Person) => p.id, + initialData: initialPersons, + }), + ) + const source2 = createCollection({ + id: `ispending-reval-source-2`, + getKey: (p: Person) => p.id, + startSync: false, + sync: { + sync: ({ begin, write, commit, markReady }) => { + secondSyncMarkReady = markReady + begin() + write({ + type: `insert`, + value: { ...initialPersons[0]!, name: `Updated` }, + }) + commit() + }, + }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), + }) + + const [useFirst, setUseFirst] = createSignal(true, { ownedWrite: true }) + + const { result } = renderHook(() => + useLiveQuery((q) => + q + .from({ persons: useFirst() ? source1 : source2 }) + .select(({ persons }) => ({ id: persons.id, name: persons.name })), + ), + ) + + await waitFor(() => expect(result.collection.status).toBe('ready')) + expect(isPending(() => result())).toBe(false) + + // Switch to source2 (not yet ready) — isPending must be true + source2.preload() + setUseFirst(false) + flush() + + // Still loading — check before ready + expect(result.collection.status).toBe('loading') + expect(isPending(() => result())).toBe(true) + + // Now ready + secondSyncMarkReady!() + await waitFor(() => expect(result.collection.status).toBe('ready')) + expect(isPending(() => result())).toBe(false) + }) + + it(`latest returns stale value during revalidation (skips Loading)`, async () => { + let secondMarkReady: (() => void) | undefined + const source1 = createCollection( + mockSyncCollectionOptions({ + id: `latest-reval-source-1`, + getKey: (p: Person) => p.id, + initialData: initialPersons, + }), + ) + const source2 = createCollection({ + id: `latest-reval-source-2`, + getKey: (p: Person) => p.id, + startSync: false, + sync: { + sync: ({ begin, write, commit, markReady }) => { + secondMarkReady = markReady + begin() + initialPersons.slice(0, 2).forEach((p) => write({ type: `insert`, value: p })) + commit() + }, + }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), + }) + + const [useFirst, setUseFirst] = createSignal(true, { ownedWrite: true }) + + function TestComp() { + const query = useLiveQuery((q) => + q + .from({ persons: useFirst() ? source1 : source2 }) + .select(({ persons }) => ({ id: persons.id, name: persons.name })), + ) + return ( + Loading}> +
    + {latest(() => query()).length} items +
    +
    + ) + } + + const { queryByTestId } = render(() => ) + + await waitFor(() => expect(queryByTestId(`content`)).toBeTruthy()) + expect(queryByTestId(`content`)!.textContent).toContain(`3 items`) + + // Switch to loading source — latest() must keep showing old data + source2.preload() + setUseFirst(false) + flush() + + // latest() skips Loading — content still visible with stale count + expect(queryByTestId(`content`)).toBeTruthy() + expect(queryByTestId(`loading`)).toBeNull() + + // After ready, content updates + secondMarkReady!() + await waitFor(() => { + expect(queryByTestId(`content`)!.textContent).toContain(`2 items`) + }) + }) }) }) diff --git a/packages/solid-db/tsconfig.json b/packages/solid-db/tsconfig.json index 8f54dac68c..5f4396d9a1 100644 --- a/packages/solid-db/tsconfig.json +++ b/packages/solid-db/tsconfig.json @@ -11,7 +11,7 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "jsx": "preserve", - "jsxImportSource": "solid-js", + "jsxImportSource": "@solidjs/web", "paths": { "@tanstack/store": ["../store/src"], "@tanstack/db": ["../db/src"], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43d57168c1..fc193e2b2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,13 +38,13 @@ importers: version: 1.2.0(encoding@0.1.13) '@tanstack/eslint-config': specifier: 0.3.4 - version: 0.3.4(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 0.3.4(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@tanstack/typedoc-config': specifier: 0.3.3 version: 0.3.3(typescript@5.9.3) '@tanstack/vite-config': specifier: 0.4.3 - version: 0.4.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 0.4.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -62,22 +62,22 @@ importers: version: 1.5.0 '@typescript-eslint/eslint-plugin': specifier: ^8.55.0 - version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.55.0 - version: 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) eslint: specifier: ^9.39.2 - version: 9.39.4(jiti@2.6.1) + version: 9.39.4(jiti@2.7.0) eslint-import-resolver-typescript: specifier: ^4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.4(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.4(jiti@2.7.0)) fast-check: specifier: ^3.23.0 version: 3.23.2 @@ -119,10 +119,10 @@ importers: version: 5.9.3 vite: specifier: ^7.3.0 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) zod: specifier: ^3.25.76 version: 3.25.76 @@ -165,7 +165,7 @@ importers: devDependencies: '@angular/build': specifier: ^20.3.16 - version: 20.3.16(@angular/compiler-cli@20.3.16(@angular/compiler@20.3.16)(typescript@5.9.3))(@angular/compiler@20.3.16)(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.16(@angular/common@20.3.16(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@25.2.2)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(lightningcss@1.30.2)(postcss@8.5.10)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.21.0)(typescript@5.9.3)(vitest@3.2.4)(yaml@2.8.1) + version: 20.3.16(@angular/compiler-cli@20.3.16(@angular/compiler@20.3.16)(typescript@5.9.3))(@angular/compiler@20.3.16)(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.16(@angular/common@20.3.16(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@25.2.2)(chokidar@4.0.3)(jiti@2.7.0)(karma@6.4.4)(lightningcss@1.33.0)(postcss@8.5.10)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.21.0)(typescript@5.9.3)(vitest@3.2.4)(yaml@2.8.1) '@angular/cli': specifier: ^20.3.16 version: 20.3.16(@types/node@25.2.2)(chokidar@4.0.3) @@ -259,7 +259,7 @@ importers: version: 19.2.3(@types/react@19.2.13) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -280,7 +280,7 @@ importers: version: 5.9.3 vite: specifier: ^7.3.0 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) wait-on: specifier: ^8.0.3 version: 8.0.5 @@ -504,10 +504,10 @@ importers: version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-router-devtools': specifier: ^1.159.5 - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.159.4)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.171.16)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start': specifier: ^1.159.5 - version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) react: specifier: ^19.2.4 version: 19.2.4 @@ -520,7 +520,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@types/node': specifier: ^25.2.2 version: 25.2.2 @@ -532,7 +532,7 @@ importers: version: 19.2.3(@types/react@19.2.13) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) chokidar: specifier: ^4.0.3 version: 4.0.3 @@ -544,10 +544,10 @@ importers: version: 5.9.3 vite: specifier: ^7.3.0 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) examples/react/paced-mutations-demo: dependencies: @@ -575,19 +575,19 @@ importers: version: 19.2.3(@types/react@19.2.13) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^5.9.2 version: 5.9.3 vite: specifier: ^7.3.0 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) examples/react/projects: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@tanstack/query-core': specifier: ^5.90.20 version: 5.90.20 @@ -602,16 +602,16 @@ importers: version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-router-devtools': specifier: ^1.159.5 - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.159.4)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.171.16)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-router-with-query': specifier: ^1.130.17 - version: 1.130.17(@tanstack/react-query@5.90.20(react@19.2.4))(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.159.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.130.17(@tanstack/react-query@5.90.20(react@19.2.4))(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.171.16)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start': specifier: ^1.159.5 - version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: ^1.159.5 - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@trpc/client': specifier: ^11.10.0 version: 11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3) @@ -620,7 +620,7 @@ importers: version: 11.10.0(typescript@5.9.3) better-auth: specifier: ^1.4.18 - version: 1.4.18(b4f55ef685357933f61fbe0b4095cc16) + version: 1.4.18(@tanstack/react-start@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(better-sqlite3@12.8.0)(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@op-engineering/op-sqlite@15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.8.0)(expo-sqlite@55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(kysely@0.28.11)(pg@8.20.0)(postgres@3.4.8)(sql.js@1.14.1))(mongodb@6.21.0(socks@2.8.7))(pg@8.20.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(svelte@5.50.0)(vitest@3.2.4)(vue@3.5.28(typescript@5.9.3)) dotenv: specifier: ^17.2.4 version: 17.2.4 @@ -644,17 +644,17 @@ importers: version: 4.1.18 vite: specifier: ^7.3.0 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@eslint/compat': specifier: ^1.4.1 - version: 1.4.1(eslint@9.39.4(jiti@2.6.1)) + version: 1.4.1(eslint@9.39.4(jiti@2.7.0)) '@eslint/js': specifier: ^9.39.2 version: 9.39.4 @@ -675,13 +675,13 @@ importers: version: 19.2.3(@types/react@19.2.13) '@typescript-eslint/eslint-plugin': specifier: ^8.55.0 - version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.55.0 - version: 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -690,16 +690,16 @@ importers: version: 0.31.9 eslint: specifier: ^9.39.2 - version: 9.39.4(jiti@2.6.1) + version: 9.39.4(jiti@2.7.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.39.4(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-prettier: specifier: ^5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.1) + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(prettier@3.8.1) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.4(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.4(jiti@2.7.0)) globals: specifier: ^16.5.0 version: 16.5.0 @@ -717,7 +717,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) web-vitals: specifier: ^5.1.0 version: 5.1.0 @@ -741,7 +741,7 @@ importers: version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start': specifier: ^1.159.5 - version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@tanstack/trailbase-db-collection': specifier: ^0.1.98 version: link:../../../packages/trailbase-db-collection @@ -774,7 +774,7 @@ importers: version: 0.10.0 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) zod: specifier: ^4.3.6 version: 4.3.6 @@ -784,7 +784,7 @@ importers: version: 9.39.4 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@types/cors': specifier: ^2.8.19 version: 2.8.19 @@ -805,13 +805,13 @@ importers: version: 19.2.3(@types/react@19.2.13) '@typescript-eslint/eslint-plugin': specifier: ^8.55.0 - version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.55.0 - version: 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -823,13 +823,13 @@ importers: version: 0.31.9 eslint: specifier: ^9.39.2 - version: 9.39.4(jiti@2.6.1) + version: 9.39.4(jiti@2.7.0) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.39.4(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react-refresh: specifier: ^0.4.26 - version: 0.4.26(eslint@9.39.4(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.4(jiti@2.7.0)) pg: specifier: ^8.20.0 version: 8.20.0 @@ -841,10 +841,13 @@ importers: version: 5.9.3 vite: specifier: ^7.3.0 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) examples/solid/todo: dependencies: + '@solidjs/web': + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/electric-db-collection': specifier: ^0.3.18 version: link:../../../packages/electric-db-collection @@ -858,11 +861,11 @@ importers: specifier: ^0.2.34 version: link:../../../packages/solid-db '@tanstack/solid-router': - specifier: ^1.159.5 - version: 1.159.5(solid-js@1.9.11) + specifier: ^2.0.0-beta.30 + version: 2.0.0-beta.30(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-start': - specifier: ^1.159.5 - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + specifier: ^2.0.0-beta.31 + version: 2.0.0-beta.31(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(esbuild@0.27.7)(rollup@4.52.5)(solid-js@2.0.0-rc.0)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@tanstack/trailbase-db-collection': specifier: ^0.1.98 version: link:../../../packages/trailbase-db-collection @@ -874,7 +877,7 @@ importers: version: 0.45.1(@op-engineering/op-sqlite@15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.8.0)(expo-sqlite@55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(kysely@0.28.11)(pg@8.20.0)(postgres@3.4.8)(sql.js@1.14.1) drizzle-zod: specifier: ^0.8.3 - version: 0.8.3(drizzle-orm@0.45.1(@op-engineering/op-sqlite@15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.8.0)(expo-sqlite@55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(kysely@0.28.11)(pg@8.20.0)(postgres@3.4.8)(sql.js@1.14.1))(zod@4.3.6) + version: 0.8.3(drizzle-orm@0.45.1(@op-engineering/op-sqlite@15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.8.0)(expo-sqlite@55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(kysely@0.28.11)(pg@8.20.0)(postgres@3.4.8)(sql.js@1.14.1))(zod@4.4.3) express: specifier: ^5.2.1 version: 5.2.1 @@ -882,8 +885,8 @@ importers: specifier: ^3.4.8 version: 3.4.8 solid-js: - specifier: ^1.9.11 - version: 1.9.11 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -892,14 +895,14 @@ importers: version: 0.10.0 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) devDependencies: '@eslint/js': specifier: ^9.39.2 version: 9.39.4 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@types/cors': specifier: ^2.8.19 version: 2.8.19 @@ -914,10 +917,10 @@ importers: version: 8.16.0 '@typescript-eslint/eslint-plugin': specifier: ^8.55.0 - version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.55.0 - version: 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -929,10 +932,10 @@ importers: version: 0.31.9 eslint: specifier: ^9.39.2 - version: 9.39.4(jiti@2.6.1) + version: 9.39.4(jiti@2.7.0) eslint-plugin-solid: specifier: ^0.14.5 - version: 0.14.5(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 0.14.5(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) pg: specifier: ^8.20.0 version: 8.20.0 @@ -944,10 +947,10 @@ importers: version: 5.9.3 vite: specifier: ^7.3.0 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vite-plugin-solid: - specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) packages/angular-db: dependencies: @@ -1056,7 +1059,7 @@ importers: version: 5.9.3 vite: specifier: ^7.3.1 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/cloudflare-durable-objects-db-sqlite-persistence: dependencies: @@ -1097,7 +1100,7 @@ importers: devDependencies: '@tanstack/config': specifier: ^0.22.2 - version: 0.22.2(@types/node@25.2.2)(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 0.22.2(@types/node@25.2.2)(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -1140,10 +1143,10 @@ importers: version: 5.9.3 vite: specifier: ^7.3.0 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/db-collections: {} @@ -1308,7 +1311,7 @@ importers: version: 25.2.2 eslint: specifier: ^9.39.2 - version: 9.39.4(jiti@2.6.1) + version: 9.39.4(jiti@2.7.0) react-native: specifier: 0.79.6 version: 0.79.6(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4) @@ -1317,7 +1320,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/powersync-db-collection: dependencies: @@ -1465,8 +1468,8 @@ importers: packages/solid-db: dependencies: '@solid-primitives/map': - specifier: ^0.7.2 - version: 0.7.2(solid-js@1.9.11) + specifier: ^1.0.0-next.2 + version: 1.0.0-next.2(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/db': specifier: workspace:* version: link:../db @@ -1475,8 +1478,11 @@ importers: specifier: ^1.5.15 version: 1.5.15 '@solidjs/testing-library': - specifier: ^0.8.10 - version: 0.8.10(solid-js@1.9.11) + specifier: ^1.0.0-beta.2 + version: 1.0.0-beta.2(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@solidjs/web': + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -1484,14 +1490,14 @@ importers: specifier: ^27.4.0 version: 27.4.0 solid-js: - specifier: ^1.9.11 - version: 1.9.11 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vite-plugin-solid: - specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/svelte-db: dependencies: @@ -1504,7 +1510,7 @@ importers: version: 2.5.7(svelte@5.50.0)(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.4 - version: 6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -1566,7 +1572,7 @@ importers: version: 5.9.3 vite: specifier: ^7.3.1 - version: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/trailbase-db-collection: dependencies: @@ -1610,7 +1616,7 @@ importers: version: 1.5.15 '@vitejs/plugin-vue': specifier: ^6.0.4 - version: 6.0.4(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vue@3.5.28(typescript@5.9.3)) + version: 6.0.4(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vue@3.5.28(typescript@5.9.3)) '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -2561,6 +2567,45 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} + '@dom-expressions/babel-plugin-jsx@0.50.0-next.42': + resolution: {integrity: sha512-ol24x9RW8loPyOTzC/mQzh/zAsrsPxyTG4WRxxRlwzNK2uBWIBftWN5IwmSV51zDQa7JcT6sE6kkXFCLUvsYIQ==} + peerDependencies: + '@babel/core': ^7.20.12 + + '@dom-expressions/compiler-darwin-arm64@0.50.0-next.40': + resolution: {integrity: sha512-+3aXdhw4SVt08fvgAsEM56ky/wdCVPXT0Wtxo164Cchgg7sapPsRqo8Gwwn0UU5AhVcEp3CIhdB5+pMoUicKFg==} + cpu: [arm64] + os: [darwin] + + '@dom-expressions/compiler-darwin-x64@0.50.0-next.40': + resolution: {integrity: sha512-Tbjg6ZQEIhKLKGd/Ep6MKqD76arPdV6SE2d3fkrP4qooIv2gYvAkvUw90qNdZxVHcuyjutrbJE0WpXYY9nSIIQ==} + cpu: [x64] + os: [darwin] + + '@dom-expressions/compiler-linux-arm64-gnu@0.50.0-next.40': + resolution: {integrity: sha512-tIJMY8dPyjiYNSL5uc4JA5l88Sw0WoMwoAilqTTHpGYdCL5GwzGq6ZOV1bndw8XKEYFYfnTr276FDHyYpLtRYQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@dom-expressions/compiler-linux-x64-gnu@0.50.0-next.40': + resolution: {integrity: sha512-H/K/3Ykk8aCSNuKDlv/sgbPdSks+zqFxZ4mzqaGJmlDqEfeaWYXan5fsvwQbACdNDJeKoKLO4GhnlnKlKWjiJg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@dom-expressions/compiler-wasm32-wasi@0.50.0-next.40': + resolution: {integrity: sha512-2SAfc35FEvvxkUz2yeh/4aNx0s9waZnce4KS64oUMlVpYEFtNBdfnZKCB/bgzJFvTxXjMs+HcU6OInGltH5jHA==} + engines: {node: '>=14.0.0'} + + '@dom-expressions/compiler-win32-x64-msvc@0.50.0-next.40': + resolution: {integrity: sha512-bBdHMxdfUHtIrS5xrt9udqdGRnGKdYQgKxJNIts+Il3Fs8QGyNwaZpi0tjnlRjYa0+GdWEC3Gw1Pmq/HFXzFeQ==} + cpu: [x64] + os: [win32] + + '@dom-expressions/compiler@0.50.0-next.40': + resolution: {integrity: sha512-RI/kHU+QkLOHo4CQyqLTn9c7sAfl/GEULMsOpS1YqkPJgy7R8MCPWXFN4sI0QDBbM6ePtEyuW+2bsdsXqyxkzQ==} + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} @@ -2583,15 +2628,24 @@ packages: engines: {node: '>=12.13.0'} hasBin: true + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} + '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} deprecated: 'Merged into tsx: https://tsx.is' @@ -4524,6 +4578,13 @@ packages: '@napi-rs/wasm-runtime@1.1.0': resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + '@napi-rs/wasm-runtime@1.2.3': + resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + '@noble/ciphers@2.1.1': resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==} engines: {node: '>= 20.19.0'} @@ -5490,10 +5551,11 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/map@0.7.2': - resolution: {integrity: sha512-sXK/rS68B4oq3XXNyLrzVhLtT1pnimmMUahd2FqhtYUuyQsCfnW058ptO1s+lWc2k8F/3zQSNVkZ2ifJjlcNbQ==} + '@solid-primitives/map@1.0.0-next.2': + resolution: {integrity: sha512-9TipViAZvtT9sNCJuriC7SbKTDA9THKseAxeGWmtvEcWEupwdCTsb/mA8qoobmo+rTgkkhYLyc2N+jHGH4KykQ==} peerDependencies: - solid-js: ^1.6.12 + '@solidjs/web': ^2.0.0-rc.0 + solid-js: ^2.0.0-rc.0 '@solid-primitives/media@2.3.3': resolution: {integrity: sha512-hQ4hLOGvfbugQi5Eu1BFWAIJGIAzztq9x0h02xgBGl2l0Jaa3h7tg6bz5tV1NSuNYVGio4rPoa7zVQQLkkx9dA==} @@ -5530,31 +5592,54 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/trigger@1.2.2': - resolution: {integrity: sha512-IWoptVc0SWYgmpBPpCMehS5b07+tpFcvw15tOQ3QbXedSYn6KP8zCjPkHNzMxcOvOicTneleeZDP7lqmz+PQ6g==} + '@solid-primitives/trigger@3.0.0-next.2': + resolution: {integrity: sha512-YhTGBKEPP7XI7Bk6/2gWxfZmwMWQEwfZsTiMO2dt9X/AQ9bmLk+xuRbT2QDOPg2IBe0D3uh/uguHUMYOLYGpbQ==} peerDependencies: - solid-js: ^1.6.12 + '@solidjs/web': ^2.0.0-rc.0 + solid-js: ^2.0.0-rc.0 '@solid-primitives/utils@6.3.2': resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} peerDependencies: solid-js: ^1.6.12 + '@solid-primitives/utils@7.0.0-next.4': + resolution: {integrity: sha512-9KyRe6eu4hdhxxGOyS9vAa2s/T8FZ1sMJtk3UuV3W1Gi0f4if+o1n7S1M6l/MMjn8+m3+I3VB1KzFa9gNDkDsg==} + peerDependencies: + '@solidjs/web': ^2.0.0-rc.0 + solid-js: ^2.0.0-rc.0 + '@solidjs/meta@0.29.4': resolution: {integrity: sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g==} peerDependencies: solid-js: '>=1.8.4' - '@solidjs/testing-library@0.8.10': - resolution: {integrity: sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==} + '@solidjs/signals@2.0.0-rc.0': + resolution: {integrity: sha512-oKZSfvsCcKw1uJjOGbUkJ+OqlhXLHtZ+rShSyu9KH0lUH7UUwfMfsKeh81JPiQxDDg4YLhEwI38hg0JkwzTdvA==} + + '@solidjs/testing-library@1.0.0-beta.2': + resolution: {integrity: sha512-TLhQ5IUT/fdDfqa4X2rkQWB28Y+zEwi6mK/TVTeiQlEHG63eK2jfgwNYf2NtQoPh2c3ihLilsCzxABiSTP3JoQ==} engines: {node: '>= 14'} peerDependencies: - '@solidjs/router': '>=0.9.0' - solid-js: '>=1.0.0' + '@solidjs/web': '>=2.0.0' + solid-js: '>=2.0.0' + + '@solidjs/vite-plugin@3.0.0-next.27': + resolution: {integrity: sha512-wytjSKLe1YkUhi/TXr1yNOxZUjoajn3SILCF6TCHk7QJckrNRxddnsIIuzVbPbCm1icpkow75iIuF7EENBB7fQ==} + peerDependencies: + '@solidjs/web': '>=2.0.0-beta.32 <2.0.0-experimental.0' + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: '>=2.0.0-beta.32 <2.0.0-experimental.0' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: - '@solidjs/router': + '@testing-library/jest-dom': optional: true + '@solidjs/web@2.0.0-rc.0': + resolution: {integrity: sha512-pYSaA9+dH8H1h/d/ZF/P2kR6omfzFGNcdzKhWTcg9fJghXhn8+5UrXUr2iYxDdYNOXZzxxFQhYHSJ7P4HKDqgw==} + peerDependencies: + solid-js: ^2.0.0-rc.0 + '@speed-highlight/core@1.2.15': resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} @@ -5723,6 +5808,10 @@ packages: resolution: {integrity: sha512-xyIfof8eHBuub1CkBnbKNKQXeRZC4dClhmzePHVOEel4G7lk/dW+TQ16da7CFdeNLv6u6Owf5VoBQxoo6DFTSA==} engines: {node: '>=12'} + '@tanstack/history@1.162.0': + resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==} + engines: {node: '>=20.19'} + '@tanstack/pacer-lite@0.2.1': resolution: {integrity: sha512-3PouiFjR4B6x1c969/Pl4ZIJleof1M0n6fNX8NRiC9Sqv1g06CVDlEaXUR4212ycGFyfq4q+t8Gi37Xy+z34iQ==} engines: {node: '>=18'} @@ -5800,6 +5889,10 @@ packages: resolution: {integrity: sha512-MFzPH39ijNO83qJN3pe7x4iAlhZyqgao3sJIzv3SJ4Pnk12xMnzuDzIAQT/1WV6JolPQEcw0Wr4L5agF8yxoeg==} engines: {node: '>=12'} + '@tanstack/router-core@1.171.16': + resolution: {integrity: sha512-/qwawP5a45puA9DQtG8syrChWCV7uGMYs1p5rwgrICgiS/0pHo7zNOFyfVI02J1azWhCfFc6w6+SuiivPESYAA==} + engines: {node: '>=20.19'} + '@tanstack/router-devtools-core@1.159.4': resolution: {integrity: sha512-qMUeIv+6n1mZOcO2raCIbdOeDeMpJEmgm6oMs/nWEG61lYrzJYaCcpBTviAX0nRhSiQSUCX9cHiosUEA0e2HAw==} engines: {node: '>=12'} @@ -5814,6 +5907,10 @@ packages: resolution: {integrity: sha512-O8tICQoSuvK6vs3mvBdI3zVLFmYfj/AYDCX0a5msSADP/2S0GsgDDTB5ah731TqYCtjeNriaWz9iqst38cjF/Q==} engines: {node: '>=12'} + '@tanstack/router-generator@1.167.22': + resolution: {integrity: sha512-tiKrH6xuCdTfmm4UuHSpLsZ5q2pwmhNbGpExp5u/CCRObjQM5nxz8Dce/X3w86ST6VSZFQMBNjLcsUMnVlJw/Q==} + engines: {node: '>=20.19'} + '@tanstack/router-plugin@1.159.5': resolution: {integrity: sha512-i2LR3WRaBOAZ1Uab5QBG9UxZIRJ3V56JVu890NysbuX15rgzRiL5yLAbfenOHdhaHy2+4joX35VICAHuVWy7Og==} engines: {node: '>=12'} @@ -5835,62 +5932,120 @@ packages: webpack: optional: true + '@tanstack/router-plugin@1.168.24': + resolution: {integrity: sha512-FfPW45gfZHDC25AHo4MJB3ZljXEKFJenEgIDTELwnI6FtS90vXTQXjOjdTVNs/7B4R8+wLf7nWVrPSvBMp7zWw==} + engines: {node: '>=20.19'} + peerDependencies: + '@rsbuild/core': '>=1.0.2 || ^2.0.0' + '@tanstack/react-router': ^1.170.19 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' + vite-plugin-solid: ^2.11.10 || ^3.0.0-0 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + '@tanstack/router-utils@1.158.0': resolution: {integrity: sha512-qZ76eaLKU6Ae9iI/mc5zizBX149DXXZkBVVO3/QRIll79uKLJZHQlMKR++2ba7JsciBWz1pgpIBcCJPE9S0LVg==} engines: {node: '>=12'} - '@tanstack/solid-router@1.159.5': - resolution: {integrity: sha512-gmqVm9HBmhFzzkOZ9yy89vY+/p84V4j3k8OsBoaJmhBYPcAxVxWt8PAdRRIefXg/a5FRZEjyxCh01bCkESHNXw==} - engines: {node: '>=12'} + '@tanstack/router-utils@1.162.2': + resolution: {integrity: sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ==} + engines: {node: '>=20.19'} + + '@tanstack/solid-router@2.0.0-beta.30': + resolution: {integrity: sha512-GWnXJuIw8uLA5tIwuyi655hhkI2PHb8yK7DBEeBc/GSpRWvPt61FqCRjy4vZuvkyRx4+onlaUjtdLCBZROTMSg==} + engines: {node: '>=20.19'} peerDependencies: - solid-js: ^1.9.10 + '@solidjs/web': '>=2.0.0-0 <3.0.0' + solid-js: '>=2.0.0-0 <3.0.0' - '@tanstack/solid-start-client@1.159.5': - resolution: {integrity: sha512-nGsdAt0UulyHzXnQw0PjSPipQqz1CTtD0uoie9FGOIbGDANYp14ybpNiyXIJpd13fc5OI2AmAmqiBGZF0EyCtw==} + '@tanstack/solid-start-client@2.0.0-beta.30': + resolution: {integrity: sha512-dParRxlWZH5i6vPhf9BohfWPmANqZYzQb1uAzLBcYJV4nX0zb8QRwzThXwrc6iSE80mN4rErA5jbXJt6xXDPHg==} engines: {node: '>=22.12.0'} peerDependencies: - solid-js: '>=1.0.0' + '@solidjs/web': '>=2.0.0-0 <3.0.0' + solid-js: '>=2.0.0-0 <3.0.0' - '@tanstack/solid-start-server@1.159.5': - resolution: {integrity: sha512-Li2bw+2kSqUD0x+zlbDa8pweQRtk3FWlMCEqp3orZ3F6vwisezNO2iGX08/kibs2LUEdIquCXtNhyesfL8QNPA==} + '@tanstack/solid-start-server@2.0.0-beta.30': + resolution: {integrity: sha512-EEeys8J4Gq6/xO6hv6+Kw1Uphh0V5fI2+gP+CzyAGY/AchLNsfwAGNkl40mz/QUgCIcqvFONo0aLAYBQJeubGQ==} engines: {node: '>=22.12.0'} peerDependencies: - solid-js: ^1.0.0 + '@solidjs/web': '>=2.0.0-0 <3.0.0' + solid-js: '>=2.0.0-0 <3.0.0' - '@tanstack/solid-start@1.159.5': - resolution: {integrity: sha512-3xwEs+urtM68V+amUVwayN6ygMH8TtYaPyztjG9QMBRxFNBmLWH2vHnmkgh1GdJldI700tyiJNfQVEATeQVawg==} + '@tanstack/solid-start@2.0.0-beta.31': + resolution: {integrity: sha512-b7DSxnhRzcBuADd+8OrXXuy+slYKbmEPAtbnsYNdotq7ywNSc7+PmbfIsf32vD1B/6QZUm6/x4G1CosxfgVnBA==} engines: {node: '>=22.12.0'} peerDependencies: - solid-js: '>=1.0.0' + '@rsbuild/core': ^2.0.0 + '@solidjs/web': '>=2.0.0-0 <3.0.0' + solid-js: '>=2.0.0-0 <3.0.0' vite: '>=7.0.0' - - '@tanstack/solid-store@0.8.0': - resolution: {integrity: sha512-JwqTedbxyOGw7mfmdGkB0RGgefRCw/tNauc8tlMcaS1mV5wTFT8c1KIB3LgttuHaanMJEBeqQJ7bc/R0WTP1fA==} - peerDependencies: - solid-js: ^1.6.0 + peerDependenciesMeta: + '@rsbuild/core': + optional: true + vite: + optional: true '@tanstack/start-client-core@1.159.4': resolution: {integrity: sha512-9j2i1PRTIGcYAD+509znve0ngK81ZUfbX4XCpoNFMaUUpRHoEPPK5I9+PzLFvL9sNOto67x+WULCUggzX+lEKQ==} engines: {node: '>=22.12.0'} + '@tanstack/start-client-core@1.170.15': + resolution: {integrity: sha512-jzQ19jYFHcFeGADbZul6jNALP3ihTraKDkAnPzDIFyOKf/8B8py5qOi8pAl+0QlCBEXmxGw+5u+IU2bCr3SI5Q==} + engines: {node: '>=22.12.0'} + '@tanstack/start-fn-stubs@1.154.7': resolution: {integrity: sha512-D69B78L6pcFN5X5PHaydv7CScQcKLzJeEYqs7jpuyyqGQHSUIZUjS955j+Sir8cHhuDIovCe2LmsYHeZfWf3dQ==} engines: {node: '>=22.12.0'} + '@tanstack/start-fn-stubs@1.162.0': + resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} + engines: {node: '>=22.12.0'} + '@tanstack/start-plugin-core@1.159.5': resolution: {integrity: sha512-QGiBw+L3qu2sUY0Tg9KovxjDSi5kevoANEcq9RLX7iIhLkTjrILN6hnAlXZUzqk5Egaf0aN2yWhwI4HWucMprw==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' + '@tanstack/start-plugin-core@1.171.27': + resolution: {integrity: sha512-VV9vUJ4qUYotWj6VqaUh1g6wTpijDWijHuMNymQKC3uAJQ/EVWJir+Jp/XhhSFtlmOeZXmCTLgwKdJwUzJtTxg==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@rsbuild/core': ^2.0.0 + vite: '>=7.0.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + vite: + optional: true + '@tanstack/start-server-core@1.159.4': resolution: {integrity: sha512-sGpr+iil+pcY3Gglvbnxaj7fCEPTQJv4oF7YA24SVv8YvayLXtBXpF26miJLA+KR9P31dQdPYe1gTjv5zRyvHg==} engines: {node: '>=22.12.0'} + '@tanstack/start-server-core@1.169.19': + resolution: {integrity: sha512-q+RE1YI9SGckFOINW2RE/z1KmuXKrUnUWf/xQUWVYN0xXqZNxQvWrNEhoV2Fr+1TT6Fp0hy8oP1yTrNoteNg6Q==} + engines: {node: '>=22.12.0'} + '@tanstack/start-storage-context@1.159.4': resolution: {integrity: sha512-iGkmuCIq3PLI4GKOGwgUNHQKZ13YV8LGq62o2hVnyXE64Jm2SP7c5z6D1ndydpk4JwdRzQKlcOFT/1agvS6Nsg==} engines: {node: '>=22.12.0'} + '@tanstack/start-storage-context@1.167.18': + resolution: {integrity: sha512-Hpr/yvwYKIcXlfUt7MZ8mBHt9f2VNEXYwZXq9bIJVUvYhKcF/zzdMnc8UStTyRAynkgK/rZ36UvK9RrX4dcjeg==} + engines: {node: '>=22.12.0'} + '@tanstack/store@0.8.0': resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} @@ -5909,6 +6064,10 @@ packages: resolution: {integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg==} engines: {node: '>=12'} + '@tanstack/virtual-file-routes@1.162.0': + resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} + engines: {node: '>=20.19'} + '@tanstack/vite-config@0.4.1': resolution: {integrity: sha512-FOl8EF6SAcljanKSm5aBeJaflFcxQAytTbxtNW8HC6D4x+UBW68IC4tBcrlrsI0wXHBmC/Gz4Ovvv8qCtiXSgQ==} engines: {node: '>=18'} @@ -6050,6 +6209,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -6840,11 +7002,6 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-plugin-jsx-dom-expressions@0.40.1: - resolution: {integrity: sha512-b4iHuirqK7RgaMzB2Lsl7MqrlDgQtVRSSazyrmx7wB3T759ggGjod5Rkok5MfHjQXhR7tRPmdwoeGPqBnW2KfA==} - peerDependencies: - '@babel/core': ^7.20.12 - babel-plugin-polyfill-corejs2@0.4.15: resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} peerDependencies: @@ -6915,11 +7072,11 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babel-preset-solid@1.9.9: - resolution: {integrity: sha512-pCnxWrciluXCeli/dj5PIEHgbNzim3evtTn12snjqqg8QZWJNMjH1AWIp4iG/tbVjqQ72aBEymMSagvmgxubXw==} + babel-preset-solid@2.0.0-beta.34: + resolution: {integrity: sha512-r06URXFAiHtT9dIKG4sF2mgqxh6rpd6KOYtPNX4HFxC5nZLsNSybLZcuZ30cONUl//n/Tav6IzZQiSwxqCkLfg==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^1.9.8 + solid-js: ^2.0.0-beta.34 peerDependenciesMeta: solid-js: optional: true @@ -7425,6 +7582,9 @@ packages: cookie-es@2.0.0: resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -8456,6 +8616,9 @@ packages: fetch-nodeshim@0.4.9: resolution: {integrity: sha512-XIQWlB2A4RZ7NebXWGxS0uDMdvRHkiUDTghBVJKFg9yEOd45w/PP8cZANuPf2H08W6Cor3+2n7Q6TTZgAS3Fkw==} + fetchdts@0.1.7: + resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -8763,6 +8926,16 @@ packages: crossws: optional: true + h3@2.0.1-rc.20: + resolution: {integrity: sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -9359,6 +9532,10 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} @@ -9552,6 +9729,12 @@ packages: cpu: [arm64] os: [android] + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.27.0: resolution: {integrity: sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==} engines: {node: '>= 12.0.0'} @@ -9564,6 +9747,12 @@ packages: cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.27.0: resolution: {integrity: sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==} engines: {node: '>= 12.0.0'} @@ -9576,6 +9765,12 @@ packages: cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.27.0: resolution: {integrity: sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==} engines: {node: '>= 12.0.0'} @@ -9588,6 +9783,12 @@ packages: cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.27.0: resolution: {integrity: sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==} engines: {node: '>= 12.0.0'} @@ -9600,6 +9801,12 @@ packages: cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.27.0: resolution: {integrity: sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==} engines: {node: '>= 12.0.0'} @@ -9614,6 +9821,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + lightningcss-linux-arm64-musl@1.27.0: resolution: {integrity: sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==} engines: {node: '>= 12.0.0'} @@ -9628,6 +9842,13 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + lightningcss-linux-x64-gnu@1.27.0: resolution: {integrity: sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==} engines: {node: '>= 12.0.0'} @@ -9642,6 +9863,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + lightningcss-linux-x64-musl@1.27.0: resolution: {integrity: sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==} engines: {node: '>= 12.0.0'} @@ -9656,6 +9884,13 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + lightningcss-win32-arm64-msvc@1.27.0: resolution: {integrity: sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==} engines: {node: '>= 12.0.0'} @@ -9668,6 +9903,12 @@ packages: cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.27.0: resolution: {integrity: sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==} engines: {node: '>= 12.0.0'} @@ -9680,6 +9921,12 @@ packages: cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.27.0: resolution: {integrity: sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==} engines: {node: '>= 12.0.0'} @@ -9688,6 +9935,10 @@ packages: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -11194,6 +11445,9 @@ packages: rou3@0.7.12: resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} + rou3@0.8.1: + resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -11314,10 +11568,20 @@ packages: peerDependencies: seroval: ^1.0 + seroval-plugins@1.5.6: + resolution: {integrity: sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + seroval@1.5.0: resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} engines: {node: '>=10'} + seroval@1.5.6: + resolution: {integrity: sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA==} + engines: {node: '>=10'} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -11541,13 +11805,8 @@ packages: resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - solid-js@1.9.11: - resolution: {integrity: sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==} - - solid-refresh@0.6.3: - resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} - peerDependencies: - solid-js: ^1.3 + solid-js@2.0.0-rc.0: + resolution: {integrity: sha512-3enTJ71VL69nM5p/it2InVBDBt316Cqfij+F0S7VuHZLITc8YV7Rvavjoy52nAKKxYWXM+BcXh2K7KcLTf1zdQ==} sorted-btree@1.8.1: resolution: {integrity: sha512-395+XIP+wqNn3USkFSrNz7G3Ss/MXlZEqesxvzCRFwL14h6e8LukDHdLBePn5pwbm5OQ9vGu8mDyz2lLDIqamQ==} @@ -12186,6 +12445,39 @@ packages: resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} engines: {node: '>=18.12.0'} + unplugin@3.3.0: + resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true + unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} @@ -12277,15 +12569,8 @@ packages: peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - vite-plugin-solid@2.11.10: - resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} - peerDependencies: - '@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 - peerDependenciesMeta: - '@testing-library/jest-dom': - optional: true + vite-plugin-solid@3.0.0-next.27: + resolution: {integrity: sha512-bDzjIIplkSDH73BiGP9pbPR3ZnjeUA18SAYugLhqDCy4u0bl3qdrETstxrXuo2vHXLB0VD9rvOr0iesZBBul4Q==} vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} @@ -12794,6 +13079,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zone.js@0.15.1: resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==} @@ -12926,7 +13214,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular/build@20.3.16(@angular/compiler-cli@20.3.16(@angular/compiler@20.3.16)(typescript@5.9.3))(@angular/compiler@20.3.16)(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.16(@angular/common@20.3.16(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@25.2.2)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(lightningcss@1.30.2)(postcss@8.5.10)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.21.0)(typescript@5.9.3)(vitest@3.2.4)(yaml@2.8.1)': + '@angular/build@20.3.16(@angular/compiler-cli@20.3.16(@angular/compiler@20.3.16)(typescript@5.9.3))(@angular/compiler@20.3.16)(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.16(@angular/common@20.3.16(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@25.2.2)(chokidar@4.0.3)(jiti@2.7.0)(karma@6.4.4)(lightningcss@1.33.0)(postcss@8.5.10)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.21.0)(typescript@5.9.3)(vitest@3.2.4)(yaml@2.8.1)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2003.16(chokidar@4.0.3) @@ -12936,7 +13224,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.14(@types/node@25.2.2) - '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.11(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.11(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) beasties: 0.3.5 browserslist: 4.28.1 esbuild: 0.25.9 @@ -12956,7 +13244,7 @@ snapshots: tinyglobby: 0.2.14 tslib: 2.8.1 typescript: 5.9.3 - vite: 7.1.11(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) watchpack: 2.4.4 optionalDependencies: '@angular/core': 20.3.17(@angular/compiler@20.3.16)(rxjs@7.8.2)(zone.js@0.15.1) @@ -12965,7 +13253,7 @@ snapshots: lmdb: 3.4.2 postcss: 8.5.10 tailwindcss: 4.1.18 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - chokidar @@ -14014,6 +14302,47 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} + '@dom-expressions/babel-plugin-jsx@0.50.0-next.42(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/types': 7.29.0 + html-entities: 2.3.3 + parse5: 7.3.0 + validate-html-nesting: 1.2.3 + + '@dom-expressions/compiler-darwin-arm64@0.50.0-next.40': + optional: true + + '@dom-expressions/compiler-darwin-x64@0.50.0-next.40': + optional: true + + '@dom-expressions/compiler-linux-arm64-gnu@0.50.0-next.40': + optional: true + + '@dom-expressions/compiler-linux-x64-gnu@0.50.0-next.40': + optional: true + + '@dom-expressions/compiler-wasm32-wasi@0.50.0-next.40': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@dom-expressions/compiler-win32-x64-msvc@0.50.0-next.40': + optional: true + + '@dom-expressions/compiler@0.50.0-next.40': + optionalDependencies: + '@dom-expressions/compiler-darwin-arm64': 0.50.0-next.40 + '@dom-expressions/compiler-darwin-x64': 0.50.0-next.40 + '@dom-expressions/compiler-linux-arm64-gnu': 0.50.0-next.40 + '@dom-expressions/compiler-linux-x64-gnu': 0.50.0-next.40 + '@dom-expressions/compiler-wasm32-wasi': 0.50.0-next.40 + '@dom-expressions/compiler-win32-x64-msvc': 0.50.0-next.40 + '@drizzle-team/brocli@0.10.2': {} '@electric-sql/client@1.5.15': @@ -14072,12 +14401,23 @@ snapshots: - bluebird - supports-color + '@emnapi/core@1.11.2': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.7.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 @@ -14088,6 +14428,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 @@ -14476,18 +14821,18 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@1.4.1(eslint@9.39.4(jiti@2.6.1))': + '@eslint/compat@1.4.1(eslint@9.39.4(jiti@2.7.0))': dependencies: '@eslint/core': 0.17.0 optionalDependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) '@eslint/config-array@0.21.2': dependencies: @@ -15214,7 +15559,7 @@ snapshots: '@fast-check/vitest@0.2.4(vitest@3.2.4)': dependencies: fast-check: 3.23.2 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@firebase/ai@1.4.1(@firebase/app-types@0.9.3)(@firebase/app@0.13.2)': dependencies: @@ -16224,6 +16569,13 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 + optional: true + '@noble/ciphers@2.1.1': {} '@noble/hashes@2.0.1': {} @@ -17308,123 +17660,156 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} - '@solid-devtools/debugger@0.28.1(solid-js@1.9.11)': + '@solid-devtools/debugger@0.28.1(solid-js@2.0.0-rc.0)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/shared': 0.20.0(solid-js@1.9.11) - '@solid-primitives/bounds': 0.1.3(solid-js@1.9.11) - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.11) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/scheduled': 1.5.2(solid-js@1.9.11) - '@solid-primitives/static-store': 0.1.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 - - '@solid-devtools/logger@0.9.11(solid-js@1.9.11)': + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-rc.0) + '@solid-primitives/bounds': 0.1.3(solid-js@2.0.0-rc.0) + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/keyboard': 1.3.3(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/scheduled': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 + + '@solid-devtools/logger@0.9.11(solid-js@2.0.0-rc.0)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/debugger': 0.28.1(solid-js@1.9.11) - '@solid-devtools/shared': 0.20.0(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-devtools/debugger': 0.28.1(solid-js@2.0.0-rc.0) + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-devtools/shared@0.20.0(solid-js@1.9.11)': + '@solid-devtools/shared@0.20.0(solid-js@2.0.0-rc.0)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/media': 2.3.3(solid-js@1.9.11) - '@solid-primitives/refs': 1.1.2(solid-js@1.9.11) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/scheduled': 1.5.2(solid-js@1.9.11) - '@solid-primitives/static-store': 0.1.2(solid-js@1.9.11) - '@solid-primitives/styles': 0.1.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/media': 2.3.3(solid-js@2.0.0-rc.0) + '@solid-primitives/refs': 1.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/scheduled': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/styles': 0.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 + + '@solid-primitives/bounds@0.1.3(solid-js@2.0.0-rc.0)': + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/resize-observer': 2.1.3(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/bounds@0.1.3(solid-js@1.9.11)': + '@solid-primitives/event-listener@2.4.3(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.11) - '@solid-primitives/static-store': 0.1.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/event-listener@2.4.3(solid-js@1.9.11)': + '@solid-primitives/keyboard@1.3.3(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/keyboard@1.3.3(solid-js@1.9.11)': + '@solid-primitives/map@1.0.0-next.2(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/trigger': 3.0.0-next.2(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/map@0.7.2(solid-js@1.9.11)': + '@solid-primitives/media@2.3.3(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/trigger': 1.2.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/media@2.3.3(solid-js@1.9.11)': + '@solid-primitives/refs@1.1.2(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/static-store': 0.1.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/refs@1.1.2(solid-js@1.9.11)': + '@solid-primitives/resize-observer@2.1.3(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/resize-observer@2.1.3(solid-js@1.9.11)': + '@solid-primitives/rootless@1.5.2(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/static-store': 0.1.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/rootless@1.5.2(solid-js@1.9.11)': + '@solid-primitives/scheduled@1.5.2(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + solid-js: 2.0.0-rc.0 - '@solid-primitives/scheduled@1.5.2(solid-js@1.9.11)': + '@solid-primitives/static-store@0.1.2(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 1.9.11 + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/static-store@0.1.2(solid-js@1.9.11)': + '@solid-primitives/styles@0.1.2(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/styles@0.1.2(solid-js@1.9.11)': + '@solid-primitives/trigger@3.0.0-next.2(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + '@solid-primitives/utils': 7.0.0-next.4(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/trigger@1.2.2(solid-js@1.9.11)': + '@solid-primitives/utils@6.3.2(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) - solid-js: 1.9.11 + solid-js: 2.0.0-rc.0 - '@solid-primitives/utils@6.3.2(solid-js@1.9.11)': + '@solid-primitives/utils@7.0.0-next.4(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 1.9.11 + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solidjs/meta@0.29.4(solid-js@1.9.11)': + '@solidjs/meta@0.29.4(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 1.9.11 + solid-js: 2.0.0-rc.0 + + '@solidjs/signals@2.0.0-rc.0': {} - '@solidjs/testing-library@0.8.10(solid-js@1.9.11)': + '@solidjs/testing-library@1.0.0-beta.2(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': dependencies: + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@testing-library/dom': 10.4.1 - solid-js: 1.9.11 + solid-js: 2.0.0-rc.0 + + '@solidjs/vite-plugin@3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/core': 7.29.0 + '@dom-expressions/compiler': 0.50.0-next.40 + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + '@types/babel__core': 7.20.5 + babel-preset-solid: 2.0.0-beta.34(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) + merge-anything: 5.1.7 + solid-js: 2.0.0-rc.0 + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + optionalDependencies: + '@testing-library/jest-dom': 6.9.1 + transitivePeerDependencies: + - supports-color + + '@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0)': + dependencies: + seroval: 1.5.6 + seroval-plugins: 1.5.6(seroval@1.5.6) + solid-js: 2.0.0-rc.0 '@speed-highlight/core@1.2.15': {} @@ -17441,11 +17826,11 @@ snapshots: '@rollup/rollup-win32-arm64-msvc': 4.44.0 '@rollup/rollup-win32-x64-msvc': 4.44.0 - '@stylistic/eslint-plugin@5.4.0(eslint@9.39.4(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.4.0(eslint@9.39.4(jiti@2.7.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/types': 8.55.0 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -17466,24 +17851,24 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) debug: 4.4.3 svelte: 5.50.0 - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.50.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.1 svelte: 5.50.0 - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -17567,19 +17952,19 @@ snapshots: postcss: 8.5.10 tailwindcss: 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.18(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - '@tanstack/config@0.22.2(@types/node@25.2.2)(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/config@0.22.2(@types/node@25.2.2)(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: - '@tanstack/eslint-config': 0.3.3(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@tanstack/eslint-config': 0.3.3(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@tanstack/publish-config': 0.2.2 '@tanstack/typedoc-config': 0.3.2(typescript@5.9.3) - '@tanstack/vite-config': 0.4.1(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@tanstack/vite-config': 0.4.1(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -17590,15 +17975,15 @@ snapshots: - typescript - vite - '@tanstack/eslint-config@0.3.3(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@tanstack/eslint-config@0.3.3(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint/js': 9.39.4 - '@stylistic/eslint-plugin': 5.4.0(eslint@9.39.4(jiti@2.6.1)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)) - eslint-plugin-n: 17.23.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.4.0(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-n: 17.23.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) globals: 16.5.0 - typescript-eslint: 8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - vue-eslint-parser: 10.2.0(eslint@9.39.4(jiti@2.6.1)) + typescript-eslint: 8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + vue-eslint-parser: 10.2.0(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint @@ -17606,16 +17991,16 @@ snapshots: - supports-color - typescript - '@tanstack/eslint-config@0.3.4(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@tanstack/eslint-config@0.3.4(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint/js': 9.39.4 - '@stylistic/eslint-plugin': 5.4.0(eslint@9.39.4(jiti@2.6.1)) - eslint: 9.39.4(jiti@2.6.1) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)) - eslint-plugin-n: 17.23.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.4.0(eslint@9.39.4(jiti@2.7.0)) + eslint: 9.39.4(jiti@2.7.0) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-n: 17.23.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) globals: 16.5.0 - typescript-eslint: 8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - vue-eslint-parser: 10.2.0(eslint@9.39.4(jiti@2.6.1)) + typescript-eslint: 8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + vue-eslint-parser: 10.2.0(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-node @@ -17624,6 +18009,8 @@ snapshots: '@tanstack/history@1.154.14': {} + '@tanstack/history@1.162.0': {} + '@tanstack/pacer-lite@0.2.1': {} '@tanstack/publish-config@0.2.2': @@ -17647,22 +18034,22 @@ snapshots: '@tanstack/query-core': 5.90.20 react: 19.2.4 - '@tanstack/react-router-devtools@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.159.4)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-router-devtools@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.171.16)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/router-devtools-core': 1.159.4(@tanstack/router-core@1.159.4)(csstype@3.2.3) + '@tanstack/router-devtools-core': 1.159.4(@tanstack/router-core@1.171.16)(csstype@3.2.3) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@tanstack/router-core': 1.159.4 + '@tanstack/router-core': 1.171.16 transitivePeerDependencies: - csstype - '@tanstack/react-router-with-query@1.130.17(@tanstack/react-query@5.90.20(react@19.2.4))(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.159.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-router-with-query@1.130.17(@tanstack/react-query@5.90.20(react@19.2.4))(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.171.16)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@tanstack/react-query': 5.90.20(react@19.2.4) '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/router-core': 1.159.4 + '@tanstack/router-core': 1.171.16 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -17699,19 +18086,19 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/react-start@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start-client': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start-server': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-utils': 1.158.0 '@tanstack/start-client-core': 1.159.4 - '@tanstack/start-plugin-core': 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@tanstack/start-plugin-core': 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@tanstack/start-server-core': 1.159.4 pathe: 2.0.3 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -17736,9 +18123,16 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.159.4(@tanstack/router-core@1.159.4)(csstype@3.2.3)': + '@tanstack/router-core@1.171.16': dependencies: - '@tanstack/router-core': 1.159.4 + '@tanstack/history': 1.162.0 + cookie-es: 3.1.1 + seroval: 1.5.6 + seroval-plugins: 1.5.6(seroval@1.5.6) + + '@tanstack/router-devtools-core@1.159.4(@tanstack/router-core@1.171.16)(csstype@3.2.3)': + dependencies: + '@tanstack/router-core': 1.171.16 clsx: 2.1.1 goober: 2.1.18(csstype@3.2.3) tiny-invariant: 1.3.3 @@ -17758,7 +18152,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/router-generator@1.167.22': + dependencies: + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.171.16 + '@tanstack/router-utils': 1.162.2 + '@tanstack/virtual-file-routes': 1.162.0 + jiti: 2.7.0 + magic-string: 0.30.21 + prettier: 3.8.1 + zod: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -17775,11 +18182,34 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-solid: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color + '@tanstack/router-plugin@1.168.24(esbuild@0.27.7)(rollup@4.52.5)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.171.16 + '@tanstack/router-generator': 1.167.22 + '@tanstack/router-utils': 1.162.2 + chokidar: 5.0.0 + unplugin: 3.3.0(esbuild@0.27.7)(rollup@4.52.5)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + zod: 4.4.3 + optionalDependencies: + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite-plugin-solid: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rolldown + - rollup + - supports-color + - unloader + '@tanstack/router-utils@1.158.0': dependencies: '@babel/core': 7.29.0 @@ -17794,64 +18224,75 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/solid-router@1.159.5(solid-js@1.9.11)': + '@tanstack/router-utils@1.162.2': dependencies: - '@solid-devtools/logger': 0.9.11(solid-js@1.9.11) - '@solid-primitives/refs': 1.1.2(solid-js@1.9.11) - '@solidjs/meta': 0.29.4(solid-js@1.9.11) - '@tanstack/history': 1.154.14 - '@tanstack/router-core': 1.159.4 - '@tanstack/solid-store': 0.8.0(solid-js@1.9.11) + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + ansis: 4.2.0 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.3 + pathe: 2.0.3 + tinyglobby: 0.2.16 + transitivePeerDependencies: + - supports-color + + '@tanstack/solid-router@2.0.0-beta.30(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': + dependencies: + '@solid-devtools/logger': 0.9.11(solid-js@2.0.0-rc.0) + '@solid-primitives/refs': 1.1.2(solid-js@2.0.0-rc.0) + '@solidjs/meta': 0.29.4(solid-js@2.0.0-rc.0) + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + '@tanstack/history': 1.162.0 + '@tanstack/router-core': 1.171.16 isbot: 5.1.30 - solid-js: 1.9.11 - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 + solid-js: 2.0.0-rc.0 - '@tanstack/solid-start-client@1.159.5(solid-js@1.9.11)': + '@tanstack/solid-start-client@2.0.0-beta.30(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': dependencies: - '@tanstack/router-core': 1.159.4 - '@tanstack/solid-router': 1.159.5(solid-js@1.9.11) - '@tanstack/start-client-core': 1.159.4 - solid-js: 1.9.11 - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + '@tanstack/router-core': 1.171.16 + '@tanstack/solid-router': 2.0.0-beta.30(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@tanstack/start-client-core': 1.170.15 + solid-js: 2.0.0-rc.0 - '@tanstack/solid-start-server@1.159.5(solid-js@1.9.11)': + '@tanstack/solid-start-server@2.0.0-beta.30(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': dependencies: - '@solidjs/meta': 0.29.4(solid-js@1.9.11) - '@tanstack/history': 1.154.14 - '@tanstack/router-core': 1.159.4 - '@tanstack/solid-router': 1.159.5(solid-js@1.9.11) - '@tanstack/start-client-core': 1.159.4 - '@tanstack/start-server-core': 1.159.4 - solid-js: 1.9.11 + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + '@tanstack/router-core': 1.171.16 + '@tanstack/solid-router': 2.0.0-beta.30(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@tanstack/start-server-core': 1.169.19 + solid-js: 2.0.0-rc.0 transitivePeerDependencies: - crossws - '@tanstack/solid-start@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/solid-start@2.0.0-beta.31(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(esbuild@0.27.7)(rollup@4.52.5)(solid-js@2.0.0-rc.0)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: - '@tanstack/solid-router': 1.159.5(solid-js@1.9.11) - '@tanstack/solid-start-client': 1.159.5(solid-js@1.9.11) - '@tanstack/solid-start-server': 1.159.5(solid-js@1.9.11) - '@tanstack/start-client-core': 1.159.4 - '@tanstack/start-plugin-core': 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.159.4 + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + '@tanstack/solid-router': 2.0.0-beta.30(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@tanstack/solid-start-client': 2.0.0-beta.30(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@tanstack/solid-start-server': 2.0.0-beta.30(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@tanstack/start-client-core': 1.170.15 + '@tanstack/start-plugin-core': 1.171.27(esbuild@0.27.7)(rollup@4.52.5)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.169.19 pathe: 2.0.3 - solid-js: 1.9.11 - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + solid-js: 2.0.0-rc.0 + optionalDependencies: + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - - '@rsbuild/core' + - '@farmfe/core' + - '@rspack/core' - '@tanstack/react-router' + - bun-types-no-globals - crossws + - esbuild + - rolldown + - rollup - supports-color + - unloader - vite-plugin-solid - webpack - '@tanstack/solid-store@0.8.0(solid-js@1.9.11)': - dependencies: - '@tanstack/store': 0.8.0 - solid-js: 1.9.11 - '@tanstack/start-client-core@1.159.4': dependencies: '@tanstack/router-core': 1.159.4 @@ -17861,9 +18302,18 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 + '@tanstack/start-client-core@1.170.15': + dependencies: + '@tanstack/router-core': 1.171.16 + '@tanstack/start-fn-stubs': 1.162.0 + '@tanstack/start-storage-context': 1.167.18 + seroval: 1.5.6 + '@tanstack/start-fn-stubs@1.154.7': {} - '@tanstack/start-plugin-core@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/start-fn-stubs@1.162.0': {} + + '@tanstack/start-plugin-core@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -17871,7 +18321,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.159.4 '@tanstack/router-generator': 1.159.4 - '@tanstack/router-plugin': 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@tanstack/router-plugin': 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@tanstack/router-utils': 1.158.0 '@tanstack/start-client-core': 1.159.4 '@tanstack/start-server-core': 1.159.4 @@ -17881,8 +18331,8 @@ snapshots: srvx: 0.11.15 tinyglobby: 0.2.16 ufo: 1.6.3 - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) xmlbuilder2: 4.0.3 zod: 3.25.76 transitivePeerDependencies: @@ -17893,6 +18343,44 @@ snapshots: - vite-plugin-solid - webpack + '@tanstack/start-plugin-core@1.171.27(esbuild@0.27.7)(rollup@4.52.5)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.171.16 + '@tanstack/router-generator': 1.167.22 + '@tanstack/router-plugin': 1.168.24(esbuild@0.27.7)(rollup@4.52.5)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@tanstack/router-utils': 1.162.2 + '@tanstack/start-server-core': 1.169.19 + exsolve: 1.0.8 + lightningcss: 1.33.0 + pathe: 2.0.3 + picomatch: 4.0.4 + seroval: 1.5.6 + source-map: 0.7.6 + srvx: 0.11.15 + tinyglobby: 0.2.16 + ufo: 1.6.3 + vitefu: 1.1.1(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + xmlbuilder2: 4.0.3 + zod: 4.4.3 + optionalDependencies: + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - '@tanstack/react-router' + - bun-types-no-globals + - crossws + - esbuild + - rolldown + - rollup + - supports-color + - unloader + - vite-plugin-solid + - webpack + '@tanstack/start-server-core@1.159.4': dependencies: '@tanstack/history': 1.154.14 @@ -17905,10 +18393,26 @@ snapshots: transitivePeerDependencies: - crossws + '@tanstack/start-server-core@1.169.19': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/router-core': 1.171.16 + '@tanstack/start-client-core': 1.170.15 + '@tanstack/start-storage-context': 1.167.18 + fetchdts: 0.1.7 + h3-v2: h3@2.0.1-rc.20 + seroval: 1.5.6 + transitivePeerDependencies: + - crossws + '@tanstack/start-storage-context@1.159.4': dependencies: '@tanstack/router-core': 1.159.4 + '@tanstack/start-storage-context@1.167.18': + dependencies: + '@tanstack/router-core': 1.171.16 + '@tanstack/store@0.8.0': {} '@tanstack/store@0.9.2': {} @@ -17931,12 +18435,14 @@ snapshots: '@tanstack/virtual-file-routes@1.154.7': {} - '@tanstack/vite-config@0.4.1(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/virtual-file-routes@1.162.0': {} + + '@tanstack/vite-config@0.4.1(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.52.5) - vite-plugin-dts: 4.2.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - vite-plugin-externalize-deps: 0.10.0(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite-plugin-dts: 4.2.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite-plugin-externalize-deps: 0.10.0(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - rollup @@ -17944,13 +18450,13 @@ snapshots: - typescript - vite - '@tanstack/vite-config@0.4.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/vite-config@0.4.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.52.5) - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-dts: 4.2.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - vite-plugin-externalize-deps: 0.10.0(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite-plugin-dts: 4.2.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite-plugin-externalize-deps: 0.10.0(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - rollup @@ -18063,6 +18569,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/argparse@1.0.38': {} '@types/aria-query@5.0.4': {} @@ -18274,15 +18785,15 @@ snapshots: '@types/node': 25.2.2 optional: true - '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.47.0 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -18291,15 +18802,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.55.0 - '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.55.0 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -18307,26 +18818,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.47.0 '@typescript-eslint/types': 8.47.0 '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.47.0 debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.55.0 '@typescript-eslint/types': 8.55.0 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.55.0 debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -18367,25 +18878,25 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.47.0 '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.55.0 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -18426,24 +18937,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.47.0 '@typescript-eslint/types': 8.47.0 '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.55.0 '@typescript-eslint/types': 8.55.0 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -18533,11 +19044,11 @@ snapshots: '@urql/core': 5.2.0(graphql@16.12.0) wonka: 6.3.5 - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.11(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.11(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: - vite: 7.1.11(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - '@vitejs/plugin-react@5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitejs/plugin-react@5.1.3(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -18545,14 +19056,14 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.2 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.4(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vue@3.5.28(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.4(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vue@3.5.28(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vue: 3.5.28(typescript@5.9.3) '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4)': @@ -18567,7 +19078,7 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -18579,13 +19090,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -18616,7 +19127,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.16 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/utils@3.2.4': dependencies: @@ -19020,16 +19531,6 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 - babel-plugin-jsx-dom-expressions@0.40.1(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/types': 7.29.0 - html-entities: 2.3.3 - parse5: 7.3.0 - validate-html-nesting: 1.2.3 - babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0): dependencies: '@babel/compat-data': 7.29.0 @@ -19165,12 +19666,12 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) - babel-preset-solid@1.9.9(@babel/core@7.29.0)(solid-js@1.9.11): + babel-preset-solid@2.0.0-beta.34(@babel/core@7.29.0)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.29.0 - babel-plugin-jsx-dom-expressions: 0.40.1(@babel/core@7.29.0) + '@dom-expressions/babel-plugin-jsx': 0.50.0-next.42(@babel/core@7.29.0) optionalDependencies: - solid-js: 1.9.11 + solid-js: 2.0.0-rc.0 balanced-match@1.0.2: {} @@ -19193,7 +19694,7 @@ snapshots: postcss: 8.5.10 postcss-media-query-parser: 0.2.3 - better-auth@1.4.18(b4f55ef685357933f61fbe0b4095cc16): + better-auth@1.4.18(@tanstack/react-start@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(better-sqlite3@12.8.0)(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@op-engineering/op-sqlite@15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.8.0)(expo-sqlite@55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(kysely@0.28.11)(pg@8.20.0)(postgres@3.4.8)(sql.js@1.14.1))(mongodb@6.21.0(socks@2.8.7))(pg@8.20.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(svelte@5.50.0)(vitest@3.2.4)(vue@3.5.28(typescript@5.9.3)): dependencies: '@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0) '@better-auth/telemetry': 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)) @@ -19208,8 +19709,7 @@ snapshots: nanostores: 1.1.0 zod: 4.3.6 optionalDependencies: - '@tanstack/react-start': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@tanstack/solid-start': 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@tanstack/react-start': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) better-sqlite3: 12.8.0 drizzle-kit: 0.31.9 drizzle-orm: 0.45.1(@op-engineering/op-sqlite@15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.8.0)(expo-sqlite@55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(kysely@0.28.11)(pg@8.20.0)(postgres@3.4.8)(sql.js@1.14.1) @@ -19217,9 +19717,8 @@ snapshots: pg: 8.20.0 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - solid-js: 1.9.11 svelte: 5.50.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vue: 3.5.28(typescript@5.9.3) better-call@1.1.8(zod@4.3.6): @@ -19722,6 +20221,8 @@ snapshots: cookie-es@2.0.0: {} + cookie-es@3.1.1: {} + cookie-signature@1.2.2: {} cookie@0.7.2: {} @@ -19998,6 +20499,11 @@ snapshots: drizzle-orm: 0.45.1(@op-engineering/op-sqlite@15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.8.0)(expo-sqlite@55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(kysely@0.28.11)(pg@8.20.0)(postgres@3.4.8)(sql.js@1.14.1) zod: 4.3.6 + drizzle-zod@0.8.3(drizzle-orm@0.45.1(@op-engineering/op-sqlite@15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.8.0)(expo-sqlite@55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(kysely@0.28.11)(pg@8.20.0)(postgres@3.4.8)(sql.js@1.14.1))(zod@4.4.3): + dependencies: + drizzle-orm: 0.45.1(@op-engineering/op-sqlite@15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.8.0)(expo-sqlite@55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.13)(react@19.2.4))(react@19.2.4))(kysely@0.28.11)(pg@8.20.0)(postgres@3.4.8)(sql.js@1.14.1) + zod: 4.4.3 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -20371,14 +20877,14 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.39.4(jiti@2.6.1)): + eslint-compat-utils@0.5.1(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) semver: 7.7.4 - eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: @@ -20387,10 +20893,10 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)): dependencies: debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 @@ -20398,23 +20904,23 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-es-x@7.8.0(eslint@9.39.4(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - eslint: 9.39.4(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@9.39.4(jiti@2.6.1)) + eslint: 9.39.4(jiti@2.7.0) + eslint-compat-utils: 0.5.1(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)): dependencies: '@typescript-eslint/types': 8.55.0 comment-parser: 1.4.1 debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.2.5 @@ -20422,16 +20928,16 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) transitivePeerDependencies: - supports-color - eslint-plugin-n@17.23.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-n@17.23.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) enhanced-resolve: 5.18.3 - eslint: 9.39.4(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@9.39.4(jiti@2.6.1)) + eslint: 9.39.4(jiti@2.7.0) + eslint-plugin-es-x: 7.8.0(eslint@9.39.4(jiti@2.7.0)) get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 @@ -20441,24 +20947,24 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.1): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(prettier@3.8.1): dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) prettier: 3.8.1 prettier-linter-helpers: 1.0.1 synckit: 0.11.12 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-react-hooks@5.2.0(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) - eslint-plugin-react-refresh@0.4.26(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-react-refresh@0.4.26(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) - eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.7.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -20466,7 +20972,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -20480,10 +20986,10 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-solid@0.14.5(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-solid@0.14.5(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.55.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) estraverse: 5.3.0 is-html: 2.0.0 kebab-case: 1.0.2 @@ -20502,9 +21008,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.4(jiti@2.6.1): + eslint@9.39.4(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 @@ -20539,7 +21045,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -21148,6 +21654,8 @@ snapshots: fetch-nodeshim@0.4.9: {} + fetchdts@0.1.7: {} + fflate@0.8.2: {} file-entry-cache@8.0.0: @@ -21509,6 +22017,11 @@ snapshots: rou3: 0.7.12 srvx: 0.11.15 + h3@2.0.1-rc.20: + dependencies: + rou3: 0.8.1 + srvx: 0.11.15 + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -22117,6 +22630,8 @@ snapshots: jiti@2.6.1: {} + jiti@2.7.0: {} + jju@1.4.0: {} joi@18.0.2: @@ -22351,66 +22866,99 @@ snapshots: lightningcss-android-arm64@1.30.2: optional: true + lightningcss-android-arm64@1.33.0: + optional: true + lightningcss-darwin-arm64@1.27.0: optional: true lightningcss-darwin-arm64@1.30.2: optional: true + lightningcss-darwin-arm64@1.33.0: + optional: true + lightningcss-darwin-x64@1.27.0: optional: true lightningcss-darwin-x64@1.30.2: optional: true + lightningcss-darwin-x64@1.33.0: + optional: true + lightningcss-freebsd-x64@1.27.0: optional: true lightningcss-freebsd-x64@1.30.2: optional: true + lightningcss-freebsd-x64@1.33.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.27.0: optional: true lightningcss-linux-arm-gnueabihf@1.30.2: optional: true + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + lightningcss-linux-arm64-gnu@1.27.0: optional: true lightningcss-linux-arm64-gnu@1.30.2: optional: true + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + lightningcss-linux-arm64-musl@1.27.0: optional: true lightningcss-linux-arm64-musl@1.30.2: optional: true + lightningcss-linux-arm64-musl@1.33.0: + optional: true + lightningcss-linux-x64-gnu@1.27.0: optional: true lightningcss-linux-x64-gnu@1.30.2: optional: true + lightningcss-linux-x64-gnu@1.33.0: + optional: true + lightningcss-linux-x64-musl@1.27.0: optional: true lightningcss-linux-x64-musl@1.30.2: optional: true + lightningcss-linux-x64-musl@1.33.0: + optional: true + lightningcss-win32-arm64-msvc@1.27.0: optional: true lightningcss-win32-arm64-msvc@1.30.2: optional: true + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + lightningcss-win32-x64-msvc@1.27.0: optional: true lightningcss-win32-x64-msvc@1.30.2: optional: true + lightningcss-win32-x64-msvc@1.33.0: + optional: true + lightningcss@1.27.0: dependencies: detect-libc: 1.0.3 @@ -22442,6 +22990,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -24413,6 +24977,8 @@ snapshots: rou3@0.7.12: {} + rou3@0.8.1: {} + router@2.2.0: dependencies: debug: 4.4.3 @@ -24608,8 +25174,14 @@ snapshots: dependencies: seroval: 1.5.0 + seroval-plugins@1.5.6(seroval@1.5.6): + dependencies: + seroval: 1.5.6 + seroval@1.5.0: {} + seroval@1.5.6: {} + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -24920,20 +25492,12 @@ snapshots: ip-address: 10.1.0 smart-buffer: 4.2.0 - solid-js@1.9.11: + solid-js@2.0.0-rc.0: dependencies: + '@solidjs/signals': 2.0.0-rc.0 csstype: 3.2.3 - seroval: 1.5.0 - seroval-plugins: 1.5.0(seroval@1.5.0) - - solid-refresh@0.6.3(solid-js@1.9.11): - dependencies: - '@babel/generator': 7.29.1 - '@babel/helper-module-imports': 7.28.6 - '@babel/types': 7.29.0 - solid-js: 1.9.11 - transitivePeerDependencies: - - supports-color + seroval: 1.5.6 + seroval-plugins: 1.5.6(seroval@1.5.6) sorted-btree@1.8.1: {} @@ -25498,13 +26062,13 @@ snapshots: typescript: 5.9.3 yaml: 2.8.1 - typescript-eslint@8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -25582,6 +26146,16 @@ snapshots: picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 + unplugin@3.3.0(esbuild@0.27.7)(rollup@4.52.5)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + esbuild: 0.27.7 + rollup: 4.52.5 + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.3 @@ -25680,13 +26254,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vite-node@3.2.4(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -25701,7 +26275,7 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-dts@4.2.3(@types/node@25.2.2)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@25.2.2) '@rollup/pluginutils': 5.3.0(rollup@4.52.5) @@ -25714,43 +26288,38 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.10.0(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-externalize-deps@0.10.0(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - '@babel/core': 7.29.0 - '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.9(@babel/core@7.29.0)(solid-js@1.9.11) - merge-anything: 5.1.7 - solid-js: 1.9.11 - solid-refresh: 0.6.3(solid-js@1.9.11) - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - optionalDependencies: - '@testing-library/jest-dom': 6.9.1 + '@solidjs/vite-plugin': 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: + - '@solidjs/web' + - '@testing-library/jest-dom' + - solid-js - supports-color + - vite - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.11(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vite@7.1.11(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.4) @@ -25761,14 +26330,14 @@ snapshots: optionalDependencies: '@types/node': 25.2.2 fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 + jiti: 2.7.0 + lightningcss: 1.33.0 sass: 1.90.0 terser: 5.44.0 tsx: 4.21.0 yaml: 2.8.1 - vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -25779,22 +26348,22 @@ snapshots: optionalDependencies: '@types/node': 25.2.2 fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 + jiti: 2.7.0 + lightningcss: 1.33.0 sass: 1.90.0 terser: 5.44.0 tsx: 4.21.0 yaml: 2.8.1 - vitefu@1.1.1(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): optionalDependencies: - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.2)(@vitest/ui@3.2.4)(jiti@2.7.0)(jsdom@27.4.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -25812,8 +26381,8 @@ snapshots: tinyglobby: 0.2.16 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.2(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.2(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.33.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -25840,10 +26409,10 @@ snapshots: vscode-uri@3.1.0: {} - vue-eslint-parser@10.2.0(eslint@9.39.4(jiti@2.6.1)): + vue-eslint-parser@10.2.0(eslint@9.39.4(jiti@2.7.0)): dependencies: debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -26199,4 +26768,6 @@ snapshots: zod@4.3.6: {} + zod@4.4.3: {} + zone.js@0.15.1: {}