From 5b58da97ab505b8c6ea73bf7d932f5c5e21c64c0 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Thu, 2 Oct 2025 15:21:42 +0100 Subject: [PATCH 01/51] remove console.log from local-only tests (#626) --- packages/db/tests/local-only.test.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/db/tests/local-only.test.ts b/packages/db/tests/local-only.test.ts index 2b3df38117..74906f4f57 100644 --- a/packages/db/tests/local-only.test.ts +++ b/packages/db/tests/local-only.test.ts @@ -461,10 +461,6 @@ describe(`LocalOnly Collection`, () => { }) ) - testCollection.subscribeChanges((changes) => { - console.log({ testCollectionChanges: changes }) - }) - const query = createCollection( liveQueryCollectionOptions({ startSync: true, @@ -475,10 +471,6 @@ describe(`LocalOnly Collection`, () => { }) ) - query.subscribeChanges((changes) => { - console.log({ queryChanges: changes }) - }) - testCollection.delete(0) await new Promise((resolve) => setTimeout(resolve, 10)) From e837256a84ac78a62fdcb403ae076e235f3f382f Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Thu, 2 Oct 2025 19:19:22 -0600 Subject: [PATCH 02/51] Add mutations guide (#614) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add WIP version of mutations guide * add before/after example * docs: clean up mutation handler examples - Pull mutation off mutations array for cleaner code - Add comment explaining collection handlers only receive one mutation at a time - Apply pattern consistently across all handler examples πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * docs: remove pioneer analogy * docs: fix mutation handler patterns - Remove incorrect comment about single mutations - Update handlers to use Promise.all for multiple mutations - Fix collection.refetch() -> collection.utils.refetch() - Update Electric collection pattern to return txids - Add note about automatic refetch in collection handlers πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * docs: fix temporary ID generator bug Parenthesize the offset to ensure negative IDs: -(Math.floor(...) + 1) Previously could produce positive 1 when Math.random() returns 0 * docs: clarify Immer-like pattern usage Use 'Immer-like pattern' instead of 'uses Immer under the hood' * docs: fix operation handler signatures - Correct handler params to { transaction, collection } - Remove incorrect metadata parameter from signature - Add metadata to mutation object properties list - Fix return type to Promise | any * docs: clarify handler sync requirements Replace QueryCollection-specific note with general requirement that handlers must wait for server changes to sync back before resolving * docs: remove unnecessary refetch call in generic mutation function Collection handlers automatically handle refetch, only custom actions need it * docs: clarify commit timing with example * docs: fix TransactionConfig options - Make mutationFn required (not optional) - Add missing id and metadata options - Mark autoCommit as optional * docs: clarify when to manually rollback transactions Note that rollback is automatic on error, manual rollback only needed for user actions like canceling a form * docs: streamline mutation merging section - Replace opening paragraph with bullet points - Remove worked examples, keep truth table only - Remove redundant benefits list * Add an example. --------- Co-authored-by: Claude --- docs/guides/mutations.md | 1017 ++++++++++++++++++++++++++++++++++++++ docs/overview.md | 397 +-------------- 2 files changed, 1028 insertions(+), 386 deletions(-) create mode 100644 docs/guides/mutations.md diff --git a/docs/guides/mutations.md b/docs/guides/mutations.md new file mode 100644 index 0000000000..9f4a069b17 --- /dev/null +++ b/docs/guides/mutations.md @@ -0,0 +1,1017 @@ +--- +title: Mutations +id: mutations +--- + +# TanStack DB Mutations + +TanStack DB provides a powerful mutation system that enables optimistic updates with automatic state management. This system is built around a pattern of **optimistic mutation β†’ backend persistence β†’ sync back β†’ confirmed state**. This creates a highly responsive user experience while maintaining data consistency and being easy to reason about. + +Local changes are applied immediately as optimistic state, then persisted to your backend, and finally the optimistic state is replaced by the confirmed server state once it syncs back. + +```tsx +// Define a collection with a mutation handler +const todoCollection = createCollection({ + id: "todos", + onUpdate: async ({ transaction }) => { + const mutation = transaction.mutations[0] + await api.todos.update(mutation.original.id, mutation.modified) + }, +}) + +// Apply an optimistic update +todoCollection.update(todo.id, (draft) => { + draft.completed = true +}) +``` + +This pattern extends the Redux/Flux unidirectional data flow beyond the client to include the server: + +
+ + + +
+ +With an instant inner loop of optimistic state, superseded in time by the slower outer loop of persisting to the server and syncing the updated server state back into the collection. + +### Simplified Mutations vs Traditional Approaches + +TanStack DB's mutation system eliminates much of the boilerplate required for optimistic updates in traditional approaches. Compare the difference: + +**Before (TanStack Query with manual optimistic updates):** + +```typescript +const addTodoMutation = useMutation({ + mutationFn: async (newTodo) => api.todos.create(newTodo), + onMutate: async (newTodo) => { + await queryClient.cancelQueries({ queryKey: ['todos'] }) + const previousTodos = queryClient.getQueryData(['todos']) + queryClient.setQueryData(['todos'], (old) => [...(old || []), newTodo]) + return { previousTodos } + }, + onError: (err, newTodo, context) => { + queryClient.setQueryData(['todos'], context.previousTodos) + }, + onSettled: () => { + queryClient.invalidateQueries({ queryKey: ['todos'] }) + }, +}) +``` + +**After (TanStack DB):** + +```typescript +const todoCollection = createCollection( + queryCollectionOptions({ + queryKey: ['todos'], + queryFn: async () => api.todos.getAll(), + getKey: (item) => item.id, + schema: todoSchema, + onInsert: async ({ transaction }) => { + await Promise.all( + transaction.mutations.map((mutation) => + api.todos.create(mutation.modified) + ) + ) + }, + }) +) + +// Simple mutation - no boilerplate! +todoCollection.insert({ + id: crypto.randomUUID(), + text: 'πŸ”₯ Make app faster', + completed: false, +}) +``` + +The benefits: +- βœ… Automatic optimistic updates +- βœ… Automatic rollback on error +- βœ… No manual cache manipulation +- βœ… Type-safe mutations + +## Table of Contents + +- [Mutation Approaches](#mutation-approaches) +- [Mutation Lifecycle](#mutation-lifecycle) +- [Collection Write Operations](#collection-write-operations) +- [Operation Handlers](#operation-handlers) +- [Creating Custom Actions](#creating-custom-actions) +- [Manual Transactions](#manual-transactions) +- [Mutation Merging](#mutation-merging) +- [Controlling Optimistic Behavior](#controlling-optimistic-behavior) +- [Transaction States](#transaction-states) +- [Handling Temporary IDs](#handling-temporary-ids) + +## Mutation Approaches + +TanStack DB provides different approaches to mutations, each suited to different use cases: + +### Collection-Level Mutations + +Collection-level mutations (`insert`, `update`, `delete`) are designed for **direct state manipulation** of a single collection. These are the simplest way to make changes and work well for straightforward CRUD operations. + +```tsx +// Direct state change +todoCollection.update(todoId, (draft) => { + draft.completed = true + draft.completedAt = new Date() +}) +``` + +Use collection-level mutations when: +- You're making simple CRUD operations on a single collection +- The state changes are straightforward and match what the server will store + +You can use `metadata` to annotate these operations and customize behavior in your handlers: + +```tsx +// Annotate with metadata +todoCollection.update( + todoId, + { metadata: { intent: 'complete' } }, + (draft) => { + draft.completed = true + } +) + +// Use metadata in handler +onUpdate: async ({ transaction }) => { + const mutation = transaction.mutations[0] + + if (mutation.metadata?.intent === 'complete') { + await Promise.all( + transaction.mutations.map((mutation) => + api.todos.complete(mutation.original.id) + ) + ) + } else { + await Promise.all( + transaction.mutations.map((mutation) => + api.todos.update(mutation.original.id, mutation.changes) + ) + ) + } +} +``` + +### Intent-Based Mutations with Custom Actions + +For more complex scenarios, use `createOptimisticAction` or `createTransaction` to create **intent-based mutations** that capture specific user actions. + +```tsx +// Intent: "like this post" +const likePost = createOptimisticAction({ + onMutate: (postId) => { + // Optimistic guess at the change + postCollection.update(postId, (draft) => { + draft.likeCount += 1 + draft.likedByMe = true + }) + }, + mutationFn: async (postId) => { + // Send the intent to the server + await api.posts.like(postId) + // Server determines actual state changes + await postCollection.utils.refetch() + }, +}) + +// Use it. +likePost(postId) +``` + +Use custom actions when: +- You need to mutate **multiple collections** in a single transaction +- The optimistic change is a **guess** at how the server will transform the data +- You want to send **user intent** to the backend rather than exact state changes +- The server performs complex logic, calculations, or side effects +- You want a clean, reusable mutation that captures a specific operation + +Custom actions provide the cleanest way to capture specific types of mutations as named operations in your application. While you can achieve similar results using metadata with collection-level mutations, custom actions make the intent explicit and keep related logic together. + +**When to use each:** + +- **Collection-level mutations** (`collection.update`): Simple CRUD operations on a single collection +- **`createOptimisticAction`**: Intent-based operations, multi-collection mutations, immediately committed +- **`createTransaction`**: Fully custom transactions, delayed commits, multi-step workflows + +## Mutation Lifecycle + +The mutation lifecycle follows a consistent pattern across all mutation types: + +1. **Optimistic state applied**: The mutation is immediately applied to the local collection as optimistic state +2. **Handler invoked**: The appropriate handler (`onInsert`, `onUpdate`, or `onDelete`) is called to persist the change +3. **Backend persistence**: Your handler persists the data to your backend +4. **Sync back**: The handler ensures server writes have synced back to the collection +5. **Optimistic state dropped**: Once synced, the optimistic state is replaced by the confirmed server state + +```tsx +// Step 1: Optimistic state applied immediately +todoCollection.update(todo.id, (draft) => { + draft.completed = true +}) +// UI updates instantly with optimistic state + +// Step 2-3: onUpdate handler persists to backend +// Step 4: Handler waits for sync back +// Step 5: Optimistic state replaced by server state +``` + +If the handler throws an error during persistence, the optimistic state is automatically rolled back. + +## Collection Write Operations + +Collections support three core write operations: `insert`, `update`, and `delete`. Each operation applies optimistic state immediately and triggers the corresponding operation handler. + +### Insert + +Add new items to a collection: + +```typescript +// Insert a single item +todoCollection.insert({ + id: "1", + text: "Buy groceries", + completed: false +}) + +// Insert multiple items +todoCollection.insert([ + { id: "1", text: "Buy groceries", completed: false }, + { id: "2", text: "Walk dog", completed: false }, +]) + +// Insert with metadata +todoCollection.insert( + { id: "1", text: "Custom item", completed: false }, + { metadata: { source: "import" } } +) + +// Insert without optimistic updates +todoCollection.insert( + { id: "1", text: "Server-validated item", completed: false }, + { optimistic: false } +) +``` + +**Returns**: A `Transaction` object that you can use to track the mutation's lifecycle. + +### Update + +Modify existing items using an immutable draft pattern: + +```typescript +// Update a single item +todoCollection.update(todo.id, (draft) => { + draft.completed = true +}) + +// Update multiple items +todoCollection.update([todo1.id, todo2.id], (drafts) => { + drafts.forEach((draft) => { + draft.completed = true + }) +}) + +// Update with metadata +todoCollection.update( + todo.id, + { metadata: { reason: "user update" } }, + (draft) => { + draft.text = "Updated text" + } +) + +// Update without optimistic updates +todoCollection.update( + todo.id, + { optimistic: false }, + (draft) => { + draft.status = "server-validated" + } +) +``` + +**Parameters**: +- `key` or `keys`: The item key(s) to update +- `options` (optional): Configuration object with `metadata` and/or `optimistic` flags +- `updater`: Function that receives a draft to mutate + +**Returns**: A `Transaction` object that you can use to track the mutation's lifecycle. + +> [!IMPORTANT] +> The `updater` function uses an Immer-like pattern to capture changes as immutable updates. You must not reassign the draft parameter itselfβ€”only mutate its properties. + +### Delete + +Remove items from a collection: + +```typescript +// Delete a single item +todoCollection.delete(todo.id) + +// Delete multiple items +todoCollection.delete([todo1.id, todo2.id]) + +// Delete with metadata +todoCollection.delete(todo.id, { + metadata: { reason: "completed" } +}) + +// Delete without optimistic updates +todoCollection.delete(todo.id, { optimistic: false }) +``` + +**Parameters**: +- `key` or `keys`: The item key(s) to delete +- `options` (optional): Configuration object with `metadata` and/or `optimistic` flags + +**Returns**: A `Transaction` object that you can use to track the mutation's lifecycle. + +## Operation Handlers + +Operation handlers are functions you provide when creating a collection that handle persisting mutations to your backend. Each collection can define three optional handlers: `onInsert`, `onUpdate`, and `onDelete`. + +### Handler Signature + +All operation handlers receive an object with the following properties: + +```typescript +type OperationHandler = (params: { + transaction: Transaction + collection: Collection +}) => Promise | any +``` + +The `transaction` object contains: +- `mutations`: Array of mutation objects, each with: + - `collection`: The collection being mutated + - `type`: The mutation type (`'insert'`, `'update'`, or `'delete'`) + - `original`: The original item (for updates and deletes) + - `modified`: The modified item (for inserts and updates) + - `changes`: The changes object (for updates) + - `key`: The item key + - `metadata`: Optional metadata attached to the mutation + +### Defining Operation Handlers + +Define handlers when creating a collection: + +```typescript +const todoCollection = createCollection({ + id: "todos", + // ... other options + + onInsert: async ({ transaction }) => { + await Promise.all( + transaction.mutations.map((mutation) => + api.todos.create(mutation.modified) + ) + ) + }, + + onUpdate: async ({ transaction }) => { + await Promise.all( + transaction.mutations.map((mutation) => + api.todos.update(mutation.original.id, mutation.changes) + ) + ) + }, + + onDelete: async ({ transaction }) => { + await Promise.all( + transaction.mutations.map((mutation) => + api.todos.delete(mutation.original.id) + ) + ) + }, +}) +``` + +> [!IMPORTANT] +> Operation handlers must not resolve until the server changes have synced back to the collection. Different collection types provide different patterns to ensure this happens correctly. + +### Collection-Specific Handler Patterns + +Different collection types have specific patterns for their handlers: + +**QueryCollection** - automatically refetches after handler completes: +```typescript +onUpdate: async ({ transaction }) => { + await Promise.all( + transaction.mutations.map((mutation) => + api.todos.update(mutation.original.id, mutation.changes) + ) + ) + // Automatic refetch happens after handler completes +} +``` + +**ElectricCollection** - return txid(s) to track sync: +```typescript +onUpdate: async ({ transaction }) => { + const txids = await Promise.all( + transaction.mutations.map(async (mutation) => { + const response = await api.todos.update(mutation.original.id, mutation.changes) + return response.txid + }) + ) + return { txid: txids } +} +``` + +### Generic Mutation Functions + +You can define a single mutation function for your entire app: + +```typescript +import type { MutationFn } from "@tanstack/react-db" + +const mutationFn: MutationFn = async ({ transaction }) => { + const response = await api.mutations.batch(transaction.mutations) + + if (!response.ok) { + throw new Error(`HTTP Error: ${response.status}`) + } +} + +// Use in collections +const todoCollection = createCollection({ + id: "todos", + onInsert: mutationFn, + onUpdate: mutationFn, + onDelete: mutationFn, +}) +``` + +## Creating Custom Actions + +For more complex mutation patterns, use `createOptimisticAction` to create custom actions with full control over the mutation lifecycle. + +### Basic Action + +Create an action that combines mutation logic with persistence: + +```tsx +import { createOptimisticAction } from "@tanstack/react-db" + +const addTodo = createOptimisticAction({ + onMutate: (text) => { + // Apply optimistic state + todoCollection.insert({ + id: crypto.randomUUID(), + text, + completed: false, + }) + }, + mutationFn: async (text, params) => { + // Persist to backend + const response = await fetch("/api/todos", { + method: "POST", + body: JSON.stringify({ text, completed: false }), + }) + const result = await response.json() + + // Wait for sync back + await todoCollection.utils.refetch() + + return result + }, +}) + +// Use in components +const Todo = () => { + const handleClick = () => { + addTodo("πŸ”₯ Make app faster") + } + + return + + ) +} +``` + +### Solution 3: Maintain a View Key Mapping + +To avoid UI flicker while keeping optimistic updates, maintain a separate mapping from IDs (both temporary and real) to stable view keys: + +```tsx +// Create a mapping API +const idToViewKey = new Map() + +function getViewKey(id: number | string): string { + if (!idToViewKey.has(id)) { + idToViewKey.set(id, crypto.randomUUID()) + } + return idToViewKey.get(id)! +} + +function linkIds(tempId: number, realId: number) { + const viewKey = getViewKey(tempId) + idToViewKey.set(realId, viewKey) +} + +// Configure collection to link IDs when real ID comes back +const todoCollection = createCollection({ + id: "todos", + // ... other options + onInsert: async ({ transaction }) => { + const mutation = transaction.mutations[0] + const tempId = mutation.modified.id + + // Create todo on server and get real ID back + const response = await api.todos.create({ + text: mutation.modified.text, + completed: mutation.modified.completed, + }) + const realId = response.id + + // Link temp ID to same view key as real ID + linkIds(tempId, realId) + + // Wait for sync back + await todoCollection.utils.refetch() + }, +}) + +// When inserting with temp ID +const tempId = -Math.floor(Math.random() * 1000000) + 1 +const viewKey = getViewKey(tempId) // Creates and stores mapping + +todoCollection.insert({ + id: tempId, + text: "New todo", + completed: false +}) + +// Use view key for rendering +const TodoList = () => { + const { data: todos } = useLiveQuery((q) => + q.from({ todo: todoCollection }) + ) + + return ( +
    + {todos.map((todo) => ( +
  • {/* Stable key */} + {todo.text} +
  • + ))} +
+ ) +} +``` + +This pattern maintains a stable key throughout the temporary β†’ real ID transition, preventing your UI framework from unmounting and remounting the component. The view key is stored outside the collection items, so you don't need to add extra fields to your data model. + +### Best Practices + +1. **Use UUIDs when possible**: Client-generated UUIDs eliminate the temporary ID problem +2. **Generate temporary IDs deterministically**: Use negative numbers or a specific pattern to distinguish temporary IDs from real ones +3. **Disable operations on temporary items**: Disable delete/update buttons until persistence completes +4. **Maintain view key mappings**: Create a mapping between IDs and stable view keys for rendering + +> [!NOTE] +> There's an [open issue](https://github.com/TanStack/db/issues/19) to add better built-in support for temporary ID handling in TanStack DB. This would automate the view key pattern and make it easier to work with server-generated IDs. diff --git a/docs/overview.md b/docs/overview.md index 1e180f60f9..ae34e5a9da 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -105,33 +105,11 @@ todoCollection.update(todo.id, (draft) => { }) ``` -Rather than mutating the collection data directly, the collection internally treats its synced/loaded data as immutable and maintains a separate set of local mutations as optimistic state. When live queries read from the collection, they see a local view that overlays the local optimistic mutations on-top-of the immutable synced data. +The collection maintains optimistic state separately from synced data. When live queries read from the collection, they see a local view that overlays the optimistic mutations on top of the immutable synced data. -The optimistic state is held until the `onUpdate` (in this case) handler resolves - at which point the data is persisted to the server and synced back to the local collection. +The optimistic state is held until the handler resolves, at which point the data is persisted to the server and synced back. If the handler throws an error, the optimistic state is rolled back. -If the handler throws an error, the optimistic state is rolled back. - -### Explicit transactions - -Mutations are based on a `Transaction` primitive. - -For simple state changes, directly mutating the collection and persisting with the operator handlers is enough. - -But for more complex use cases, you can directly create custom actions with `createOptimisticAction` or custom transactions with `createTransaction`. This lets you do things such as do transactions with multiple mutations across multiple collections, do chained transactions w/ intermediate rollbacks, etc. - -For example, in the following code, the mutationFn first sends the write to the server using `await api.todos.update(updatedTodo)` and then calls `await collection.refetch()` to trigger a re-fetch of the collection contents using TanStack Query. When this second await resolves, the collection is up-to-date with the latest changes and the optimistic state is safely discarded. - -```ts -const updateTodo = createOptimisticAction<{ id: string }>({ - onMutate, - mutationFn: async ({ transaction }) => { - const { collection, modified: updatedTodo } = transaction.mutations[0] - - await api.todos.update(updatedTodo) - await collection.refetch() - }, -}) -``` +For more complex mutations, you can create custom actions with `createOptimisticAction` or custom transactions with `createTransaction`. See the [Mutations guide](../guides/mutations.md) for details. ### Uni-directional data flow @@ -554,369 +532,16 @@ See the [Live Queries](../guides/live-queries.md) documentation for more details ### Transactional mutators -Transactional mutators allow you to batch and stage local changes across collections with: - -- immediate application of local optimistic updates -- flexible mutationFns to handle writes, with automatic rollbacks and management of optimistic state - -#### `mutationFn` - -Mutators are created with a `mutationFn`. You can define a single, generic `mutationFn` for your whole app. Or you can define collection or mutation specific functions. - -The `mutationFn` is responsible for handling the local changes and processing them, usually to send them to a server or database to be stored. - -**Important:** Inside your `mutationFn`, you must ensure that your server writes have synced back before you return, as the optimistic state is dropped when you return from the mutation function. You generally use collection-specific helpers to do this, such as Query's `utils.refetch()`, direct write APIs, or Electric's `utils.awaitTxId()`. - -For example: - -```tsx -import type { MutationFn } from "@tanstack/react-db" - -const mutationFn: MutationFn = async ({ transaction }) => { - const response = await api.todos.create(transaction.mutations) - - if (!response.ok) { - // Throwing an error will rollback the optimistic state. - throw new Error(`HTTP Error: ${response.status}`) - } - - const result = await response.json() - - // Wait for the transaction to be synced back from the server - // before discarding the optimistic state. - const collection: Collection = transaction.mutations[0].collection - await collection.refetch() -} -``` - -#### `createOptimisticAction` - -Use `createOptimisticAction` with your `mutationFn` and `onMutate` functions to create an action that you can use to mutate data in your components in fully custom ways: - -```tsx -import { createOptimisticAction } from "@tanstack/react-db" - -// Create the `addTodo` action, passing in your `mutationFn` and `onMutate`. -const addTodo = createOptimisticAction({ - onMutate: (text) => { - // Instantly applies the local optimistic state. - todoCollection.insert({ - id: uuid(), - text, - completed: false, - }) - }, - mutationFn: async (text, params) => { - // Persist the todo to your backend - const response = await fetch("/api/todos", { - method: "POST", - body: JSON.stringify({ text, completed: false }), - }) - const result = await response.json() - - // IMPORTANT: Ensure server writes have synced back before returning - // This ensures the optimistic state can be safely discarded - await todoCollection.utils.refetch() - - return result - }, -}) - -const Todo = () => { - const handleClick = () => { - // Triggers the onMutate and then the mutationFn - addTodo("πŸ”₯ Make app faster") - } - - return + )} + + ) +} +``` + +**Requirements:** + +- Query must include `.orderBy()` for the window mechanism to work +- Returns flattened `data` array and `pages` array for flexible rendering +- Automatically detects new pages when data is synced to the collection diff --git a/packages/db/src/collection/events.ts b/packages/db/src/collection/events.ts index d0f56e744c..0f6d8cec1d 100644 --- a/packages/db/src/collection/events.ts +++ b/packages/db/src/collection/events.ts @@ -1,3 +1,4 @@ +import { EventEmitter } from "../event-emitter.js" import type { Collection } from "./index.js" import type { CollectionStatus } from "../types.js" @@ -31,9 +32,21 @@ export interface CollectionSubscribersChangeEvent { subscriberCount: number } +/** + * Event emitted when the collection's loading more state changes + */ +export interface CollectionLoadingSubsetChangeEvent { + type: `loadingSubset:change` + collection: Collection + isLoadingSubset: boolean + previousIsLoadingSubset: boolean + loadingSubsetTransition: `start` | `end` +} + export type AllCollectionEvents = { "status:change": CollectionStatusChangeEvent "subscribers:change": CollectionSubscribersChangeEvent + "loadingSubset:change": CollectionLoadingSubsetChangeEvent } & { [K in CollectionStatus as `status:${K}`]: CollectionStatusEvent } @@ -42,94 +55,32 @@ export type CollectionEvent = | AllCollectionEvents[keyof AllCollectionEvents] | CollectionStatusChangeEvent | CollectionSubscribersChangeEvent + | CollectionLoadingSubsetChangeEvent export type CollectionEventHandler = ( event: AllCollectionEvents[T] ) => void -export class CollectionEventsManager { +export class CollectionEventsManager extends EventEmitter { private collection!: Collection - private listeners = new Map< - keyof AllCollectionEvents, - Set> - >() - constructor() {} + constructor() { + super() + } setDeps(deps: { collection: Collection }) { this.collection = deps.collection } - on( - event: T, - callback: CollectionEventHandler - ) { - if (!this.listeners.has(event)) { - this.listeners.set(event, new Set()) - } - this.listeners.get(event)!.add(callback) - - return () => { - this.listeners.get(event)?.delete(callback) - } - } - - once( - event: T, - callback: CollectionEventHandler - ) { - const unsubscribe = this.on(event, (eventPayload) => { - callback(eventPayload) - unsubscribe() - }) - return unsubscribe - } - - off( - event: T, - callback: CollectionEventHandler - ) { - this.listeners.get(event)?.delete(callback) - } - - waitFor( - event: T, - timeout?: number - ): Promise { - return new Promise((resolve, reject) => { - let timeoutId: NodeJS.Timeout | undefined - const unsubscribe = this.on(event, (eventPayload) => { - if (timeoutId) { - clearTimeout(timeoutId) - timeoutId = undefined - } - resolve(eventPayload) - unsubscribe() - }) - if (timeout) { - timeoutId = setTimeout(() => { - timeoutId = undefined - unsubscribe() - reject(new Error(`Timeout waiting for event ${event}`)) - }, timeout) - } - }) - } - + /** + * Emit an event to all listeners + * Public API for emitting collection events + */ emit( event: T, eventPayload: AllCollectionEvents[T] - ) { - this.listeners.get(event)?.forEach((listener) => { - try { - listener(eventPayload) - } catch (error) { - // Re-throw in a microtask to surface the error - queueMicrotask(() => { - throw error - }) - } - }) + ): void { + this.emitInner(event, eventPayload) } emitStatusChange( @@ -166,6 +117,6 @@ export class CollectionEventsManager { } cleanup() { - this.listeners.clear() + this.clearListeners() } } diff --git a/packages/db/src/collection/index.ts b/packages/db/src/collection/index.ts index e638ec62c4..5a4ab3c07a 100644 --- a/packages/db/src/collection/index.ts +++ b/packages/db/src/collection/index.ts @@ -25,7 +25,6 @@ import type { InferSchemaOutput, InsertConfig, NonSingleResult, - OnLoadMoreOptions, OperationConfig, SingleResult, SubscribeChangesOptions, @@ -218,7 +217,7 @@ export class CollectionImpl< private _events: CollectionEventsManager private _changes: CollectionChangesManager public _lifecycle: CollectionLifecycleManager - private _sync: CollectionSyncManager + public _sync: CollectionSyncManager private _indexes: CollectionIndexesManager private _mutations: CollectionMutationsManager< TOutput, @@ -303,6 +302,7 @@ export class CollectionImpl< collection: this, // Required for passing to config.sync callback state: this._state, lifecycle: this._lifecycle, + events: this._events, }) // Only start sync immediately if explicitly enabled @@ -356,23 +356,19 @@ export class CollectionImpl< } /** - * Start sync immediately - internal method for compiled queries - * This bypasses lazy loading for special cases like live query results + * Check if the collection is currently loading more data + * @returns true if the collection has pending load more operations, false otherwise */ - public startSyncImmediate(): void { - this._sync.startSync() + public get isLoadingSubset(): boolean { + return this._sync.isLoadingSubset } /** - * Requests the sync layer to load more data. - * @param options Options to control what data is being loaded - * @returns If data loading is asynchronous, this method returns a promise that resolves when the data is loaded. - * If data loading is synchronous, the data is loaded when the method returns. + * Start sync immediately - internal method for compiled queries + * This bypasses lazy loading for special cases like live query results */ - public syncMore(options: OnLoadMoreOptions): void | Promise { - if (this._sync.syncOnLoadMoreFn) { - return this._sync.syncOnLoadMoreFn(options) - } + public startSyncImmediate(): void { + this._sync.startSync() } /** diff --git a/packages/db/src/collection/subscription.ts b/packages/db/src/collection/subscription.ts index f369971c61..d6a43a2563 100644 --- a/packages/db/src/collection/subscription.ts +++ b/packages/db/src/collection/subscription.ts @@ -1,13 +1,20 @@ import { ensureIndexForExpression } from "../indexes/auto-index.js" import { and, gt, lt } from "../query/builder/functions.js" import { Value } from "../query/ir.js" +import { EventEmitter } from "../event-emitter.js" import { createFilterFunctionFromExpression, createFilteredCallback, } from "./change-events.js" import type { BasicExpression, OrderBy } from "../query/ir.js" import type { IndexInterface } from "../indexes/base-index.js" -import type { ChangeMessage } from "../types.js" +import type { + ChangeMessage, + Subscription, + SubscriptionEvents, + SubscriptionStatus, + SubscriptionUnsubscribedEvent, +} from "../types.js" import type { CollectionImpl } from "./index.js" type RequestSnapshotOptions = { @@ -22,13 +29,17 @@ type RequestLimitedSnapshotOptions = { } type CollectionSubscriptionOptions = { + includeInitialState?: boolean /** Pre-compiled expression for filtering changes */ whereExpression?: BasicExpression /** Callback to call when the subscription is unsubscribed */ - onUnsubscribe?: () => void + onUnsubscribe?: (event: SubscriptionUnsubscribedEvent) => void } -export class CollectionSubscription { +export class CollectionSubscription + extends EventEmitter + implements Subscription +{ private loadedInitialState = false // Flag to indicate that we have sent at least 1 snapshot. @@ -42,11 +53,24 @@ export class CollectionSubscription { private orderByIndex: IndexInterface | undefined + // Status tracking + private _status: SubscriptionStatus = `ready` + private pendingLoadSubsetPromises: Set> = new Set() + + public get status(): SubscriptionStatus { + return this._status + } + constructor( private collection: CollectionImpl, private callback: (changes: Array>) => void, private options: CollectionSubscriptionOptions ) { + super() + if (options.onUnsubscribe) { + this.on(`unsubscribed`, (event) => options.onUnsubscribe!(event)) + } + // Auto-index for where expressions if enabled if (options.whereExpression) { ensureIndexForExpression(options.whereExpression, this.collection) @@ -71,6 +95,53 @@ export class CollectionSubscription { this.orderByIndex = index } + /** + * Set subscription status and emit events if changed + */ + private setStatus(newStatus: SubscriptionStatus) { + if (this._status === newStatus) { + return // No change + } + + const previousStatus = this._status + this._status = newStatus + + // Emit status:change event + this.emitInner(`status:change`, { + type: `status:change`, + subscription: this, + previousStatus, + status: newStatus, + }) + + // Emit specific status event + const eventKey: `status:${SubscriptionStatus}` = `status:${newStatus}` + this.emitInner(eventKey, { + type: eventKey, + subscription: this, + previousStatus, + status: newStatus, + } as SubscriptionEvents[typeof eventKey]) + } + + /** + * Track a loadSubset promise and manage loading status + */ + private trackLoadSubsetPromise(syncResult: Promise | true) { + // Track the promise if it's actually a promise (async work) + if (syncResult instanceof Promise) { + this.pendingLoadSubsetPromises.add(syncResult) + this.setStatus(`loadingSubset`) + + syncResult.finally(() => { + this.pendingLoadSubsetPromises.delete(syncResult) + if (this.pendingLoadSubsetPromises.size === 0) { + this.setStatus(`ready`) + } + }) + } + } + hasLoadedInitialState() { return this.loadedInitialState } @@ -121,10 +192,13 @@ export class CollectionSubscription { // Request the sync layer to load more data // don't await it, we will load the data into the collection when it comes in - this.collection.syncMore({ + const syncResult = this.collection._sync.loadSubset({ where: stateOpts.where, + subscription: this, }) + this.trackLoadSubsetPromise(syncResult) + // Also load data immediately from the collection const snapshot = this.collection.currentStateAsChanges(stateOpts) @@ -215,11 +289,14 @@ export class CollectionSubscription { // Request the sync layer to load more data // don't await it, we will load the data into the collection when it comes in - this.collection.syncMore({ + const syncResult = this.collection._sync.loadSubset({ where: whereWithValueFilter, limit, orderBy, + subscription: this, }) + + this.trackLoadSubsetPromise(syncResult) } /** @@ -264,6 +341,11 @@ export class CollectionSubscription { } unsubscribe() { - this.options.onUnsubscribe?.() + this.emitInner(`unsubscribed`, { + type: `unsubscribed`, + subscription: this, + }) + // Clear all event listeners to prevent memory leaks + this.clearListeners() } } diff --git a/packages/db/src/collection/sync.ts b/packages/db/src/collection/sync.ts index 1958c58f9e..251fba6082 100644 --- a/packages/db/src/collection/sync.ts +++ b/packages/db/src/collection/sync.ts @@ -1,4 +1,5 @@ import { + CollectionConfigurationError, CollectionIsInErrorStateError, DuplicateKeySyncError, NoPendingSyncTransactionCommitError, @@ -13,12 +14,13 @@ import type { ChangeMessage, CleanupFn, CollectionConfig, - OnLoadMoreOptions, + LoadSubsetOptions, SyncConfigRes, } from "../types" import type { CollectionImpl } from "./index.js" import type { CollectionStateManager } from "./state" import type { CollectionLifecycleManager } from "./lifecycle" +import type { CollectionEventsManager } from "./events.js" export class CollectionSyncManager< TOutput extends object = Record, @@ -29,31 +31,38 @@ export class CollectionSyncManager< private collection!: CollectionImpl private state!: CollectionStateManager private lifecycle!: CollectionLifecycleManager + private _events!: CollectionEventsManager private config!: CollectionConfig private id: string + private syncMode: `eager` | `on-demand` public preloadPromise: Promise | null = null public syncCleanupFn: (() => void) | null = null - public syncOnLoadMoreFn: - | ((options: OnLoadMoreOptions) => void | Promise) + public syncLoadSubsetFn: + | ((options: LoadSubsetOptions) => true | Promise) | null = null + private pendingLoadSubsetPromises: Set> = new Set() + /** * Creates a new CollectionSyncManager instance */ constructor(config: CollectionConfig, id: string) { this.config = config this.id = id + this.syncMode = config.syncMode ?? `eager` } setDeps(deps: { collection: CollectionImpl state: CollectionStateManager lifecycle: CollectionLifecycleManager + events: CollectionEventsManager }) { this.collection = deps.collection this.state = deps.state this.lifecycle = deps.lifecycle + this._events = deps.events } /** @@ -189,8 +198,16 @@ export class CollectionSyncManager< // Store cleanup function if provided this.syncCleanupFn = syncRes?.cleanup ?? null - // Store onLoadMore function if provided - this.syncOnLoadMoreFn = syncRes?.onLoadMore ?? null + // Store loadSubset function if provided + this.syncLoadSubsetFn = syncRes?.loadSubset ?? null + + // Validate: on-demand mode requires a loadSubset function + if (this.syncMode === `on-demand` && !this.syncLoadSubsetFn) { + throw new CollectionConfigurationError( + `Collection "${this.id}" is configured with syncMode "on-demand" but the sync function did not return a loadSubset handler. ` + + `Either provide a loadSubset handler or use syncMode "eager".` + ) + } } catch (error) { this.lifecycle.setStatus(`error`) throw error @@ -239,16 +256,71 @@ export class CollectionSyncManager< return this.preloadPromise } + /** + * Gets whether the collection is currently loading more data + */ + public get isLoadingSubset(): boolean { + return this.pendingLoadSubsetPromises.size > 0 + } + + /** + * Tracks a load promise for isLoadingSubset state. + * @internal This is for internal coordination (e.g., live-query glue code), not for general use. + */ + public trackLoadPromise(promise: Promise): void { + const loadingStarting = !this.isLoadingSubset + this.pendingLoadSubsetPromises.add(promise) + + if (loadingStarting) { + this._events.emit(`loadingSubset:change`, { + type: `loadingSubset:change`, + collection: this.collection, + isLoadingSubset: true, + previousIsLoadingSubset: false, + loadingSubsetTransition: `start`, + }) + } + + promise.finally(() => { + const loadingEnding = + this.pendingLoadSubsetPromises.size === 1 && + this.pendingLoadSubsetPromises.has(promise) + this.pendingLoadSubsetPromises.delete(promise) + + if (loadingEnding) { + this._events.emit(`loadingSubset:change`, { + type: `loadingSubset:change`, + collection: this.collection, + isLoadingSubset: false, + previousIsLoadingSubset: true, + loadingSubsetTransition: `end`, + }) + } + }) + } + /** * Requests the sync layer to load more data. * @param options Options to control what data is being loaded * @returns If data loading is asynchronous, this method returns a promise that resolves when the data is loaded. - * If data loading is synchronous, the data is loaded when the method returns. + * Returns true if no sync function is configured, if syncMode is 'eager', or if there is no work to do. */ - public syncMore(options: OnLoadMoreOptions): void | Promise { - if (this.syncOnLoadMoreFn) { - return this.syncOnLoadMoreFn(options) + public loadSubset(options: LoadSubsetOptions): Promise | true { + // Bypass loadSubset when syncMode is 'eager' + if (this.syncMode === `eager`) { + return true + } + + if (this.syncLoadSubsetFn) { + const result = this.syncLoadSubsetFn(options) + // If the result is a promise, track it + if (result instanceof Promise) { + this.trackLoadPromise(result) + return result + } } + + return true } public cleanup(): void { diff --git a/packages/db/src/event-emitter.ts b/packages/db/src/event-emitter.ts new file mode 100644 index 0000000000..19656e573b --- /dev/null +++ b/packages/db/src/event-emitter.ts @@ -0,0 +1,118 @@ +/** + * Generic type-safe event emitter + * @template TEvents - Record of event names to event payload types + */ +export class EventEmitter> { + private listeners = new Map< + keyof TEvents, + Set<(event: TEvents[keyof TEvents]) => void> + >() + + /** + * Subscribe to an event + * @param event - Event name to listen for + * @param callback - Function to call when event is emitted + * @returns Unsubscribe function + */ + on( + event: T, + callback: (event: TEvents[T]) => void + ): () => void { + if (!this.listeners.has(event)) { + this.listeners.set(event, new Set()) + } + this.listeners.get(event)!.add(callback as (event: any) => void) + + return () => { + this.listeners.get(event)?.delete(callback as (event: any) => void) + } + } + + /** + * Subscribe to an event once (automatically unsubscribes after first emission) + * @param event - Event name to listen for + * @param callback - Function to call when event is emitted + * @returns Unsubscribe function + */ + once( + event: T, + callback: (event: TEvents[T]) => void + ): () => void { + const unsubscribe = this.on(event, (eventPayload) => { + callback(eventPayload) + unsubscribe() + }) + return unsubscribe + } + + /** + * Unsubscribe from an event + * @param event - Event name to stop listening for + * @param callback - Function to remove + */ + off( + event: T, + callback: (event: TEvents[T]) => void + ): void { + this.listeners.get(event)?.delete(callback as (event: any) => void) + } + + /** + * Wait for an event to be emitted + * @param event - Event name to wait for + * @param timeout - Optional timeout in milliseconds + * @returns Promise that resolves with the event payload + */ + waitFor( + event: T, + timeout?: number + ): Promise { + return new Promise((resolve, reject) => { + let timeoutId: NodeJS.Timeout | undefined + const unsubscribe = this.on(event, (eventPayload) => { + if (timeoutId) { + clearTimeout(timeoutId) + timeoutId = undefined + } + resolve(eventPayload) + unsubscribe() + }) + if (timeout) { + timeoutId = setTimeout(() => { + timeoutId = undefined + unsubscribe() + reject(new Error(`Timeout waiting for event ${String(event)}`)) + }, timeout) + } + }) + } + + /** + * Emit an event to all listeners + * @param event - Event name to emit + * @param eventPayload - Event payload + * @internal For use by subclasses - subclasses should wrap this with a public emit if needed + */ + protected emitInner( + event: T, + eventPayload: TEvents[T] + ): void { + this.listeners.get(event)?.forEach((listener) => { + try { + listener(eventPayload) + } catch (error) { + // Re-throw in a microtask to surface the error + queueMicrotask(() => { + throw error + }) + } + }) + } + + /** + * Clear all listeners + */ + protected clearListeners(): void { + this.listeners.clear() + } +} diff --git a/packages/db/src/query/index.ts b/packages/db/src/query/index.ts index c5e5873ccb..17f4dd8e7a 100644 --- a/packages/db/src/query/index.ts +++ b/packages/db/src/query/index.ts @@ -56,3 +56,4 @@ export { } from "./live-query-collection.js" export { type LiveQueryCollectionConfig } from "./live/types.js" +export { type LiveQueryCollectionUtils } from "./live/collection-config-builder.js" diff --git a/packages/db/src/query/live/collection-config-builder.ts b/packages/db/src/query/live/collection-config-builder.ts index a7952e9988..08302fc396 100644 --- a/packages/db/src/query/live/collection-config-builder.ts +++ b/packages/db/src/query/live/collection-config-builder.ts @@ -39,8 +39,10 @@ export type LiveQueryCollectionUtils = UtilsRecord & { /** * Sets the offset and limit of an ordered query. * Is a no-op if the query is not ordered. + * + * @returns `true` if no subset loading was triggered, or `Promise` that resolves when the subset has been loaded */ - setWindow: (options: WindowOptions) => void + setWindow: (options: WindowOptions) => true | Promise } type PendingGraphRun = { @@ -88,7 +90,7 @@ export class CollectionConfigBuilder< private isInErrorState = false // Reference to the live query collection for error state transitions - private liveQueryCollection?: Collection + public liveQueryCollection?: Collection private windowFn: ((options: WindowOptions) => void) | undefined @@ -189,13 +191,32 @@ export class CollectionConfigBuilder< } } - setWindow(options: WindowOptions) { + setWindow(options: WindowOptions): true | Promise { if (!this.windowFn) { throw new SetWindowRequiresOrderByError() } this.windowFn(options) this.maybeRunGraphFn?.() + + // Check if loading a subset was triggered + if (this.liveQueryCollection?.isLoadingSubset) { + // Loading was triggered, return a promise that resolves when it completes + return new Promise((resolve) => { + const unsubscribe = this.liveQueryCollection!.on( + `loadingSubset:change`, + (event) => { + if (!event.isLoadingSubset) { + unsubscribe() + resolve() + } + } + ) + }) + } + + // No loading was triggered + return true } /** @@ -475,15 +496,15 @@ export class CollectionConfigBuilder< } ) - const loadMoreDataCallbacks = this.subscribeToAllCollections( + const loadSubsetDataCallbacks = this.subscribeToAllCollections( config, fullSyncState ) - this.maybeRunGraphFn = () => this.scheduleGraphRun(loadMoreDataCallbacks) + this.maybeRunGraphFn = () => this.scheduleGraphRun(loadSubsetDataCallbacks) // Initial run with callback to load more data if needed - this.scheduleGraphRun(loadMoreDataCallbacks) + this.scheduleGraphRun(loadSubsetDataCallbacks) // Return the unsubscribe function return () => { @@ -792,7 +813,7 @@ export class CollectionConfigBuilder< // Combine all loaders into a single callback that initiates loading more data // from any source that needs it. Returns true once all loaders have been called, // but the actual async loading may still be in progress. - const loadMoreDataCallback = () => { + const loadSubsetDataCallbacks = () => { loaders.map((loader) => loader()) return true } @@ -804,7 +825,7 @@ export class CollectionConfigBuilder< // Initial status check after all subscriptions are set up this.updateLiveQueryStatus(config) - return loadMoreDataCallback + return loadSubsetDataCallbacks } } diff --git a/packages/db/src/query/live/collection-subscriber.ts b/packages/db/src/query/live/collection-subscriber.ts index 0abed0022c..5835a2f0ef 100644 --- a/packages/db/src/query/live/collection-subscriber.ts +++ b/packages/db/src/query/live/collection-subscriber.ts @@ -24,6 +24,12 @@ export class CollectionSubscriber< // Keep track of the biggest value we've sent so far (needed for orderBy optimization) private biggest: any = undefined + // Track deferred promises for subscription loading states + private subscriptionLoadingPromises = new Map< + CollectionSubscription, + { resolve: () => void } + >() + constructor( private alias: string, private collectionId: string, @@ -66,7 +72,51 @@ export class CollectionSubscriber< includeInitialState ) } + + // Subscribe to subscription status changes to propagate loading state + const statusUnsubscribe = subscription.on(`status:change`, (event) => { + // TODO: For now we are setting this loading state whenever the subscription + // status changes to 'loadingSubset'. But we have discussed it only happening + // when the the live query has it's offset/limit changed, and that triggers the + // subscription to request a snapshot. This will require more work to implement, + // and builds on https://github.com/TanStack/db/pull/663 which this PR + // does not yet depend on. + if (event.status === `loadingSubset`) { + // Guard against duplicate transitions + if (!this.subscriptionLoadingPromises.has(subscription)) { + let resolve: () => void + const promise = new Promise((res) => { + resolve = res + }) + + this.subscriptionLoadingPromises.set(subscription, { + resolve: resolve!, + }) + this.collectionConfigBuilder.liveQueryCollection!._sync.trackLoadPromise( + promise + ) + } + } else { + // status is 'ready' + const deferred = this.subscriptionLoadingPromises.get(subscription) + if (deferred) { + // Clear the map entry FIRST (before resolving) + this.subscriptionLoadingPromises.delete(subscription) + deferred.resolve() + } + } + }) + const unsubscribe = () => { + // If subscription has a pending promise, resolve it before unsubscribing + const deferred = this.subscriptionLoadingPromises.get(subscription) + if (deferred) { + // Clear the map entry FIRST (before resolving) + this.subscriptionLoadingPromises.delete(subscription) + deferred.resolve() + } + + statusUnsubscribe() subscription.unsubscribe() } // currentSyncState is always defined when subscribe() is called diff --git a/packages/db/src/types.ts b/packages/db/src/types.ts index 5ce991a834..73c1fc4fea 100644 --- a/packages/db/src/types.ts +++ b/packages/db/src/types.ts @@ -3,6 +3,7 @@ import type { Collection } from "./collection/index.js" import type { StandardSchemaV1 } from "@standard-schema/spec" import type { Transaction } from "./transactions" import type { BasicExpression, OrderBy } from "./query/ir.js" +import type { EventEmitter } from "./event-emitter.js" /** * Helper type to extract the output type from a standard schema @@ -150,17 +151,83 @@ export type Row = Record> export type OperationType = `insert` | `update` | `delete` -export type OnLoadMoreOptions = { +/** + * Subscription status values + */ +export type SubscriptionStatus = `ready` | `loadingSubset` + +/** + * Event emitted when subscription status changes + */ +export interface SubscriptionStatusChangeEvent { + type: `status:change` + subscription: Subscription + previousStatus: SubscriptionStatus + status: SubscriptionStatus +} + +/** + * Event emitted when subscription status changes to a specific status + */ +export interface SubscriptionStatusEvent { + type: `status:${T}` + subscription: Subscription + previousStatus: SubscriptionStatus + status: T +} + +/** + * Event emitted when subscription is unsubscribed + */ +export interface SubscriptionUnsubscribedEvent { + type: `unsubscribed` + subscription: Subscription +} + +/** + * All subscription events + */ +export type SubscriptionEvents = { + "status:change": SubscriptionStatusChangeEvent + "status:ready": SubscriptionStatusEvent<`ready`> + "status:loadingSubset": SubscriptionStatusEvent<`loadingSubset`> + unsubscribed: SubscriptionUnsubscribedEvent +} + +/** + * Public interface for a collection subscription + * Used by sync implementations to track subscription lifecycle + */ +export interface Subscription extends EventEmitter { + /** Current status of the subscription */ + readonly status: SubscriptionStatus +} + +export type LoadSubsetOptions = { + /** The where expression to filter the data */ where?: BasicExpression + /** The order by clause to sort the data */ orderBy?: OrderBy + /** The limit of the data to load */ limit?: number + /** + * The subscription that triggered the load. + * Advanced sync implementations can use this for: + * - LRU caching keyed by subscription + * - Reference counting to track active subscriptions + * - Subscribing to subscription events (e.g., finalization/unsubscribe) + * @optional Available when called from CollectionSubscription, may be undefined for direct calls + */ + subscription?: Subscription } +export type LoadSubsetFn = (options: LoadSubsetOptions) => true | Promise + export type CleanupFn = () => void export type SyncConfigRes = { cleanup?: CleanupFn - onLoadMore?: (options: OnLoadMoreOptions) => void | Promise + loadSubset?: LoadSubsetFn } export interface SyncConfig< T extends object = Record, @@ -313,6 +380,8 @@ export type CollectionStatus = /** Collection has been cleaned up and resources freed */ | `cleaned-up` +export type SyncMode = `eager` | `on-demand` + export interface BaseCollectionConfig< T extends object = Record, TKey extends string | number = string | number, @@ -374,6 +443,15 @@ export interface BaseCollectionConfig< * compare: (x, y) => x.createdAt.getTime() - y.createdAt.getTime() */ compare?: (x: T, y: T) => number + /** + * The mode of sync to use for the collection. + * @default `eager` + * @description + * - `eager`: syncs all data immediately on preload + * - `on-demand`: syncs data in incremental snapshots when the collection is queried + * The exact implementation of the sync mode is up to the sync implementation. + */ + syncMode?: SyncMode /** * Optional asynchronous handler function called before an insert operation * @param params Object containing transaction and collection information diff --git a/packages/db/tests/collection-subscription.test.ts b/packages/db/tests/collection-subscription.test.ts new file mode 100644 index 0000000000..0b9e093846 --- /dev/null +++ b/packages/db/tests/collection-subscription.test.ts @@ -0,0 +1,276 @@ +import { describe, expect, it } from "vitest" +import { createCollection } from "../src/collection/index.js" +import { flushPromises } from "./utils" + +describe(`CollectionSubscription status tracking`, () => { + it(`subscription starts with status 'ready'`, () => { + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + sync: { + sync: ({ markReady }) => { + markReady() + }, + }, + }) + + const subscription = collection.subscribeChanges(() => {}) + + expect(subscription.status).toBe(`ready`) + subscription.unsubscribe() + }) + + it(`status changes to 'loadingSubset' when requestSnapshot triggers a promise`, async () => { + let resolveLoadSubset: () => void + const loadSubsetPromise = new Promise((resolve) => { + resolveLoadSubset = resolve + }) + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => loadSubsetPromise, + } + }, + }, + }) + + const subscription = collection.subscribeChanges(() => {}, { + includeInitialState: false, + }) + + expect(subscription.status).toBe(`ready`) + + // Trigger a snapshot request that will call loadSubset + subscription.requestSnapshot({ optimizedOnly: false }) + + // Status should now be loadingSubset + expect(subscription.status).toBe(`loadingSubset`) + + // Resolve the load more promise + resolveLoadSubset!() + await flushPromises() + + // Status should be back to ready + expect(subscription.status).toBe(`ready`) + + subscription.unsubscribe() + }) + + it(`status changes back to 'ready' when promise resolves`, async () => { + let resolveLoadSubset: () => void + const loadSubsetPromise = new Promise((resolve) => { + resolveLoadSubset = resolve + }) + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => loadSubsetPromise, + } + }, + }, + }) + + const subscription = collection.subscribeChanges(() => {}, { + includeInitialState: false, + }) + + subscription.requestSnapshot({ optimizedOnly: false }) + expect(subscription.status).toBe(`loadingSubset`) + + resolveLoadSubset!() + await flushPromises() + + expect(subscription.status).toBe(`ready`) + subscription.unsubscribe() + }) + + it(`concurrent promises keep status as 'loadingSubset' until all resolve`, async () => { + let resolveLoadSubset1: () => void + let resolveLoadSubset2: () => void + let callCount = 0 + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => { + callCount++ + if (callCount === 1) { + return new Promise((resolve) => { + resolveLoadSubset1 = resolve + }) + } else { + return new Promise((resolve) => { + resolveLoadSubset2 = resolve + }) + } + }, + } + }, + }, + }) + + const subscription = collection.subscribeChanges(() => {}, { + includeInitialState: false, + }) + + // Trigger first load + subscription.requestSnapshot({ optimizedOnly: false }) + expect(subscription.status).toBe(`loadingSubset`) + + // Trigger second load + subscription.requestSnapshot({ optimizedOnly: false }) + expect(subscription.status).toBe(`loadingSubset`) + + // Resolve first promise + resolveLoadSubset1!() + await flushPromises() + + // Should still be loading because second promise is pending + expect(subscription.status).toBe(`loadingSubset`) + + // Resolve second promise + resolveLoadSubset2!() + await flushPromises() + + // Now should be ready + expect(subscription.status).toBe(`ready`) + subscription.unsubscribe() + }) + + it(`emits 'status:change' event`, async () => { + let resolveLoadSubset: () => void + const loadSubsetPromise = new Promise((resolve) => { + resolveLoadSubset = resolve + }) + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => loadSubsetPromise, + } + }, + }, + }) + + const subscription = collection.subscribeChanges(() => {}, { + includeInitialState: false, + }) + + const statusChanges: Array<{ previous: string; current: string }> = [] + + subscription.on(`status:change`, (event) => { + statusChanges.push({ + previous: event.previousStatus, + current: event.status, + }) + }) + + subscription.requestSnapshot({ optimizedOnly: false }) + await flushPromises() + + expect(statusChanges).toHaveLength(1) + expect(statusChanges[0]).toEqual({ + previous: `ready`, + current: `loadingSubset`, + }) + + resolveLoadSubset!() + await flushPromises() + + expect(statusChanges).toHaveLength(2) + expect(statusChanges[1]).toEqual({ + previous: `loadingSubset`, + current: `ready`, + }) + + subscription.unsubscribe() + }) + + it(`promise rejection still cleans up and sets status back to 'ready'`, async () => { + let rejectLoadSubset: (error: Error) => void + const loadSubsetPromise = new Promise((_, reject) => { + rejectLoadSubset = reject + }) + // Attach catch handler before rejecting to avoid unhandled rejection + const handledPromise = loadSubsetPromise.catch(() => {}) + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => handledPromise, + } + }, + }, + }) + + const subscription = collection.subscribeChanges(() => {}, { + includeInitialState: false, + }) + + subscription.requestSnapshot({ optimizedOnly: false }) + expect(subscription.status).toBe(`loadingSubset`) + + // Reject the promise + rejectLoadSubset!(new Error(`Load failed`)) + await flushPromises() + + // Status should still be back to ready + expect(subscription.status).toBe(`ready`) + subscription.unsubscribe() + }) + + it(`unsubscribe clears event listeners`, () => { + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + sync: { + sync: ({ markReady }) => { + markReady() + }, + }, + }) + + const subscription = collection.subscribeChanges(() => {}, { + includeInitialState: false, + }) + + let eventCount = 0 + subscription.on(`status:change`, () => { + eventCount++ + }) + + subscription.unsubscribe() + + // After unsubscribe, listeners should be cleared + // We can't easily verify this without accessing private members, + // but we can at least verify unsubscribe doesn't throw + expect(eventCount).toBe(0) + }) +}) diff --git a/packages/db/tests/collection.test.ts b/packages/db/tests/collection.test.ts index 77b74ec751..a5a94fb064 100644 --- a/packages/db/tests/collection.test.ts +++ b/packages/db/tests/collection.test.ts @@ -1356,3 +1356,239 @@ describe(`Collection`, () => { expect(state.size).toBe(3) }) }) + +describe(`Collection isLoadingSubset property`, () => { + it(`isLoadingSubset is false initially`, () => { + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + sync: { + sync: ({ markReady }) => { + markReady() + }, + }, + }) + + expect(collection.isLoadingSubset).toBe(false) + }) + + it(`isLoadingSubset becomes true when loadSubset returns a promise`, async () => { + let resolveLoadSubset: () => void + const loadSubsetPromise = new Promise((resolve) => { + resolveLoadSubset = resolve + }) + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + startSync: true, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => loadSubsetPromise, + } + }, + }, + }) + + expect(collection.isLoadingSubset).toBe(false) + + collection._sync.loadSubset({}) + expect(collection.isLoadingSubset).toBe(true) + + resolveLoadSubset!() + await flushPromises() + + expect(collection.isLoadingSubset).toBe(false) + }) + + it(`isLoadingSubset becomes false when promise resolves`, async () => { + let resolveLoadSubset: () => void + const loadSubsetPromise = new Promise((resolve) => { + resolveLoadSubset = resolve + }) + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + startSync: true, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => loadSubsetPromise, + } + }, + }, + }) + + collection._sync.loadSubset({}) + expect(collection.isLoadingSubset).toBe(true) + + resolveLoadSubset!() + await flushPromises() + + expect(collection.isLoadingSubset).toBe(false) + }) + + it(`concurrent loadSubset calls keep isLoadingSubset true until all resolve`, async () => { + let resolveLoadSubset1: () => void + let resolveLoadSubset2: () => void + let callCount = 0 + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + startSync: true, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => { + callCount++ + if (callCount === 1) { + return new Promise((resolve) => { + resolveLoadSubset1 = resolve + }) + } else { + return new Promise((resolve) => { + resolveLoadSubset2 = resolve + }) + } + }, + } + }, + }, + }) + + collection._sync.loadSubset({}) + collection._sync.loadSubset({}) + + expect(collection.isLoadingSubset).toBe(true) + + resolveLoadSubset1!() + await flushPromises() + + // Should still be loading because second promise is pending + expect(collection.isLoadingSubset).toBe(true) + + resolveLoadSubset2!() + await flushPromises() + + // Now should be false + expect(collection.isLoadingSubset).toBe(false) + }) + + it(`emits loadingSubset:change event`, async () => { + let resolveLoadSubset: () => void + const loadSubsetPromise = new Promise((resolve) => { + resolveLoadSubset = resolve + }) + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + startSync: true, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => loadSubsetPromise, + } + }, + }, + }) + + const loadingChanges: Array<{ + isLoadingSubset: boolean + previousIsLoadingSubset: boolean + }> = [] + + collection.on(`loadingSubset:change`, (event) => { + loadingChanges.push({ + isLoadingSubset: event.isLoadingSubset, + previousIsLoadingSubset: event.previousIsLoadingSubset, + }) + }) + + collection._sync.loadSubset({}) + await flushPromises() + + expect(loadingChanges).toHaveLength(1) + expect(loadingChanges[0]).toEqual({ + isLoadingSubset: true, + previousIsLoadingSubset: false, + }) + + resolveLoadSubset!() + await flushPromises() + + expect(loadingChanges).toHaveLength(2) + expect(loadingChanges[1]).toEqual({ + isLoadingSubset: false, + previousIsLoadingSubset: true, + }) + }) + + it(`rejected promises still clean up`, async () => { + let rejectLoadSubset: (error: Error) => void + const loadSubsetPromise = new Promise((_, reject) => { + rejectLoadSubset = reject + }) + // Attach catch handler before rejecting to avoid unhandled rejection + const handledPromise = loadSubsetPromise.catch(() => {}) + + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + startSync: true, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => handledPromise, + } + }, + }, + }) + + collection._sync.loadSubset({}) + expect(collection.isLoadingSubset).toBe(true) + + // Reject the promise + rejectLoadSubset!(new Error(`Load failed`)) + await flushPromises() + + expect(collection.isLoadingSubset).toBe(false) + }) + + it(`isLoadingSubset stays false when loadSubset returns true (no work to do)`, () => { + const collection = createCollection<{ id: string; value: string }>({ + id: `test`, + getKey: (item) => item.id, + syncMode: `on-demand`, + startSync: true, + sync: { + sync: ({ markReady }) => { + markReady() + return { + loadSubset: () => true, // No work to do + } + }, + }, + }) + + expect(collection.isLoadingSubset).toBe(false) + + // Call loadSubset - it should return true and not track any promise + const result = collection._sync.loadSubset({}) + expect(result).toBe(true) + expect(collection.isLoadingSubset).toBe(false) + }) +}) diff --git a/packages/db/tests/query/live-query-collection.test.ts b/packages/db/tests/query/live-query-collection.test.ts index 7e7a31b202..87f407f2cd 100644 --- a/packages/db/tests/query/live-query-collection.test.ts +++ b/packages/db/tests/query/live-query-collection.test.ts @@ -939,6 +939,95 @@ describe(`createLiveQueryCollection`, () => { }) }) + describe(`isLoadingSubset integration`, () => { + it(`live query result collection has isLoadingSubset property`, async () => { + const sourceCollection = createCollection<{ id: string; value: string }>({ + id: `source`, + getKey: (item) => item.id, + sync: { + sync: ({ markReady }) => { + markReady() + }, + }, + }) + + const liveQuery = createLiveQueryCollection((q) => + q.from({ item: sourceCollection }) + ) + + await liveQuery.preload() + + expect(liveQuery.isLoadingSubset).toBeDefined() + expect(liveQuery.isLoadingSubset).toBe(false) + }) + + it(`isLoadingSubset property exists and starts as false`, async () => { + const sourceCollection = createCollection<{ id: string; value: string }>({ + id: `source`, + getKey: (item) => item.id, + sync: { + sync: ({ markReady }) => { + markReady() + }, + }, + }) + + const liveQuery = createLiveQueryCollection({ + query: (q) => q.from({ item: sourceCollection }), + startSync: true, + }) + + await liveQuery.preload() + + expect(liveQuery.isLoadingSubset).toBe(false) + }) + + it(`source collection isLoadingSubset is independent`, async () => { + let resolveLoadSubset: () => void + const loadSubsetPromise = new Promise((resolve) => { + resolveLoadSubset = resolve + }) + + const sourceCollection = createCollection<{ id: string; value: number }>({ + id: `source`, + getKey: (item) => item.id, + syncMode: `on-demand`, + sync: { + sync: ({ markReady, begin, write, commit }) => { + begin() + write({ type: `insert`, value: { id: `1`, value: 1 } }) + commit() + markReady() + return { + loadSubset: () => loadSubsetPromise, + } + }, + }, + }) + + const liveQuery = createLiveQueryCollection({ + query: (q) => q.from({ item: sourceCollection }), + startSync: true, + }) + + await liveQuery.preload() + + // Calling loadSubset directly on source collection sets its own isLoadingSubset + sourceCollection._sync.loadSubset({}) + expect(sourceCollection.isLoadingSubset).toBe(true) + + // But live query isLoadingSubset tracks subscription-driven loads, not direct loadSubset calls + // so it remains false unless subscriptions trigger loads via predicate pushdown + expect(liveQuery.isLoadingSubset).toBe(false) + + resolveLoadSubset!() + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(sourceCollection.isLoadingSubset).toBe(false) + expect(liveQuery.isLoadingSubset).toBe(false) + }) + }) + describe(`move functionality`, () => { it(`should support moving orderBy window past current window using move function`, async () => { // Create a collection with more users for testing window movement @@ -1462,5 +1551,159 @@ describe(`createLiveQueryCollection`, () => { `Post F`, ]) }) + + it(`setWindow returns true when no subset loading is triggered`, async () => { + const extendedUsers = createCollection( + mockSyncCollectionOptions({ + id: `users-no-loading`, + getKey: (user) => user.id, + initialData: [ + { id: 1, name: `Alice`, active: true }, + { id: 2, name: `Bob`, active: true }, + { id: 3, name: `Charlie`, active: true }, + ], + }) + ) + + const activeUsers = createLiveQueryCollection((q) => + q + .from({ user: extendedUsers }) + .where(({ user }) => eq(user.active, true)) + .orderBy(({ user }) => user.name, `asc`) + .limit(2) + ) + + await activeUsers.preload() + + // setWindow should return true when no loading is triggered + const result = activeUsers.utils.setWindow({ offset: 1, limit: 2 }) + expect(result).toBe(true) + }) + + it(`setWindow returns and resolves a Promise when async loading is triggered`, async () => { + // This is an integration test that validates the full async flow: + // 1. setWindow triggers loading more data + // 2. Returns a Promise (not true) + // 3. The Promise waits for loading to complete + // 4. The Promise resolves once loading is done + + vi.useFakeTimers() + + try { + let loadSubsetCallCount = 0 + + const sourceCollection = createCollection<{ + id: number + value: number + }>({ + id: `source-async-subset-loading`, + getKey: (item) => item.id, + syncMode: `on-demand`, + startSync: true, + sync: { + sync: ({ markReady, begin, write, commit }) => { + // Provide minimal initial data + begin() + write({ type: `insert`, value: { id: 1, value: 1 } }) + write({ type: `insert`, value: { id: 2, value: 2 } }) + write({ type: `insert`, value: { id: 3, value: 3 } }) + commit() + markReady() + + return { + loadSubset: () => { + loadSubsetCallCount++ + + // First call is for the initial window request + if (loadSubsetCallCount === 1) { + return true + } + + // Second call (triggered by setWindow) returns a promise + const loadPromise = new Promise((resolve) => { + // Simulate async data loading with a delay + setTimeout(() => { + begin() + // Load additional items that would be needed for the new window + write({ type: `insert`, value: { id: 4, value: 4 } }) + write({ type: `insert`, value: { id: 5, value: 5 } }) + write({ type: `insert`, value: { id: 6, value: 6 } }) + commit() + resolve() + }, 50) + }) + + return loadPromise + }, + } + }, + }, + }) + + const liveQuery = createLiveQueryCollection({ + query: (q) => + q + .from({ item: sourceCollection }) + .orderBy(({ item }) => item.value, `asc`) + .limit(2) + .offset(0), + startSync: true, + }) + + await liveQuery.preload() + + // Initial state: should have 2 items (values 1, 2) + expect(liveQuery.size).toBe(2) + expect(liveQuery.isLoadingSubset).toBe(false) + expect(loadSubsetCallCount).toBe(1) + + // Move window to offset 3, which requires loading more data + // This should trigger loadSubset and return a Promise + const result = liveQuery.utils.setWindow({ offset: 3, limit: 2 }) + + // CRITICAL VALIDATION: result should be a Promise, not true + expect(result).toBeInstanceOf(Promise) + expect(result).not.toBe(true) + + // Advance just a bit to let the scheduler execute and trigger loadSubset + await vi.advanceTimersByTimeAsync(1) + + // Verify that loading was triggered and is in progress + expect(loadSubsetCallCount).toBeGreaterThan(1) + expect(liveQuery.isLoadingSubset).toBe(true) + + // Track when the promise resolves + let promiseResolved = false + if (result !== true) { + result.then(() => { + promiseResolved = true + }) + } + + // Promise should NOT be resolved yet because loading is still in progress + await vi.advanceTimersByTimeAsync(10) + expect(promiseResolved).toBe(false) + expect(liveQuery.isLoadingSubset).toBe(true) + + // Now advance time to complete the loading (50ms total from loadSubset call) + await vi.advanceTimersByTimeAsync(40) + + // Wait for the promise to resolve + if (result !== true) { + await result + } + + // CRITICAL VALIDATION: Promise has resolved and loading is complete + expect(promiseResolved).toBe(true) + expect(liveQuery.isLoadingSubset).toBe(false) + + // Verify the window was successfully moved and has the right data + expect(liveQuery.size).toBe(2) + const items = liveQuery.toArray + expect(items.map((i) => i.value)).toEqual([4, 5]) + } finally { + vi.useRealTimers() + } + }) }) }) diff --git a/packages/react-db/src/index.ts b/packages/react-db/src/index.ts index bd98349f02..bb3cd3ad50 100644 --- a/packages/react-db/src/index.ts +++ b/packages/react-db/src/index.ts @@ -1,5 +1,6 @@ // Re-export all public APIs export * from "./useLiveQuery" +export * from "./useLiveInfiniteQuery" // Re-export everything from @tanstack/db export * from "@tanstack/db" diff --git a/packages/react-db/src/useLiveInfiniteQuery.ts b/packages/react-db/src/useLiveInfiniteQuery.ts new file mode 100644 index 0000000000..1e44fd16ec --- /dev/null +++ b/packages/react-db/src/useLiveInfiniteQuery.ts @@ -0,0 +1,185 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from "react" +import { useLiveQuery } from "./useLiveQuery" +import type { + Context, + InferResultType, + InitialQueryBuilder, + LiveQueryCollectionUtils, + QueryBuilder, +} from "@tanstack/db" + +/** + * Type guard to check if utils object has setWindow method (LiveQueryCollectionUtils) + */ +function isLiveQueryCollectionUtils( + utils: unknown +): utils is LiveQueryCollectionUtils { + return typeof (utils as any).setWindow === `function` +} + +export type UseLiveInfiniteQueryConfig = { + pageSize?: number + initialPageParam?: number + getNextPageParam: ( + lastPage: Array[number]>, + allPages: Array[number]>>, + lastPageParam: number, + allPageParams: Array + ) => number | undefined +} + +export type UseLiveInfiniteQueryReturn = Omit< + ReturnType>, + `data` +> & { + data: InferResultType + pages: Array[number]>> + pageParams: Array + fetchNextPage: () => void + hasNextPage: boolean + isFetchingNextPage: boolean +} + +/** + * Create an infinite query using a query function with live updates + * + * Uses `utils.setWindow()` to dynamically adjust the limit/offset window + * without recreating the live query collection on each page change. + * + * @param queryFn - Query function that defines what data to fetch. Must include `.orderBy()` for setWindow to work. + * @param config - Configuration including pageSize and getNextPageParam + * @param deps - Array of dependencies that trigger query re-execution when changed + * @returns Object with pages, data, and pagination controls + * + * @example + * // Basic infinite query + * const { data, pages, fetchNextPage, hasNextPage } = useLiveInfiniteQuery( + * (q) => q + * .from({ posts: postsCollection }) + * .orderBy(({ posts }) => posts.createdAt, 'desc') + * .select(({ posts }) => ({ + * id: posts.id, + * title: posts.title + * })), + * { + * pageSize: 20, + * getNextPageParam: (lastPage, allPages) => + * lastPage.length === 20 ? allPages.length : undefined + * } + * ) + * + * @example + * // With dependencies + * const { pages, fetchNextPage } = useLiveInfiniteQuery( + * (q) => q + * .from({ posts: postsCollection }) + * .where(({ posts }) => eq(posts.category, category)) + * .orderBy(({ posts }) => posts.createdAt, 'desc'), + * { + * pageSize: 10, + * getNextPageParam: (lastPage) => + * lastPage.length === 10 ? lastPage.length : undefined + * }, + * [category] + * ) + */ +export function useLiveInfiniteQuery( + queryFn: (q: InitialQueryBuilder) => QueryBuilder, + config: UseLiveInfiniteQueryConfig, + deps: Array = [] +): UseLiveInfiniteQueryReturn { + const pageSize = config.pageSize || 20 + const initialPageParam = config.initialPageParam ?? 0 + + // Track how many pages have been loaded + const [loadedPageCount, setLoadedPageCount] = useState(1) + const [isFetchingNextPage, setIsFetchingNextPage] = useState(false) + + // Stringify deps for comparison + const depsKey = JSON.stringify(deps) + const prevDepsKeyRef = useRef(depsKey) + + // Reset page count when dependencies change + useEffect(() => { + if (prevDepsKeyRef.current !== depsKey) { + setLoadedPageCount(1) + prevDepsKeyRef.current = depsKey + } + }, [depsKey]) + + // Create a live query with initial limit and offset + // The query function is wrapped to add limit/offset to the query + const queryResult = useLiveQuery( + (q) => queryFn(q).limit(pageSize).offset(0), + deps + ) + + // Update the window when loadedPageCount changes + // We fetch one extra item to peek if there's a next page + useEffect(() => { + const newLimit = loadedPageCount * pageSize + 1 // +1 to peek ahead + const utils = queryResult.collection.utils + // setWindow is available on live query collections with orderBy + if (isLiveQueryCollectionUtils(utils)) { + const result = utils.setWindow({ offset: 0, limit: newLimit }) + // setWindow returns true if data is immediately available, or Promise if loading + if (result !== true) { + setIsFetchingNextPage(true) + result.then(() => { + setIsFetchingNextPage(false) + }) + } else { + setIsFetchingNextPage(false) + } + } + }, [loadedPageCount, pageSize, queryResult.collection]) + + // Split the data array into pages and determine if there's a next page + const { pages, pageParams, hasNextPage, flatData } = useMemo(() => { + const dataArray = queryResult.data as InferResultType + const totalItemsRequested = loadedPageCount * pageSize + + // Check if we have more data than requested (the peek ahead item) + const hasMore = dataArray.length > totalItemsRequested + + // Build pages array (without the peek ahead item) + const pagesResult: Array[number]>> = [] + const pageParamsResult: Array = [] + + for (let i = 0; i < loadedPageCount; i++) { + const pageData = dataArray.slice(i * pageSize, (i + 1) * pageSize) + pagesResult.push(pageData) + pageParamsResult.push(initialPageParam + i) + } + + // Flatten the pages for the data return (without peek ahead item) + const flatDataResult = dataArray.slice( + 0, + totalItemsRequested + ) as InferResultType + + return { + pages: pagesResult, + pageParams: pageParamsResult, + hasNextPage: hasMore, + flatData: flatDataResult, + } + }, [queryResult.data, loadedPageCount, pageSize, initialPageParam]) + + // Fetch next page + const fetchNextPage = useCallback(() => { + if (!hasNextPage || isFetchingNextPage) return + + setLoadedPageCount((prev) => prev + 1) + }, [hasNextPage, isFetchingNextPage]) + + return { + ...queryResult, + data: flatData, + pages, + pageParams, + fetchNextPage, + hasNextPage, + isFetchingNextPage, + } +} diff --git a/packages/react-db/tests/useLiveInfiniteQuery.test.tsx b/packages/react-db/tests/useLiveInfiniteQuery.test.tsx new file mode 100644 index 0000000000..0a8c3eeca7 --- /dev/null +++ b/packages/react-db/tests/useLiveInfiniteQuery.test.tsx @@ -0,0 +1,967 @@ +import { describe, expect, it } from "vitest" +import { act, renderHook, waitFor } from "@testing-library/react" +import { createCollection, eq } from "@tanstack/db" +import { useLiveInfiniteQuery } from "../src/useLiveInfiniteQuery" +import { mockSyncCollectionOptions } from "../../db/tests/utils" + +type Post = { + id: string + title: string + content: string + createdAt: number + category: string +} + +const createMockPosts = (count: number): Array => { + const posts: Array = [] + for (let i = 1; i <= count; i++) { + posts.push({ + id: `${i}`, + title: `Post ${i}`, + content: `Content ${i}`, + createdAt: 1000000 - i * 1000, // Descending order + category: i % 2 === 0 ? `tech` : `life`, + }) + } + return posts +} + +describe(`useLiveInfiniteQuery`, () => { + it(`should fetch initial page of data`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `initial-page-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`) + .select(({ posts: p }) => ({ + id: p.id, + title: p.title, + createdAt: p.createdAt, + })), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Should have 1 page initially + expect(result.current.pages).toHaveLength(1) + expect(result.current.pages[0]).toHaveLength(10) + + // Data should be flattened + expect(result.current.data).toHaveLength(10) + + // Should have next page since we have 50 items total + expect(result.current.hasNextPage).toBe(true) + + // First item should be Post 1 (most recent by createdAt) + expect(result.current.pages[0]![0]).toMatchObject({ + id: `1`, + title: `Post 1`, + }) + }) + + it(`should fetch multiple pages`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `multiple-pages-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Initially 1 page + expect(result.current.pages).toHaveLength(1) + expect(result.current.hasNextPage).toBe(true) + + // Fetch next page + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + expect(result.current.pages[0]).toHaveLength(10) + expect(result.current.pages[1]).toHaveLength(10) + expect(result.current.data).toHaveLength(20) + expect(result.current.hasNextPage).toBe(true) + + // Fetch another page + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(3) + }) + + expect(result.current.data).toHaveLength(30) + expect(result.current.hasNextPage).toBe(true) + }) + + it(`should detect when no more pages available`, async () => { + const posts = createMockPosts(25) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `no-more-pages-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Page 1: 10 items, has more + expect(result.current.pages).toHaveLength(1) + expect(result.current.hasNextPage).toBe(true) + + // Fetch page 2 + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + // Page 2: 10 items, has more + expect(result.current.pages[1]).toHaveLength(10) + expect(result.current.hasNextPage).toBe(true) + + // Fetch page 3 + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(3) + }) + + // Page 3: 5 items, no more + expect(result.current.pages[2]).toHaveLength(5) + expect(result.current.data).toHaveLength(25) + expect(result.current.hasNextPage).toBe(false) + }) + + it(`should handle empty results`, async () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `empty-results-test`, + getKey: (post: Post) => post.id, + initialData: [], + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // With no data, we still have 1 page (which is empty) + expect(result.current.pages).toHaveLength(1) + expect(result.current.pages[0]).toHaveLength(0) + expect(result.current.data).toHaveLength(0) + expect(result.current.hasNextPage).toBe(false) + }) + + it(`should update pages when underlying data changes`, async () => { + const posts = createMockPosts(30) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `live-updates-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Fetch 2 pages + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + expect(result.current.data).toHaveLength(20) + + // Insert a new post with most recent timestamp + act(() => { + collection.utils.begin() + collection.utils.write({ + type: `insert`, + value: { + id: `new-1`, + title: `New Post`, + content: `New Content`, + createdAt: 1000001, // Most recent + category: `tech`, + }, + }) + collection.utils.commit() + }) + + await waitFor(() => { + // New post should be first + expect(result.current.pages[0]![0]).toMatchObject({ + id: `new-1`, + title: `New Post`, + }) + }) + + // Still showing 2 pages (20 items), but content has shifted + // The new item is included, pushing the last item out of view + expect(result.current.pages).toHaveLength(2) + expect(result.current.data).toHaveLength(20) + expect(result.current.pages[0]).toHaveLength(10) + expect(result.current.pages[1]).toHaveLength(10) + }) + + it(`should handle deletions across pages`, async () => { + const posts = createMockPosts(25) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `deletions-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Fetch 2 pages + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + expect(result.current.data).toHaveLength(20) + const firstItemId = result.current.data[0]!.id + + // Delete the first item + act(() => { + collection.utils.begin() + collection.utils.write({ + type: `delete`, + value: posts[0]!, + }) + collection.utils.commit() + }) + + await waitFor(() => { + // First item should have changed + expect(result.current.data[0]!.id).not.toBe(firstItemId) + }) + + // Still showing 2 pages, each pulls from remaining 24 items + // Page 1: items 0-9 (10 items) + // Page 2: items 10-19 (10 items) + // Total: 20 items (item 20-23 are beyond our loaded pages) + expect(result.current.pages).toHaveLength(2) + expect(result.current.data).toHaveLength(20) + expect(result.current.pages[0]).toHaveLength(10) + expect(result.current.pages[1]).toHaveLength(10) + }) + + it(`should work with where clauses`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `where-clause-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .where(({ posts: p }) => eq(p.category, `tech`)) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 5, + getNextPageParam: (lastPage) => + lastPage.length === 5 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Should only have tech posts (every even ID) + expect(result.current.pages).toHaveLength(1) + expect(result.current.pages[0]).toHaveLength(5) + + // All items should be tech category + result.current.pages[0]!.forEach((post) => { + expect(post.category).toBe(`tech`) + }) + + // Should have more pages + expect(result.current.hasNextPage).toBe(true) + + // Fetch next page + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + expect(result.current.data).toHaveLength(10) + }) + + it(`should re-execute query when dependencies change`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `deps-change-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result, rerender } = renderHook( + ({ category }: { category: string }) => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .where(({ posts: p }) => eq(p.category, category)) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 5, + getNextPageParam: (lastPage) => + lastPage.length === 5 ? lastPage.length : undefined, + }, + [category] + ) + }, + { initialProps: { category: `tech` } } + ) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Fetch 2 pages of tech posts + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + // Change category to life + act(() => { + rerender({ category: `life` }) + }) + + await waitFor(() => { + // Should reset to 1 page with life posts + expect(result.current.pages).toHaveLength(1) + }) + + // All items should be life category + result.current.pages[0]!.forEach((post) => { + expect(post.category).toBe(`life`) + }) + }) + + it(`should track pageParams correctly`, async () => { + const posts = createMockPosts(30) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `page-params-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + initialPageParam: 0, + getNextPageParam: (lastPage, allPages, lastPageParam) => + lastPage.length === 10 ? lastPageParam + 1 : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + expect(result.current.pageParams).toEqual([0]) + + // Fetch next page + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pageParams).toEqual([0, 1]) + }) + + // Fetch another page + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pageParams).toEqual([0, 1, 2]) + }) + }) + + it(`should handle exact page size boundaries`, async () => { + const posts = createMockPosts(20) // Exactly 2 pages + const collection = createCollection( + mockSyncCollectionOptions({ + id: `exact-boundary-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + // Better getNextPageParam that checks against total data available + getNextPageParam: (lastPage, allPages) => { + // If last page is not full, we're done + if (lastPage.length < 10) return undefined + // Check if we've likely loaded all data (this is a heuristic) + // In a real app with backend, you'd check response metadata + const totalLoaded = allPages.flat().length + // If we have less than a full page left, no more pages + return totalLoaded + }, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + expect(result.current.hasNextPage).toBe(true) + + // Fetch page 2 + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + expect(result.current.pages[1]).toHaveLength(10) + // With setWindow peek-ahead, we can now detect no more pages immediately + // We request 21 items (2 * 10 + 1 peek) but only get 20, so we know there's no more + expect(result.current.hasNextPage).toBe(false) + + // Verify total data + expect(result.current.data).toHaveLength(20) + }) + + it(`should not fetch when already fetching`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `concurrent-fetch-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + expect(result.current.pages).toHaveLength(1) + + // With sync data, all fetches complete immediately, so all 3 calls will succeed + // The key is that they won't cause race conditions or errors + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(3) + }) + + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(4) + }) + + // All fetches should have succeeded + expect(result.current.pages).toHaveLength(4) + expect(result.current.data).toHaveLength(40) + }) + + it(`should not fetch when hasNextPage is false`, async () => { + const posts = createMockPosts(5) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `no-fetch-when-done-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + expect(result.current.hasNextPage).toBe(false) + expect(result.current.pages).toHaveLength(1) + + // Try to fetch when there's no next page + act(() => { + result.current.fetchNextPage() + }) + + await new Promise((resolve) => setTimeout(resolve, 50)) + + // Should still have only 1 page + expect(result.current.pages).toHaveLength(1) + }) + + it(`should support custom initialPageParam`, async () => { + const posts = createMockPosts(30) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `initial-param-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + initialPageParam: 100, + getNextPageParam: (lastPage, allPages, lastPageParam) => + lastPage.length === 10 ? lastPageParam + 1 : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + expect(result.current.pageParams).toEqual([100]) + + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pageParams).toEqual([100, 101]) + }) + }) + + it(`should detect hasNextPage change when new items are synced`, async () => { + // Start with exactly 20 items (2 pages) + const posts = createMockPosts(20) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `sync-detection-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Load both pages + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + // Should have no next page (exactly 20 items, 2 full pages, peek returns nothing) + expect(result.current.hasNextPage).toBe(false) + expect(result.current.data).toHaveLength(20) + + // Add 5 more items to the collection + act(() => { + collection.utils.begin() + for (let i = 0; i < 5; i++) { + collection.utils.write({ + type: `insert`, + value: { + id: `new-${i}`, + title: `New Post ${i}`, + content: `Content ${i}`, + createdAt: Date.now() + i, + category: `tech`, + }, + }) + } + collection.utils.commit() + }) + + // Should now detect that there's a next page available + await waitFor(() => { + expect(result.current.hasNextPage).toBe(true) + }) + + // Data should still be 20 items (we haven't fetched the next page yet) + expect(result.current.data).toHaveLength(20) + expect(result.current.pages).toHaveLength(2) + + // Fetch the next page + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(3) + }) + + // Third page should have the new items + expect(result.current.pages[2]).toHaveLength(5) + expect(result.current.data).toHaveLength(25) + + // No more pages available now + expect(result.current.hasNextPage).toBe(false) + }) + + it(`should set isFetchingNextPage to false when data is immediately available`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `immediate-data-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Initially 1 page and not fetching + expect(result.current.pages).toHaveLength(1) + expect(result.current.isFetchingNextPage).toBe(false) + + // Fetch next page - should remain false because data is immediately available + act(() => { + result.current.fetchNextPage() + }) + + // Since data is *synchronously* available, isFetchingNextPage should be false + expect(result.current.pages).toHaveLength(2) + expect(result.current.isFetchingNextPage).toBe(false) + }) + + it(`should track isFetchingNextPage when async loading is triggered`, async () => { + let loadSubsetCallCount = 0 + + const collection = createCollection({ + id: `async-loading-test`, + getKey: (post: Post) => post.id, + syncMode: `on-demand`, + startSync: true, + sync: { + sync: ({ markReady, begin, write, commit }) => { + // Provide initial data + begin() + for (let i = 1; i <= 15; i++) { + write({ + type: `insert`, + value: { + id: `${i}`, + title: `Post ${i}`, + content: `Content ${i}`, + createdAt: 1000000 - i * 1000, + category: i % 2 === 0 ? `tech` : `life`, + }, + }) + } + commit() + markReady() + + return { + loadSubset: () => { + loadSubsetCallCount++ + + // First few calls return true (initial load + window setup) + if (loadSubsetCallCount <= 2) { + return true + } + + // Subsequent calls simulate async loading with a real timeout + const loadPromise = new Promise((resolve) => { + setTimeout(() => { + begin() + // Load more data + for (let i = 16; i <= 30; i++) { + write({ + type: `insert`, + value: { + id: `${i}`, + title: `Post ${i}`, + content: `Content ${i}`, + createdAt: 1000000 - i * 1000, + category: i % 2 === 0 ? `tech` : `life`, + }, + }) + } + commit() + resolve() + }, 50) + }) + + return loadPromise + }, + } + }, + }, + }) + + const { result } = renderHook(() => { + return useLiveInfiniteQuery( + (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`), + { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + } + ) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Wait for initial window setup to complete + await waitFor(() => { + expect(result.current.isFetchingNextPage).toBe(false) + }) + + expect(result.current.pages).toHaveLength(1) + + // Fetch next page which will trigger async loading + act(() => { + result.current.fetchNextPage() + }) + + // Should be fetching now and so isFetchingNextPage should be true *synchronously!* + expect(result.current.isFetchingNextPage).toBe(true) + + // Wait for loading to complete + await waitFor( + () => { + expect(result.current.isFetchingNextPage).toBe(false) + }, + { timeout: 200 } + ) + + // Should have 2 pages now + expect(result.current.pages).toHaveLength(2) + expect(result.current.data).toHaveLength(20) + }, 10000) +}) From 4cb1093003b0652ddc99c5d3f511d0bcb0ed4d8c Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Wed, 15 Oct 2025 12:17:39 -0600 Subject: [PATCH 41/51] Fix changeset for PR #669 - Update to accurately describe loadSubset features (#679) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix changeset for PR #669 to accurately describe features Updated changeset to correctly describe: - isLoadingSubset property (not isLoadingMore) - loadingSubset:change events - syncMode configuration options - Comprehensive loading state tracking - Enhanced setWindow utility πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude --- .changeset/cruel-buckets-shop.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.changeset/cruel-buckets-shop.md b/.changeset/cruel-buckets-shop.md index b677b56eed..7463b5fc21 100644 --- a/.changeset/cruel-buckets-shop.md +++ b/.changeset/cruel-buckets-shop.md @@ -1,5 +1,14 @@ --- -"@tanstack/db": patch +"@tanstack/db": minor --- -Added `isLoadingMore` property and `loadingMore:change` events to collections and live queries, enabling UIs to display loading indicators when more data is being fetched via `syncMore`. Each live query maintains its own isolated loading state based on its subscriptions, preventing loading status "bleed" between independent queries that share the same source collections. +Added comprehensive loading state tracking and configurable sync modes to collections and live queries: + +- Added `isLoadingSubset` property and `loadingSubset:change` events to all collections for tracking when data is being loaded +- Added `syncMode` configuration option to collections: + - `'eager'` (default): Loads all data immediately during initial sync + - `'on-demand'`: Only loads data as requested via `loadSubset` calls +- Added comprehensive status tracking to collection subscriptions with `status` property (`'ready'` | `'loadingSubset'`) and events (`status:change`, `status:ready`, `status:loadingSubset`, `unsubscribed`) +- Live queries automatically reflect loading state from their source collection subscriptions, with each query maintaining isolated loading state to prevent status "bleed" between independent queries +- Enhanced `setWindow` utility to return `Promise` when loading is triggered, allowing callers to await data loading completion +- Added `subscription` parameter to `loadSubset` handler for advanced sync implementations that need to track subscription lifecycle From c0f06e2d761c83d3301dc8eef142a609625ad229 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Wed, 15 Oct 2025 12:37:08 -0600 Subject: [PATCH 42/51] Change PR #669 changeset from minor to patch (#680) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude --- .changeset/cruel-buckets-shop.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/cruel-buckets-shop.md b/.changeset/cruel-buckets-shop.md index 7463b5fc21..e5ed29d024 100644 --- a/.changeset/cruel-buckets-shop.md +++ b/.changeset/cruel-buckets-shop.md @@ -1,5 +1,5 @@ --- -"@tanstack/db": minor +"@tanstack/db": patch --- Added comprehensive loading state tracking and configurable sync modes to collections and live queries: From 7044f9505cdb793845f86daa611696feffaf1dc5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 12:49:49 -0600 Subject: [PATCH 43/51] ci: Version Packages (#678) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/clever-parks-report.md | 20 ------- .changeset/cruel-buckets-shop.md | 14 ----- .changeset/smooth-goats-ring.md | 58 ------------------ examples/angular/todos/CHANGELOG.md | 8 +++ examples/angular/todos/package.json | 2 +- examples/react/projects/package.json | 4 +- examples/react/todo/CHANGELOG.md | 10 ++++ examples/react/todo/package.json | 2 +- packages/angular-db/CHANGELOG.md | 7 +++ packages/angular-db/package.json | 2 +- packages/db-ivm/CHANGELOG.md | 20 +++++++ packages/db-ivm/package.json | 2 +- packages/db/CHANGELOG.md | 33 ++++++++++ packages/db/package.json | 2 +- packages/electric-db-collection/CHANGELOG.md | 7 +++ packages/electric-db-collection/package.json | 2 +- packages/query-db-collection/CHANGELOG.md | 7 +++ packages/query-db-collection/package.json | 2 +- packages/react-db/CHANGELOG.md | 60 +++++++++++++++++++ packages/react-db/package.json | 2 +- packages/rxdb-db-collection/CHANGELOG.md | 7 +++ packages/rxdb-db-collection/package.json | 2 +- packages/solid-db/CHANGELOG.md | 7 +++ packages/solid-db/package.json | 2 +- packages/svelte-db/CHANGELOG.md | 7 +++ packages/svelte-db/package.json | 2 +- packages/trailbase-db-collection/CHANGELOG.md | 7 +++ packages/trailbase-db-collection/package.json | 2 +- packages/vue-db/CHANGELOG.md | 7 +++ packages/vue-db/package.json | 2 +- pnpm-lock.yaml | 4 +- 31 files changed, 204 insertions(+), 109 deletions(-) delete mode 100644 .changeset/clever-parks-report.md delete mode 100644 .changeset/cruel-buckets-shop.md delete mode 100644 .changeset/smooth-goats-ring.md diff --git a/.changeset/clever-parks-report.md b/.changeset/clever-parks-report.md deleted file mode 100644 index 63a2ec5630..0000000000 --- a/.changeset/clever-parks-report.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -"@tanstack/db-ivm": patch -"@tanstack/db": patch ---- - -Add `utils.setWindow()` method to live query collections to dynamically change limit and offset on ordered queries. - -You can now change the pagination window of an ordered live query without recreating the collection: - -```ts -const users = createLiveQueryCollection((q) => - q - .from({ user: usersCollection }) - .orderBy(({ user }) => user.name, "asc") - .limit(10) - .offset(0) -) - -users.utils.setWindow({ offset: 10, limit: 10 }) -``` diff --git a/.changeset/cruel-buckets-shop.md b/.changeset/cruel-buckets-shop.md deleted file mode 100644 index e5ed29d024..0000000000 --- a/.changeset/cruel-buckets-shop.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -"@tanstack/db": patch ---- - -Added comprehensive loading state tracking and configurable sync modes to collections and live queries: - -- Added `isLoadingSubset` property and `loadingSubset:change` events to all collections for tracking when data is being loaded -- Added `syncMode` configuration option to collections: - - `'eager'` (default): Loads all data immediately during initial sync - - `'on-demand'`: Only loads data as requested via `loadSubset` calls -- Added comprehensive status tracking to collection subscriptions with `status` property (`'ready'` | `'loadingSubset'`) and events (`status:change`, `status:ready`, `status:loadingSubset`, `unsubscribed`) -- Live queries automatically reflect loading state from their source collection subscriptions, with each query maintaining isolated loading state to prevent status "bleed" between independent queries -- Enhanced `setWindow` utility to return `Promise` when loading is triggered, allowing callers to await data loading completion -- Added `subscription` parameter to `loadSubset` handler for advanced sync implementations that need to track subscription lifecycle diff --git a/.changeset/smooth-goats-ring.md b/.changeset/smooth-goats-ring.md deleted file mode 100644 index 6fc227d340..0000000000 --- a/.changeset/smooth-goats-ring.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -"@tanstack/react-db": patch ---- - -Add `useLiveInfiniteQuery` hook for infinite scrolling with live updates. - -The new `useLiveInfiniteQuery` hook provides an infinite query pattern similar to TanStack Query's `useInfiniteQuery`, but with live updates from your local collection. It uses `liveQueryCollection.utils.setWindow()` internally to efficiently paginate through ordered data without recreating the query on each page fetch. - -**Key features:** - -- Automatic live updates as data changes in the collection -- Efficient pagination using dynamic window adjustment -- Peek-ahead mechanism to detect when more pages are available -- Compatible with TanStack Query's infinite query API patterns - -**Example usage:** - -```tsx -import { useLiveInfiniteQuery } from "@tanstack/react-db" - -function PostList() { - const { data, pages, fetchNextPage, hasNextPage, isLoading } = - useLiveInfiniteQuery( - (q) => - q - .from({ posts: postsCollection }) - .orderBy(({ posts }) => posts.createdAt, "desc"), - { - pageSize: 20, - getNextPageParam: (lastPage, allPages) => - lastPage.length === 20 ? allPages.length : undefined, - } - ) - - if (isLoading) return
Loading...
- - return ( -
- {pages.map((page, i) => ( -
- {page.map((post) => ( - - ))} -
- ))} - {hasNextPage && ( - - )} -
- ) -} -``` - -**Requirements:** - -- Query must include `.orderBy()` for the window mechanism to work -- Returns flattened `data` array and `pages` array for flexible rendering -- Automatically detects new pages when data is synced to the collection diff --git a/examples/angular/todos/CHANGELOG.md b/examples/angular/todos/CHANGELOG.md index cb93bb5e85..8e2724a5a7 100644 --- a/examples/angular/todos/CHANGELOG.md +++ b/examples/angular/todos/CHANGELOG.md @@ -1,5 +1,13 @@ # todos +## 0.0.11 + +### Patch Changes + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + - @tanstack/angular-db@0.1.15 + ## 0.0.10 ### Patch Changes diff --git a/examples/angular/todos/package.json b/examples/angular/todos/package.json index f41e2bcc93..0680ebf359 100644 --- a/examples/angular/todos/package.json +++ b/examples/angular/todos/package.json @@ -1,6 +1,6 @@ { "name": "todos", - "version": "0.0.10", + "version": "0.0.11", "scripts": { "ng": "ng", "start": "ng serve", diff --git a/examples/react/projects/package.json b/examples/react/projects/package.json index 49eb701ca1..bab49c39aa 100644 --- a/examples/react/projects/package.json +++ b/examples/react/projects/package.json @@ -17,8 +17,8 @@ "dependencies": { "@tailwindcss/vite": "^4.1.14", "@tanstack/query-core": "^5.90.2", - "@tanstack/query-db-collection": "^0.2.30", - "@tanstack/react-db": "^0.1.31", + "@tanstack/query-db-collection": "^0.2.31", + "@tanstack/react-db": "^0.1.32", "@tanstack/react-router": "^1.132.47", "@tanstack/react-router-devtools": "^1.132.51", "@tanstack/react-router-with-query": "^1.130.17", diff --git a/examples/react/todo/CHANGELOG.md b/examples/react/todo/CHANGELOG.md index 443c89e2a6..702ca6329e 100644 --- a/examples/react/todo/CHANGELOG.md +++ b/examples/react/todo/CHANGELOG.md @@ -1,5 +1,15 @@ # examples/react/todo +## 0.1.10 + +### Patch Changes + +- Updated dependencies [[`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/react-db@0.1.32 + - @tanstack/electric-db-collection@0.1.34 + - @tanstack/query-db-collection@0.2.31 + - @tanstack/trailbase-db-collection@0.1.32 + ## 0.1.9 ### Patch Changes diff --git a/examples/react/todo/package.json b/examples/react/todo/package.json index 4af677ca03..84fa09e45c 100644 --- a/examples/react/todo/package.json +++ b/examples/react/todo/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/db-example-react-todo", "private": true, - "version": "0.1.9", + "version": "0.1.10", "dependencies": { "@tanstack/electric-db-collection": "workspace:^", "@tanstack/query-core": "^5.90.2", diff --git a/packages/angular-db/CHANGELOG.md b/packages/angular-db/CHANGELOG.md index 551b5ada4c..761e59fd2e 100644 --- a/packages/angular-db/CHANGELOG.md +++ b/packages/angular-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/angular-db +## 0.1.15 + +### Patch Changes + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + ## 0.1.14 ### Patch Changes diff --git a/packages/angular-db/package.json b/packages/angular-db/package.json index 0e19befefe..36513c2a3d 100644 --- a/packages/angular-db/package.json +++ b/packages/angular-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/angular-db", "description": "Angular integration for @tanstack/db", - "version": "0.1.14", + "version": "0.1.15", "author": "Ethan McDaniel", "license": "MIT", "repository": { diff --git a/packages/db-ivm/CHANGELOG.md b/packages/db-ivm/CHANGELOG.md index d5932c58f6..571175e93a 100644 --- a/packages/db-ivm/CHANGELOG.md +++ b/packages/db-ivm/CHANGELOG.md @@ -1,5 +1,25 @@ # @tanstack/db-ivm +## 0.1.11 + +### Patch Changes + +- Add `utils.setWindow()` method to live query collections to dynamically change limit and offset on ordered queries. ([#663](https://github.com/TanStack/db/pull/663)) + + You can now change the pagination window of an ordered live query without recreating the collection: + + ```ts + const users = createLiveQueryCollection((q) => + q + .from({ user: usersCollection }) + .orderBy(({ user }) => user.name, "asc") + .limit(10) + .offset(0) + ) + + users.utils.setWindow({ offset: 10, limit: 10 }) + ``` + ## 0.1.10 ### Patch Changes diff --git a/packages/db-ivm/package.json b/packages/db-ivm/package.json index c424d7a6bb..e2e722d0c2 100644 --- a/packages/db-ivm/package.json +++ b/packages/db-ivm/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/db-ivm", "description": "Incremental View Maintenance for TanStack DB based on Differential Dataflow", - "version": "0.1.10", + "version": "0.1.11", "dependencies": { "fractional-indexing": "^3.2.0", "sorted-btree": "^1.8.1" diff --git a/packages/db/CHANGELOG.md b/packages/db/CHANGELOG.md index ea42646359..9e9142678b 100644 --- a/packages/db/CHANGELOG.md +++ b/packages/db/CHANGELOG.md @@ -1,5 +1,38 @@ # @tanstack/db +## 0.4.10 + +### Patch Changes + +- Add `utils.setWindow()` method to live query collections to dynamically change limit and offset on ordered queries. ([#663](https://github.com/TanStack/db/pull/663)) + + You can now change the pagination window of an ordered live query without recreating the collection: + + ```ts + const users = createLiveQueryCollection((q) => + q + .from({ user: usersCollection }) + .orderBy(({ user }) => user.name, "asc") + .limit(10) + .offset(0) + ) + + users.utils.setWindow({ offset: 10, limit: 10 }) + ``` + +- Added comprehensive loading state tracking and configurable sync modes to collections and live queries: ([#669](https://github.com/TanStack/db/pull/669)) + - Added `isLoadingSubset` property and `loadingSubset:change` events to all collections for tracking when data is being loaded + - Added `syncMode` configuration option to collections: + - `'eager'` (default): Loads all data immediately during initial sync + - `'on-demand'`: Only loads data as requested via `loadSubset` calls + - Added comprehensive status tracking to collection subscriptions with `status` property (`'ready'` | `'loadingSubset'`) and events (`status:change`, `status:ready`, `status:loadingSubset`, `unsubscribed`) + - Live queries automatically reflect loading state from their source collection subscriptions, with each query maintaining isolated loading state to prevent status "bleed" between independent queries + - Enhanced `setWindow` utility to return `Promise` when loading is triggered, allowing callers to await data loading completion + - Added `subscription` parameter to `loadSubset` handler for advanced sync implementations that need to track subscription lifecycle + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a)]: + - @tanstack/db-ivm@0.1.11 + ## 0.4.9 ### Patch Changes diff --git a/packages/db/package.json b/packages/db/package.json index e0de8b52c0..47d25726cf 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/db", "description": "A reactive client store for building super fast apps on sync", - "version": "0.4.9", + "version": "0.4.10", "dependencies": { "@standard-schema/spec": "^1.0.0", "@tanstack/db-ivm": "workspace:*" diff --git a/packages/electric-db-collection/CHANGELOG.md b/packages/electric-db-collection/CHANGELOG.md index 15c81e4606..a9e0866e20 100644 --- a/packages/electric-db-collection/CHANGELOG.md +++ b/packages/electric-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/electric-db-collection +## 0.1.34 + +### Patch Changes + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + ## 0.1.33 ### Patch Changes diff --git a/packages/electric-db-collection/package.json b/packages/electric-db-collection/package.json index 7278bd0c60..de849391e1 100644 --- a/packages/electric-db-collection/package.json +++ b/packages/electric-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/electric-db-collection", "description": "ElectricSQL collection for TanStack DB", - "version": "0.1.33", + "version": "0.1.34", "dependencies": { "@electric-sql/client": "^1.0.14", "@standard-schema/spec": "^1.0.0", diff --git a/packages/query-db-collection/CHANGELOG.md b/packages/query-db-collection/CHANGELOG.md index ca627e5e5b..2be48ca153 100644 --- a/packages/query-db-collection/CHANGELOG.md +++ b/packages/query-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-db-collection +## 0.2.31 + +### Patch Changes + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + ## 0.2.30 ### Patch Changes diff --git a/packages/query-db-collection/package.json b/packages/query-db-collection/package.json index 1fe88841d0..b6cf08a5bc 100644 --- a/packages/query-db-collection/package.json +++ b/packages/query-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/query-db-collection", "description": "TanStack Query collection for TanStack DB", - "version": "0.2.30", + "version": "0.2.31", "dependencies": { "@standard-schema/spec": "^1.0.0", "@tanstack/db": "workspace:*" diff --git a/packages/react-db/CHANGELOG.md b/packages/react-db/CHANGELOG.md index 8464a7ccbc..edcc4e526b 100644 --- a/packages/react-db/CHANGELOG.md +++ b/packages/react-db/CHANGELOG.md @@ -1,5 +1,65 @@ # @tanstack/react-db +## 0.1.32 + +### Patch Changes + +- Add `useLiveInfiniteQuery` hook for infinite scrolling with live updates. ([#669](https://github.com/TanStack/db/pull/669)) + + The new `useLiveInfiniteQuery` hook provides an infinite query pattern similar to TanStack Query's `useInfiniteQuery`, but with live updates from your local collection. It uses `liveQueryCollection.utils.setWindow()` internally to efficiently paginate through ordered data without recreating the query on each page fetch. + + **Key features:** + - Automatic live updates as data changes in the collection + - Efficient pagination using dynamic window adjustment + - Peek-ahead mechanism to detect when more pages are available + - Compatible with TanStack Query's infinite query API patterns + + **Example usage:** + + ```tsx + import { useLiveInfiniteQuery } from "@tanstack/react-db" + + function PostList() { + const { data, pages, fetchNextPage, hasNextPage, isLoading } = + useLiveInfiniteQuery( + (q) => + q + .from({ posts: postsCollection }) + .orderBy(({ posts }) => posts.createdAt, "desc"), + { + pageSize: 20, + getNextPageParam: (lastPage, allPages) => + lastPage.length === 20 ? allPages.length : undefined, + } + ) + + if (isLoading) return
Loading...
+ + return ( +
+ {pages.map((page, i) => ( +
+ {page.map((post) => ( + + ))} +
+ ))} + {hasNextPage && ( + + )} +
+ ) + } + ``` + + **Requirements:** + - Query must include `.orderBy()` for the window mechanism to work + - Returns flattened `data` array and `pages` array for flexible rendering + - Automatically detects new pages when data is synced to the collection + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + ## 0.1.31 ### Patch Changes diff --git a/packages/react-db/package.json b/packages/react-db/package.json index 8bc45346cb..424e58739b 100644 --- a/packages/react-db/package.json +++ b/packages/react-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/react-db", "description": "React integration for @tanstack/db", - "version": "0.1.31", + "version": "0.1.32", "author": "Kyle Mathews", "license": "MIT", "repository": { diff --git a/packages/rxdb-db-collection/CHANGELOG.md b/packages/rxdb-db-collection/CHANGELOG.md index 2dbf41f256..1502e6e3a6 100644 --- a/packages/rxdb-db-collection/CHANGELOG.md +++ b/packages/rxdb-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/rxdb-db-collection +## 0.1.21 + +### Patch Changes + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + ## 0.1.20 ### Patch Changes diff --git a/packages/rxdb-db-collection/package.json b/packages/rxdb-db-collection/package.json index 29a29e559b..a6d3aeae42 100644 --- a/packages/rxdb-db-collection/package.json +++ b/packages/rxdb-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/rxdb-db-collection", "description": "RxDB collection for TanStack DB", - "version": "0.1.20", + "version": "0.1.21", "dependencies": { "rxdb": "16.19.1", "@standard-schema/spec": "^1.0.0", diff --git a/packages/solid-db/CHANGELOG.md b/packages/solid-db/CHANGELOG.md index 850e3fa111..3613566e58 100644 --- a/packages/solid-db/CHANGELOG.md +++ b/packages/solid-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-db +## 0.1.32 + +### Patch Changes + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + ## 0.1.31 ### Patch Changes diff --git a/packages/solid-db/package.json b/packages/solid-db/package.json index b802f8217c..66eae628ad 100644 --- a/packages/solid-db/package.json +++ b/packages/solid-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/solid-db", "description": "Solid integration for @tanstack/db", - "version": "0.1.31", + "version": "0.1.32", "author": "Kyle Mathews", "license": "MIT", "repository": { diff --git a/packages/svelte-db/CHANGELOG.md b/packages/svelte-db/CHANGELOG.md index 088f30462e..1af1bf1e3b 100644 --- a/packages/svelte-db/CHANGELOG.md +++ b/packages/svelte-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/svelte-db +## 0.1.32 + +### Patch Changes + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + ## 0.1.31 ### Patch Changes diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index 5aa662545f..9842330324 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/svelte-db", "description": "Svelte integration for @tanstack/db", - "version": "0.1.31", + "version": "0.1.32", "dependencies": { "@tanstack/db": "workspace:*" }, diff --git a/packages/trailbase-db-collection/CHANGELOG.md b/packages/trailbase-db-collection/CHANGELOG.md index 4abc980653..71bd904650 100644 --- a/packages/trailbase-db-collection/CHANGELOG.md +++ b/packages/trailbase-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/trailbase-db-collection +## 0.1.32 + +### Patch Changes + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + ## 0.1.31 ### Patch Changes diff --git a/packages/trailbase-db-collection/package.json b/packages/trailbase-db-collection/package.json index 7142414ed0..9389b5979f 100644 --- a/packages/trailbase-db-collection/package.json +++ b/packages/trailbase-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/trailbase-db-collection", "description": "TrailBase collection for TanStack DB", - "version": "0.1.31", + "version": "0.1.32", "dependencies": { "@standard-schema/spec": "^1.0.0", "@tanstack/db": "workspace:*", diff --git a/packages/vue-db/CHANGELOG.md b/packages/vue-db/CHANGELOG.md index fa14c51498..146478605a 100644 --- a/packages/vue-db/CHANGELOG.md +++ b/packages/vue-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/vue-db +## 0.0.65 + +### Patch Changes + +- Updated dependencies [[`63aa8ef`](https://github.com/TanStack/db/commit/63aa8ef8b09960ce0f93e068d41b37fb0503a21a), [`b0687ab`](https://github.com/TanStack/db/commit/b0687ab4c1476362d7a25e3c1704ab0fb0385455)]: + - @tanstack/db@0.4.10 + ## 0.0.64 ### Patch Changes diff --git a/packages/vue-db/package.json b/packages/vue-db/package.json index efc0d01ecf..ad46379cfd 100644 --- a/packages/vue-db/package.json +++ b/packages/vue-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/vue-db", "description": "Vue integration for @tanstack/db", - "version": "0.0.64", + "version": "0.0.65", "author": "Kyle Mathews", "license": "MIT", "repository": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a725066aa8..bd33d6f63f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,10 +196,10 @@ importers: specifier: ^5.90.2 version: 5.90.2 '@tanstack/query-db-collection': - specifier: ^0.2.30 + specifier: ^0.2.31 version: link:../../../packages/query-db-collection '@tanstack/react-db': - specifier: ^0.1.31 + specifier: ^0.1.32 version: link:../../../packages/react-db '@tanstack/react-router': specifier: ^1.132.47 From 5566b26100abdae9b4a041f048aeda1dd726e904 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Thu, 16 Oct 2025 20:22:41 +0100 Subject: [PATCH 44/51] Add Pre-created Collection Support to useLiveInfiniteQuery (#684) enable passing a preloaded live query to useLiveInfiniteQuery --- .changeset/brown-otters-grab.md | 6 + .../query/live/collection-config-builder.ts | 20 + packages/react-db/src/useLiveInfiniteQuery.ts | 174 ++++++-- .../tests/useLiveInfiniteQuery.test.tsx | 409 +++++++++++++++++- 4 files changed, 580 insertions(+), 29 deletions(-) create mode 100644 .changeset/brown-otters-grab.md diff --git a/.changeset/brown-otters-grab.md b/.changeset/brown-otters-grab.md new file mode 100644 index 0000000000..35a0e5a374 --- /dev/null +++ b/.changeset/brown-otters-grab.md @@ -0,0 +1,6 @@ +--- +"@tanstack/react-db": patch +"@tanstack/db": patch +--- + +Add support for pre-created live query collections in useLiveInfiniteQuery, enabling router loader patterns where live queries can be created, preloaded, and passed to components. diff --git a/packages/db/src/query/live/collection-config-builder.ts b/packages/db/src/query/live/collection-config-builder.ts index 08302fc396..eef3241dc0 100644 --- a/packages/db/src/query/live/collection-config-builder.ts +++ b/packages/db/src/query/live/collection-config-builder.ts @@ -43,6 +43,12 @@ export type LiveQueryCollectionUtils = UtilsRecord & { * @returns `true` if no subset loading was triggered, or `Promise` that resolves when the subset has been loaded */ setWindow: (options: WindowOptions) => true | Promise + /** + * Gets the current window (offset and limit) for an ordered query. + * + * @returns The current window settings, or `undefined` if the query is not windowed + */ + getWindow: () => { offset: number; limit: number } | undefined } type PendingGraphRun = { @@ -93,6 +99,7 @@ export class CollectionConfigBuilder< public liveQueryCollection?: Collection private windowFn: ((options: WindowOptions) => void) | undefined + private currentWindow: WindowOptions | undefined private maybeRunGraphFn: (() => void) | undefined @@ -187,6 +194,7 @@ export class CollectionConfigBuilder< getRunCount: this.getRunCount.bind(this), getBuilder: () => this, setWindow: this.setWindow.bind(this), + getWindow: this.getWindow.bind(this), }, } } @@ -196,6 +204,7 @@ export class CollectionConfigBuilder< throw new SetWindowRequiresOrderByError() } + this.currentWindow = options this.windowFn(options) this.maybeRunGraphFn?.() @@ -219,6 +228,17 @@ export class CollectionConfigBuilder< return true } + getWindow(): { offset: number; limit: number } | undefined { + // Only return window if this is a windowed query (has orderBy and windowFn) + if (!this.windowFn || !this.currentWindow) { + return undefined + } + return { + offset: this.currentWindow.offset ?? 0, + limit: this.currentWindow.limit ?? 0, + } + } + /** * Resolves a collection alias to its collection ID. * diff --git a/packages/react-db/src/useLiveInfiniteQuery.ts b/packages/react-db/src/useLiveInfiniteQuery.ts index 1e44fd16ec..650bbe22c6 100644 --- a/packages/react-db/src/useLiveInfiniteQuery.ts +++ b/packages/react-db/src/useLiveInfiniteQuery.ts @@ -1,10 +1,13 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react" +import { CollectionImpl } from "@tanstack/db" import { useLiveQuery } from "./useLiveQuery" import type { + Collection, Context, InferResultType, InitialQueryBuilder, LiveQueryCollectionUtils, + NonSingleResult, QueryBuilder, } from "@tanstack/db" @@ -82,61 +85,176 @@ export type UseLiveInfiniteQueryReturn = Omit< * }, * [category] * ) + * + * @example + * // Router loader pattern with pre-created collection + * // In loader: + * const postsQuery = createLiveQueryCollection({ + * query: (q) => q + * .from({ posts: postsCollection }) + * .orderBy(({ posts }) => posts.createdAt, 'desc') + * .limit(20) + * }) + * await postsQuery.preload() + * return { postsQuery } + * + * // In component: + * const { postsQuery } = useLoaderData() + * const { data, fetchNextPage, hasNextPage } = useLiveInfiniteQuery( + * postsQuery, + * { + * pageSize: 20, + * getNextPageParam: (lastPage) => lastPage.length === 20 ? lastPage.length : undefined + * } + * ) */ + +// Overload for pre-created collection (non-single result) +export function useLiveInfiniteQuery< + TResult extends object, + TKey extends string | number, + TUtils extends Record, +>( + liveQueryCollection: Collection & NonSingleResult, + config: UseLiveInfiniteQueryConfig +): UseLiveInfiniteQueryReturn + +// Overload for query function export function useLiveInfiniteQuery( queryFn: (q: InitialQueryBuilder) => QueryBuilder, config: UseLiveInfiniteQueryConfig, + deps?: Array +): UseLiveInfiniteQueryReturn + +// Implementation +export function useLiveInfiniteQuery( + queryFnOrCollection: any, + config: UseLiveInfiniteQueryConfig, deps: Array = [] ): UseLiveInfiniteQueryReturn { const pageSize = config.pageSize || 20 const initialPageParam = config.initialPageParam ?? 0 + // Detect if input is a collection or query function + const isCollection = queryFnOrCollection instanceof CollectionImpl + + // Validate input type + if (!isCollection && typeof queryFnOrCollection !== `function`) { + throw new Error( + `useLiveInfiniteQuery: First argument must be either a pre-created live query collection (CollectionImpl) ` + + `or a query function. Received: ${typeof queryFnOrCollection}` + ) + } + // Track how many pages have been loaded const [loadedPageCount, setLoadedPageCount] = useState(1) const [isFetchingNextPage, setIsFetchingNextPage] = useState(false) - // Stringify deps for comparison + // Track collection instance and whether we've validated it (only for pre-created collections) + const collectionRef = useRef(isCollection ? queryFnOrCollection : null) + const hasValidatedCollectionRef = useRef(false) + + // Track deps for query functions (stringify for comparison) const depsKey = JSON.stringify(deps) const prevDepsKeyRef = useRef(depsKey) - // Reset page count when dependencies change + // Reset pagination when inputs change useEffect(() => { - if (prevDepsKeyRef.current !== depsKey) { + let shouldReset = false + + if (isCollection) { + // Reset if collection instance changed + if (collectionRef.current !== queryFnOrCollection) { + collectionRef.current = queryFnOrCollection + hasValidatedCollectionRef.current = false + shouldReset = true + } + } else { + // Reset if deps changed (for query functions) + if (prevDepsKeyRef.current !== depsKey) { + prevDepsKeyRef.current = depsKey + shouldReset = true + } + } + + if (shouldReset) { setLoadedPageCount(1) - prevDepsKeyRef.current = depsKey } - }, [depsKey]) + }, [isCollection, queryFnOrCollection, depsKey]) // Create a live query with initial limit and offset - // The query function is wrapped to add limit/offset to the query - const queryResult = useLiveQuery( - (q) => queryFn(q).limit(pageSize).offset(0), - deps - ) - - // Update the window when loadedPageCount changes - // We fetch one extra item to peek if there's a next page + // Either pass collection directly or wrap query function + const queryResult = isCollection + ? useLiveQuery(queryFnOrCollection) + : useLiveQuery( + (q) => queryFnOrCollection(q).limit(pageSize).offset(0), + deps + ) + + // Adjust window when pagination changes useEffect(() => { - const newLimit = loadedPageCount * pageSize + 1 // +1 to peek ahead const utils = queryResult.collection.utils - // setWindow is available on live query collections with orderBy - if (isLiveQueryCollectionUtils(utils)) { - const result = utils.setWindow({ offset: 0, limit: newLimit }) - // setWindow returns true if data is immediately available, or Promise if loading - if (result !== true) { - setIsFetchingNextPage(true) - result.then(() => { - setIsFetchingNextPage(false) - }) - } else { - setIsFetchingNextPage(false) + const expectedOffset = 0 + const expectedLimit = loadedPageCount * pageSize + 1 // +1 for peek ahead + + // Check if collection has orderBy (required for setWindow) + if (!isLiveQueryCollectionUtils(utils)) { + // For pre-created collections, throw an error if no orderBy + if (isCollection) { + throw new Error( + `useLiveInfiniteQuery: Pre-created live query collection must have an orderBy clause for infinite pagination to work. ` + + `Please add .orderBy() to your createLiveQueryCollection query.` + ) + } + return + } + + // For pre-created collections, validate window on first check + if (isCollection && !hasValidatedCollectionRef.current) { + const currentWindow = utils.getWindow() + if ( + currentWindow && + (currentWindow.offset !== expectedOffset || + currentWindow.limit !== expectedLimit) + ) { + console.warn( + `useLiveInfiniteQuery: Pre-created collection has window {offset: ${currentWindow.offset}, limit: ${currentWindow.limit}} ` + + `but hook expects {offset: ${expectedOffset}, limit: ${expectedLimit}}. Adjusting window now.` + ) } + hasValidatedCollectionRef.current = true } - }, [loadedPageCount, pageSize, queryResult.collection]) + + // For query functions, wait until collection is ready + if (!isCollection && !queryResult.isReady) return + + // Adjust the window + const result = utils.setWindow({ + offset: expectedOffset, + limit: expectedLimit, + }) + + if (result !== true) { + setIsFetchingNextPage(true) + result.then(() => { + setIsFetchingNextPage(false) + }) + } else { + setIsFetchingNextPage(false) + } + }, [ + isCollection, + queryResult.collection, + queryResult.isReady, + loadedPageCount, + pageSize, + ]) // Split the data array into pages and determine if there's a next page const { pages, pageParams, hasNextPage, flatData } = useMemo(() => { - const dataArray = queryResult.data as InferResultType + const dataArray = ( + Array.isArray(queryResult.data) ? queryResult.data : [] + ) as InferResultType const totalItemsRequested = loadedPageCount * pageSize // Check if we have more data than requested (the peek ahead item) @@ -181,5 +299,5 @@ export function useLiveInfiniteQuery( fetchNextPage, hasNextPage, isFetchingNextPage, - } + } as UseLiveInfiniteQueryReturn } diff --git a/packages/react-db/tests/useLiveInfiniteQuery.test.tsx b/packages/react-db/tests/useLiveInfiniteQuery.test.tsx index 0a8c3eeca7..1496a27f1e 100644 --- a/packages/react-db/tests/useLiveInfiniteQuery.test.tsx +++ b/packages/react-db/tests/useLiveInfiniteQuery.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest" import { act, renderHook, waitFor } from "@testing-library/react" -import { createCollection, eq } from "@tanstack/db" +import { createCollection, createLiveQueryCollection, eq } from "@tanstack/db" import { useLiveInfiniteQuery } from "../src/useLiveInfiniteQuery" import { mockSyncCollectionOptions } from "../../db/tests/utils" @@ -964,4 +964,411 @@ describe(`useLiveInfiniteQuery`, () => { expect(result.current.pages).toHaveLength(2) expect(result.current.data).toHaveLength(20) }, 10000) + + describe(`pre-created collections`, () => { + it(`should accept pre-created live query collection`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `pre-created-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const liveQueryCollection = createLiveQueryCollection({ + query: (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`) + .limit(5), // Initial limit + }) + + await liveQueryCollection.preload() + + const { result } = renderHook(() => { + return useLiveInfiniteQuery(liveQueryCollection, { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + }) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Should have 1 page initially + expect(result.current.pages).toHaveLength(1) + expect(result.current.pages[0]).toHaveLength(10) + expect(result.current.data).toHaveLength(10) + expect(result.current.hasNextPage).toBe(true) + + // First item should be Post 1 (most recent by createdAt) + expect(result.current.pages[0]![0]).toMatchObject({ + id: `1`, + title: `Post 1`, + }) + }) + + it(`should fetch multiple pages with pre-created collection`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `pre-created-multi-page-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const liveQueryCollection = createLiveQueryCollection({ + query: (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`) + .limit(10) + .offset(0), + }) + + await liveQueryCollection.preload() + + const { result } = renderHook(() => { + return useLiveInfiniteQuery(liveQueryCollection, { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + }) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + expect(result.current.pages).toHaveLength(1) + expect(result.current.hasNextPage).toBe(true) + + // Fetch next page + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + expect(result.current.pages[0]).toHaveLength(10) + expect(result.current.pages[1]).toHaveLength(10) + expect(result.current.data).toHaveLength(20) + expect(result.current.hasNextPage).toBe(true) + }) + + it(`should reset pagination when collection instance changes`, async () => { + const posts1 = createMockPosts(30) + const collection1 = createCollection( + mockSyncCollectionOptions({ + id: `pre-created-reset-1`, + getKey: (post: Post) => post.id, + initialData: posts1, + }) + ) + + const liveQueryCollection1 = createLiveQueryCollection({ + query: (q) => + q + .from({ posts: collection1 }) + .orderBy(({ posts: p }) => p.createdAt, `desc`) + .limit(10) + .offset(0), + }) + + await liveQueryCollection1.preload() + + const posts2 = createMockPosts(40) + const collection2 = createCollection( + mockSyncCollectionOptions({ + id: `pre-created-reset-2`, + getKey: (post: Post) => post.id, + initialData: posts2, + }) + ) + + const liveQueryCollection2 = createLiveQueryCollection({ + query: (q) => + q + .from({ posts: collection2 }) + .orderBy(({ posts: p }) => p.createdAt, `desc`) + .limit(10) + .offset(0), + }) + + await liveQueryCollection2.preload() + + const { result, rerender } = renderHook( + ({ coll }: { coll: any }) => { + return useLiveInfiniteQuery(coll, { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + }) + }, + { initialProps: { coll: liveQueryCollection1 } } + ) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Fetch 2 pages + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + expect(result.current.data).toHaveLength(20) + + // Switch to second collection + act(() => { + rerender({ coll: liveQueryCollection2 }) + }) + + await waitFor(() => { + // Should reset to 1 page + expect(result.current.pages).toHaveLength(1) + }) + + expect(result.current.data).toHaveLength(10) + }) + + it(`should throw error if collection lacks orderBy`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `no-orderby-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + // Create collection WITHOUT orderBy + const liveQueryCollection = createLiveQueryCollection({ + query: (q) => q.from({ posts: collection }), + }) + + await liveQueryCollection.preload() + + // Should throw error when trying to use it with useLiveInfiniteQuery + expect(() => { + renderHook(() => { + return useLiveInfiniteQuery(liveQueryCollection, { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + }) + }) + }).toThrow(/ORDER BY/) + }) + + it(`should throw error if first argument is not a collection or function`, () => { + // Should throw error when passing invalid types + expect(() => { + renderHook(() => { + return useLiveInfiniteQuery(`not a collection or function` as any, { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + }) + }) + }).toThrow(/must be either a pre-created live query collection/) + + expect(() => { + renderHook(() => { + return useLiveInfiniteQuery(123 as any, { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + }) + }) + }).toThrow(/must be either a pre-created live query collection/) + + expect(() => { + renderHook(() => { + return useLiveInfiniteQuery(null as any, { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + }) + }) + }).toThrow(/must be either a pre-created live query collection/) + }) + + it(`should work correctly even if pre-created collection has different initial limit`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `mismatched-window-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const liveQueryCollection = createLiveQueryCollection({ + query: (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`) + .limit(5) // Different from pageSize + .offset(0), + }) + + await liveQueryCollection.preload() + + const { result } = renderHook(() => { + return useLiveInfiniteQuery(liveQueryCollection, { + pageSize: 10, // Different from the initial limit of 5 + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + }) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Should work correctly despite different initial limit + // The window will be adjusted to match pageSize + expect(result.current.pages).toHaveLength(1) + expect(result.current.pages[0]).toHaveLength(10) + expect(result.current.data).toHaveLength(10) + expect(result.current.hasNextPage).toBe(true) + }) + + it(`should handle live updates with pre-created collection`, async () => { + const posts = createMockPosts(30) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `pre-created-live-updates-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + const liveQueryCollection = createLiveQueryCollection({ + query: (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`) + .limit(10) + .offset(0), + }) + + await liveQueryCollection.preload() + + const { result } = renderHook(() => { + return useLiveInfiniteQuery(liveQueryCollection, { + pageSize: 10, + getNextPageParam: (lastPage) => + lastPage.length === 10 ? lastPage.length : undefined, + }) + }) + + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + // Fetch 2 pages + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + expect(result.current.data).toHaveLength(20) + + // Insert a new post with most recent timestamp + act(() => { + collection.utils.begin() + collection.utils.write({ + type: `insert`, + value: { + id: `new-1`, + title: `New Post`, + content: `New Content`, + createdAt: 1000001, // Most recent + category: `tech`, + }, + }) + collection.utils.commit() + }) + + await waitFor(() => { + // New post should be first + expect(result.current.pages[0]![0]).toMatchObject({ + id: `new-1`, + title: `New Post`, + }) + }) + + // Still showing 2 pages (20 items), but content has shifted + expect(result.current.pages).toHaveLength(2) + expect(result.current.data).toHaveLength(20) + }) + + it(`should work with router loader pattern (preloaded collection)`, async () => { + const posts = createMockPosts(50) + const collection = createCollection( + mockSyncCollectionOptions({ + id: `router-loader-test`, + getKey: (post: Post) => post.id, + initialData: posts, + }) + ) + + // Simulate router loader: create and preload collection + const loaderQuery = createLiveQueryCollection({ + query: (q) => + q + .from({ posts: collection }) + .orderBy(({ posts: p }) => p.createdAt, `desc`) + .limit(20), + }) + + // Preload in loader + await loaderQuery.preload() + + // Simulate component receiving preloaded collection + const { result } = renderHook(() => { + return useLiveInfiniteQuery(loaderQuery, { + pageSize: 20, + getNextPageParam: (lastPage) => + lastPage.length === 20 ? lastPage.length : undefined, + }) + }) + + // Should be immediately ready since it was preloaded + await waitFor(() => { + expect(result.current.isReady).toBe(true) + }) + + expect(result.current.pages).toHaveLength(1) + expect(result.current.pages[0]).toHaveLength(20) + expect(result.current.data).toHaveLength(20) + expect(result.current.hasNextPage).toBe(true) + + // Can still fetch more pages + act(() => { + result.current.fetchNextPage() + }) + + await waitFor(() => { + expect(result.current.pages).toHaveLength(2) + }) + + expect(result.current.data).toHaveLength(40) + }) + }) }) From 3f4e154e7063f751da7d9a1f0945bd2c5258c239 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 13:27:14 -0600 Subject: [PATCH 45/51] ci: Version Packages (#686) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/brown-otters-grab.md | 6 ------ examples/angular/todos/CHANGELOG.md | 8 ++++++++ examples/angular/todos/package.json | 2 +- examples/react/projects/package.json | 4 ++-- examples/react/todo/CHANGELOG.md | 10 ++++++++++ examples/react/todo/package.json | 2 +- packages/angular-db/CHANGELOG.md | 7 +++++++ packages/angular-db/package.json | 2 +- packages/db/CHANGELOG.md | 6 ++++++ packages/db/package.json | 2 +- packages/electric-db-collection/CHANGELOG.md | 7 +++++++ packages/electric-db-collection/package.json | 2 +- packages/query-db-collection/CHANGELOG.md | 7 +++++++ packages/query-db-collection/package.json | 2 +- packages/react-db/CHANGELOG.md | 9 +++++++++ packages/react-db/package.json | 2 +- packages/rxdb-db-collection/CHANGELOG.md | 7 +++++++ packages/rxdb-db-collection/package.json | 2 +- packages/solid-db/CHANGELOG.md | 7 +++++++ packages/solid-db/package.json | 2 +- packages/svelte-db/CHANGELOG.md | 7 +++++++ packages/svelte-db/package.json | 2 +- packages/trailbase-db-collection/CHANGELOG.md | 7 +++++++ packages/trailbase-db-collection/package.json | 2 +- packages/vue-db/CHANGELOG.md | 7 +++++++ packages/vue-db/package.json | 2 +- pnpm-lock.yaml | 4 ++-- 27 files changed, 105 insertions(+), 22 deletions(-) delete mode 100644 .changeset/brown-otters-grab.md diff --git a/.changeset/brown-otters-grab.md b/.changeset/brown-otters-grab.md deleted file mode 100644 index 35a0e5a374..0000000000 --- a/.changeset/brown-otters-grab.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@tanstack/react-db": patch -"@tanstack/db": patch ---- - -Add support for pre-created live query collections in useLiveInfiniteQuery, enabling router loader patterns where live queries can be created, preloaded, and passed to components. diff --git a/examples/angular/todos/CHANGELOG.md b/examples/angular/todos/CHANGELOG.md index 8e2724a5a7..d8c163b811 100644 --- a/examples/angular/todos/CHANGELOG.md +++ b/examples/angular/todos/CHANGELOG.md @@ -1,5 +1,13 @@ # todos +## 0.0.12 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + - @tanstack/angular-db@0.1.16 + ## 0.0.11 ### Patch Changes diff --git a/examples/angular/todos/package.json b/examples/angular/todos/package.json index 0680ebf359..f29245bbb4 100644 --- a/examples/angular/todos/package.json +++ b/examples/angular/todos/package.json @@ -1,6 +1,6 @@ { "name": "todos", - "version": "0.0.11", + "version": "0.0.12", "scripts": { "ng": "ng", "start": "ng serve", diff --git a/examples/react/projects/package.json b/examples/react/projects/package.json index bab49c39aa..181cbb939b 100644 --- a/examples/react/projects/package.json +++ b/examples/react/projects/package.json @@ -17,8 +17,8 @@ "dependencies": { "@tailwindcss/vite": "^4.1.14", "@tanstack/query-core": "^5.90.2", - "@tanstack/query-db-collection": "^0.2.31", - "@tanstack/react-db": "^0.1.32", + "@tanstack/query-db-collection": "^0.2.32", + "@tanstack/react-db": "^0.1.33", "@tanstack/react-router": "^1.132.47", "@tanstack/react-router-devtools": "^1.132.51", "@tanstack/react-router-with-query": "^1.130.17", diff --git a/examples/react/todo/CHANGELOG.md b/examples/react/todo/CHANGELOG.md index 702ca6329e..8c3c7da0a5 100644 --- a/examples/react/todo/CHANGELOG.md +++ b/examples/react/todo/CHANGELOG.md @@ -1,5 +1,15 @@ # examples/react/todo +## 0.1.11 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/react-db@0.1.33 + - @tanstack/electric-db-collection@0.1.35 + - @tanstack/query-db-collection@0.2.32 + - @tanstack/trailbase-db-collection@0.1.33 + ## 0.1.10 ### Patch Changes diff --git a/examples/react/todo/package.json b/examples/react/todo/package.json index 84fa09e45c..7e6042c06c 100644 --- a/examples/react/todo/package.json +++ b/examples/react/todo/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/db-example-react-todo", "private": true, - "version": "0.1.10", + "version": "0.1.11", "dependencies": { "@tanstack/electric-db-collection": "workspace:^", "@tanstack/query-core": "^5.90.2", diff --git a/packages/angular-db/CHANGELOG.md b/packages/angular-db/CHANGELOG.md index 761e59fd2e..139e5fddcf 100644 --- a/packages/angular-db/CHANGELOG.md +++ b/packages/angular-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/angular-db +## 0.1.16 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + ## 0.1.15 ### Patch Changes diff --git a/packages/angular-db/package.json b/packages/angular-db/package.json index 36513c2a3d..0f47776537 100644 --- a/packages/angular-db/package.json +++ b/packages/angular-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/angular-db", "description": "Angular integration for @tanstack/db", - "version": "0.1.15", + "version": "0.1.16", "author": "Ethan McDaniel", "license": "MIT", "repository": { diff --git a/packages/db/CHANGELOG.md b/packages/db/CHANGELOG.md index 9e9142678b..0103ace18b 100644 --- a/packages/db/CHANGELOG.md +++ b/packages/db/CHANGELOG.md @@ -1,5 +1,11 @@ # @tanstack/db +## 0.4.11 + +### Patch Changes + +- Add support for pre-created live query collections in useLiveInfiniteQuery, enabling router loader patterns where live queries can be created, preloaded, and passed to components. ([#684](https://github.com/TanStack/db/pull/684)) + ## 0.4.10 ### Patch Changes diff --git a/packages/db/package.json b/packages/db/package.json index 47d25726cf..32dd84d7c6 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/db", "description": "A reactive client store for building super fast apps on sync", - "version": "0.4.10", + "version": "0.4.11", "dependencies": { "@standard-schema/spec": "^1.0.0", "@tanstack/db-ivm": "workspace:*" diff --git a/packages/electric-db-collection/CHANGELOG.md b/packages/electric-db-collection/CHANGELOG.md index a9e0866e20..f9316f2473 100644 --- a/packages/electric-db-collection/CHANGELOG.md +++ b/packages/electric-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/electric-db-collection +## 0.1.35 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + ## 0.1.34 ### Patch Changes diff --git a/packages/electric-db-collection/package.json b/packages/electric-db-collection/package.json index de849391e1..f77ed3872a 100644 --- a/packages/electric-db-collection/package.json +++ b/packages/electric-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/electric-db-collection", "description": "ElectricSQL collection for TanStack DB", - "version": "0.1.34", + "version": "0.1.35", "dependencies": { "@electric-sql/client": "^1.0.14", "@standard-schema/spec": "^1.0.0", diff --git a/packages/query-db-collection/CHANGELOG.md b/packages/query-db-collection/CHANGELOG.md index 2be48ca153..48106f1d93 100644 --- a/packages/query-db-collection/CHANGELOG.md +++ b/packages/query-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-db-collection +## 0.2.32 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + ## 0.2.31 ### Patch Changes diff --git a/packages/query-db-collection/package.json b/packages/query-db-collection/package.json index b6cf08a5bc..fe26777d56 100644 --- a/packages/query-db-collection/package.json +++ b/packages/query-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/query-db-collection", "description": "TanStack Query collection for TanStack DB", - "version": "0.2.31", + "version": "0.2.32", "dependencies": { "@standard-schema/spec": "^1.0.0", "@tanstack/db": "workspace:*" diff --git a/packages/react-db/CHANGELOG.md b/packages/react-db/CHANGELOG.md index edcc4e526b..7760660ca5 100644 --- a/packages/react-db/CHANGELOG.md +++ b/packages/react-db/CHANGELOG.md @@ -1,5 +1,14 @@ # @tanstack/react-db +## 0.1.33 + +### Patch Changes + +- Add support for pre-created live query collections in useLiveInfiniteQuery, enabling router loader patterns where live queries can be created, preloaded, and passed to components. ([#684](https://github.com/TanStack/db/pull/684)) + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + ## 0.1.32 ### Patch Changes diff --git a/packages/react-db/package.json b/packages/react-db/package.json index 424e58739b..eb83d71c19 100644 --- a/packages/react-db/package.json +++ b/packages/react-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/react-db", "description": "React integration for @tanstack/db", - "version": "0.1.32", + "version": "0.1.33", "author": "Kyle Mathews", "license": "MIT", "repository": { diff --git a/packages/rxdb-db-collection/CHANGELOG.md b/packages/rxdb-db-collection/CHANGELOG.md index 1502e6e3a6..a9de728fbe 100644 --- a/packages/rxdb-db-collection/CHANGELOG.md +++ b/packages/rxdb-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/rxdb-db-collection +## 0.1.22 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + ## 0.1.21 ### Patch Changes diff --git a/packages/rxdb-db-collection/package.json b/packages/rxdb-db-collection/package.json index a6d3aeae42..4b2a6a4fc0 100644 --- a/packages/rxdb-db-collection/package.json +++ b/packages/rxdb-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/rxdb-db-collection", "description": "RxDB collection for TanStack DB", - "version": "0.1.21", + "version": "0.1.22", "dependencies": { "rxdb": "16.19.1", "@standard-schema/spec": "^1.0.0", diff --git a/packages/solid-db/CHANGELOG.md b/packages/solid-db/CHANGELOG.md index 3613566e58..d19fb40248 100644 --- a/packages/solid-db/CHANGELOG.md +++ b/packages/solid-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-db +## 0.1.33 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + ## 0.1.32 ### Patch Changes diff --git a/packages/solid-db/package.json b/packages/solid-db/package.json index 66eae628ad..9981bda6de 100644 --- a/packages/solid-db/package.json +++ b/packages/solid-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/solid-db", "description": "Solid integration for @tanstack/db", - "version": "0.1.32", + "version": "0.1.33", "author": "Kyle Mathews", "license": "MIT", "repository": { diff --git a/packages/svelte-db/CHANGELOG.md b/packages/svelte-db/CHANGELOG.md index 1af1bf1e3b..34b1c12116 100644 --- a/packages/svelte-db/CHANGELOG.md +++ b/packages/svelte-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/svelte-db +## 0.1.33 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + ## 0.1.32 ### Patch Changes diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index 9842330324..c16901c8e6 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/svelte-db", "description": "Svelte integration for @tanstack/db", - "version": "0.1.32", + "version": "0.1.33", "dependencies": { "@tanstack/db": "workspace:*" }, diff --git a/packages/trailbase-db-collection/CHANGELOG.md b/packages/trailbase-db-collection/CHANGELOG.md index 71bd904650..62ca3a17b2 100644 --- a/packages/trailbase-db-collection/CHANGELOG.md +++ b/packages/trailbase-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/trailbase-db-collection +## 0.1.33 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + ## 0.1.32 ### Patch Changes diff --git a/packages/trailbase-db-collection/package.json b/packages/trailbase-db-collection/package.json index 9389b5979f..a5428b649e 100644 --- a/packages/trailbase-db-collection/package.json +++ b/packages/trailbase-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/trailbase-db-collection", "description": "TrailBase collection for TanStack DB", - "version": "0.1.32", + "version": "0.1.33", "dependencies": { "@standard-schema/spec": "^1.0.0", "@tanstack/db": "workspace:*", diff --git a/packages/vue-db/CHANGELOG.md b/packages/vue-db/CHANGELOG.md index 146478605a..10421f8c77 100644 --- a/packages/vue-db/CHANGELOG.md +++ b/packages/vue-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/vue-db +## 0.0.66 + +### Patch Changes + +- Updated dependencies [[`5566b26`](https://github.com/TanStack/db/commit/5566b26100abdae9b4a041f048aeda1dd726e904)]: + - @tanstack/db@0.4.11 + ## 0.0.65 ### Patch Changes diff --git a/packages/vue-db/package.json b/packages/vue-db/package.json index ad46379cfd..7ddb8a52c6 100644 --- a/packages/vue-db/package.json +++ b/packages/vue-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/vue-db", "description": "Vue integration for @tanstack/db", - "version": "0.0.65", + "version": "0.0.66", "author": "Kyle Mathews", "license": "MIT", "repository": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd33d6f63f..3b26cbec58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,10 +196,10 @@ importers: specifier: ^5.90.2 version: 5.90.2 '@tanstack/query-db-collection': - specifier: ^0.2.31 + specifier: ^0.2.32 version: link:../../../packages/query-db-collection '@tanstack/react-db': - specifier: ^0.1.32 + specifier: ^0.1.33 version: link:../../../packages/react-db '@tanstack/react-router': specifier: ^1.132.47 From 8051cbe78a0a7e353edcf1854a932d39596a723d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 04:38:28 +0000 Subject: [PATCH 46/51] chore(deps): update all non-major dependencies (#693) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- examples/angular/todos/package.json | 20 +- examples/react/projects/package.json | 22 +- examples/react/todo/package.json | 18 +- examples/solid/todo/package.json | 22 +- package.json | 20 +- packages/angular-db/package.json | 2 +- packages/db-ivm/package.json | 2 +- packages/db/package.json | 4 +- packages/electric-db-collection/package.json | 2 +- packages/query-db-collection/package.json | 4 +- packages/react-db/package.json | 4 +- packages/rxdb-db-collection/package.json | 2 +- packages/solid-db/package.json | 4 +- packages/svelte-db/package.json | 2 +- packages/trailbase-db-collection/package.json | 2 +- packages/vue-db/package.json | 2 +- pnpm-lock.yaml | 1374 +++++++++-------- 17 files changed, 767 insertions(+), 739 deletions(-) diff --git a/examples/angular/todos/package.json b/examples/angular/todos/package.json index f29245bbb4..a5ae2e80e4 100644 --- a/examples/angular/todos/package.json +++ b/examples/angular/todos/package.json @@ -22,12 +22,12 @@ }, "private": true, "dependencies": { - "@angular/common": "^20.3.4", - "@angular/compiler": "^20.3.4", - "@angular/core": "^20.3.4", - "@angular/forms": "^20.3.4", - "@angular/platform-browser": "^20.3.4", - "@angular/router": "^20.3.4", + "@angular/common": "^20.3.6", + "@angular/compiler": "^20.3.6", + "@angular/core": "^20.3.6", + "@angular/forms": "^20.3.6", + "@angular/platform-browser": "^20.3.6", + "@angular/router": "^20.3.6", "@tanstack/angular-db": "workspace:*", "@tanstack/db": "workspace:*", "rxjs": "~7.8.2", @@ -35,10 +35,10 @@ "zone.js": "~0.15.1" }, "devDependencies": { - "@angular/build": "^20.3.5", - "@angular/cli": "^20.3.5", - "@angular/compiler-cli": "^20.3.4", - "@types/jasmine": "~5.1.9", + "@angular/build": "^20.3.6", + "@angular/cli": "^20.3.6", + "@angular/compiler-cli": "^20.3.6", + "@types/jasmine": "~5.1.12", "autoprefixer": "^10.4.21", "jasmine-core": "~5.12.0", "karma": "~6.4.4", diff --git a/examples/react/projects/package.json b/examples/react/projects/package.json index 181cbb939b..1e6a7e6c6f 100644 --- a/examples/react/projects/package.json +++ b/examples/react/projects/package.json @@ -16,14 +16,14 @@ }, "dependencies": { "@tailwindcss/vite": "^4.1.14", - "@tanstack/query-core": "^5.90.2", + "@tanstack/query-core": "^5.90.5", "@tanstack/query-db-collection": "^0.2.32", "@tanstack/react-db": "^0.1.33", - "@tanstack/react-router": "^1.132.47", - "@tanstack/react-router-devtools": "^1.132.51", + "@tanstack/react-router": "^1.133.15", + "@tanstack/react-router-devtools": "^1.133.15", "@tanstack/react-router-with-query": "^1.130.17", - "@tanstack/react-start": "^1.132.56", - "@tanstack/router-plugin": "^1.132.56", + "@tanstack/react-start": "^1.133.15", + "@tanstack/router-plugin": "^1.133.15", "@trpc/client": "^11.6.0", "@trpc/server": "^11.6.0", "better-auth": "^1.3.26", @@ -40,18 +40,18 @@ }, "devDependencies": { "@eslint/compat": "^1.4.0", - "@eslint/js": "^9.37.0", + "@eslint/js": "^9.38.0", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", "@types/pg": "^8.15.5", "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.1", - "@typescript-eslint/eslint-plugin": "^8.46.0", - "@typescript-eslint/parser": "^8.46.0", + "@types/react-dom": "^19.2.2", + "@typescript-eslint/eslint-plugin": "^8.46.1", + "@typescript-eslint/parser": "^8.46.1", "@vitejs/plugin-react": "^5.0.4", "concurrently": "^9.2.1", "drizzle-kit": "^0.31.5", - "eslint": "^9.37.0", + "eslint": "^9.38.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", @@ -60,7 +60,7 @@ "prettier": "^3.6.2", "tsx": "^4.20.6", "typescript": "^5.9.2", - "vite": "^6.3.6", + "vite": "^6.4.0", "vitest": "^3.2.4", "web-vitals": "^5.1.0" } diff --git a/examples/react/todo/package.json b/examples/react/todo/package.json index 7e6042c06c..b6c122fc15 100644 --- a/examples/react/todo/package.json +++ b/examples/react/todo/package.json @@ -4,11 +4,11 @@ "version": "0.1.11", "dependencies": { "@tanstack/electric-db-collection": "workspace:^", - "@tanstack/query-core": "^5.90.2", + "@tanstack/query-core": "^5.90.5", "@tanstack/query-db-collection": "workspace:*", "@tanstack/react-db": "workspace:*", - "@tanstack/react-router": "^1.132.47", - "@tanstack/react-start": "^1.132.56", + "@tanstack/react-router": "^1.133.15", + "@tanstack/react-start": "^1.133.15", "@tanstack/trailbase-db-collection": "workspace:^", "cors": "^2.8.5", "drizzle-orm": "^0.44.6", @@ -23,23 +23,23 @@ "zod": "^4.1.11" }, "devDependencies": { - "@eslint/js": "^9.37.0", + "@eslint/js": "^9.38.0", "@tailwindcss/vite": "^4.1.14", "@types/cors": "^2.8.19", "@types/express": "^4.17.23", "@types/node": "^24.5.2", "@types/pg": "^8.15.5", "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.1", - "@typescript-eslint/eslint-plugin": "^8.46.0", - "@typescript-eslint/parser": "^8.46.0", + "@types/react-dom": "^19.2.2", + "@typescript-eslint/eslint-plugin": "^8.46.1", + "@typescript-eslint/parser": "^8.46.1", "@vitejs/plugin-react": "^5.0.3", "concurrently": "^9.2.1", "dotenv": "^17.2.2", "drizzle-kit": "^0.31.5", - "eslint": "^9.37.0", + "eslint": "^9.38.0", "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.23", + "eslint-plugin-react-refresh": "^0.4.24", "pg": "^8.16.3", "tsx": "^4.20.6", "typescript": "^5.9.2", diff --git a/examples/solid/todo/package.json b/examples/solid/todo/package.json index 18c5680ea1..46adbc1d5a 100644 --- a/examples/solid/todo/package.json +++ b/examples/solid/todo/package.json @@ -3,13 +3,13 @@ "private": true, "version": "0.0.33", "dependencies": { - "@tanstack/electric-db-collection": "^0.1.32", - "@tanstack/query-core": "^5.90.2", - "@tanstack/query-db-collection": "^0.2.29", - "@tanstack/solid-db": "^0.1.30", - "@tanstack/solid-router": "^1.132.49", - "@tanstack/solid-start": "^1.132.56", - "@tanstack/trailbase-db-collection": "^0.1.30", + "@tanstack/electric-db-collection": "^0.1.35", + "@tanstack/query-core": "^5.90.5", + "@tanstack/query-db-collection": "^0.2.32", + "@tanstack/solid-db": "^0.1.33", + "@tanstack/solid-router": "^1.133.15", + "@tanstack/solid-start": "^1.133.15", + "@tanstack/trailbase-db-collection": "^0.1.33", "cors": "^2.8.5", "drizzle-orm": "^0.44.6", "drizzle-zod": "^0.8.3", @@ -21,18 +21,18 @@ "vite-tsconfig-paths": "^5.1.4" }, "devDependencies": { - "@eslint/js": "^9.37.0", + "@eslint/js": "^9.38.0", "@tailwindcss/vite": "^4.1.14", "@types/cors": "^2.8.19", "@types/express": "^4.17.23", "@types/node": "^22.18.1", "@types/pg": "^8.15.5", - "@typescript-eslint/eslint-plugin": "^8.46.0", - "@typescript-eslint/parser": "^8.46.0", + "@typescript-eslint/eslint-plugin": "^8.46.1", + "@typescript-eslint/parser": "^8.46.1", "concurrently": "^9.2.1", "dotenv": "^16.6.1", "drizzle-kit": "^0.31.5", - "eslint": "^9.37.0", + "eslint": "^9.38.0", "eslint-plugin-solid": "^0.14.5", "pg": "^8.16.3", "tsx": "^4.20.6", diff --git a/package.json b/package.json index 0bdda89358..6be9d85303 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "type": "git", "url": "https://github.com/tanstack/db.git" }, - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "type": "module", "scripts": { "build": "pnpm --filter \"./packages/**\" build", @@ -22,26 +22,26 @@ }, "devDependencies": { "@changesets/cli": "^2.29.7", - "@eslint/js": "^9.37.0", + "@eslint/js": "^9.38.0", "@stylistic/eslint-plugin": "^4.4.1", "@svitejs/changesets-changelog-github-compact": "^1.2.0", - "@tanstack/config": "^0.21.0", + "@tanstack/config": "^0.22.0", "@testing-library/jest-dom": "^6.9.1", "@types/node": "^24.6.2", "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.1", + "@types/react-dom": "^19.2.2", "@types/use-sync-external-store": "^1.5.0", - "@typescript-eslint/eslint-plugin": "^8.46.0", - "@typescript-eslint/parser": "^8.46.0", + "@typescript-eslint/eslint-plugin": "^8.46.1", + "@typescript-eslint/parser": "^8.46.1", "@vitejs/plugin-react": "^5.0.4", - "eslint": "^9.37.0", + "eslint": "^9.38.0", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", "husky": "^9.1.7", - "jsdom": "^27.0.0", - "knip": "^5.64.3", + "jsdom": "^27.0.1", + "knip": "^5.66.1", "lint-staged": "^15.5.2", "markdown-link-extractor": "^4.0.2", "mitt": "^3.0.1", @@ -51,7 +51,7 @@ "shx": "^0.4.0", "tinyglobby": "^0.2.15", "typescript": "^5.9.2", - "vite": "^7.1.9", + "vite": "^7.1.10", "vitest": "^3.2.4", "zod": "^3.25.76" }, diff --git a/packages/angular-db/package.json b/packages/angular-db/package.json index 0f47776537..b305561622 100644 --- a/packages/angular-db/package.json +++ b/packages/angular-db/package.json @@ -15,7 +15,7 @@ "angular", "typescript" ], - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "dependencies": { "@tanstack/db": "workspace:*" }, diff --git a/packages/db-ivm/package.json b/packages/db-ivm/package.json index e2e722d0c2..2fb5d3e890 100644 --- a/packages/db-ivm/package.json +++ b/packages/db-ivm/package.json @@ -29,7 +29,7 @@ ], "main": "dist/cjs/index.cjs", "module": "dist/esm/index.js", - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "peerDependencies": { "typescript": ">=4.7" }, diff --git a/packages/db/package.json b/packages/db/package.json index 32dd84d7c6..932d17e676 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -8,7 +8,7 @@ }, "devDependencies": { "@vitest/coverage-istanbul": "^3.2.4", - "arktype": "^2.1.22", + "arktype": "^2.1.23", "temporal-polyfill": "^0.3.0" }, "exports": { @@ -30,7 +30,7 @@ ], "main": "dist/cjs/index.cjs", "module": "dist/esm/index.js", - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "peerDependencies": { "typescript": ">=4.7" }, diff --git a/packages/electric-db-collection/package.json b/packages/electric-db-collection/package.json index f77ed3872a..1661d9ddb4 100644 --- a/packages/electric-db-collection/package.json +++ b/packages/electric-db-collection/package.json @@ -32,7 +32,7 @@ ], "main": "dist/cjs/index.cjs", "module": "dist/esm/index.js", - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "author": "Kyle Mathews", "license": "MIT", "repository": { diff --git a/packages/query-db-collection/package.json b/packages/query-db-collection/package.json index fe26777d56..35f1610690 100644 --- a/packages/query-db-collection/package.json +++ b/packages/query-db-collection/package.json @@ -7,7 +7,7 @@ "@tanstack/db": "workspace:*" }, "devDependencies": { - "@tanstack/query-core": "^5.90.2", + "@tanstack/query-core": "^5.90.5", "@vitest/coverage-istanbul": "^3.2.4" }, "exports": { @@ -29,7 +29,7 @@ ], "main": "dist/cjs/index.cjs", "module": "dist/esm/index.js", - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "peerDependencies": { "@tanstack/query-core": "^5.0.0", "typescript": ">=4.7" diff --git a/packages/react-db/package.json b/packages/react-db/package.json index eb83d71c19..c12c7916d8 100644 --- a/packages/react-db/package.json +++ b/packages/react-db/package.json @@ -15,7 +15,7 @@ "react", "typescript" ], - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "dependencies": { "@tanstack/db": "workspace:*", "use-sync-external-store": "^1.6.0" @@ -24,7 +24,7 @@ "@electric-sql/client": "1.0.14", "@testing-library/react": "^16.3.0", "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.1", + "@types/react-dom": "^19.2.2", "@types/use-sync-external-store": "^1.5.0", "@vitest/coverage-istanbul": "^3.2.4", "react": "^19.2.0", diff --git a/packages/rxdb-db-collection/package.json b/packages/rxdb-db-collection/package.json index 4b2a6a4fc0..9a7f241a38 100644 --- a/packages/rxdb-db-collection/package.json +++ b/packages/rxdb-db-collection/package.json @@ -32,7 +32,7 @@ ], "main": "dist/cjs/index.cjs", "module": "dist/esm/index.js", - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "peerDependencies": { "rxdb": ">=16.17.2", "rxjs": ">=7.8.2", diff --git a/packages/solid-db/package.json b/packages/solid-db/package.json index 9981bda6de..0aab6539b3 100644 --- a/packages/solid-db/package.json +++ b/packages/solid-db/package.json @@ -15,7 +15,7 @@ "solid", "typescript" ], - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "dependencies": { "@solid-primitives/map": "^0.7.2", "@tanstack/db": "workspace:*" @@ -24,7 +24,7 @@ "@electric-sql/client": "1.0.14", "@solidjs/testing-library": "^0.8.10", "@vitest/coverage-istanbul": "^3.2.4", - "jsdom": "^27.0.0", + "jsdom": "^27.0.1", "solid-js": "^1.9.9", "vite-plugin-solid": "^2.11.9", "vitest": "^3.2.4" diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index c16901c8e6..09fc9d7ca9 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -10,7 +10,7 @@ "@sveltejs/vite-plugin-svelte": "^6.2.1", "@vitest/coverage-istanbul": "^3.2.4", "publint": "^0.3.14", - "svelte": "^5.39.11", + "svelte": "^5.41.0", "svelte-check": "^4.3.3" }, "exports": { diff --git a/packages/trailbase-db-collection/package.json b/packages/trailbase-db-collection/package.json index a5428b649e..83c301d467 100644 --- a/packages/trailbase-db-collection/package.json +++ b/packages/trailbase-db-collection/package.json @@ -32,7 +32,7 @@ ], "main": "dist/cjs/index.cjs", "module": "dist/esm/index.js", - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "peerDependencies": { "typescript": ">=4.7" }, diff --git a/packages/vue-db/package.json b/packages/vue-db/package.json index 7ddb8a52c6..1fd2a1679e 100644 --- a/packages/vue-db/package.json +++ b/packages/vue-db/package.json @@ -15,7 +15,7 @@ "vue", "typescript" ], - "packageManager": "pnpm@10.18.2", + "packageManager": "pnpm@10.18.3", "dependencies": { "@tanstack/db": "workspace:*" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b26cbec58..ed3718f49f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,17 +12,17 @@ importers: specifier: ^2.29.7 version: 2.29.7(@types/node@24.7.0) '@eslint/js': - specifier: ^9.37.0 - version: 9.37.0 + specifier: ^9.38.0 + version: 9.38.0 '@stylistic/eslint-plugin': specifier: ^4.4.1 - version: 4.4.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + version: 4.4.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0(encoding@0.1.13) '@tanstack/config': - specifier: ^0.21.0 - version: 0.21.0(@types/node@24.7.0)(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^0.22.0 + version: 0.22.0(@types/node@24.7.0)(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -33,44 +33,44 @@ importers: specifier: ^19.2.2 version: 19.2.2 '@types/react-dom': - specifier: ^19.2.1 - version: 19.2.1(@types/react@19.2.2) + specifier: ^19.2.2 + version: 19.2.2(@types/react@19.2.2) '@types/use-sync-external-store': specifier: ^1.5.0 version: 1.5.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + specifier: ^8.46.1 + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/parser': - specifier: ^8.46.0 - version: 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + specifier: ^8.46.1 + version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.0.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) eslint: - specifier: ^9.37.0 - version: 9.37.0(jiti@2.6.0) + specifier: ^9.38.0 + version: 9.38.0(jiti@2.6.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.37.0(jiti@2.6.0)) + version: 10.1.8(eslint@9.38.0(jiti@2.6.0)) eslint-import-resolver-typescript: specifier: ^4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0)))(eslint@9.37.0(jiti@2.6.0)) + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0)) eslint-plugin-prettier: specifier: ^5.5.4 - version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.0)))(eslint@9.37.0(jiti@2.6.0))(prettier@3.6.2) + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0))(prettier@3.6.2) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.37.0(jiti@2.6.0)) + version: 7.37.5(eslint@9.38.0(jiti@2.6.0)) husky: specifier: ^9.1.7 version: 9.1.7 jsdom: - specifier: ^27.0.0 - version: 27.0.0(postcss@8.5.6) + specifier: ^27.0.1 + version: 27.0.1(postcss@8.5.6) knip: - specifier: ^5.64.3 - version: 5.64.3(@types/node@24.7.0)(typescript@5.9.2) + specifier: ^5.66.1 + version: 5.66.1(@types/node@24.7.0)(typescript@5.9.2) lint-staged: specifier: ^15.5.2 version: 15.5.2 @@ -99,11 +99,11 @@ importers: specifier: ^5.9.2 version: 5.9.2 vite: - specifier: ^7.1.9 - version: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^7.1.10 + version: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) zod: specifier: ^3.25.76 version: 3.25.76 @@ -111,23 +111,23 @@ importers: examples/angular/todos: dependencies: '@angular/common': - specifier: ^20.3.4 - version: 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + specifier: ^20.3.6 + version: 20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/compiler': - specifier: ^20.3.4 - version: 20.3.4 + specifier: ^20.3.6 + version: 20.3.6 '@angular/core': - specifier: ^20.3.4 - version: 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1) + specifier: ^20.3.6 + version: 20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/forms': - specifier: ^20.3.4 - version: 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + specifier: ^20.3.6 + version: 20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/platform-browser': - specifier: ^20.3.4 - version: 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)) + specifier: ^20.3.6 + version: 20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/router': - specifier: ^20.3.4 - version: 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + specifier: ^20.3.6 + version: 20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-db': specifier: workspace:* version: link:../../../packages/angular-db @@ -145,17 +145,17 @@ importers: version: 0.15.1 devDependencies: '@angular/build': - specifier: ^20.3.5 - version: 20.3.5(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.8.3))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.7.0)(chokidar@4.0.3)(jiti@2.6.0)(karma@6.4.4)(lightningcss@1.30.1)(postcss@8.5.6)(tailwindcss@3.4.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.6)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) + specifier: ^20.3.6 + version: 20.3.6(@angular/compiler-cli@20.3.6(@angular/compiler@20.3.6)(typescript@5.8.3))(@angular/compiler@20.3.6)(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.7.0)(chokidar@4.0.3)(jiti@2.6.0)(karma@6.4.4)(lightningcss@1.30.1)(postcss@8.5.6)(tailwindcss@3.4.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.6)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': - specifier: ^20.3.5 - version: 20.3.5(@types/node@24.7.0)(chokidar@4.0.3) + specifier: ^20.3.6 + version: 20.3.6(@types/node@24.7.0)(chokidar@4.0.3) '@angular/compiler-cli': - specifier: ^20.3.4 - version: 20.3.4(@angular/compiler@20.3.4)(typescript@5.8.3) + specifier: ^20.3.6 + version: 20.3.6(@angular/compiler@20.3.6)(typescript@5.8.3) '@types/jasmine': - specifier: ~5.1.9 - version: 5.1.9 + specifier: ~5.1.12 + version: 5.1.12 autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) @@ -191,10 +191,10 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.14 - version: 4.1.14(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.1.14(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/query-core': - specifier: ^5.90.2 - version: 5.90.2 + specifier: ^5.90.5 + version: 5.90.5 '@tanstack/query-db-collection': specifier: ^0.2.32 version: link:../../../packages/query-db-collection @@ -202,20 +202,20 @@ importers: specifier: ^0.1.33 version: link:../../../packages/react-db '@tanstack/react-router': - specifier: ^1.132.47 - version: 1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^1.133.15 + version: 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-router-devtools': - specifier: ^1.132.51 - version: 1.132.51(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.132.47)(@types/node@24.7.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^1.133.15 + version: 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.15)(@types/node@24.7.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/react-router-with-query': specifier: ^1.130.17 - version: 1.130.17(@tanstack/react-query@5.83.0(react@19.2.0))(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.132.47)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.130.17(@tanstack/react-query@5.83.0(react@19.2.0))(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.15)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-start': - specifier: ^1.132.56 - version: 1.132.56(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^1.133.15 + version: 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/router-plugin': - specifier: ^1.132.56 - version: 1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^1.133.15 + version: 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@trpc/client': specifier: ^11.6.0 version: 11.6.0(@trpc/server@11.6.0(typescript@5.9.2))(typescript@5.9.2) @@ -248,26 +248,26 @@ importers: version: 4.1.14 vite: specifier: ^7.1.7 - version: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) zod: specifier: ^4.1.11 version: 4.1.11 devDependencies: '@eslint/compat': specifier: ^1.4.0 - version: 1.4.0(eslint@9.37.0(jiti@2.6.0)) + version: 1.4.0(eslint@9.38.0(jiti@2.6.0)) '@eslint/js': - specifier: ^9.37.0 - version: 9.37.0 + specifier: ^9.38.0 + version: 9.38.0 '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/pg': specifier: ^8.15.5 version: 8.15.5 @@ -275,17 +275,17 @@ importers: specifier: ^19.2.2 version: 19.2.2 '@types/react-dom': - specifier: ^19.2.1 - version: 19.2.1(@types/react@19.2.2) + specifier: ^19.2.2 + version: 19.2.2(@types/react@19.2.2) '@typescript-eslint/eslint-plugin': - specifier: ^8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + specifier: ^8.46.1 + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/parser': - specifier: ^8.46.0 - version: 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + specifier: ^8.46.1 + version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.0.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -293,23 +293,23 @@ importers: specifier: ^0.31.5 version: 0.31.5 eslint: - specifier: ^9.37.0 - version: 9.37.0(jiti@2.6.0) + specifier: ^9.38.0 + version: 9.38.0(jiti@2.6.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.37.0(jiti@2.6.0)) + version: 10.1.8(eslint@9.38.0(jiti@2.6.0)) eslint-plugin-prettier: specifier: ^5.5.4 - version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.0)))(eslint@9.37.0(jiti@2.6.0))(prettier@3.6.2) + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0))(prettier@3.6.2) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.37.0(jiti@2.6.0)) + version: 7.37.5(eslint@9.38.0(jiti@2.6.0)) globals: specifier: ^16.4.0 version: 16.4.0 jsdom: specifier: ^27.0.0 - version: 27.0.0(postcss@8.5.6) + version: 27.0.1(postcss@8.5.6) prettier: specifier: ^3.6.2 version: 3.6.2 @@ -321,7 +321,7 @@ importers: version: 5.9.2 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) web-vitals: specifier: ^5.1.0 version: 5.1.0 @@ -332,8 +332,8 @@ importers: specifier: workspace:^ version: link:../../../packages/electric-db-collection '@tanstack/query-core': - specifier: ^5.90.2 - version: 5.90.2 + specifier: ^5.90.5 + version: 5.90.5 '@tanstack/query-db-collection': specifier: workspace:* version: link:../../../packages/query-db-collection @@ -341,11 +341,11 @@ importers: specifier: workspace:* version: link:../../../packages/react-db '@tanstack/react-router': - specifier: ^1.132.47 - version: 1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^1.133.15 + version: 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-start': - specifier: ^1.132.56 - version: 1.132.56(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^1.133.15 + version: 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/trailbase-db-collection': specifier: workspace:^ version: link:../../../packages/trailbase-db-collection @@ -378,17 +378,17 @@ importers: version: 0.8.0 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) zod: specifier: ^4.1.11 version: 4.1.11 devDependencies: '@eslint/js': - specifier: ^9.37.0 - version: 9.37.0 + specifier: ^9.38.0 + version: 9.38.0 '@tailwindcss/vite': specifier: ^4.1.14 - version: 4.1.14(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.1.14(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@types/cors': specifier: ^2.8.19 version: 2.8.19 @@ -405,17 +405,17 @@ importers: specifier: ^19.2.2 version: 19.2.2 '@types/react-dom': - specifier: ^19.2.1 - version: 19.2.1(@types/react@19.2.2) + specifier: ^19.2.2 + version: 19.2.2(@types/react@19.2.2) '@typescript-eslint/eslint-plugin': - specifier: ^8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + specifier: ^8.46.1 + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/parser': - specifier: ^8.46.0 - version: 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + specifier: ^8.46.1 + version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^5.0.3 - version: 5.0.4(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.0.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -426,14 +426,14 @@ importers: specifier: ^0.31.5 version: 0.31.5 eslint: - specifier: ^9.37.0 - version: 9.37.0(jiti@2.6.0) + specifier: ^9.38.0 + version: 9.38.0(jiti@2.6.0) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.37.0(jiti@2.6.0)) + version: 5.2.0(eslint@9.38.0(jiti@2.6.0)) eslint-plugin-react-refresh: - specifier: ^0.4.23 - version: 0.4.23(eslint@9.37.0(jiti@2.6.0)) + specifier: ^0.4.24 + version: 0.4.24(eslint@9.38.0(jiti@2.6.0)) pg: specifier: ^8.16.3 version: 8.16.3 @@ -445,30 +445,30 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) examples/solid/todo: dependencies: '@tanstack/electric-db-collection': - specifier: ^0.1.32 + specifier: ^0.1.35 version: link:../../../packages/electric-db-collection '@tanstack/query-core': - specifier: ^5.90.2 - version: 5.90.2 + specifier: ^5.90.5 + version: 5.90.5 '@tanstack/query-db-collection': - specifier: ^0.2.29 + specifier: ^0.2.32 version: link:../../../packages/query-db-collection '@tanstack/solid-db': - specifier: ^0.1.30 + specifier: ^0.1.33 version: link:../../../packages/solid-db '@tanstack/solid-router': - specifier: ^1.132.49 - version: 1.132.49(solid-js@1.9.9) + specifier: ^1.133.15 + version: 1.133.15(solid-js@1.9.9) '@tanstack/solid-start': - specifier: ^1.132.56 - version: 1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(solid-js@1.9.9)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^1.133.15 + version: 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(solid-js@1.9.9)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/trailbase-db-collection': - specifier: ^0.1.30 + specifier: ^0.1.33 version: link:../../../packages/trailbase-db-collection cors: specifier: ^2.8.5 @@ -478,7 +478,7 @@ importers: version: 0.44.6(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7) drizzle-zod: specifier: ^0.8.3 - version: 0.8.3(drizzle-orm@0.44.6(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.11) + version: 0.8.3(drizzle-orm@0.44.6(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))(zod@3.25.76) express: specifier: ^4.21.2 version: 4.21.2 @@ -499,8 +499,8 @@ importers: version: 5.1.4(typescript@5.9.2)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) devDependencies: '@eslint/js': - specifier: ^9.37.0 - version: 9.37.0 + specifier: ^9.38.0 + version: 9.38.0 '@tailwindcss/vite': specifier: ^4.1.14 version: 4.1.14(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) @@ -517,11 +517,11 @@ importers: specifier: ^8.15.5 version: 8.15.5 '@typescript-eslint/eslint-plugin': - specifier: ^8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + specifier: ^8.46.1 + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/parser': - specifier: ^8.46.0 - version: 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + specifier: ^8.46.1 + version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -532,11 +532,11 @@ importers: specifier: ^0.31.5 version: 0.31.5 eslint: - specifier: ^9.37.0 - version: 9.37.0(jiti@2.6.0) + specifier: ^9.38.0 + version: 9.38.0(jiti@2.6.0) eslint-plugin-solid: specifier: ^0.14.5 - version: 0.14.5(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + version: 0.14.5(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) pg: specifier: ^8.16.3 version: 8.16.3 @@ -576,7 +576,7 @@ importers: version: 19.2.15(@angular/common@19.2.15(@angular/core@19.2.15(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.15)(@angular/core@19.2.15(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.15(@angular/common@19.2.15(@angular/core@19.2.15(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.15(rxjs@7.8.2)(zone.js@0.15.1))) '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) rxjs: specifier: ^7.8.2 version: 7.8.2 @@ -598,10 +598,10 @@ importers: devDependencies: '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) arktype: - specifier: ^2.1.22 - version: 2.1.22 + specifier: ^2.1.23 + version: 2.1.23 temporal-polyfill: specifier: ^0.3.0 version: 0.3.0 @@ -623,7 +623,7 @@ importers: version: 4.1.12 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/electric-db-collection: dependencies: @@ -648,7 +648,7 @@ importers: version: 4.1.12 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/query-db-collection: dependencies: @@ -663,11 +663,11 @@ importers: version: 5.9.2 devDependencies: '@tanstack/query-core': - specifier: ^5.90.2 - version: 5.90.2 + specifier: ^5.90.5 + version: 5.90.5 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/react-db: dependencies: @@ -683,19 +683,19 @@ importers: version: 1.0.14 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/react': specifier: ^19.2.2 version: 19.2.2 '@types/react-dom': - specifier: ^19.2.1 - version: 19.2.1(@types/react@19.2.2) + specifier: ^19.2.2 + version: 19.2.2(@types/react@19.2.2) '@types/use-sync-external-store': specifier: ^1.5.0 version: 1.5.0 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) react: specifier: ^19.2.0 version: 19.2.0 @@ -732,7 +732,7 @@ importers: version: 4.1.12 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/solid-db: dependencies: @@ -751,19 +751,19 @@ importers: version: 0.8.10(solid-js@1.9.9) '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) jsdom: - specifier: ^27.0.0 - version: 27.0.0(postcss@8.5.6) + specifier: ^27.0.1 + version: 27.0.1(postcss@8.5.6) solid-js: specifier: ^1.9.9 version: 1.9.9 vite-plugin-solid: specifier: ^2.11.9 - version: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/svelte-db: dependencies: @@ -773,22 +773,22 @@ importers: devDependencies: '@sveltejs/package': specifier: ^2.5.4 - version: 2.5.4(svelte@5.39.11)(typescript@5.9.2) + version: 2.5.4(svelte@5.41.0)(typescript@5.9.2) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.1 - version: 6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) publint: specifier: ^0.3.14 version: 0.3.14 svelte: - specifier: ^5.39.11 - version: 5.39.11 + specifier: ^5.41.0 + version: 5.41.0 svelte-check: specifier: ^4.3.3 - version: 4.3.3(picomatch@4.0.3)(svelte@5.39.11)(typescript@5.9.2) + version: 4.3.3(picomatch@4.0.3)(svelte@5.41.0)(typescript@5.9.2) packages/trailbase-db-collection: dependencies: @@ -816,7 +816,7 @@ importers: version: 4.1.12 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/vue-db: dependencies: @@ -829,10 +829,10 @@ importers: version: 1.0.14 '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.1(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 6.0.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vue: specifier: ^3.5.22 version: 3.5.22(typescript@5.9.2) @@ -906,12 +906,12 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular-devkit/architect@0.2003.5': - resolution: {integrity: sha512-KtA//ucTIdnKp1+vTYnqBallEbiZHLx3Gs7XgYm+p4VJfVjbMZHWY2vrbJoyCUp05goiv2XnDy0bKQ9VYHePWg==} + '@angular-devkit/architect@0.2003.6': + resolution: {integrity: sha512-VtXxfJzrBZ8MQN83shXNaTUaLSOIwa+4/3LD5drxSnHuYJrz+d3FIApWAxcA9QzucsTDZwXyFxaWZN/e5XVm6g==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@angular-devkit/core@20.3.5': - resolution: {integrity: sha512-NpAP5j3q/n+SC1s0yAWKDAbc7Y8xUxlmJ5iDRJBGu6qDKM7lMnYA1tn2UEy/JnXluJ2XZqqiymrtucw7yux2xQ==} + '@angular-devkit/core@20.3.6': + resolution: {integrity: sha512-uLRk3865Iz/EO9Zm/mrFfdyoZinJBihXE6HVDYRYjAqsgW14LsD8pkpWy9+LYlOwcH96Ndnev+msxaTJaNXtPg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^4.0.0 @@ -919,12 +919,12 @@ packages: chokidar: optional: true - '@angular-devkit/schematics@20.3.5': - resolution: {integrity: sha512-BDizJp7QIoCyMZmuGKoryNUH3QgFPnkEIv0gRdpLhZum4+ZN/DYWaf/jSSGnSVGK88oMrgq7420VEjYPlgJ5MA==} + '@angular-devkit/schematics@20.3.6': + resolution: {integrity: sha512-QD7QS1oR0XcZ9ZI4D1c4JjKmSn2up/ocOU2FS1mMO7S5RtAZMsPv4J3r+6ywHA2ev2sRySOQ0D8OYBcEuYX9Jw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@angular/build@20.3.5': - resolution: {integrity: sha512-Nwwwm8U7lolkdHt75PiPkW93689SBFUN9qEQeu02sPfq2Tqyn20PZGifXkV8A/6mlWbQUjfUnGpRTVk/WhW9Eg==} + '@angular/build@20.3.6': + resolution: {integrity: sha512-O5qyxCCe77tu1zy9XudKxqFqi5zih0ZI8J8Anra/ZZdtTKbLMprXMGFzMYzwCqvcIzzbmOumkSJKoXbFazHaaw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler': ^20.0.0 @@ -934,7 +934,7 @@ packages: '@angular/platform-browser': ^20.0.0 '@angular/platform-server': ^20.0.0 '@angular/service-worker': ^20.0.0 - '@angular/ssr': ^20.3.5 + '@angular/ssr': ^20.3.6 karma: ^6.4.0 less: ^4.2.0 ng-packagr: ^20.0.0 @@ -969,8 +969,8 @@ packages: vitest: optional: true - '@angular/cli@20.3.5': - resolution: {integrity: sha512-UA843Mh5uHIWnrzKUotGmhJmvefyEizFS7X8xJEUJsX5pa1EKUB/145rKHoLHxRRpHGxFcXtvciJCksFz1lSBA==} + '@angular/cli@20.3.6': + resolution: {integrity: sha512-1RozAub7Gcl5ES3vBYatIgoMDgujlvySwHARoYT+1VhbYvM0RTt4sn2aDhHxqG0GcyiXR5zISkzJvldaY2nQCQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true @@ -981,19 +981,19 @@ packages: '@angular/core': 19.2.15 rxjs: ^6.5.3 || ^7.4.0 - '@angular/common@20.3.4': - resolution: {integrity: sha512-hBQahyiHEAtc30a8hPOuIWcUL7j8189DC0sX4RiBd/wtvzH4Sd3XhguxyZAL6gHgNZEQ0nKy0uAfvWB/79GChQ==} + '@angular/common@20.3.6': + resolution: {integrity: sha512-+gHMuFe0wz4f+vfGZ2q+fSQSYaY7KlN7QdDrFqLnA7H2sythzhXvRbXEtp4DkPjihh9gupXg2MeLh1ROy5AfSw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/core': 20.3.4 + '@angular/core': 20.3.6 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@20.3.4': - resolution: {integrity: sha512-FwEv+QM9tEMXDMd2V+j82VLOjJVUrI7ENz/LJa2p/YEGVJQkT3HVca5qJj+8I+7bfPEY/d46R/cmjjqMqUcYdg==} + '@angular/compiler-cli@20.3.6': + resolution: {integrity: sha512-VOFRBx9fBt2jW9I8qD23fwGeKxBI8JssJBAMqnFPl3k59VJWHQi6LlXZCLCBNdfwflTJdKeRvdgT51Q0k6tnFQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 20.3.4 + '@angular/compiler': 20.3.6 typescript: '>=5.8 <6.0' peerDependenciesMeta: typescript: @@ -1003,8 +1003,8 @@ packages: resolution: {integrity: sha512-hMHZU6/03xG0tbPDIm1hbVSTFLnRkGYfh+xdBwUMnIFYYTS0QJ2hdPfEZKCJIXm+fz9IAI5MPdDTfeyp0sgaHQ==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - '@angular/compiler@20.3.4': - resolution: {integrity: sha512-ISfEyn5ppWOP2hyZy0/IFEcQOaq5x1mXVZ2CRCxTpWyXYzavj27Ahr3+LQHPVV0uTNovlENyPAUnrzW+gLxXEw==} + '@angular/compiler@20.3.6': + resolution: {integrity: sha512-OdjXBsAsnn7qiW6fSHClwn9XwjVxhtO9+RbDc6Mf+YPCnJq0s8T78H2fc8VdJFp/Rs+tMZcwwjd9VZPm8+2XWA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@angular/core@19.2.15': @@ -1014,11 +1014,11 @@ packages: rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 - '@angular/core@20.3.4': - resolution: {integrity: sha512-qLYVXcpSBmsA/9fITB1cT2y37V1Yo3ybWEwvafnbAh8izabrMV0hh+J9Ajh9bPk092T7LS8Xt9eTu0OquBXkbw==} + '@angular/core@20.3.6': + resolution: {integrity: sha512-sDURQWnjwE4Y750u/5qwkZEYMoI4CrKghnx4aKulxCnohR3//C78wvz6p8MtCuqYfzGkdQZDYFg8tgAz17qgPw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/compiler': 20.3.4 + '@angular/compiler': 20.3.6 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 peerDependenciesMeta: @@ -1027,13 +1027,13 @@ packages: zone.js: optional: true - '@angular/forms@20.3.4': - resolution: {integrity: sha512-gPbI2iIvVA2jhwjTg7e3j/JqCFIpRSPgzW/wi5q7LrGBm7XKHNzY5xlEVDNvdq+gC4HTius9GOIx9I0i8mjrEw==} + '@angular/forms@20.3.6': + resolution: {integrity: sha512-tBGo/LBtCtSrClMY4DTm/3UiSjqLLMEYXS/4E0nW1mFDv7ulKnaAQB+KbfBmmTHYxlKLs+SxjKv6GoydMPSurA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 20.3.4 - '@angular/core': 20.3.4 - '@angular/platform-browser': 20.3.4 + '@angular/common': 20.3.6 + '@angular/core': 20.3.6 + '@angular/platform-browser': 20.3.6 rxjs: ^6.5.3 || ^7.4.0 '@angular/platform-browser-dynamic@19.2.15': @@ -1056,37 +1056,40 @@ packages: '@angular/animations': optional: true - '@angular/platform-browser@20.3.4': - resolution: {integrity: sha512-8eoHC+vk7scb24qjlpsirkh1Q17uFyWdhl+u92XNjvimtZRY96oDZeFEDPoexPqtKUQcCOpEPbL8P/IbpBsqYQ==} + '@angular/platform-browser@20.3.6': + resolution: {integrity: sha512-gFp1yd+HtRN8XdpMatRLO5w6FLIzsnF31lD2Duo4BUTCoMAMdfaNT6FtcvNdKu7ANo27Ke26fxEEE2bh6FU98A==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/animations': 20.3.4 - '@angular/common': 20.3.4 - '@angular/core': 20.3.4 + '@angular/animations': 20.3.6 + '@angular/common': 20.3.6 + '@angular/core': 20.3.6 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/router@20.3.4': - resolution: {integrity: sha512-qMVurWXVplYeHBKOWtQFtD+MfwOc0i/VJaFPGdiM5mDlfhtsg3OHcZBbSTmQW02l/4YimF5Ee3+pac279p+g1A==} + '@angular/router@20.3.6': + resolution: {integrity: sha512-fSAYOR9nKpH5PoBYFNdII3nAFl2maUrYiISU33CnGwb7J7Q0s09k231c/P5tVN4URi+jdADVwiBI8cIYk8SVrg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 20.3.4 - '@angular/core': 20.3.4 - '@angular/platform-browser': 20.3.4 + '@angular/common': 20.3.6 + '@angular/core': 20.3.6 + '@angular/platform-browser': 20.3.6 rxjs: ^6.5.3 || ^7.4.0 - '@ark/schema@0.49.0': - resolution: {integrity: sha512-GphZBLpW72iS0v4YkeUtV3YIno35Gimd7+ezbPO9GwEi9kzdUrPVjvf6aXSBAfHikaFc/9pqZOpv3pOXnC71tw==} + '@ark/regex@0.0.0': + resolution: {integrity: sha512-p4vsWnd/LRGOdGQglbwOguIVhPmCAf5UzquvnDoxqhhPWTP84wWgi1INea8MgJ4SnI2gp37f13oA4Waz9vwNYg==} + + '@ark/schema@0.50.0': + resolution: {integrity: sha512-hfmP82GltBZDadIOeR3argKNlYYyB2wyzHp0eeAqAOFBQguglMV/S7Ip2q007bRtKxIMLDqFY6tfPie1dtssaQ==} - '@ark/util@0.49.0': - resolution: {integrity: sha512-/BtnX7oCjNkxi2vi6y1399b+9xd1jnCrDYhZ61f0a+3X8x8DxlK52VgEEzyuC2UQMPACIfYrmHkhD3lGt2GaMA==} + '@ark/util@0.50.0': + resolution: {integrity: sha512-tIkgIMVRpkfXRQIEf0G2CJryZVtHVrqcWHMDa5QKo0OEEBu0tHkRSIMm4Ln8cd8Bn9TPZtvc/kE2Gma8RESPSg==} '@asamuzakjp/css-color@4.0.5': resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} - '@asamuzakjp/dom-selector@6.5.6': - resolution: {integrity: sha512-Mj3Hu9ymlsERd7WOsUKNUZnJYL4IZ/I9wVVYgtvOsWYiEFbkQ4G7VRIh2USxTVW4BBDIsLG+gBUgqOqf2Kvqow==} + '@asamuzakjp/dom-selector@6.7.2': + resolution: {integrity: sha512-ccKogJI+0aiDhOahdjANIc9SDixSud1gbwdVrhn7kMopAtLXqsz9MKmQQtIl6Y5aC2IYq+j4dz/oedL2AVMmVQ==} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -1699,12 +1702,12 @@ packages: eslint: optional: true - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.4.0': - resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} + '@eslint/config-helpers@0.4.1': + resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.16.0': @@ -1715,12 +1718,12 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.37.0': - resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} + '@eslint/js@9.38.0': + resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.4.0': @@ -1937,8 +1940,8 @@ packages: '@firebase/webchannel-wrapper@1.0.3': resolution: {integrity: sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ==} - '@gerrit0/mini-shiki@1.27.2': - resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} + '@gerrit0/mini-shiki@3.13.1': + resolution: {integrity: sha512-fDWM5QQc70jwBIt/WYMybdyXdyBmoJe7r1hpM+V/bHnyla79sygVDK2/LlVxIPc4n5FA3B5Wzt7AQH2+psNphg==} '@grpc/grpc-js@1.9.15': resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==} @@ -2831,15 +2834,21 @@ packages: '@rushstack/ts-command-line@4.22.6': resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} - '@schematics/angular@20.3.5': - resolution: {integrity: sha512-mrVWO64psqah8E8HgpF30NMizVZyX6aH3k6hqf2tDgU3+giKX7xvTG9UQCaXA4MLBsQbpcWAmwPLipwLnPm8wA==} + '@schematics/angular@20.3.6': + resolution: {integrity: sha512-YPIEyKPBOyJYlda5fA49kMThzZ4WidomEMDghshux8xidbjDaPWBZdyVPQj3IXyW0teGlUM/TH0TH2weumMZrg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -3109,12 +3118,12 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 - '@tanstack/config@0.21.0': - resolution: {integrity: sha512-K62qQ8UGCBMZuVLSc/C+sdb1b38922ue3GMsc3FFZr5BbVsxZIw+y6EYYCU7UWrVwfq8h+0Z2lATq4lWETP2/w==} + '@tanstack/config@0.22.0': + resolution: {integrity: sha512-7Wwfw6wBv2Kc+OBNIJQzBSJ6q7GABtwVT+VOQ/7/Gl7z8z1rtEYUZrxUrNvbbrHY+J5/WNZNZjJjTWDf8nTUBw==} engines: {node: '>=18'} - '@tanstack/directive-functions-plugin@1.132.53': - resolution: {integrity: sha512-ZMg2XMLFoci83zM0c707cXRygj+bXZl1jG9BOlqK5ggrRzsyAO78USuyhq/EUo67uEkEWM4JIlwmzLTAjprDyg==} + '@tanstack/directive-functions-plugin@1.133.9': + resolution: {integrity: sha512-mnJXMQNovd+BhAp5SoSF6BXWfB8e/s0PdxY1AW3wqGOoGA1T7cLXHXhvzuiefX0FVKyAbvsyejs1d5usHePjEA==} engines: {node: '>=12'} peerDependencies: vite: '>=6.0.0 || >=7.0.0' @@ -3123,8 +3132,8 @@ packages: resolution: {integrity: sha512-2g+PuGR3GuvvCiR3xZs+IMqAvnYU9bvH+jRml0BFBSxHBj22xFCTNvJWhvgj7uICFF9IchDkFUto91xDPMu5cg==} engines: {node: '>=18'} - '@tanstack/history@1.132.31': - resolution: {integrity: sha512-UCHM2uS0t/uSszqPEo+SBSSoQVeQ+LlOWAVBl5SA7+AedeAbKafIPjFn8huZCXNLAYb0WKV2+wETr7lDK9uz7g==} + '@tanstack/history@1.133.3': + resolution: {integrity: sha512-zFQnGdX0S4g5xRuS+95iiEXM+qlGvYG7ksmOKx7LaMv60lDWa0imR8/24WwXXvBWJT1KnwVdZcjvhCwz9IiJCw==} engines: {node: '>=12'} '@tanstack/publish-config@0.2.1': @@ -3134,19 +3143,19 @@ packages: '@tanstack/query-core@5.83.0': resolution: {integrity: sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA==} - '@tanstack/query-core@5.90.2': - resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} + '@tanstack/query-core@5.90.5': + resolution: {integrity: sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==} '@tanstack/react-query@5.83.0': resolution: {integrity: sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.132.51': - resolution: {integrity: sha512-09gHGUE9BVE6O+7u4ICnKigdPP0vZAYI70dKNqGp8bEy9jaMmHGlUxVV6pKqBLVgcPmwT9YMRAeJ5+QrcznXGA==} + '@tanstack/react-router-devtools@1.133.15': + resolution: {integrity: sha512-EBkWLTdafkWY+M0A32qeFMSJc6SLU3DBg2oPQ4zDOy55BTeFSRMw7Y2z3V00BwO2eGI+yB73Ym/Noy28qGySvQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.132.47 + '@tanstack/react-router': ^1.133.15 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' @@ -3160,29 +3169,29 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.132.47': - resolution: {integrity: sha512-mjCN1ueVLHBOK1gqLeacCrUPBZietMKTkr7xZlC32dCGn4e+83zMSlRTS2TrEl7+wEH+bqjnoyx8ALYTSiQ1Cg==} + '@tanstack/react-router@1.133.15': + resolution: {integrity: sha512-3gQitqq/5lL//KSv9Ro34Fw7xak2ZQcPbR7x6bu5X4W0v97xTE7+bMbBS5UAg9zXTq0FNyB124GabgyBgeQ0NA==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.132.54': - resolution: {integrity: sha512-lz4oA54SgTBWqdZIUpAtmu7kDpcjQEuoi7kQh9sSUc7z5ECp1E1EJG+Nbzo6i7B1cqmNyuPYiJ+2GqTus22dmw==} + '@tanstack/react-start-client@1.133.15': + resolution: {integrity: sha512-eQ8n4+61G5PizQpuso9MpyOsW8dVL5ZlTMa7BNdGt96OGkenj/dXnqXi3gZ9xYAIkn7VRcFZMpagZQo/Yksp5Q==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-server@1.132.54': - resolution: {integrity: sha512-Kec2BtXsqbeIpaeqk29b7nm2TGgwGKUIxyZleO1SkvnXWDWLlU2Ok/wFJz/7rz5Qe2SYtIhOX7K/t5DTrVBnpQ==} + '@tanstack/react-start-server@1.133.15': + resolution: {integrity: sha512-dF5PyB1BGOYRKY1B+p1e617pSpg7BEeHT3mDPH6XMy3whzMKnlo9vXSOvRekoZ0phtMloYq4/TlP7qK4lWdS2g==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.132.56': - resolution: {integrity: sha512-Lu0/FrjdYHCeDQpQ1UuuCaZsslwBmHy0eiahwSE0TgqS1YfT6IN2Iu4AkpuEOvV0Fv5aYASmukTkGShOfpCZrA==} + '@tanstack/react-start@1.133.15': + resolution: {integrity: sha512-E2VOqrPp9D28QHwig5jvIZMEQYjUYoLBZ4PQt6esymKr5DduI3KdFFD495jLm4dxRIH3rE4BHZjkEKGvuB2XLw==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' @@ -3195,15 +3204,15 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.132.47': - resolution: {integrity: sha512-8YKFHmG6VUqXaWAJzEqjyW6w31dARS2USd2mtI5ZeZcihqMbskK28N4iotBXNn+sSKJnPRjc7A4jTnnEf8Mn8Q==} + '@tanstack/router-core@1.133.15': + resolution: {integrity: sha512-ZWAmoFcgi27Ojv2FH3Dq3D6Vt73LswdTnA1tyHShNWQf7wOMH/VKKB9JxiXJqpLTK4NJqpnUp/x0/3nvmdrIqg==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.132.51': - resolution: {integrity: sha512-uhbk4rSeUpYaqOJLZwOwfyysSoeedIEiRWz37sTVM4tUBFsWqA/p9gO2kVSx/Xmcu8grLy512KNDDeji3QhdwQ==} + '@tanstack/router-devtools-core@1.133.15': + resolution: {integrity: sha512-TseqoP0fRfgkdb1kYzPC0S8td3pRt04BudOpenCabn8/f1EDmraxHdWh5O7S5x0VXr9dpvnj0KAUG+ip7x+iEg==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.132.47 + '@tanstack/router-core': ^1.133.15 csstype: ^3.0.10 solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 @@ -3211,16 +3220,16 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.132.51': - resolution: {integrity: sha512-iAGz2IZ2rr38o+7cgE33qPyNFJFx7PcPOvUXk5kcX1TtXeyTgVLoe7vqQzKYbungZmht2V8xSFmy6kakUJhxOA==} + '@tanstack/router-generator@1.133.15': + resolution: {integrity: sha512-TXI07UzV5t1j1LeJ2eOErV9TxvzBRx2oSCEmkVaWMXaGKuQL7I4VB9e9w15ylHnvCO2Z/4DgIhUVF6h9/ZS3Mw==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.132.56': - resolution: {integrity: sha512-kwW2NWMoxMMOoxbRPAxYoEjB+iy4vnYTS9VctKMcwYDtIGK1pQuLR3XtpdhNt0S5reKXfqJG2hEj6yTHUcJs7g==} + '@tanstack/router-plugin@1.133.15': + resolution: {integrity: sha512-c3m7Pfuth/TXiRol0OpTw+cJyE7RxJpiMXDLooCiZgRDu2VhyXaanPLuuti9vyZiVdSrVZTQ7tJBFABymWbX5w==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.132.47 + '@tanstack/react-router': ^1.133.15 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.8 webpack: '>=5.92.0' @@ -3236,34 +3245,34 @@ packages: webpack: optional: true - '@tanstack/router-utils@1.132.51': - resolution: {integrity: sha512-8wmYmc8LY0MhgNw1jfwjTdpYgl5CmvvkamoHOUcz4odFiAWOXLhwo3UBOwKihw+6SxJ/M7l9tEcq5PdLUOUi0Q==} + '@tanstack/router-utils@1.133.3': + resolution: {integrity: sha512-miPFlt0aG6ID5VDolYuRXgLS7cofvbZGMvHwf2Wmyxjo6GLp/kxxpkQrfM4T1I5cwjwYZZAQmdUKbVHwFZz9sQ==} engines: {node: '>=12'} - '@tanstack/server-functions-plugin@1.132.53': - resolution: {integrity: sha512-g3RXrk8DQ48Xl3jwoqHODivxshxfgiJ+OI2rgQUCvXW2U6J0Jy+UbTKcjMl2oUbeOTs1egG84jjvPCd1KH0ZSg==} + '@tanstack/server-functions-plugin@1.133.11': + resolution: {integrity: sha512-i6w1fmnXCWsbIEq5LZ1+tSVsqy0Iy7zAUVJzfNw6AzfbWZymwl508xwQJkIowv7v+kH1yIqNaeZ75gyWNZuVEg==} engines: {node: '>=12'} - '@tanstack/solid-router@1.132.49': - resolution: {integrity: sha512-6ACsikae/CfgmFgCMShqd6qpYkTVi6J6i7vI++DeXw2Xzf0VCkqnm0ShgXXofFChrwytcSLxsUicPQ9JIviLAw==} + '@tanstack/solid-router@1.133.15': + resolution: {integrity: sha512-P1ymkQDeoQHdpfkNibol8IhVTvDVt6mrefIjGXZBa+hY/Cbt4/6VOQ5OYbmo5YYLHQpaMmYrZYdsAmdtM0ynfw==} engines: {node: '>=12'} peerDependencies: solid-js: ^1.9.5 - '@tanstack/solid-start-client@1.132.54': - resolution: {integrity: sha512-VONAG5SFk5Q9l0C3LNDm1nszQL6zpb6Avt0ibaMFhpvPugZsGdNRSQOjGsokn9tZ7K7+Zi+zIwGq/MF03+3RMg==} + '@tanstack/solid-start-client@1.133.15': + resolution: {integrity: sha512-EgOMR3J4wv1oHfwwkyJga9ZhrKfPLbYB0zEFJVsjK6hwOtUGNSE+jqBss50VcMK5zbvJIP23XSE0QRO/NCCt5w==} engines: {node: '>=22.12.0'} peerDependencies: solid-js: '>=1.0.0' - '@tanstack/solid-start-server@1.132.54': - resolution: {integrity: sha512-BqX0y2T35OGg1I6mBox7TjsucsEfeluoE/SuI21ElabQG4ySvPYoXatdvJ2Oeja7D2d+pFBuF7t8/8Lmfb7Akw==} + '@tanstack/solid-start-server@1.133.15': + resolution: {integrity: sha512-ANLqKIxDyRQA4pIUARWRjvwpDaYpU15QcUrsk58a5+QmcGEWx2oxiVAJ+3ounASx/XOhpbk6gKqE/FidSijSjQ==} engines: {node: '>=22.12.0'} peerDependencies: solid-js: ^1.0.0 - '@tanstack/solid-start@1.132.56': - resolution: {integrity: sha512-zUnZQjOcQGm2GqUp+4Zwg+cUBli4ew9MVu7D9/N62tIp3lJkPAQMVety8QESC9Px8QrzmtwHBYMUeabBJXMR1Q==} + '@tanstack/solid-start@1.133.15': + resolution: {integrity: sha512-EoXEfVr5tYw2DkGXXZ/cskkuDn1JcKsFUEL9c6sTnF19ZlnsQXzfkJ0fICTf4n8kS453mIiYlw4uvD9Sb+ulVQ==} engines: {node: '>=22.12.0'} peerDependencies: solid-js: '>=1.0.0' @@ -3274,22 +3283,22 @@ packages: peerDependencies: solid-js: ^1.6.0 - '@tanstack/start-client-core@1.132.54': - resolution: {integrity: sha512-BdtmJ3jShjmKDltzfycGccaN0aKCId1c4djQ9GeLQ6yYCTI702r7Ki1bMbsnYVyhV7DIvmRY9IR5ttbaLUxsTQ==} + '@tanstack/start-client-core@1.133.15': + resolution: {integrity: sha512-Rnr2grPF+7ygtc6Dy6SnJrAlTeF+tr+cKv12SMvtGq1Tg2WkjmFXmGe6ac5pHqNTPs+jVBAD3MtYo3FJmIK/Fw==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.132.56': - resolution: {integrity: sha512-mhsudcD84bON2Saqr5sMmQRpnJSTWLodb9EWGyalM+J8Y4LGafT1gdMz+LZnAE6DtcFLH7ARXrEQPAcyviLN/Q==} + '@tanstack/start-plugin-core@1.133.15': + resolution: {integrity: sha512-t8z45y0wc3zQISvVaZIRspzJ+52nIEBE4J1mGHncxQN+43EO+sHWhN7HHA60vbYVI+PNI57QmBGZEsa23SmdBg==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' - '@tanstack/start-server-core@1.132.54': - resolution: {integrity: sha512-wBr9lrODxWmjGzyb59ERfjjNpWTmSTtiENoSpOANdy5GSQ7q79Wrf2BAhfBP8Y/zrj+AarAuslxC6hE3JGnyFA==} + '@tanstack/start-server-core@1.133.15': + resolution: {integrity: sha512-mw7Sv+Tk2oFcFpVYSRVEZv+u5GQVU8VhgyA/h8K3i9xViuBztzqsUABEPPI+sU7Nz+jnnVSfQLH6mzy9rrr12g==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.132.48': - resolution: {integrity: sha512-+QC2fXEHrcNhMoPojE18qf58kdd9kuja24xCpzuwSVq/3a8JAHvjj5H6bucZxydGbkD0MEnT3B+7wWx+8zM7Hw==} + '@tanstack/start-storage-context@1.133.15': + resolution: {integrity: sha512-nkC/U2Ul8oTcdBJJRHcp0prpbsw9pHQEQIJW9G+BTRRZMFV5DeZPmjMmw6W29VZyXT5TMm/kHcXMqlc7x6ppPg==} engines: {node: '>=22.12.0'} '@tanstack/store@0.7.0': @@ -3304,12 +3313,12 @@ packages: '@tanstack/store@0.8.0': resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} - '@tanstack/typedoc-config@0.2.1': - resolution: {integrity: sha512-3miLBNiyWX54bQKBNnh7Fj6otWX8ZDiU6/ffOsNnikwBdKjFkA7ddrBtC5/JQkLCE6CBIqcJvtNIwI+DZu4y1Q==} + '@tanstack/typedoc-config@0.3.0': + resolution: {integrity: sha512-g7sfxscIq0wYUGtOLegnTbiMTsNiAz6r28CDgdZqIIjI1naWZoIlABpWH2qdI3IIJUDWvhOaVwAo6sfqzm6GsQ==} engines: {node: '>=18'} - '@tanstack/virtual-file-routes@1.132.31': - resolution: {integrity: sha512-rxS8Cm2nIXroLqkm9pE/8X2lFNuvcTIIiFi5VH4PwzvKscAuaW3YRMN1WmaGDI2mVEn+GLaoY6Kc3jOczL5i4w==} + '@tanstack/virtual-file-routes@1.133.3': + resolution: {integrity: sha512-6d2AP9hAjEi8mcIew2RkxBX+wClH1xedhfaYhs8fUiX+V2Cedk7RBD9E9ww2z6BGUYD8Es4fS0OIrzXZWHKGhw==} engines: {node: '>=12'} '@tanstack/vite-config@0.4.0': @@ -3427,8 +3436,8 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/jasmine@5.1.9': - resolution: {integrity: sha512-8t4HtkW4wxiPVedMpeZ63n3vlWxEIquo/zc1Tm8ElU+SqVV7+D3Na2PWaJUp179AzTragMWVwkMv7mvty0NfyQ==} + '@types/jasmine@5.1.12': + resolution: {integrity: sha512-1BzPxNsFDLDfj9InVR3IeY0ZVf4o9XV+4mDqoCfyPkbsA7dYyKAPAb2co6wLFlHcvxPlt1wShm7zQdV7uTfLGA==} '@types/json-schema@7.0.11': resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} @@ -3460,8 +3469,8 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@19.2.1': - resolution: {integrity: sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==} + '@types/react-dom@19.2.2': + resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} peerDependencies: '@types/react': ^19.2.0 @@ -3500,11 +3509,11 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/eslint-plugin@8.46.0': - resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} + '@typescript-eslint/eslint-plugin@8.46.1': + resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.0 + '@typescript-eslint/parser': ^8.46.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' @@ -3515,8 +3524,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.0': - resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} + '@typescript-eslint/parser@8.46.1': + resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3528,8 +3537,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.0': - resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} + '@typescript-eslint/project-service@8.46.1': + resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -3538,8 +3547,8 @@ packages: resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.46.0': - resolution: {integrity: sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==} + '@typescript-eslint/scope-manager@8.46.1': + resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.44.1': @@ -3548,8 +3557,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.46.0': - resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} + '@typescript-eslint/tsconfig-utils@8.46.1': + resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -3561,8 +3570,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.0': - resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} + '@typescript-eslint/type-utils@8.46.1': + resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3572,8 +3581,8 @@ packages: resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.46.0': - resolution: {integrity: sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==} + '@typescript-eslint/types@8.46.1': + resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.44.1': @@ -3582,8 +3591,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.46.0': - resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} + '@typescript-eslint/typescript-estree@8.46.1': + resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -3595,8 +3604,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.0': - resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} + '@typescript-eslint/utils@8.46.1': + resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3606,8 +3615,8 @@ packages: resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.46.0': - resolution: {integrity: sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==} + '@typescript-eslint/visitor-keys@8.46.1': + resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/raw-json@0.4.4': @@ -3934,8 +3943,8 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - arktype@2.1.22: - resolution: {integrity: sha512-xdzl6WcAhrdahvRRnXaNwsipCgHuNoLobRqhiP8RjnfL9Gp947abGlo68GAIyLtxbD+MLzNyH2YR4kEqioMmYQ==} + arktype@2.1.23: + resolution: {integrity: sha512-tyxNWX6xJVMb2EPJJ3OjgQS1G/vIeQRrZuY4DeBNQmh8n7geS+czgbauQWB6Pr+RXiOO8ChEey44XdmxsqGmfQ==} array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} @@ -4891,8 +4900,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-refresh@0.4.23: - resolution: {integrity: sha512-G4j+rv0NmbIR45kni5xJOrYvCtyD3/7LjpVH8MPPcudXDcNu8gv+4ATTDXTtbRR8rTCM5HxECvCSsRmxKnWDsA==} + eslint-plugin-react-refresh@0.4.24: + resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} peerDependencies: eslint: '>=8.40' @@ -4921,8 +4930,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.37.0: - resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} + eslint@9.38.0: + resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -5764,8 +5773,8 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@27.0.0: - resolution: {integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==} + jsdom@27.0.1: + resolution: {integrity: sha512-SNSQteBL1IlV2zqhwwolaG9CwhIhTvVHWg3kTss/cLE7H/X4644mtPQqYvCfsSrGQWt9hSZcgOXX8bOZaMN+kA==} engines: {node: '>=20'} peerDependencies: canvas: ^3.0.0 @@ -5862,8 +5871,8 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - knip@5.64.3: - resolution: {integrity: sha512-P9dZetEZfSBwNBFwj55CAnPAMdzVLTTscWx6rdB8eBmPqXPji8F3L+hhWi+Xp+u9O6Xp2ClRDq2JENSK8Z04Qg==} + knip@5.66.1: + resolution: {integrity: sha512-Ad3VUPIk9GZYovKuwKtGMheupek7IoPGaDEBAvnCYLKJXnwmqNLyXqMp+l5r3OOpFVjF7DdkFIZFVrXESDNylQ==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: @@ -6038,8 +6047,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.1: - resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -7472,8 +7481,8 @@ packages: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@5.39.11: - resolution: {integrity: sha512-8MxWVm2+3YwrFbPaxOlT1bbMi6OTenrAgks6soZfiaS8Fptk4EVyRIFhJc3RpO264EeSNwgjWAdki0ufg4zkGw==} + svelte@5.41.0: + resolution: {integrity: sha512-mP3vFFv5OUM5JN189+nJVW74kQ1dGqUrXTEzvCEVZqessY0GxZDls1nWVvt4Sxyv2USfQvAZO68VRaeIZvpzKg==} engines: {node: '>=18'} symbol-tree@3.2.4: @@ -7680,23 +7689,23 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typedoc-plugin-frontmatter@1.2.1: - resolution: {integrity: sha512-TKiOOQCxC1uUYldokAegap2oAtDy9QpsUoVDRohcB6Dm45T91qMgkWqHVS8qbCpDc4SJoGqmGTULGfrqeRqXtA==} + typedoc-plugin-frontmatter@1.3.0: + resolution: {integrity: sha512-xYQFMAecMlsRUjmf9oM/Sq2FVz4zlgcbIeVFNLdO118CHTN06gIKJNSlyExh9+Xl8sK0YhIvoQwViUURxritWA==} peerDependencies: - typedoc-plugin-markdown: '>=4.4.2' + typedoc-plugin-markdown: '>=4.5.0' - typedoc-plugin-markdown@4.4.2: - resolution: {integrity: sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg==} + typedoc-plugin-markdown@4.9.0: + resolution: {integrity: sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==} engines: {node: '>= 18'} peerDependencies: - typedoc: 0.27.x + typedoc: 0.28.x - typedoc@0.27.9: - resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} - engines: {node: '>= 18'} + typedoc@0.28.14: + resolution: {integrity: sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==} + engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x typescript-eslint@8.44.1: resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==} @@ -7901,8 +7910,8 @@ packages: yaml: optional: true - vite@7.1.5: - resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} + vite@7.1.10: + resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -7941,8 +7950,8 @@ packages: yaml: optional: true - vite@7.1.9: - resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + vite@7.1.5: + resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -8370,14 +8379,14 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular-devkit/architect@0.2003.5(chokidar@4.0.3)': + '@angular-devkit/architect@0.2003.6(chokidar@4.0.3)': dependencies: - '@angular-devkit/core': 20.3.5(chokidar@4.0.3) + '@angular-devkit/core': 20.3.6(chokidar@4.0.3) rxjs: 7.8.2 transitivePeerDependencies: - chokidar - '@angular-devkit/core@20.3.5(chokidar@4.0.3)': + '@angular-devkit/core@20.3.6(chokidar@4.0.3)': dependencies: ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) @@ -8388,9 +8397,9 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular-devkit/schematics@20.3.5(chokidar@4.0.3)': + '@angular-devkit/schematics@20.3.6(chokidar@4.0.3)': dependencies: - '@angular-devkit/core': 20.3.5(chokidar@4.0.3) + '@angular-devkit/core': 20.3.6(chokidar@4.0.3) jsonc-parser: 3.3.1 magic-string: 0.30.17 ora: 8.2.0 @@ -8398,12 +8407,12 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular/build@20.3.5(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.8.3))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.7.0)(chokidar@4.0.3)(jiti@2.6.0)(karma@6.4.4)(lightningcss@1.30.1)(postcss@8.5.6)(tailwindcss@3.4.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.6)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1)': + '@angular/build@20.3.6(@angular/compiler-cli@20.3.6(@angular/compiler@20.3.6)(typescript@5.8.3))(@angular/compiler@20.3.6)(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.7.0)(chokidar@4.0.3)(jiti@2.6.0)(karma@6.4.4)(lightningcss@1.30.1)(postcss@8.5.6)(tailwindcss@3.4.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.6)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2003.5(chokidar@4.0.3) - '@angular/compiler': 20.3.4 - '@angular/compiler-cli': 20.3.4(@angular/compiler@20.3.4)(typescript@5.8.3) + '@angular-devkit/architect': 0.2003.6(chokidar@4.0.3) + '@angular/compiler': 20.3.6 + '@angular/compiler-cli': 20.3.6(@angular/compiler@20.3.6)(typescript@5.8.3) '@babel/core': 7.28.3 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 @@ -8431,13 +8440,13 @@ snapshots: vite: 7.1.5(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) watchpack: 2.4.4 optionalDependencies: - '@angular/core': 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/core': 20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)) karma: 6.4.4 lmdb: 3.4.2 postcss: 8.5.6 tailwindcss: 3.4.18 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - chokidar @@ -8451,15 +8460,15 @@ snapshots: - tsx - yaml - '@angular/cli@20.3.5(@types/node@24.7.0)(chokidar@4.0.3)': + '@angular/cli@20.3.6(@types/node@24.7.0)(chokidar@4.0.3)': dependencies: - '@angular-devkit/architect': 0.2003.5(chokidar@4.0.3) - '@angular-devkit/core': 20.3.5(chokidar@4.0.3) - '@angular-devkit/schematics': 20.3.5(chokidar@4.0.3) + '@angular-devkit/architect': 0.2003.6(chokidar@4.0.3) + '@angular-devkit/core': 20.3.6(chokidar@4.0.3) + '@angular-devkit/schematics': 20.3.6(chokidar@4.0.3) '@inquirer/prompts': 7.8.2(@types/node@24.7.0) '@listr2/prompt-adapter-inquirer': 3.0.1(@inquirer/prompts@7.8.2(@types/node@24.7.0))(@types/node@24.7.0)(listr2@9.0.1) '@modelcontextprotocol/sdk': 1.17.3 - '@schematics/angular': 20.3.5(chokidar@4.0.3) + '@schematics/angular': 20.3.6(chokidar@4.0.3) '@yarnpkg/lockfile': 1.1.0 algoliasearch: 5.35.0 ini: 5.0.0 @@ -8482,15 +8491,15 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + '@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/core': 20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.8.3)': + '@angular/compiler-cli@20.3.6(@angular/compiler@20.3.6)(typescript@5.8.3)': dependencies: - '@angular/compiler': 20.3.4 + '@angular/compiler': 20.3.6 '@babel/core': 7.28.3 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 4.0.3 @@ -8508,7 +8517,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@angular/compiler@20.3.4': + '@angular/compiler@20.3.6': dependencies: tslib: 2.8.1 @@ -8518,19 +8527,19 @@ snapshots: tslib: 2.8.1 zone.js: 0.15.1 - '@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)': + '@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 20.3.4 + '@angular/compiler': 20.3.6 zone.js: 0.15.1 - '@angular/forms@20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + '@angular/forms@20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/common': 20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)) rxjs: 7.8.2 tslib: 2.8.1 @@ -8548,25 +8557,29 @@ snapshots: '@angular/core': 19.2.15(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 - '@angular/platform-browser@20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))': + '@angular/platform-browser@20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))': dependencies: - '@angular/common': 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/common': 20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 - '@angular/router@20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + '@angular/router@20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/common': 20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 20.3.6(@angular/common@20.3.6(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.6(@angular/compiler@20.3.6)(rxjs@7.8.2)(zone.js@0.15.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@ark/schema@0.49.0': + '@ark/regex@0.0.0': + dependencies: + '@ark/util': 0.50.0 + + '@ark/schema@0.50.0': dependencies: - '@ark/util': 0.49.0 + '@ark/util': 0.50.0 - '@ark/util@0.49.0': {} + '@ark/util@0.50.0': {} '@asamuzakjp/css-color@4.0.5': dependencies: @@ -8574,15 +8587,15 @@ snapshots: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.1 + lru-cache: 11.2.2 - '@asamuzakjp/dom-selector@6.5.6': + '@asamuzakjp/dom-selector@6.7.2': dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.1.0 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.1 + lru-cache: 11.2.2 '@asamuzakjp/nwsapi@2.3.9': {} @@ -9206,28 +9219,28 @@ snapshots: '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.6.0))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.0))': dependencies: - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.4.0(eslint@9.37.0(jiti@2.6.0))': + '@eslint/compat@1.4.0(eslint@9.38.0(jiti@2.6.0))': dependencies: '@eslint/core': 0.16.0 optionalDependencies: - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.21.1': dependencies: - '@eslint/object-schema': 2.1.6 + '@eslint/object-schema': 2.1.7 debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.0': + '@eslint/config-helpers@0.4.1': dependencies: '@eslint/core': 0.16.0 @@ -9249,9 +9262,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.37.0': {} + '@eslint/js@9.38.0': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} '@eslint/plugin-kit@0.4.0': dependencies: @@ -9576,10 +9589,12 @@ snapshots: '@firebase/webchannel-wrapper@1.0.3': {} - '@gerrit0/mini-shiki@1.27.2': + '@gerrit0/mini-shiki@3.13.1': dependencies: - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 '@shikijs/vscode-textmate': 10.0.2 '@grpc/grpc-js@1.9.15': @@ -10394,20 +10409,28 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@schematics/angular@20.3.5(chokidar@4.0.3)': + '@schematics/angular@20.3.6(chokidar@4.0.3)': dependencies: - '@angular-devkit/core': 20.3.5(chokidar@4.0.3) - '@angular-devkit/schematics': 20.3.5(chokidar@4.0.3) + '@angular-devkit/core': 20.3.6(chokidar@4.0.3) + '@angular-devkit/schematics': 20.3.6(chokidar@4.0.3) jsonc-parser: 3.3.1 transitivePeerDependencies: - chokidar - '@shikijs/engine-oniguruma@1.29.2': + '@shikijs/engine-oniguruma@3.13.0': dependencies: - '@shikijs/types': 1.29.2 + '@shikijs/types': 3.13.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/types@1.29.2': + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/types@3.13.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -10580,10 +10603,10 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@stylistic/eslint-plugin@4.4.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@stylistic/eslint-plugin@4.4.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) - eslint: 9.37.0(jiti@2.6.0) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.38.0(jiti@2.6.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -10592,11 +10615,11 @@ snapshots: - supports-color - typescript - '@stylistic/eslint-plugin@5.4.0(eslint@9.37.0(jiti@2.6.0))': + '@stylistic/eslint-plugin@5.4.0(eslint@9.38.0(jiti@2.6.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.0)) - '@typescript-eslint/types': 8.46.0 - eslint: 9.37.0(jiti@2.6.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.0)) + '@typescript-eslint/types': 8.46.1 + eslint: 9.38.0(jiti@2.6.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -10606,35 +10629,35 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/package@2.5.4(svelte@5.39.11)(typescript@5.9.2)': + '@sveltejs/package@2.5.4(svelte@5.41.0)(typescript@5.9.2)': dependencies: chokidar: 4.0.3 kleur: 4.1.5 sade: 1.8.1 semver: 7.7.2 - svelte: 5.39.11 - svelte2tsx: 0.7.42(svelte@5.39.11)(typescript@5.9.2) + svelte: 5.41.0 + svelte2tsx: 0.7.42(svelte@5.41.0)(typescript@5.9.2) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) debug: 4.4.3 - svelte: 5.39.11 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + svelte: 5.41.0 + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) debug: 4.4.3 deepmerge: 4.3.1 magic-string: 0.30.19 - svelte: 5.39.11 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + svelte: 5.41.0 + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -10716,19 +10739,19 @@ snapshots: tailwindcss: 4.1.14 vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@tailwindcss/vite@4.1.14(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.14(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.14 '@tailwindcss/oxide': 4.1.14 tailwindcss: 4.1.14 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@tanstack/config@0.21.0(@types/node@24.7.0)(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/config@0.22.0(@types/node@24.7.0)(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@tanstack/publish-config': 0.2.1 - '@tanstack/typedoc-config': 0.2.1(typescript@5.9.2) - '@tanstack/vite-config': 0.4.0(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/typedoc-config': 0.3.0(typescript@5.9.2) + '@tanstack/vite-config': 0.4.0(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -10739,13 +10762,13 @@ snapshots: - typescript - vite - '@tanstack/directive-functions-plugin@1.132.53(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.133.9(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-utils': 1.132.51 + '@tanstack/router-utils': 1.133.3 babel-dead-code-elimination: 1.0.10 pathe: 2.0.3 tiny-invariant: 1.3.3 @@ -10753,29 +10776,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/directive-functions-plugin@1.132.53(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.133.9(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-utils': 1.132.51 + '@tanstack/router-utils': 1.133.3 babel-dead-code-elimination: 1.0.10 pathe: 2.0.3 tiny-invariant: 1.3.3 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint/js': 9.37.0 - '@stylistic/eslint-plugin': 5.4.0(eslint@9.37.0(jiti@2.6.0)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0)) - eslint-plugin-n: 17.23.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint/js': 9.38.0 + '@stylistic/eslint-plugin': 5.4.0(eslint@9.38.0(jiti@2.6.0)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)) + eslint-plugin-n: 17.23.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) globals: 16.4.0 - typescript-eslint: 8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) - vue-eslint-parser: 10.2.0(eslint@9.37.0(jiti@2.6.0)) + typescript-eslint: 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + vue-eslint-parser: 10.2.0(eslint@9.38.0(jiti@2.6.0)) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint @@ -10783,7 +10806,7 @@ snapshots: - supports-color - typescript - '@tanstack/history@1.132.31': {} + '@tanstack/history@1.133.3': {} '@tanstack/publish-config@0.2.1': dependencies: @@ -10796,20 +10819,20 @@ snapshots: '@tanstack/query-core@5.83.0': {} - '@tanstack/query-core@5.90.2': {} + '@tanstack/query-core@5.90.5': {} '@tanstack/react-query@5.83.0(react@19.2.0)': dependencies: '@tanstack/query-core': 5.83.0 react: 19.2.0 - '@tanstack/react-router-devtools@1.132.51(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.132.47)(@types/node@24.7.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.15)(@types/node@24.7.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/react-router': 1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-devtools-core': 1.132.51(@tanstack/router-core@1.132.47)(@types/node@24.7.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-devtools-core': 1.133.15(@tanstack/router-core@1.133.15)(@types/node@24.7.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@tanstack/router-core' - '@types/node' @@ -10827,60 +10850,60 @@ snapshots: - tsx - yaml - '@tanstack/react-router-with-query@1.130.17(@tanstack/react-query@5.83.0(react@19.2.0))(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.132.47)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-router-with-query@1.130.17(@tanstack/react-query@5.83.0(react@19.2.0))(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.15)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/react-query': 5.83.0(react@19.2.0) - '@tanstack/react-router': 1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.132.47 + '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.133.15 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/history': 1.132.31 + '@tanstack/history': 1.133.3 '@tanstack/react-store': 0.7.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.132.47 + '@tanstack/router-core': 1.133.15 isbot: 5.1.30 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.132.54(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-start-client@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/react-router': 1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.132.47 - '@tanstack/start-client-core': 1.132.54 + '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.133.15 + '@tanstack/start-client-core': 1.133.15 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-server@1.132.54(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-start-server@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/history': 1.132.31 - '@tanstack/react-router': 1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.132.47 - '@tanstack/start-client-core': 1.132.54 - '@tanstack/start-server-core': 1.132.54 + '@tanstack/history': 1.133.3 + '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.133.15 + '@tanstack/start-client-core': 1.133.15 + '@tanstack/start-server-core': 1.133.15 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.132.56(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/react-start@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/react-router': 1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-start-client': 1.132.54(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-start-server': 1.132.54(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-utils': 1.132.51 - '@tanstack/start-client-core': 1.132.54 - '@tanstack/start-plugin-core': 1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.132.54 + '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-start-client': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-start-server': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-utils': 1.133.3 + '@tanstack/start-client-core': 1.133.15 + '@tanstack/start-plugin-core': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.133.15 pathe: 2.0.3 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -10895,9 +10918,9 @@ snapshots: react-dom: 19.2.0(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) - '@tanstack/router-core@1.132.47': + '@tanstack/router-core@1.133.15': dependencies: - '@tanstack/history': 1.132.31 + '@tanstack/history': 1.133.3 '@tanstack/store': 0.7.7 cookie-es: 2.0.0 seroval: 1.3.2 @@ -10905,14 +10928,14 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.132.51(@tanstack/router-core@1.132.47)(@types/node@24.7.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.133.15(@tanstack/router-core@1.133.15)(@types/node@24.7.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/router-core': 1.132.47 + '@tanstack/router-core': 1.133.15 clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.9 tiny-invariant: 1.3.3 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: csstype: 3.1.3 transitivePeerDependencies: @@ -10928,11 +10951,11 @@ snapshots: - tsx - yaml - '@tanstack/router-generator@1.132.51': + '@tanstack/router-generator@1.133.15': dependencies: - '@tanstack/router-core': 1.132.47 - '@tanstack/router-utils': 1.132.51 - '@tanstack/virtual-file-routes': 1.132.31 + '@tanstack/router-core': 1.133.15 + '@tanstack/router-utils': 1.133.3 + '@tanstack/virtual-file-routes': 1.133.3 prettier: 3.6.2 recast: 0.23.11 source-map: 0.7.6 @@ -10941,7 +10964,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -10949,22 +10972,22 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-core': 1.132.47 - '@tanstack/router-generator': 1.132.51 - '@tanstack/router-utils': 1.132.51 - '@tanstack/virtual-file-routes': 1.132.31 + '@tanstack/router-core': 1.133.15 + '@tanstack/router-generator': 1.133.15 + '@tanstack/router-utils': 1.133.3 + '@tanstack/virtual-file-routes': 1.133.3 babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-solid: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -10972,22 +10995,22 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-core': 1.132.47 - '@tanstack/router-generator': 1.132.51 - '@tanstack/router-utils': 1.132.51 - '@tanstack/virtual-file-routes': 1.132.31 + '@tanstack/router-core': 1.133.15 + '@tanstack/router-generator': 1.133.15 + '@tanstack/router-utils': 1.133.3 + '@tanstack/virtual-file-routes': 1.133.3 babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-solid: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-plugin-solid: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.132.51': + '@tanstack/router-utils@1.133.3': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -11000,7 +11023,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.132.53(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.133.11(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -11009,14 +11032,14 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/directive-functions-plugin': 1.132.53(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.133.9(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@tanstack/server-functions-plugin@1.132.53(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.133.11(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -11025,55 +11048,55 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/directive-functions-plugin': 1.132.53(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.133.9(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@tanstack/solid-router@1.132.49(solid-js@1.9.9)': + '@tanstack/solid-router@1.133.15(solid-js@1.9.9)': dependencies: '@solid-devtools/logger': 0.9.11(solid-js@1.9.9) '@solid-primitives/refs': 1.1.2(solid-js@1.9.9) '@solidjs/meta': 0.29.4(solid-js@1.9.9) - '@tanstack/history': 1.132.31 - '@tanstack/router-core': 1.132.47 + '@tanstack/history': 1.133.3 + '@tanstack/router-core': 1.133.15 '@tanstack/solid-store': 0.7.0(solid-js@1.9.9) isbot: 5.1.30 solid-js: 1.9.9 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/solid-start-client@1.132.54(solid-js@1.9.9)': + '@tanstack/solid-start-client@1.133.15(solid-js@1.9.9)': dependencies: - '@tanstack/router-core': 1.132.47 - '@tanstack/solid-router': 1.132.49(solid-js@1.9.9) - '@tanstack/start-client-core': 1.132.54 + '@tanstack/router-core': 1.133.15 + '@tanstack/solid-router': 1.133.15(solid-js@1.9.9) + '@tanstack/start-client-core': 1.133.15 solid-js: 1.9.9 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/solid-start-server@1.132.54(solid-js@1.9.9)': + '@tanstack/solid-start-server@1.133.15(solid-js@1.9.9)': dependencies: '@solidjs/meta': 0.29.4(solid-js@1.9.9) - '@tanstack/history': 1.132.31 - '@tanstack/router-core': 1.132.47 - '@tanstack/solid-router': 1.132.49(solid-js@1.9.9) - '@tanstack/start-client-core': 1.132.54 - '@tanstack/start-server-core': 1.132.54 + '@tanstack/history': 1.133.3 + '@tanstack/router-core': 1.133.15 + '@tanstack/solid-router': 1.133.15(solid-js@1.9.9) + '@tanstack/start-client-core': 1.133.15 + '@tanstack/start-server-core': 1.133.15 solid-js: 1.9.9 transitivePeerDependencies: - crossws - '@tanstack/solid-start@1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(solid-js@1.9.9)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/solid-start@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(solid-js@1.9.9)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/solid-router': 1.132.49(solid-js@1.9.9) - '@tanstack/solid-start-client': 1.132.54(solid-js@1.9.9) - '@tanstack/solid-start-server': 1.132.54(solid-js@1.9.9) - '@tanstack/start-client-core': 1.132.54 - '@tanstack/start-plugin-core': 1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.132.54 + '@tanstack/solid-router': 1.133.15(solid-js@1.9.9) + '@tanstack/solid-start-client': 1.133.15(solid-js@1.9.9) + '@tanstack/solid-start-server': 1.133.15(solid-js@1.9.9) + '@tanstack/start-client-core': 1.133.15 + '@tanstack/start-plugin-core': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.133.15 pathe: 2.0.3 solid-js: 1.9.9 vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -11090,27 +11113,27 @@ snapshots: '@tanstack/store': 0.7.0 solid-js: 1.9.9 - '@tanstack/start-client-core@1.132.54': + '@tanstack/start-client-core@1.133.15': dependencies: - '@tanstack/router-core': 1.132.47 - '@tanstack/start-storage-context': 1.132.48 + '@tanstack/router-core': 1.133.15 + '@tanstack/start-storage-context': 1.133.15 seroval: 1.3.2 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.4 '@babel/types': 7.28.4 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.132.47 - '@tanstack/router-generator': 1.132.51 - '@tanstack/router-plugin': 1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/router-utils': 1.132.51 - '@tanstack/server-functions-plugin': 1.132.53(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-client-core': 1.132.54 - '@tanstack/start-server-core': 1.132.54 + '@tanstack/router-core': 1.133.15 + '@tanstack/router-generator': 1.133.15 + '@tanstack/router-plugin': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-utils': 1.133.3 + '@tanstack/server-functions-plugin': 1.133.11(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-client-core': 1.133.15 + '@tanstack/start-server-core': 1.133.15 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 @@ -11130,19 +11153,19 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-plugin-core@1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.4 '@babel/types': 7.28.4 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.132.47 - '@tanstack/router-generator': 1.132.51 - '@tanstack/router-plugin': 1.132.56(@tanstack/react-router@1.132.47(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/router-utils': 1.132.51 - '@tanstack/server-functions-plugin': 1.132.53(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-client-core': 1.132.54 - '@tanstack/start-server-core': 1.132.54 + '@tanstack/router-core': 1.133.15 + '@tanstack/router-generator': 1.133.15 + '@tanstack/router-plugin': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-utils': 1.133.3 + '@tanstack/server-functions-plugin': 1.133.11(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-client-core': 1.133.15 + '@tanstack/start-server-core': 1.133.15 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 @@ -11150,8 +11173,8 @@ snapshots: srvx: 0.8.7 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) xmlbuilder2: 3.1.1 zod: 3.25.76 transitivePeerDependencies: @@ -11162,21 +11185,21 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.132.54': + '@tanstack/start-server-core@1.133.15': dependencies: - '@tanstack/history': 1.132.31 - '@tanstack/router-core': 1.132.47 - '@tanstack/start-client-core': 1.132.54 - '@tanstack/start-storage-context': 1.132.48 + '@tanstack/history': 1.133.3 + '@tanstack/router-core': 1.133.15 + '@tanstack/start-client-core': 1.133.15 + '@tanstack/start-storage-context': 1.133.15 h3-v2: h3@2.0.0-beta.4 seroval: 1.3.2 tiny-invariant: 1.3.3 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.132.48': + '@tanstack/start-storage-context@1.133.15': dependencies: - '@tanstack/router-core': 1.132.47 + '@tanstack/router-core': 1.133.15 '@tanstack/store@0.7.0': {} @@ -11186,22 +11209,22 @@ snapshots: '@tanstack/store@0.8.0': {} - '@tanstack/typedoc-config@0.2.1(typescript@5.9.2)': + '@tanstack/typedoc-config@0.3.0(typescript@5.9.2)': dependencies: - typedoc: 0.27.9(typescript@5.9.2) - typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2))) - typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.2)) + typedoc: 0.28.14(typescript@5.9.2) + typedoc-plugin-frontmatter: 1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.2))) + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.2)) transitivePeerDependencies: - typescript - '@tanstack/virtual-file-routes@1.132.31': {} + '@tanstack/virtual-file-routes@1.133.3': {} - '@tanstack/vite-config@0.4.0(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/vite-config@0.4.0(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.52.3) - vite-plugin-dts: 4.2.3(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - vite-plugin-externalize-deps: 0.10.0(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-plugin-dts: 4.2.3(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-plugin-externalize-deps: 0.10.0(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - rollup @@ -11229,7 +11252,7 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 '@testing-library/dom': 10.4.1 @@ -11237,7 +11260,7 @@ snapshots: react-dom: 19.2.0(react@19.2.0) optionalDependencies: '@types/react': 19.2.2 - '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@types/react-dom': 19.2.2(@types/react@19.2.2) '@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.2))(typescript@5.9.2)': dependencies: @@ -11351,7 +11374,7 @@ snapshots: '@types/http-errors@2.0.5': {} - '@types/jasmine@5.1.9': {} + '@types/jasmine@5.1.12': {} '@types/json-schema@7.0.11': {} @@ -11381,7 +11404,7 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.2.1(@types/react@19.2.2)': + '@types/react-dom@19.2.2(@types/react@19.2.2)': dependencies: '@types/react': 19.2.2 @@ -11418,15 +11441,15 @@ snapshots: dependencies: '@types/node': 24.7.0 - '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.44.1 - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -11435,15 +11458,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/type-utils': 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.46.0 - eslint: 9.37.0(jiti@2.6.0) + '@typescript-eslint/parser': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/type-utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.46.1 + eslint: 9.38.0(jiti@2.6.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -11452,43 +11475,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/parser@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.44.1 '@typescript-eslint/types': 8.44.1 '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.44.1 debug: 4.4.3 - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.46.0 + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3 - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color '@typescript-eslint/project-service@8.44.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.2) - '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.2) + '@typescript-eslint/types': 8.46.1 debug: 4.4.3 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.46.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.2) - '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.2) + '@typescript-eslint/types': 8.46.1 debug: 4.4.3 typescript: 5.9.2 transitivePeerDependencies: @@ -11499,38 +11522,38 @@ snapshots: '@typescript-eslint/types': 8.44.1 '@typescript-eslint/visitor-keys': 8.44.1 - '@typescript-eslint/scope-manager@8.46.0': + '@typescript-eslint/scope-manager@8.46.1': dependencies: - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/visitor-keys': 8.46.0 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.44.1 '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) debug: 4.4.3 - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) debug: 4.4.3 - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: @@ -11538,7 +11561,7 @@ snapshots: '@typescript-eslint/types@8.44.1': {} - '@typescript-eslint/types@8.46.0': {} + '@typescript-eslint/types@8.46.1': {} '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)': dependencies: @@ -11556,12 +11579,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.46.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.2) - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/visitor-keys': 8.46.0 + '@typescript-eslint/project-service': 8.46.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.2) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -11572,24 +11595,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/utils@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.0)) '@typescript-eslint/scope-manager': 8.44.1 '@typescript-eslint/types': 8.44.1 '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.0)) - '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.2) - eslint: 9.37.0(jiti@2.6.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.0)) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.2) + eslint: 9.38.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -11599,9 +11622,9 @@ snapshots: '@typescript-eslint/types': 8.44.1 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.46.0': + '@typescript-eslint/visitor-keys@8.46.1': dependencies: - '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/types': 8.46.1 eslint-visitor-keys: 4.2.1 '@ungap/raw-json@0.4.4': {} @@ -11669,7 +11692,7 @@ snapshots: dependencies: vite: 7.1.5(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitejs/plugin-react@5.0.4(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@5.0.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -11677,17 +11700,17 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.1(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vue: 3.5.22(typescript@5.9.2) - '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@istanbuljs/schema': 0.1.3 debug: 4.4.3 @@ -11699,7 +11722,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@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -11711,13 +11734,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -11958,10 +11981,11 @@ snapshots: aria-query@5.3.2: {} - arktype@2.1.22: + arktype@2.1.23: dependencies: - '@ark/schema': 0.49.0 - '@ark/util': 0.49.0 + '@ark/regex': 0.0.0 + '@ark/schema': 0.50.0 + '@ark/util': 0.50.0 array-buffer-byte-length@1.0.2: dependencies: @@ -12655,6 +12679,11 @@ snapshots: pg: 8.16.3 postgres: 3.4.7 + drizzle-zod@0.8.3(drizzle-orm@0.44.6(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))(zod@3.25.76): + dependencies: + drizzle-orm: 0.44.6(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7) + zod: 3.25.76 + drizzle-zod@0.8.3(drizzle-orm@0.44.6(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.11): dependencies: drizzle-orm: 0.44.6(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7) @@ -12916,14 +12945,14 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.37.0(jiti@2.6.0)): + eslint-compat-utils@0.5.1(eslint@9.38.0(jiti@2.6.0)): dependencies: - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) semver: 7.7.2 - eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.0)): + eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.0)): dependencies: - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: @@ -12932,10 +12961,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.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0)))(eslint@9.37.0(jiti@2.6.0)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0)): dependencies: debug: 4.4.3 - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 @@ -12943,23 +12972,23 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)) transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.37.0(jiti@2.6.0)): + eslint-plugin-es-x@7.8.0(eslint@9.38.0(jiti@2.6.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.0)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.37.0(jiti@2.6.0) - eslint-compat-utils: 0.5.1(eslint@9.37.0(jiti@2.6.0)) + eslint: 9.38.0(jiti@2.6.0) + eslint-compat-utils: 0.5.1(eslint@9.38.0(jiti@2.6.0)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)): dependencies: - '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/types': 8.46.1 comment-parser: 1.4.1 debug: 4.4.3 - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.0.3 @@ -12967,16 +12996,16 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) transitivePeerDependencies: - supports-color - eslint-plugin-n@17.23.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2): + eslint-plugin-n@17.23.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.0)) enhanced-resolve: 5.18.3 - eslint: 9.37.0(jiti@2.6.0) - eslint-plugin-es-x: 7.8.0(eslint@9.37.0(jiti@2.6.0)) + eslint: 9.38.0(jiti@2.6.0) + eslint-plugin-es-x: 7.8.0(eslint@9.38.0(jiti@2.6.0)) get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 @@ -12986,24 +13015,24 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.0)))(eslint@9.37.0(jiti@2.6.0))(prettier@3.6.2): + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0))(prettier@3.6.2): dependencies: - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.11 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.37.0(jiti@2.6.0)) + eslint-config-prettier: 10.1.8(eslint@9.38.0(jiti@2.6.0)) - eslint-plugin-react-hooks@5.2.0(eslint@9.37.0(jiti@2.6.0)): + eslint-plugin-react-hooks@5.2.0(eslint@9.38.0(jiti@2.6.0)): dependencies: - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) - eslint-plugin-react-refresh@0.4.23(eslint@9.37.0(jiti@2.6.0)): + eslint-plugin-react-refresh@0.4.24(eslint@9.38.0(jiti@2.6.0)): dependencies: - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) - eslint-plugin-react@7.37.5(eslint@9.37.0(jiti@2.6.0)): + eslint-plugin-react@7.37.5(eslint@9.38.0(jiti@2.6.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -13011,7 +13040,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -13025,10 +13054,10 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-solid@0.14.5(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2): + eslint-plugin-solid@0.14.5(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2): dependencies: - '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) - eslint: 9.37.0(jiti@2.6.0) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.38.0(jiti@2.6.0) estraverse: 5.3.0 is-html: 2.0.0 kebab-case: 1.0.2 @@ -13047,21 +13076,20 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.37.0(jiti@2.6.0): + eslint@9.38.0(jiti@2.6.0): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.0)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.4.0 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.1 '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.37.0 + '@eslint/js': 9.38.0 '@eslint/plugin-kit': 0.4.0 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -13606,7 +13634,7 @@ snapshots: hosted-git-info@9.0.0: dependencies: - lru-cache: 11.2.1 + lru-cache: 11.2.2 html-encoding-sniffer@4.0.0: dependencies: @@ -14010,9 +14038,9 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@27.0.0(postcss@8.5.6): + jsdom@27.0.1(postcss@8.5.6): dependencies: - '@asamuzakjp/dom-selector': 6.5.6 + '@asamuzakjp/dom-selector': 6.7.2 cssstyle: 5.3.1(postcss@8.5.6) data-urls: 6.0.0 decimal.js: 10.6.0 @@ -14020,7 +14048,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - parse5: 7.3.0 + parse5: 8.0.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -14145,7 +14173,7 @@ snapshots: kleur@4.1.5: {} - knip@5.64.3(@types/node@24.7.0)(typescript@5.9.2): + knip@5.66.1(@types/node@24.7.0)(typescript@5.9.2): dependencies: '@nodelib/fs.walk': 1.2.8 '@types/node': 24.7.0 @@ -14340,7 +14368,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.1: {} + lru-cache@11.2.2: {} lru-cache@5.1.1: dependencies: @@ -15927,26 +15955,26 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.3.3(picomatch@4.0.3)(svelte@5.39.11)(typescript@5.9.2): + svelte-check@4.3.3(picomatch@4.0.3)(svelte@5.41.0)(typescript@5.9.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 chokidar: 4.0.3 fdir: 6.5.0(picomatch@4.0.3) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.39.11 + svelte: 5.41.0 typescript: 5.9.2 transitivePeerDependencies: - picomatch - svelte2tsx@0.7.42(svelte@5.39.11)(typescript@5.9.2): + svelte2tsx@0.7.42(svelte@5.41.0)(typescript@5.9.2): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 5.39.11 + svelte: 5.41.0 typescript: 5.9.2 - svelte@5.39.11: + svelte@5.41.0: dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.5.5 @@ -16195,31 +16223,31 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2))): + typedoc-plugin-frontmatter@1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.2))): dependencies: - typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.2)) + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.2)) yaml: 2.8.1 - typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2)): + typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.2)): dependencies: - typedoc: 0.27.9(typescript@5.9.2) + typedoc: 0.28.14(typescript@5.9.2) - typedoc@0.27.9(typescript@5.9.2): + typedoc@0.28.14(typescript@5.9.2): dependencies: - '@gerrit0/mini-shiki': 1.27.2 + '@gerrit0/mini-shiki': 3.13.1 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 typescript: 5.9.2 yaml: 2.8.1 - typescript-eslint@8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2): + typescript-eslint@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/parser': 8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.2) - eslint: 9.37.0(jiti@2.6.0) + '@typescript-eslint/utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.38.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -16345,7 +16373,7 @@ snapshots: debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -16360,7 +16388,7 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-dts@4.2.3(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@24.7.0) '@rollup/pluginutils': 5.3.0(rollup@4.52.3) @@ -16373,15 +16401,15 @@ snapshots: magic-string: 0.30.19 typescript: 5.9.2 optionalDependencies: - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.10.0(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-externalize-deps@0.10.0(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: @@ -16398,7 +16426,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@babel/core': 7.28.4 '@types/babel__core': 7.20.5 @@ -16406,8 +16434,8 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.9 solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: @@ -16424,13 +16452,13 @@ snapshots: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.2) optionalDependencies: - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript @@ -16453,7 +16481,7 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.5(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) @@ -16471,7 +16499,7 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.5(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) @@ -16493,15 +16521,15 @@ snapshots: optionalDependencies: vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu@1.1.1(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -16519,13 +16547,13 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-node: 3.2.4(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.7.0 - jsdom: 27.0.0(postcss@8.5.6) + jsdom: 27.0.1(postcss@8.5.6) transitivePeerDependencies: - jiti - less @@ -16544,10 +16572,10 @@ snapshots: vscode-uri@3.1.0: {} - vue-eslint-parser@10.2.0(eslint@9.37.0(jiti@2.6.0)): + vue-eslint-parser@10.2.0(eslint@9.38.0(jiti@2.6.0)): dependencies: debug: 4.4.3 - eslint: 9.37.0(jiti@2.6.0) + eslint: 9.38.0(jiti@2.6.0) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 From 67f5d549f9d04e9f6d766f52865a0bd2ccd8c683 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Mon, 20 Oct 2025 15:35:56 -0600 Subject: [PATCH 47/51] docs: document conditional queries and isUndefined/isNull functions (#695) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add comprehensive documentation for three undocumented live query features: 1. Conditional queries via undefined/null return - Document how to disable queries by returning undefined/null from useLiveQuery - Explain the disabled state (status: 'disabled', isEnabled: false) - Show practical "wait until inputs exist" pattern 2. Alternative useLiveQuery callback return types - Document returning pre-created Collections - Document returning LiveQueryCollectionConfig objects - Show use cases for each approach 3. isUndefined and isNull query functions - Add to Expression Functions Reference - Explain semantic difference between undefined vs null - Show examples with joins and optional properties These features were added in PR #535 and DB 0.2.0 but were not previously documented in the Live Queries guide. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude --- docs/guides/live-queries.md | 131 ++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/docs/guides/live-queries.md b/docs/guides/live-queries.md index c1e7c21e2b..5b1664b20d 100644 --- a/docs/guides/live-queries.md +++ b/docs/guides/live-queries.md @@ -162,6 +162,102 @@ export class UserListComponent { For more details on framework integration, see the [React](../../framework/react/adapter), [Vue](../../framework/vue/adapter), and [Angular](../../framework/angular/adapter) adapter documentation. +### Conditional Queries + +In React, you can conditionally disable a query by returning `undefined` or `null` from the `useLiveQuery` callback. When disabled, the hook returns a special state indicating the query is not active. + +```tsx +import { useLiveQuery } from '@tanstack/react-db' + +function TodoList({ userId }: { userId?: string }) { + const { data, isEnabled, status } = useLiveQuery((q) => { + // Disable the query when userId is not available + if (!userId) return undefined + + return q + .from({ todos: todosCollection }) + .where(({ todos }) => eq(todos.userId, userId)) + }, [userId]) + + if (!isEnabled) { + return
Please select a user
+ } + + return ( +
    + {data?.map(todo => ( +
  • {todo.text}
  • + ))} +
+ ) +} +``` + +When the query is disabled (callback returns `undefined` or `null`): +- `status` is `'disabled'` +- `data`, `state`, and `collection` are `undefined` +- `isEnabled` is `false` +- `isLoading`, `isReady`, `isIdle`, and `isError` are all `false` + +This pattern is useful for "wait until inputs exist" flows without needing to conditionally render the hook itself or manage an external enabled flag. + +### Alternative Callback Return Types + +The `useLiveQuery` callback can return different types depending on your use case: + +#### Returning a Query Builder (Standard) + +The most common pattern is to return a query builder: + +```tsx +const { data } = useLiveQuery((q) => + q.from({ todos: todosCollection }) + .where(({ todos }) => eq(todos.completed, false)) +) +``` + +#### Returning a Pre-created Collection + +You can return an existing collection directly: + +```tsx +const activeUsersCollection = createLiveQueryCollection((q) => + q.from({ users: usersCollection }) + .where(({ users }) => eq(users.active, true)) +) + +function UserList({ usePrebuilt }: { usePrebuilt: boolean }) { + const { data } = useLiveQuery((q) => { + // Toggle between pre-created collection and ad-hoc query + if (usePrebuilt) return activeUsersCollection + + return q.from({ users: usersCollection }) + }, [usePrebuilt]) + + return
    {data?.map(user =>
  • {user.name}
  • )}
+} +``` + +#### Returning a LiveQueryCollectionConfig + +You can return a configuration object to specify additional options like a custom ID: + +```tsx +const { data } = useLiveQuery((q) => { + return { + query: q.from({ items: itemsCollection }) + .select(({ items }) => ({ id: items.id })), + id: 'items-view', // Custom ID for debugging + gcTime: 10000 // Custom garbage collection time + } +}) +``` + +This is particularly useful when you need to: +- Attach a stable ID for debugging or logging +- Configure collection-specific options like `gcTime` or `getKey` +- Conditionally switch between different collection configurations + ## From Clause The foundation of every query is the `from` method, which specifies the source collection or subquery. You can alias the source using object syntax. @@ -1222,6 +1318,41 @@ like(user.name, 'John%') // Case-sensitive ilike(user.email, '%@gmail.com') // Case-insensitive ``` +#### `isUndefined(value)`, `isNull(value)` +Check for missing vs null values: +```ts +// Check if a property is missing/undefined +isUndefined(user.profile) + +// Check if a value is explicitly null +isNull(user.profile) +``` + +These functions are particularly important when working with joins and optional properties, as they distinguish between: +- `undefined`: The property is absent or not present +- `null`: The property exists but is explicitly set to null + +**Example with joins:** +```ts +// Find users without a matching profile (left join resulted in undefined) +const usersWithoutProfiles = createLiveQueryCollection((q) => + q + .from({ user: usersCollection }) + .leftJoin( + { profile: profilesCollection }, + ({ user, profile }) => eq(user.id, profile.userId) + ) + .where(({ profile }) => isUndefined(profile)) +) + +// Find users with explicitly null bio field +const usersWithNullBio = createLiveQueryCollection((q) => + q + .from({ user: usersCollection }) + .where(({ user }) => isNull(user.bio)) +) +``` + ### Logical Operators #### `and(...conditions)` From 4436d74877a2ce746a96f8799f2b62f19190de77 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 00:56:00 +0000 Subject: [PATCH 48/51] chore(deps): update dependency vite [security] (#698) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- examples/react/projects/package.json | 2 +- examples/react/todo/package.json | 2 +- pnpm-lock.yaml | 1169 +++++++++++++++++++------- 3 files changed, 858 insertions(+), 315 deletions(-) diff --git a/examples/react/projects/package.json b/examples/react/projects/package.json index 1e6a7e6c6f..37b77cd58d 100644 --- a/examples/react/projects/package.json +++ b/examples/react/projects/package.json @@ -34,7 +34,7 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "tailwindcss": "^4.1.14", - "vite": "^7.1.7", + "vite": "^6.3.5", "vite-tsconfig-paths": "^5.1.4", "zod": "^4.1.11" }, diff --git a/examples/react/todo/package.json b/examples/react/todo/package.json index b6c122fc15..bbf47b0674 100644 --- a/examples/react/todo/package.json +++ b/examples/react/todo/package.json @@ -43,7 +43,7 @@ "pg": "^8.16.3", "tsx": "^4.20.6", "typescript": "^5.9.2", - "vite": "^7.1.7" + "vite": "^6.1.1" }, "scripts": { "build": "vite build", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed3718f49f..449535b381 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,13 +16,13 @@ importers: version: 9.38.0 '@stylistic/eslint-plugin': specifier: ^4.4.1 - version: 4.4.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 4.4.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0(encoding@0.1.13) '@tanstack/config': specifier: ^0.22.0 - version: 0.22.0(@types/node@24.7.0)(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 0.22.0(@types/node@24.7.0)(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -40,13 +40,13 @@ importers: version: 1.5.0 '@typescript-eslint/eslint-plugin': specifier: ^8.46.1 - version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.46.1 - version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.0.4(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) eslint: specifier: ^9.38.0 version: 9.38.0(jiti@2.6.0) @@ -55,7 +55,7 @@ importers: version: 10.1.8(eslint@9.38.0(jiti@2.6.0)) eslint-import-resolver-typescript: specifier: ^4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0)) + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0)) eslint-plugin-prettier: specifier: ^5.5.4 version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0))(prettier@3.6.2) @@ -70,7 +70,7 @@ importers: version: 27.0.1(postcss@8.5.6) knip: specifier: ^5.66.1 - version: 5.66.1(@types/node@24.7.0)(typescript@5.9.2) + version: 5.66.1(@types/node@24.7.0)(typescript@5.9.3) lint-staged: specifier: ^15.5.2 version: 15.5.2 @@ -97,10 +97,10 @@ importers: version: 0.2.15 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 vite: specifier: ^7.1.10 - version: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -191,7 +191,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.14 - version: 4.1.14(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.1.14(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/query-core': specifier: ^5.90.5 version: 5.90.5 @@ -212,16 +212,16 @@ importers: version: 1.130.17(@tanstack/react-query@5.83.0(react@19.2.0))(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.15)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-start': specifier: ^1.133.15 - version: 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: ^1.133.15 - version: 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@trpc/client': specifier: ^11.6.0 - version: 11.6.0(@trpc/server@11.6.0(typescript@5.9.2))(typescript@5.9.2) + version: 11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': specifier: ^11.6.0 - version: 11.6.0(typescript@5.9.2) + version: 11.6.0(typescript@5.9.3) better-auth: specifier: ^1.3.26 version: 1.3.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9) @@ -247,11 +247,11 @@ importers: specifier: ^4.1.14 version: 4.1.14 vite: - specifier: ^7.1.7 - version: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^6.3.5 + version: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) zod: specifier: ^4.1.11 version: 4.1.11 @@ -279,13 +279,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@typescript-eslint/eslint-plugin': specifier: ^8.46.1 - version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.46.1 - version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.0.4(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -318,7 +318,7 @@ importers: version: 4.20.6 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 vitest: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -345,7 +345,7 @@ importers: version: 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-start': specifier: ^1.133.15 - version: 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/trailbase-db-collection': specifier: workspace:^ version: link:../../../packages/trailbase-db-collection @@ -378,7 +378,7 @@ importers: version: 0.8.0 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) zod: specifier: ^4.1.11 version: 4.1.11 @@ -388,7 +388,7 @@ importers: version: 9.38.0 '@tailwindcss/vite': specifier: ^4.1.14 - version: 4.1.14(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.1.14(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@types/cors': specifier: ^2.8.19 version: 2.8.19 @@ -409,13 +409,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@typescript-eslint/eslint-plugin': specifier: ^8.46.1 - version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.46.1 - version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.0.3 - version: 5.0.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.0.4(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -442,10 +442,10 @@ importers: version: 4.20.6 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 vite: - specifier: ^7.1.7 - version: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^6.1.1 + version: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) examples/solid/todo: dependencies: @@ -466,7 +466,7 @@ importers: version: 1.133.15(solid-js@1.9.9) '@tanstack/solid-start': specifier: ^1.133.15 - version: 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(solid-js@1.9.9)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(solid-js@1.9.9)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/trailbase-db-collection': specifier: ^0.1.33 version: link:../../../packages/trailbase-db-collection @@ -496,14 +496,14 @@ importers: version: 0.8.0 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) devDependencies: '@eslint/js': specifier: ^9.38.0 version: 9.38.0 '@tailwindcss/vite': specifier: ^4.1.14 - version: 4.1.14(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.1.14(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@types/cors': specifier: ^2.8.19 version: 2.8.19 @@ -518,10 +518,10 @@ importers: version: 8.15.5 '@typescript-eslint/eslint-plugin': specifier: ^8.46.1 - version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.46.1 - version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -536,7 +536,7 @@ importers: version: 9.38.0(jiti@2.6.0) eslint-plugin-solid: specifier: ^0.14.5 - version: 0.14.5(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + version: 0.14.5(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) pg: specifier: ^8.16.3 version: 8.16.3 @@ -545,13 +545,13 @@ importers: version: 4.20.6 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 vite: specifier: ^6.3.6 - version: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.9 - version: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/angular-db: dependencies: @@ -594,7 +594,7 @@ importers: version: link:../db-ivm typescript: specifier: '>=4.7' - version: 5.9.2 + version: 5.9.3 devDependencies: '@vitest/coverage-istanbul': specifier: ^3.2.4 @@ -616,7 +616,7 @@ importers: version: 1.8.1 typescript: specifier: '>=4.7' - version: 5.9.2 + version: 5.9.3 devDependencies: '@types/debug': specifier: ^4.1.12 @@ -660,7 +660,7 @@ importers: version: link:../db typescript: specifier: '>=4.7' - version: 5.9.2 + version: 5.9.3 devDependencies: '@tanstack/query-core': specifier: ^5.90.5 @@ -725,7 +725,7 @@ importers: version: 7.8.2 typescript: specifier: '>=4.7' - version: 5.9.2 + version: 5.9.3 devDependencies: '@types/debug': specifier: ^4.1.12 @@ -760,7 +760,7 @@ importers: version: 1.9.9 vite-plugin-solid: specifier: ^2.11.9 - version: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -773,10 +773,10 @@ importers: devDependencies: '@sveltejs/package': specifier: ^2.5.4 - version: 2.5.4(svelte@5.41.0)(typescript@5.9.2) + version: 2.5.4(svelte@5.41.0)(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.1 - version: 6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 6.2.1(svelte@5.41.0)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) @@ -788,7 +788,7 @@ importers: version: 5.41.0 svelte-check: specifier: ^4.3.3 - version: 4.3.3(picomatch@4.0.3)(svelte@5.41.0)(typescript@5.9.2) + version: 4.3.3(picomatch@4.0.3)(svelte@5.41.0)(typescript@5.9.3) packages/trailbase-db-collection: dependencies: @@ -809,7 +809,7 @@ importers: version: 0.8.0 typescript: specifier: '>=4.7' - version: 5.9.2 + version: 5.9.3 devDependencies: '@types/debug': specifier: ^4.1.12 @@ -829,13 +829,13 @@ importers: version: 1.0.14 '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 6.0.1(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vue: specifier: ^3.5.22 - version: 3.5.22(typescript@5.9.2) + version: 3.5.22(typescript@5.9.3) packages: @@ -1395,6 +1395,12 @@ packages: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} deprecated: 'Merged into tsx: https://tsx.is' + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.9': resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} @@ -1407,6 +1413,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.9': resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} @@ -1419,6 +1431,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.9': resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} @@ -1431,6 +1449,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.9': resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} @@ -1443,6 +1467,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.9': resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} @@ -1455,6 +1485,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.9': resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} @@ -1467,6 +1503,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.9': resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} @@ -1479,6 +1521,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.9': resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} @@ -1491,6 +1539,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.9': resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} @@ -1503,6 +1557,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.9': resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} @@ -1515,6 +1575,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.9': resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} @@ -1527,6 +1593,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.9': resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} @@ -1539,6 +1611,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.9': resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} @@ -1551,6 +1629,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.9': resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} @@ -1563,6 +1647,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.9': resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} @@ -1575,6 +1665,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.9': resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} @@ -1587,12 +1683,24 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.9': resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.25.9': resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} @@ -1605,12 +1713,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.9': resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.25.9': resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} @@ -1623,12 +1743,24 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.9': resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/openharmony-arm64@0.25.9': resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} @@ -1641,6 +1773,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.9': resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} @@ -1653,6 +1791,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.9': resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} @@ -1665,6 +1809,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.9': resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} @@ -1677,6 +1827,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.9': resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} @@ -2639,8 +2795,8 @@ packages: '@peculiar/asn1-x509@2.5.0': resolution: {integrity: sha512-CpwtMCTJvfvYTFMuiME5IH+8qmDe3yEWzKHe7OOADbGfq7ohxeLaXwQo0q4du3qs0AII3UbLCvb9NF/6q0oTKQ==} - '@petamoriken/float16@3.9.2': - resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} + '@petamoriken/float16@3.9.3': + resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2707,111 +2863,221 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.52.3': resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.52.3': resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.52.3': resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.52.3': resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.52.3': resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.52.3': resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.52.3': resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.52.3': resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.52.3': resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.52.3': resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.52.3': resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.52.3': resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.52.3': resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.52.3': resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.52.3': resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.52.3': resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-openharmony-arm64@4.52.3': resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==} cpu: [arm64] os: [openharmony] + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.52.3': resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.52.3': resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-gnu@4.52.3': resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.52.3': resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + '@rushstack/node-core-library@5.7.0': resolution: {integrity: sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==} peerDependencies: @@ -4805,6 +5071,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.25.9: resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} @@ -7020,11 +7291,16 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rou3@0.5.1: resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} - rou3@0.7.5: - resolution: {integrity: sha512-bwUHDHw1HSARty7TWNV71R0NZs5fOt74OM+hcMdJyPfchfRktEmxLoMSNa7PwEp6WqJ0a3feKztsIfTUEYhskw==} + rou3@0.7.8: + resolution: {integrity: sha512-21X/el5fdOaEsqwl3an/d9kpZ8hshVIyrwFCpsoleJ4ccAGRbN+PVoxyXzWXkHDxfMkVnLe4yzx+imz2qoem2Q==} router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} @@ -7097,6 +7373,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -7331,8 +7612,8 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - srvx@0.8.7: - resolution: {integrity: sha512-g3+15LlwVOGL2QpoTPZlvRjg+9a5Tx/69CatXjFP6txvhIaW2FmGyzJfb8yft5wyfGddvJmP/Yx+e/uNDMRSLQ==} + srvx@0.8.16: + resolution: {integrity: sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==} engines: {node: '>=20.16.0'} hasBin: true @@ -7724,8 +8005,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -7870,8 +8151,8 @@ packages: vite: optional: true - vite@6.3.6: - resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -7910,8 +8191,8 @@ packages: yaml: optional: true - vite@7.1.10: - resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} + vite@7.1.11: + resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -8505,7 +8786,7 @@ snapshots: chokidar: 4.0.3 convert-source-map: 1.9.0 reflect-metadata: 0.2.2 - semver: 7.7.2 + semver: 7.7.3 tslib: 2.8.1 yargs: 18.0.0 optionalDependencies: @@ -8867,7 +9148,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 '@changesets/assemble-release-plan@6.0.9': dependencies: @@ -8876,7 +9157,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@changesets/changelog-git@0.2.1': dependencies: @@ -8909,7 +9190,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 spawndamnit: 3.0.1 term-size: 2.2.1 transitivePeerDependencies: @@ -8934,7 +9215,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.2 + semver: 7.7.3 '@changesets/get-github-info@0.6.0(encoding@0.1.13)': dependencies: @@ -9047,7 +9328,7 @@ snapshots: dependencies: '@microsoft/fetch-event-source': 2.0.1 optionalDependencies: - '@rollup/rollup-darwin-arm64': 4.52.3 + '@rollup/rollup-darwin-arm64': 4.52.5 '@emnapi/core@1.5.0': dependencies: @@ -9075,147 +9356,225 @@ snapshots: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.10.1 + '@esbuild/aix-ppc64@0.25.11': + optional: true + '@esbuild/aix-ppc64@0.25.9': optional: true '@esbuild/android-arm64@0.18.20': optional: true + '@esbuild/android-arm64@0.25.11': + optional: true + '@esbuild/android-arm64@0.25.9': optional: true '@esbuild/android-arm@0.18.20': optional: true + '@esbuild/android-arm@0.25.11': + optional: true + '@esbuild/android-arm@0.25.9': optional: true '@esbuild/android-x64@0.18.20': optional: true + '@esbuild/android-x64@0.25.11': + optional: true + '@esbuild/android-x64@0.25.9': optional: true '@esbuild/darwin-arm64@0.18.20': optional: true + '@esbuild/darwin-arm64@0.25.11': + optional: true + '@esbuild/darwin-arm64@0.25.9': optional: true '@esbuild/darwin-x64@0.18.20': optional: true + '@esbuild/darwin-x64@0.25.11': + optional: true + '@esbuild/darwin-x64@0.25.9': optional: true '@esbuild/freebsd-arm64@0.18.20': optional: true + '@esbuild/freebsd-arm64@0.25.11': + optional: true + '@esbuild/freebsd-arm64@0.25.9': optional: true '@esbuild/freebsd-x64@0.18.20': optional: true + '@esbuild/freebsd-x64@0.25.11': + optional: true + '@esbuild/freebsd-x64@0.25.9': optional: true '@esbuild/linux-arm64@0.18.20': optional: true + '@esbuild/linux-arm64@0.25.11': + optional: true + '@esbuild/linux-arm64@0.25.9': optional: true '@esbuild/linux-arm@0.18.20': optional: true + '@esbuild/linux-arm@0.25.11': + optional: true + '@esbuild/linux-arm@0.25.9': optional: true '@esbuild/linux-ia32@0.18.20': optional: true + '@esbuild/linux-ia32@0.25.11': + optional: true + '@esbuild/linux-ia32@0.25.9': optional: true '@esbuild/linux-loong64@0.18.20': optional: true + '@esbuild/linux-loong64@0.25.11': + optional: true + '@esbuild/linux-loong64@0.25.9': optional: true '@esbuild/linux-mips64el@0.18.20': optional: true + '@esbuild/linux-mips64el@0.25.11': + optional: true + '@esbuild/linux-mips64el@0.25.9': optional: true '@esbuild/linux-ppc64@0.18.20': optional: true + '@esbuild/linux-ppc64@0.25.11': + optional: true + '@esbuild/linux-ppc64@0.25.9': optional: true '@esbuild/linux-riscv64@0.18.20': optional: true + '@esbuild/linux-riscv64@0.25.11': + optional: true + '@esbuild/linux-riscv64@0.25.9': optional: true '@esbuild/linux-s390x@0.18.20': optional: true + '@esbuild/linux-s390x@0.25.11': + optional: true + '@esbuild/linux-s390x@0.25.9': optional: true '@esbuild/linux-x64@0.18.20': optional: true + '@esbuild/linux-x64@0.25.11': + optional: true + '@esbuild/linux-x64@0.25.9': optional: true + '@esbuild/netbsd-arm64@0.25.11': + optional: true + '@esbuild/netbsd-arm64@0.25.9': optional: true '@esbuild/netbsd-x64@0.18.20': optional: true + '@esbuild/netbsd-x64@0.25.11': + optional: true + '@esbuild/netbsd-x64@0.25.9': optional: true + '@esbuild/openbsd-arm64@0.25.11': + optional: true + '@esbuild/openbsd-arm64@0.25.9': optional: true '@esbuild/openbsd-x64@0.18.20': optional: true + '@esbuild/openbsd-x64@0.25.11': + optional: true + '@esbuild/openbsd-x64@0.25.9': optional: true + '@esbuild/openharmony-arm64@0.25.11': + optional: true + '@esbuild/openharmony-arm64@0.25.9': optional: true '@esbuild/sunos-x64@0.18.20': optional: true + '@esbuild/sunos-x64@0.25.11': + optional: true + '@esbuild/sunos-x64@0.25.9': optional: true '@esbuild/win32-arm64@0.18.20': optional: true + '@esbuild/win32-arm64@0.25.11': + optional: true + '@esbuild/win32-arm64@0.25.9': optional: true '@esbuild/win32-ia32@0.18.20': optional: true + '@esbuild/win32-ia32@0.25.11': + optional: true + '@esbuild/win32-ia32@0.25.9': optional: true '@esbuild/win32-x64@0.18.20': optional: true + '@esbuild/win32-x64@0.25.11': + optional: true + '@esbuild/win32-x64@0.25.9': optional: true @@ -10045,7 +10404,7 @@ snapshots: '@npmcli/fs@4.0.0': dependencies: - semver: 7.7.2 + semver: 7.7.3 '@npmcli/git@6.0.3': dependencies: @@ -10055,7 +10414,7 @@ snapshots: npm-pick-manifest: 10.0.0 proc-log: 5.0.0 promise-retry: 2.0.1 - semver: 7.7.2 + semver: 7.7.3 which: 5.0.0 '@npmcli/installed-package-contents@3.0.0': @@ -10072,7 +10431,7 @@ snapshots: hosted-git-info: 8.1.0 json-parse-even-better-errors: 4.0.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 '@npmcli/promise-spawn@8.0.3': @@ -10262,7 +10621,7 @@ snapshots: pvtsutils: 1.3.6 tslib: 2.8.1 - '@petamoriken/float16@3.9.2': + '@petamoriken/float16@3.9.3': optional: true '@pkgjs/parseargs@0.11.0': @@ -10301,80 +10660,146 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.40': {} - '@rollup/pluginutils@5.3.0(rollup@4.52.3)': + '@rollup/pluginutils@5.3.0(rollup@4.52.5)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.3 + rollup: 4.52.5 '@rollup/rollup-android-arm-eabi@4.52.3': optional: true + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + '@rollup/rollup-android-arm64@4.52.3': optional: true + '@rollup/rollup-android-arm64@4.52.5': + optional: true + '@rollup/rollup-darwin-arm64@4.52.3': optional: true + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + '@rollup/rollup-darwin-x64@4.52.3': optional: true + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + '@rollup/rollup-freebsd-arm64@4.52.3': optional: true + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + '@rollup/rollup-freebsd-x64@4.52.3': optional: true + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.52.3': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.52.3': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.52.3': optional: true + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-arm64-musl@4.52.3': optional: true + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.52.3': optional: true + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.52.3': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.52.3': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.52.3': optional: true + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.52.3': optional: true + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-x64-gnu@4.52.3': optional: true + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-x64-musl@4.52.3': optional: true + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + '@rollup/rollup-openharmony-arm64@4.52.3': optional: true + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.52.3': optional: true + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.52.3': optional: true + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + '@rollup/rollup-win32-x64-gnu@4.52.3': optional: true + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + '@rollup/rollup-win32-x64-msvc@4.52.3': optional: true + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + '@rushstack/node-core-library@5.7.0(@types/node@24.7.0)': dependencies: ajv: 8.13.0 @@ -10603,9 +11028,9 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@stylistic/eslint-plugin@4.4.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@stylistic/eslint-plugin@4.4.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -10629,35 +11054,35 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/package@2.5.4(svelte@5.41.0)(typescript@5.9.2)': + '@sveltejs/package@2.5.4(svelte@5.41.0)(typescript@5.9.3)': dependencies: chokidar: 4.0.3 kleur: 4.1.5 sade: 1.8.1 - semver: 7.7.2 + semver: 7.7.3 svelte: 5.41.0 - svelte2tsx: 0.7.42(svelte@5.41.0)(typescript@5.9.2) + svelte2tsx: 0.7.42(svelte@5.41.0)(typescript@5.9.3) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.41.0)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.41.0)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) debug: 4.4.3 svelte: 5.41.0 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.41.0)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.41.0)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) debug: 4.4.3 deepmerge: 4.3.1 magic-string: 0.30.19 svelte: 5.41.0 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -10732,26 +11157,26 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 - '@tailwindcss/vite@4.1.14(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.14(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.14 '@tailwindcss/oxide': 4.1.14 tailwindcss: 4.1.14 - vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@tailwindcss/vite@4.1.14(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.14(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.14 '@tailwindcss/oxide': 4.1.14 tailwindcss: 4.1.14 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@tanstack/config@0.22.0(@types/node@24.7.0)(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/config@0.22.0(@types/node@24.7.0)(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@tanstack/publish-config': 0.2.1 - '@tanstack/typedoc-config': 0.3.0(typescript@5.9.2) - '@tanstack/vite-config': 0.4.0(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/typedoc-config': 0.3.0(typescript@5.9.3) + '@tanstack/vite-config': 0.4.0(@types/node@24.7.0)(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -10762,7 +11187,7 @@ snapshots: - typescript - vite - '@tanstack/directive-functions-plugin@1.133.9(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.133.9(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -10772,11 +11197,11 @@ snapshots: babel-dead-code-elimination: 1.0.10 pathe: 2.0.3 tiny-invariant: 1.3.3 - vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/directive-functions-plugin@1.133.9(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.133.9(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -10786,18 +11211,18 @@ snapshots: babel-dead-code-elimination: 1.0.10 pathe: 2.0.3 tiny-invariant: 1.3.3 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@eslint/js': 9.38.0 '@stylistic/eslint-plugin': 5.4.0(eslint@9.38.0(jiti@2.6.0)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)) - eslint-plugin-n: 17.23.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0)) + eslint-plugin-n: 17.23.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) globals: 16.4.0 - typescript-eslint: 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + typescript-eslint: 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) vue-eslint-parser: 10.2.0(eslint@9.38.0(jiti@2.6.0)) transitivePeerDependencies: - '@typescript-eslint/utils' @@ -10812,7 +11237,7 @@ snapshots: dependencies: '@commitlint/parse': 19.8.1 jsonfile: 6.2.0 - semver: 7.7.2 + semver: 7.7.3 simple-git: 3.28.0 transitivePeerDependencies: - supports-color @@ -10832,7 +11257,7 @@ snapshots: '@tanstack/router-devtools-core': 1.133.15(@tanstack/router-core@1.133.15)(@types/node@24.7.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@tanstack/router-core' - '@types/node' @@ -10891,19 +11316,19 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/react-start@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-start-client': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-start-server': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/router-utils': 1.133.3 '@tanstack/start-client-core': 1.133.15 - '@tanstack/start-plugin-core': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-plugin-core': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/start-server-core': 1.133.15 pathe: 2.0.3 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -10935,7 +11360,7 @@ snapshots: goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.9 tiny-invariant: 1.3.3 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: csstype: 3.1.3 transitivePeerDependencies: @@ -10964,7 +11389,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -10982,12 +11407,12 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-solid: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-plugin-solid: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -11005,8 +11430,8 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-solid: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-plugin-solid: 2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -11023,7 +11448,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.133.11(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.133.11(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -11032,14 +11457,14 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/directive-functions-plugin': 1.133.9(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.133.9(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@tanstack/server-functions-plugin@1.133.11(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.133.11(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -11048,7 +11473,7 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/directive-functions-plugin': 1.133.9(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.133.9(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: @@ -11089,17 +11514,17 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/solid-start@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(solid-js@1.9.9)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/solid-start@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(solid-js@1.9.9)(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@tanstack/solid-router': 1.133.15(solid-js@1.9.9) '@tanstack/solid-start-client': 1.133.15(solid-js@1.9.9) '@tanstack/solid-start-server': 1.133.15(solid-js@1.9.9) '@tanstack/start-client-core': 1.133.15 - '@tanstack/start-plugin-core': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-plugin-core': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/start-server-core': 1.133.15 pathe: 2.0.3 solid-js: 1.9.9 - vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - '@tanstack/react-router' @@ -11121,7 +11546,7 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.4 @@ -11129,20 +11554,20 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.133.15 '@tanstack/router-generator': 1.133.15 - '@tanstack/router-plugin': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-plugin': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/router-utils': 1.133.3 - '@tanstack/server-functions-plugin': 1.133.11(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/server-functions-plugin': 1.133.11(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/start-client-core': 1.133.15 '@tanstack/start-server-core': 1.133.15 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 pathe: 2.0.3 - srvx: 0.8.7 + srvx: 0.8.16 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) xmlbuilder2: 3.1.1 zod: 3.25.76 transitivePeerDependencies: @@ -11153,7 +11578,7 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-plugin-core@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.4 @@ -11161,20 +11586,20 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.133.15 '@tanstack/router-generator': 1.133.15 - '@tanstack/router-plugin': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-plugin': 1.133.15(@tanstack/react-router@1.133.15(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/router-utils': 1.133.3 - '@tanstack/server-functions-plugin': 1.133.11(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/server-functions-plugin': 1.133.11(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/start-client-core': 1.133.15 '@tanstack/start-server-core': 1.133.15 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 pathe: 2.0.3 - srvx: 0.8.7 + srvx: 0.8.16 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) xmlbuilder2: 3.1.1 zod: 3.25.76 transitivePeerDependencies: @@ -11209,22 +11634,22 @@ snapshots: '@tanstack/store@0.8.0': {} - '@tanstack/typedoc-config@0.3.0(typescript@5.9.2)': + '@tanstack/typedoc-config@0.3.0(typescript@5.9.3)': dependencies: - typedoc: 0.28.14(typescript@5.9.2) - typedoc-plugin-frontmatter: 1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.2))) - typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.2)) + typedoc: 0.28.14(typescript@5.9.3) + typedoc-plugin-frontmatter: 1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))) + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.3)) transitivePeerDependencies: - typescript '@tanstack/virtual-file-routes@1.133.3': {} - '@tanstack/vite-config@0.4.0(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/vite-config@0.4.0(@types/node@24.7.0)(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - rollup-plugin-preserve-directives: 0.4.0(rollup@4.52.3) - vite-plugin-dts: 4.2.3(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - vite-plugin-externalize-deps: 0.10.0(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + rollup-plugin-preserve-directives: 0.4.0(rollup@4.52.5) + vite-plugin-dts: 4.2.3(@types/node@24.7.0)(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-plugin-externalize-deps: 0.10.0(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - rollup @@ -11262,14 +11687,14 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.2))(typescript@5.9.2)': + '@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@trpc/server': 11.6.0(typescript@5.9.2) - typescript: 5.9.2 + '@trpc/server': 11.6.0(typescript@5.9.3) + typescript: 5.9.3 - '@trpc/server@11.6.0(typescript@5.9.2)': + '@trpc/server@11.6.0(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 '@tufjs/canonical-json@2.0.0': {} @@ -11441,79 +11866,79 @@ snapshots: dependencies: '@types/node': 24.7.0 - '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.44.1 eslint: 9.38.0(jiti@2.6.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/parser': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.46.1 - '@typescript-eslint/type-utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.1 eslint: 9.38.0(jiti@2.6.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/parser@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.44.1 '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.44.1 debug: 4.4.3 eslint: 9.38.0(jiti@2.6.0) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.46.1 '@typescript-eslint/types': 8.46.1 - '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3 eslint: 9.38.0(jiti@2.6.0) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.44.1(typescript@5.9.2)': + '@typescript-eslint/project-service@8.44.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) '@typescript-eslint/types': 8.46.1 debug: 4.4.3 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.1(typescript@5.9.2)': + '@typescript-eslint/project-service@8.46.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) '@typescript-eslint/types': 8.46.1 debug: 4.4.3 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -11527,35 +11952,35 @@ snapshots: '@typescript-eslint/types': 8.46.1 '@typescript-eslint/visitor-keys': 8.46.1 - '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) debug: 4.4.3 eslint: 9.38.0(jiti@2.6.0) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.46.1 - '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) debug: 4.4.3 eslint: 9.38.0(jiti@2.6.0) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -11563,57 +11988,57 @@ snapshots: '@typescript-eslint/types@8.46.1': {} - '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.44.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/project-service': 8.44.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.3) '@typescript-eslint/types': 8.44.1 '@typescript-eslint/visitor-keys': 8.44.1 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.2) + '@typescript-eslint/project-service': 8.46.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) '@typescript-eslint/types': 8.46.1 '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/utils@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.0)) '@typescript-eslint/scope-manager': 8.44.1 '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.0) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.0)) '@typescript-eslint/scope-manager': 8.46.1 '@typescript-eslint/types': 8.46.1 - '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.0) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -11692,7 +12117,7 @@ snapshots: dependencies: vite: 7.1.5(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitejs/plugin-react@5.0.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@5.0.4(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -11700,15 +12125,27 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + '@vitejs/plugin-react@5.0.4(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.38 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@6.0.1(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vue: 3.5.22(typescript@5.9.2) + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.3) '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: @@ -11734,13 +12171,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -11815,7 +12252,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.1.6(typescript@5.9.2)': + '@vue/language-core@2.1.6(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.23 '@vue/compiler-dom': 3.5.22 @@ -11826,7 +12263,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 '@vue/reactivity@3.5.22': dependencies: @@ -11844,11 +12281,11 @@ snapshots: '@vue/shared': 3.5.22 csstype: 3.1.3 - '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.2))': + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.22 '@vue/shared': 3.5.22 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) '@vue/shared@3.5.22': {} @@ -12666,8 +13103,8 @@ snapshots: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.25.9 - esbuild-register: 3.6.0(esbuild@0.25.9) + esbuild: 0.25.11 + esbuild-register: 3.6.0(esbuild@0.25.11) transitivePeerDependencies: - supports-color @@ -12878,10 +13315,10 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-register@3.6.0(esbuild@0.25.9): + esbuild-register@3.6.0(esbuild@0.25.11): dependencies: debug: 4.4.3 - esbuild: 0.25.9 + esbuild: 0.25.11 transitivePeerDependencies: - supports-color @@ -12910,6 +13347,35 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + esbuild@0.25.9: optionalDependencies: '@esbuild/aix-ppc64': 0.25.9 @@ -12948,7 +13414,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@9.38.0(jiti@2.6.0)): dependencies: eslint: 9.38.0(jiti@2.6.0) - semver: 7.7.2 + semver: 7.7.3 eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.0)): dependencies: @@ -12961,7 +13427,7 @@ 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.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0)))(eslint@9.38.0(jiti@2.6.0)): dependencies: debug: 4.4.3 eslint: 9.38.0(jiti@2.6.0) @@ -12972,7 +13438,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0)) transitivePeerDependencies: - supports-color @@ -12983,7 +13449,7 @@ snapshots: eslint: 9.38.0(jiti@2.6.0) eslint-compat-utils: 0.5.1(eslint@9.38.0(jiti@2.6.0)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0)): dependencies: '@typescript-eslint/types': 8.46.1 comment-parser: 1.4.1 @@ -12992,15 +13458,15 @@ snapshots: eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.0.3 - semver: 7.7.2 + semver: 7.7.3 stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) transitivePeerDependencies: - supports-color - eslint-plugin-n@17.23.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2): + eslint-plugin-n@17.23.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.0)) enhanced-resolve: 5.18.3 @@ -13010,8 +13476,8 @@ snapshots: globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.2 - ts-declaration-location: 1.0.7(typescript@5.9.2) + semver: 7.7.3 + ts-declaration-location: 1.0.7(typescript@5.9.3) transitivePeerDependencies: - typescript @@ -13054,16 +13520,16 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-solid@0.14.5(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2): + eslint-plugin-solid@0.14.5(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.0) estraverse: 5.3.0 is-html: 2.0.0 kebab-case: 1.0.2 known-css-properties: 0.30.0 style-to-object: 1.0.9 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -13464,10 +13930,10 @@ snapshots: gel@2.1.1: dependencies: - '@petamoriken/float16': 3.9.2 + '@petamoriken/float16': 3.9.3 debug: 4.4.3 env-paths: 3.0.0 - semver: 7.7.2 + semver: 7.7.3 shell-quote: 1.8.3 which: 4.0.0 transitivePeerDependencies: @@ -13601,8 +14067,8 @@ snapshots: dependencies: cookie-es: 2.0.0 fetchdts: 0.1.7 - rou3: 0.7.5 - srvx: 0.8.7 + rou3: 0.7.8 + srvx: 0.8.16 has-bigints@1.1.0: {} @@ -13791,7 +14257,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 is-callable@1.2.7: {} @@ -13965,7 +14431,7 @@ snapshots: '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -14173,7 +14639,7 @@ snapshots: kleur@4.1.5: {} - knip@5.66.1(@types/node@24.7.0)(typescript@5.9.2): + knip@5.66.1(@types/node@24.7.0)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 '@types/node': 24.7.0 @@ -14187,7 +14653,7 @@ snapshots: picomatch: 4.0.3 smol-toml: 1.4.2 strip-json-comments: 5.0.2 - typescript: 5.9.2 + typescript: 5.9.3 zod: 4.1.11 known-css-properties@0.30.0: {} @@ -14398,7 +14864,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 make-fetch-happen@14.0.3: dependencies: @@ -14663,7 +15129,7 @@ snapshots: make-fetch-happen: 14.0.3 nopt: 8.1.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 tar: 7.5.1 tinyglobby: 0.2.15 which: 5.0.0 @@ -14686,7 +15152,7 @@ snapshots: npm-install-checks@7.1.2: dependencies: - semver: 7.7.2 + semver: 7.7.3 npm-normalize-package-bin@4.0.0: {} @@ -14694,14 +15160,14 @@ snapshots: dependencies: hosted-git-info: 8.1.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-name: 6.0.2 npm-package-arg@13.0.0: dependencies: hosted-git-info: 9.0.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-name: 6.0.2 npm-packlist@10.0.1: @@ -14713,7 +15179,7 @@ snapshots: npm-install-checks: 7.1.2 npm-normalize-package-bin: 4.0.0 npm-package-arg: 12.0.2 - semver: 7.7.2 + semver: 7.7.3 npm-registry-fetch@18.0.2: dependencies: @@ -15329,11 +15795,11 @@ snapshots: dependencies: glob: 7.2.3 - rollup-plugin-preserve-directives@0.4.0(rollup@4.52.3): + rollup-plugin-preserve-directives@0.4.0(rollup@4.52.5): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.52.3) + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) magic-string: 0.30.19 - rollup: 4.52.3 + rollup: 4.52.5 rollup@4.52.3: dependencies: @@ -15363,9 +15829,37 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.3 fsevents: 2.3.3 + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + rou3@0.5.1: {} - rou3@0.7.5: {} + rou3@0.7.8: {} router@2.2.0: dependencies: @@ -15486,6 +15980,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -15802,9 +16298,7 @@ snapshots: sprintf-js@1.0.3: {} - srvx@0.8.7: - dependencies: - cookie-es: 2.0.0 + srvx@0.8.16: {} ssri@12.0.0: dependencies: @@ -15955,7 +16449,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.3.3(picomatch@4.0.3)(svelte@5.41.0)(typescript@5.9.2): + svelte-check@4.3.3(picomatch@4.0.3)(svelte@5.41.0)(typescript@5.9.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 chokidar: 4.0.3 @@ -15963,16 +16457,16 @@ snapshots: picocolors: 1.1.1 sade: 1.8.1 svelte: 5.41.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - picomatch - svelte2tsx@0.7.42(svelte@5.41.0)(typescript@5.9.2): + svelte2tsx@0.7.42(svelte@5.41.0)(typescript@5.9.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 svelte: 5.41.0 - typescript: 5.9.2 + typescript: 5.9.3 svelte@5.41.0: dependencies: @@ -16139,26 +16633,26 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - ts-declaration-location@1.0.7(typescript@5.9.2): + ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: picomatch: 4.0.3 - typescript: 5.9.2 + typescript: 5.9.3 ts-interface-checker@0.1.13: {} - tsconfck@3.1.6(typescript@5.9.2): + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 tslib@2.8.1: {} tsx@4.20.6: dependencies: - esbuild: 0.25.9 + esbuild: 0.25.11 get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 @@ -16223,32 +16717,32 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedoc-plugin-frontmatter@1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.2))): + typedoc-plugin-frontmatter@1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))): dependencies: - typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.2)) + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.3)) yaml: 2.8.1 - typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.2)): + typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3)): dependencies: - typedoc: 0.28.14(typescript@5.9.2) + typedoc: 0.28.14(typescript@5.9.3) - typedoc@0.28.14(typescript@5.9.2): + typedoc@0.28.14(typescript@5.9.3): dependencies: '@gerrit0/mini-shiki': 3.13.1 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.9.2 + typescript: 5.9.3 yaml: 2.8.1 - typescript-eslint@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2): + typescript-eslint@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/parser': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.44.1(eslint@9.38.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.0) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -16256,7 +16750,7 @@ snapshots: typescript@5.8.3: {} - typescript@5.9.2: {} + typescript@5.9.3: {} ua-parser-js@0.7.41: {} @@ -16373,7 +16867,7 @@ snapshots: debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -16388,30 +16882,30 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@24.7.0)(rollup@4.52.3)(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-dts@4.2.3(@types/node@24.7.0)(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@24.7.0) - '@rollup/pluginutils': 5.3.0(rollup@4.52.3) + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) '@volar/typescript': 2.4.23 - '@vue/language-core': 2.1.6(typescript@5.9.2) + '@vue/language-core': 2.1.6(typescript@5.9.3) compare-versions: 6.1.1 debug: 4.4.3 kolorist: 1.8.0 local-pkg: 0.5.1 magic-string: 0.30.19 - typescript: 5.9.2 + typescript: 5.9.3 optionalDependencies: - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.10.0(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-externalize-deps@0.10.0(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@babel/core': 7.28.4 '@types/babel__core': 7.20.5 @@ -16419,14 +16913,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.9 solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@babel/core': 7.28.4 '@types/babel__core': 7.20.5 @@ -16434,42 +16928,69 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.9 solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color + optional: true - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-solid@2.11.9(@testing-library/jest-dom@6.9.1)(solid-js@1.9.9)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + dependencies: + '@babel/core': 7.28.4 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.9(@babel/core@7.28.4)(solid-js@1.9.9) + merge-anything: 5.1.7 + solid-js: 1.9.9 + solid-refresh: 0.6.3(solid-js@1.9.9) + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + optionalDependencies: + '@testing-library/jest-dom': 6.9.1 + transitivePeerDependencies: + - supports-color + + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.2) + tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.2) + tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - esbuild: 0.25.9 + debug: 4.4.3 + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.9.3) + optionalDependencies: + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + - typescript + + vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.3 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.18.1 @@ -16481,13 +17002,31 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.3 + rollup: 4.52.5 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.7.0 + fsevents: 2.3.3 + jiti: 2.6.0 + lightningcss: 1.30.1 + sass: 1.90.0 + terser: 5.44.0 + tsx: 4.20.6 + yaml: 2.8.1 + + vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.7.0 @@ -16501,11 +17040,11 @@ snapshots: vite@7.1.5(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.3 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.7.0 @@ -16517,19 +17056,23 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitefu@1.1.1(vite@6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vitefu@1.1.1(vite@6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: - vite: 6.3.6(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@22.18.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu@1.1.1(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vitefu@1.1.1(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + + vitefu@1.1.1(vite@7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + optionalDependencies: + vite: 7.1.11(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.0)(jiti@2.6.0)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -16547,7 +17090,7 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.10(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-node: 3.2.4(@types/node@24.7.0)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: @@ -16580,19 +17123,19 @@ snapshots: eslint-visitor-keys: 4.2.1 espree: 10.4.0 esquery: 1.6.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color - vue@3.5.22(typescript@5.9.2): + vue@3.5.22(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.22 '@vue/compiler-sfc': 3.5.22 '@vue/runtime-dom': 3.5.22 - '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.2)) + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.3)) '@vue/shared': 3.5.22 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 w3c-xmlserializer@5.0.0: dependencies: From 63a7958f2ced03789465d2f738d85e0f38ab8441 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 09:55:14 +0000 Subject: [PATCH 49/51] chore(deps): update dependency vite to v6.4.1 [security] (#700) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- examples/react/projects/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/react/projects/package.json b/examples/react/projects/package.json index 37b77cd58d..1b7be2f9e5 100644 --- a/examples/react/projects/package.json +++ b/examples/react/projects/package.json @@ -60,7 +60,7 @@ "prettier": "^3.6.2", "tsx": "^4.20.6", "typescript": "^5.9.2", - "vite": "^6.4.0", + "vite": "^6.4.1", "vitest": "^3.2.4", "web-vitals": "^5.1.0" } From 8b298417964340bbac5ad08a831766f8f1497477 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Tue, 21 Oct 2025 08:55:15 -0600 Subject: [PATCH 50/51] feat: Add in-memory fallback for localStorage collections in SSR environments (#696) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Add in-memory fallback for localStorage collections in SSR environments Prevents LocalStorageCollectionError when localStorage collections are imported on the server by automatically falling back to an in-memory store. This addresses issue #691 where importing client code with localStorage collections in server environments would throw errors during module initialization. Changes: - Add createInMemoryStorage() to provide in-memory StorageApi fallback - Add createNoOpStorageEventApi() for server environments without window - Update localStorageCollectionOptions to use fallbacks instead of throwing errors - Remove unused NoStorageAvailableError and NoStorageEventApiError imports - Update tests to verify fallback behavior instead of expecting errors - Update JSDoc to document fallback behavior This allows isomorphic JavaScript applications to safely import localStorage collection modules without errors, though data will not persist across reloads or sync across tabs when using the in-memory fallback. Fixes #691 πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * chore: Remove unused NoStorageAvailableError and NoStorageEventApiError classes These error classes are no longer used after implementing the in-memory fallback for localStorage collections in SSR environments. Removes dead code to keep the codebase clean. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * chore: Add changeset for in-memory fallback feature πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * fix: Update changeset to patch version (pre-1.0 project) πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * chore: Update changeset to not reference deleted error class πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --------- Co-authored-by: Claude --- .changeset/in-memory-fallback-for-ssr.md | 11 ++++ packages/db/src/errors.ts | 16 ------ packages/db/src/local-storage.ts | 65 +++++++++++++++++++----- packages/db/tests/local-storage.test.ts | 44 ++++++++-------- 4 files changed, 87 insertions(+), 49 deletions(-) create mode 100644 .changeset/in-memory-fallback-for-ssr.md diff --git a/.changeset/in-memory-fallback-for-ssr.md b/.changeset/in-memory-fallback-for-ssr.md new file mode 100644 index 0000000000..5afb610183 --- /dev/null +++ b/.changeset/in-memory-fallback-for-ssr.md @@ -0,0 +1,11 @@ +--- +"@tanstack/db": patch +--- + +Add in-memory fallback for localStorage collections in SSR environments + +Prevents errors when localStorage collections are imported on the server by automatically falling back to an in-memory store. This allows isomorphic JavaScript applications to safely import localStorage collection modules without errors during module initialization. + +When localStorage is not available (e.g., in server-side rendering environments), the collection automatically uses an in-memory storage implementation. Data will not persist across page reloads or be shared across tabs when using the in-memory fallback, but the collection will function normally otherwise. + +Fixes #691 diff --git a/packages/db/src/errors.ts b/packages/db/src/errors.ts index 3858df1784..7ec6dd4787 100644 --- a/packages/db/src/errors.ts +++ b/packages/db/src/errors.ts @@ -521,22 +521,6 @@ export class StorageKeyRequiredError extends LocalStorageCollectionError { } } -export class NoStorageAvailableError extends LocalStorageCollectionError { - constructor() { - super( - `[LocalStorageCollection] No storage available. Please provide a storage option or ensure window.localStorage is available.` - ) - } -} - -export class NoStorageEventApiError extends LocalStorageCollectionError { - constructor() { - super( - `[LocalStorageCollection] No storage event API available. Please provide a storageEventApi option or ensure window is available.` - ) - } -} - export class InvalidStorageDataFormatError extends LocalStorageCollectionError { constructor(storageKey: string, key: string) { super( diff --git a/packages/db/src/local-storage.ts b/packages/db/src/local-storage.ts index cb9e3e2cec..df3b1b2e58 100644 --- a/packages/db/src/local-storage.ts +++ b/packages/db/src/local-storage.ts @@ -1,8 +1,6 @@ import { InvalidStorageDataFormatError, InvalidStorageObjectFormatError, - NoStorageAvailableError, - NoStorageEventApiError, SerializationError, StorageKeyRequiredError, } from "./errors" @@ -138,12 +136,58 @@ function generateUuid(): string { return crypto.randomUUID() } +/** + * Creates an in-memory storage implementation that mimics the StorageApi interface + * Used as a fallback when localStorage is not available (e.g., server-side rendering) + * @returns An object implementing the StorageApi interface using an in-memory Map + */ +function createInMemoryStorage(): StorageApi { + const storage = new Map() + + return { + getItem(key: string): string | null { + return storage.get(key) ?? null + }, + setItem(key: string, value: string): void { + storage.set(key, value) + }, + removeItem(key: string): void { + storage.delete(key) + }, + } +} + +/** + * Creates a no-op storage event API for environments without window (e.g., server-side) + * This provides the required interface but doesn't actually listen to any events + * since cross-tab synchronization is not possible in server environments + * @returns An object implementing the StorageEventApi interface with no-op methods + */ +function createNoOpStorageEventApi(): StorageEventApi { + return { + addEventListener: () => { + // No-op: cannot listen to storage events without window + }, + removeEventListener: () => { + // No-op: cannot remove listeners without window + }, + } +} + /** * Creates localStorage collection options for use with a standard Collection * * This function creates a collection that persists data to localStorage/sessionStorage * and synchronizes changes across browser tabs using storage events. * + * **Fallback Behavior:** + * + * When localStorage is not available (e.g., in server-side rendering environments), + * this function automatically falls back to an in-memory storage implementation. + * This prevents errors during module initialization and allows the collection to + * work in any environment, though data will not persist across page reloads or + * be shared across tabs when using the in-memory fallback. + * * **Using with Manual Transactions:** * * For manual transactions, you must call `utils.acceptMutations()` in your transaction's `mutationFn` @@ -257,21 +301,18 @@ export function localStorageCollectionOptions( } // Default to window.localStorage if no storage is provided + // Fall back to in-memory storage if localStorage is not available (e.g., server-side rendering) const storage = config.storage || - (typeof window !== `undefined` ? window.localStorage : null) - - if (!storage) { - throw new NoStorageAvailableError() - } + (typeof window !== `undefined` ? window.localStorage : null) || + createInMemoryStorage() // Default to window for storage events if not provided + // Fall back to no-op storage event API if window is not available (e.g., server-side rendering) const storageEventApi = - config.storageEventApi || (typeof window !== `undefined` ? window : null) - - if (!storageEventApi) { - throw new NoStorageEventApiError() - } + config.storageEventApi || + (typeof window !== `undefined` ? window : null) || + createNoOpStorageEventApi() // Track the last known state to detect changes const lastKnownData = new Map>() diff --git a/packages/db/tests/local-storage.test.ts b/packages/db/tests/local-storage.test.ts index f2a488d755..b991622dc4 100644 --- a/packages/db/tests/local-storage.test.ts +++ b/packages/db/tests/local-storage.test.ts @@ -2,11 +2,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" import { createCollection } from "../src/index" import { localStorageCollectionOptions } from "../src/local-storage" import { createTransaction } from "../src/transactions" -import { - NoStorageAvailableError, - NoStorageEventApiError, - StorageKeyRequiredError, -} from "../src/errors" +import { StorageKeyRequiredError } from "../src/errors" import type { StorageEventApi } from "../src/local-storage" // Mock storage implementation for testing that properly implements Storage interface @@ -138,37 +134,43 @@ describe(`localStorage collection`, () => { ).toThrow(StorageKeyRequiredError) }) - it(`should throw error when no storage is available`, () => { + it(`should fall back to in-memory storage when no storage is available`, () => { // Mock window to be undefined globally const originalWindow = globalThis.window // @ts-ignore - Temporarily delete window to test error condition delete globalThis.window - expect(() => - localStorageCollectionOptions({ - storageKey: `test`, - storageEventApi: mockStorageEventApi, - getKey: (item: any) => item.id, - }) - ).toThrow(NoStorageAvailableError) + // Should not throw - instead falls back to in-memory storage + const collectionOptions = localStorageCollectionOptions({ + storageKey: `test`, + storageEventApi: mockStorageEventApi, + getKey: (item: any) => item.id, + }) + + // Verify collection was created successfully + expect(collectionOptions).toBeDefined() + expect(collectionOptions.id).toBe(`local-collection:test`) // Restore window globalThis.window = originalWindow }) - it(`should throw error when no storage event API is available`, () => { + it(`should fall back to no-op event API when no storage event API is available`, () => { // Mock window to be undefined globally const originalWindow = globalThis.window // @ts-ignore - Temporarily delete window to test error condition delete globalThis.window - expect(() => - localStorageCollectionOptions({ - storageKey: `test`, - storage: mockStorage, - getKey: (item: any) => item.id, - }) - ).toThrow(NoStorageEventApiError) + // Should not throw - instead falls back to no-op storage event API + const collectionOptions = localStorageCollectionOptions({ + storageKey: `test`, + storage: mockStorage, + getKey: (item: any) => item.id, + }) + + // Verify collection was created successfully + expect(collectionOptions).toBeDefined() + expect(collectionOptions.id).toBe(`local-collection:test`) // Restore window globalThis.window = originalWindow From a03b5a5a619a448357fa1145bdd9733d755e366d Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Tue, 21 Oct 2025 09:34:48 -0600 Subject: [PATCH 51/51] docs: improve incremental updates example in query-collection docs (#703) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: improve incremental updates example in query-collection docs Replace confusing manual optimistic update pattern with familiar onInsert/onUpdate handler pattern. Show how to: - Use persistence handlers (onInsert, onUpdate) like regular collections - Return { refetch: false } to avoid unnecessary refetches - Sync server-computed fields using direct writes within handlers This makes the example more approachable and consistent with the rest of the documentation. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude * docs: remove unnecessary writeDelete from query-collection example Optimistic state is automatically removed when the mutation handler returns, so there's no need to manually delete optimistic items. The handler just needs to write the server response to the synced data store, and when it completes, the optimistic state is automatically replaced. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --------- Co-authored-by: Claude --- docs/collections/query-collection.md | 70 +++++++++++++++++++--------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/docs/collections/query-collection.md b/docs/collections/query-collection.md index 6f641dbf32..cd4e7eedc8 100644 --- a/docs/collections/query-collection.md +++ b/docs/collections/query-collection.md @@ -224,28 +224,56 @@ ws.on('todos:update', (changes) => { ### Example: Incremental Updates +When the server returns computed fields (like server-generated IDs or timestamps), you can use the `onInsert` handler with `{ refetch: false }` to avoid unnecessary refetches while still syncing the server response: + ```typescript -// Handle server responses after mutations without full refetch -const createTodo = async (todo) => { - // Optimistically add the todo - const tempId = crypto.randomUUID() - todosCollection.insert({ ...todo, id: tempId }) - - try { - // Send to server - const serverTodo = await api.createTodo(todo) - - // Sync the server response (with server-generated ID and timestamps) - // without triggering a full collection refetch - todosCollection.utils.writeBatch(() => { - todosCollection.utils.writeDelete(tempId) - todosCollection.utils.writeInsert(serverTodo) - }) - } catch (error) { - // Rollback happens automatically - throw error - } -} +const todosCollection = createCollection( + queryCollectionOptions({ + queryKey: ['todos'], + queryFn: fetchTodos, + queryClient, + getKey: (item) => item.id, + + onInsert: async ({ transaction }) => { + const newItems = transaction.mutations.map(m => m.modified) + + // Send to server and get back items with server-computed fields + const serverItems = await api.createTodos(newItems) + + // Sync server-computed fields (like server-generated IDs, timestamps, etc.) + // to the collection's synced data store + todosCollection.utils.writeBatch(() => { + serverItems.forEach(serverItem => { + todosCollection.utils.writeInsert(serverItem) + }) + }) + + // Skip automatic refetch since we've already synced the server response + // (optimistic state is automatically replaced when handler completes) + return { refetch: false } + }, + + onUpdate: async ({ transaction }) => { + const updates = transaction.mutations.map(m => ({ + id: m.key, + changes: m.changes + })) + const serverItems = await api.updateTodos(updates) + + // Sync server-computed fields from the update response + todosCollection.utils.writeBatch(() => { + serverItems.forEach(serverItem => { + todosCollection.utils.writeUpdate(serverItem) + }) + }) + + return { refetch: false } + } + }) +) + +// Usage is just like a regular collection +todosCollection.insert({ text: 'Buy milk', completed: false }) ``` ### Example: Large Dataset Pagination