Skip to content

ci: Version Packages - #2217

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main
Open

github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@tanstack/[email protected]

Minor Changes

  • Collect the helpers the framework adapters share into one adapter layer, exported from @tanstack/db and marked unstable for external use. It adds identifyLiveQuery, which checks a prepared query's identity and source Collection IDs for a hook that compares query identity, and bindLiveQueryWindow, the window binding every useLiveInfiniteQuery now uses. The window helpers that binding replaces are no longer exported. (#2235)

    Add SourceCollectionIdReuseError, which a mounted hook that compares query identity throws when a different source Collection appears under a Collection ID it already read.

    Add rejectLiveQueryInput and releaseDeferredOnReclaim for framework hooks. The first releases the sync starts a rejected query deferred and rethrows the rejection. The second releases a render's deferred sync starts when garbage collection reclaims the live query it built, so a render that never commits, because a sibling threw or it suspended, does not keep its sources deferred. Each released source follows its own start policy, so startSyncImmediate() or another hook can still start it.

  • Breaking: grouping, includes, and pooling are now opt-in. An app bundles an operator's code only when it imports the value for that operator. Joins do not change. A typical app is about 8 kB smaller after gzip. This app has a query collection, a filtered live query, and React useLiveQuery. (#2232)

    • An include needs include(), toArray(), or materialize(). Change issues: q.from(...) in select() to issues: include(q.from(...)). A subquery in select() without one of these throws IncludeOperatorRequiredError.
    • Aggregates such as count() need no change. A groupBy with no aggregate takes groupKeys(): .groupBy(groupKeys(({ todo }) => todo.status)). Without it, the query throws GroupingOperatorRequiredError.
    • Hooks do not pool live queries by default. To share one partition among many equality-filtered queries, pass pool: pooledLiveQueries in the hook's query config: useLiveQuery({ query, pool: pooledLiveQueries }). Results do not change. Angular's { params, query } form takes pool the same way. Any other pool value, such as the old boolean, throws InvalidPoolOptionError, also for a disabled query. For adapter authors: the pool option of resolveLiveQueryValue is now pooledLiveQueries or false, not a boolean. An adapter that reads pool from its own options checks it with configPool first.
    • Code that builds query IR by hand must supply the operator code. IR.Aggregate takes groupingCompiler as its third argument. IR.IncludesSubquery takes includesRuntime as its fifth argument, before parentFilters. Import both from @tanstack/db. IR without them throws GroupingOperatorRequiredError or IncludeOperatorRequiredError when it compiles, unless another aggregate or groupKeys() in the query supplies the grouping compiler. Queries that the query builder builds need no change.
    • Operator code is part of query identity. A hook that re-renders a grouped query without groupKeys() now throws GroupingOperatorRequiredError. Before, React and Preact kept the grouped query.
    • Vue: when a changed query fails to compile, useLiveQuery no longer shows the rows of the previous query.

Patch Changes

  • Garbage collection no longer cleans up a collection while a transaction that touches it is persisting. Cleaning it up dropped the transaction's optimistic rows while its mutation handler still ran, and rejected waits such as Electric's awaitTxId, so a write could fail after the screen that made it unmounted. The gcTime delay now starts again when the last such transaction completes or fails, cancels obsolete queued idle cleanup, and preserves the remaining startup grace. Rolling back a manual transaction that stayed pending preserves the existing deadline. Explicit cleanup() still starts immediately; a transaction that settles afterward no longer restores another transaction's cleared optimistic rows. (#2258)

  • Keep ordered live queries accurate and loading when source work overlaps. A window with orderBy and limit no longer stops loading, keeps old rows, or holds acquisitions in these cases: a failed or superseded request, a truncate replay, a source change during a repair, or an on-demand joined source. Recovery after a failure uses one full-source read, and a window move whose load succeeded now resolves. (#2194)

    When an adapter's unloadSubset throws, TanStack DB now reports the error as an uncaught error and continues as if the release succeeded. The error is no longer a subset failure. It does not set lastError or lastSubsetError, fail a truncate replay, reject setWindow(), or dispose an Effect. unsubscribe(), releaseSnapshot(), and Effect dispose() no longer throw or reject with it.

    The newest setWindow() call now wins. A pending source recovery that defers two calls no longer lets the older one set the window. A superseded call that succeeds now resolves only after the newest call settles, so awaiting it shows the window that won.

  • Apps without a persisted Collection no longer bundle the persisted initial-render wait. The persistence adapter now supplies the wait, so a typical app is about 230 bytes smaller after gzip. (#2228)

  • Start the required Collection sync run when an ordinary subscriber follows an abandoned suspended render. Deferred acquisition still starts no idle source sync run or acquisition attempt. (#2229)

    Ordinary subscription admission and deferred acquisition resumption throw during cleanup, including automatic GC. Effects created then return disposed handles. Failed setup releases partial ownership, and throwing callbacks cannot prevent healthy observers receiving cleanup status. Subscribers surviving cleanup retain demand for an explicit restart.

    SSR captures each reader's rows and Collection status. Hydration preserves that view through browser preloads, runtime errors, sibling commits, and delayed streamed records. Missing records reject when transport ends. Known pending results survive normal record-stream close. A new stream after client cleanup starts independently of prior failures.

    Empty loading SSR needs no preload. Rendering rows or readiness requires matching query preparation or explicit source Collection preparation. Streaming Suspense prepares its result. Unsupported preparation throws with guidance. Prepared non-streaming Suspense remains supported. The DbClient query hash includes an infinite query's initial limit and offset.

    Apps without DbClient exclude its SSR implementation. Its API stays unchanged.

    Svelte roots initialized with hydrate() must set hydrating on DbProvider. Nested providers inherit it. Each provider clears initial hydration after mount so new children read live rows.

@tanstack/[email protected]

Minor Changes

  • Reloaded persisted collections now read their rows before they write a leader election term. A collection still takes its leader lock when it subscribes, but it reserves its durable term only after the database work already queued on the shared scheduler has settled, or as soon as something needs a leader during that election: a local write, a follower request, a sync commit during startup, or ensureLeadership. A need that an earlier leader already served does not let a later takeover skip the wait. A tab that takes over treats the departed leader's route as gone, so a sync commit queued behind one of its reads goes to the new leader and settles without waiting out an RPC timeout. The Electron renderer applies the same rule to its own hydrations. The renderer now has a hydration scope, so its startup runs as one hydration, as a Browser tab's does, and a restart keeps its metadata and row reads in one scope, so a term cannot run between them. (#2219)

    ensureLeadership now resolves when this node becomes leader, keeps its place in the Web Locks queue instead of replacing its lock request, and rejects if the coordinator is disposed.

    Migration for custom persistence adapters: runInRegularScope is now a RegularScope, which must also provide afterQueuedWork(). It resolves once every operation queued or running on the adapter's scheduler at the call has settled. An adapter without a scheduler can return a promise that settles with its running hydrations. A coordinator now rejects an adapter whose runInRegularScope lacks afterQueuedWork with InvalidPersistenceAdapterError.

Patch Changes

  • Fix type inference for schema-free collection options wrapped with persistedCollectionOptions and passed to createCollection. (#2259)

    Reject caller utilities that use the reserved local persistence names acceptMutations, getLeadershipState, or forceReloadSubset, instead of silently replacing them.

  • Apps without a persisted Collection no longer bundle the persisted initial-render wait. The persistence adapter now supplies the wait, so a typical app is about 230 bytes smaller after gzip. (#2228)

  • Reloads no longer repeat setup that is already complete. A reopened persisted collection checks its tables, indexes, triggers, and bookkeeping rows in the same query that reads its registration, and runs its nine setup statements only when something is missing. Each adapter checks database-wide setup with one query and runs it only when a table, index, or migrated column is missing, instead of about 19 statements on every load. The write-only global schema_version row, which adapters with different schema versions overwrote on every load, is no longer created or written. (#2219)

    A tab no longer rereads all of a collection's rows after its own write. It used to record the write's stream position before that write's commit notice arrived, so the notice looked like a gap and triggered pullSince and a full row scan.

  • Add SQLiteConnectionClosedError. A browser OPFS connection now rejects requests made after close starts with this error instead of InvalidPersistedCollectionConfigError. (#2213)

  • Updated dependencies [5649a07, 7538afd, 6c1ca8f, 30175be, 37b8fc2, 1640de8]:

@tanstack/[email protected]

Minor Changes

  • Add @tanstack/preact-db, a Preact adapter with useLiveQuery and useLiveInfiniteQuery. Both compare query identity derived from the query IR on each render, require a queryKey for functional query variants, and pass the shared live-query and infinite-query conformance suites. Queries read concrete source Collections; DbProvider and collection descriptors are not supported yet. (#2235)

Patch Changes

  • Breaking: grouping, includes, and pooling are now opt-in. An app bundles an operator's code only when it imports the value for that operator. Joins do not change. A typical app is about 8 kB smaller after gzip. This app has a query collection, a filtered live query, and React useLiveQuery. (#2232)

    • An include needs include(), toArray(), or materialize(). Change issues: q.from(...) in select() to issues: include(q.from(...)). A subquery in select() without one of these throws IncludeOperatorRequiredError.
    • Aggregates such as count() need no change. A groupBy with no aggregate takes groupKeys(): .groupBy(groupKeys(({ todo }) => todo.status)). Without it, the query throws GroupingOperatorRequiredError.
    • Hooks do not pool live queries by default. To share one partition among many equality-filtered queries, pass pool: pooledLiveQueries in the hook's query config: useLiveQuery({ query, pool: pooledLiveQueries }). Results do not change. Angular's { params, query } form takes pool the same way. Any other pool value, such as the old boolean, throws InvalidPoolOptionError, also for a disabled query. For adapter authors: the pool option of resolveLiveQueryValue is now pooledLiveQueries or false, not a boolean. An adapter that reads pool from its own options checks it with configPool first.
    • Code that builds query IR by hand must supply the operator code. IR.Aggregate takes groupingCompiler as its third argument. IR.IncludesSubquery takes includesRuntime as its fifth argument, before parentFilters. Import both from @tanstack/db. IR without them throws GroupingOperatorRequiredError or IncludeOperatorRequiredError when it compiles, unless another aggregate or groupKeys() in the query supplies the grouping compiler. Queries that the query builder builds need no change.
    • Operator code is part of query identity. A hook that re-renders a grouped query without groupKeys() now throws GroupingOperatorRequiredError. Before, React and Preact kept the grouped query.
    • Vue: when a changed query fails to compile, useLiveQuery no longer shows the rows of the previous query.
  • Updated dependencies [5649a07, 7538afd, 6c1ca8f, 30175be, 37b8fc2, 1640de8]:

@tanstack/[email protected]

Minor Changes

  • Breaking (1.0): a live query whose IR has no stable identity, such as one using fn.where, fn.select, or fn.having, now throws UnhashableQueryIRError unless it supplies a nonempty queryKey. It previously warned in development and kept its first compilation. An empty queryKey now counts as none, as it already did for a DbClient preload, so a hook and a preload agree on the query's identity. A dependency array does not replace queryKey: in that mode the hook checks identity and claims source Collection IDs each time it binds a live query, including one that useLiveSuspenseQuery takes from its cache. A reused source Collection ID now throws SourceCollectionIdReuseError. (#2235)

    A rejected render now releases every sync start it deferred for a DbClient descriptor, so a later hook or startSyncImmediate() can start that source. A render that never commits, because a sibling threw or it suspended, releases them when its live query is reclaimed.

Patch Changes

  • Breaking: grouping, includes, and pooling are now opt-in. An app bundles an operator's code only when it imports the value for that operator. Joins do not change. A typical app is about 8 kB smaller after gzip. This app has a query collection, a filtered live query, and React useLiveQuery. (#2232)

    • An include needs include(), toArray(), or materialize(). Change issues: q.from(...) in select() to issues: include(q.from(...)). A subquery in select() without one of these throws IncludeOperatorRequiredError.
    • Aggregates such as count() need no change. A groupBy with no aggregate takes groupKeys(): .groupBy(groupKeys(({ todo }) => todo.status)). Without it, the query throws GroupingOperatorRequiredError.
    • Hooks do not pool live queries by default. To share one partition among many equality-filtered queries, pass pool: pooledLiveQueries in the hook's query config: useLiveQuery({ query, pool: pooledLiveQueries }). Results do not change. Angular's { params, query } form takes pool the same way. Any other pool value, such as the old boolean, throws InvalidPoolOptionError, also for a disabled query. For adapter authors: the pool option of resolveLiveQueryValue is now pooledLiveQueries or false, not a boolean. An adapter that reads pool from its own options checks it with configPool first.
    • Code that builds query IR by hand must supply the operator code. IR.Aggregate takes groupingCompiler as its third argument. IR.IncludesSubquery takes includesRuntime as its fifth argument, before parentFilters. Import both from @tanstack/db. IR without them throws GroupingOperatorRequiredError or IncludeOperatorRequiredError when it compiles, unless another aggregate or groupKeys() in the query supplies the grouping compiler. Queries that the query builder builds need no change.
    • Operator code is part of query identity. A hook that re-renders a grouped query without groupKeys() now throws GroupingOperatorRequiredError. Before, React and Preact kept the grouped query.
    • Vue: when a changed query fails to compile, useLiveQuery no longer shows the rows of the previous query.
  • Production builds no longer include the development warnings of useLiveQuery. A typical app's bundle is about 1.6 kB smaller before compression and 0.66 kB smaller after gzip. (#2227)

  • Start the required Collection sync run when an ordinary subscriber follows an abandoned suspended render. Deferred acquisition still starts no idle source sync run or acquisition attempt. (#2229)

    Ordinary subscription admission and deferred acquisition resumption throw during cleanup, including automatic GC. Effects created then return disposed handles. Failed setup releases partial ownership, and throwing callbacks cannot prevent healthy observers receiving cleanup status. Subscribers surviving cleanup retain demand for an explicit restart.

    SSR captures each reader's rows and Collection status. Hydration preserves that view through browser preloads, runtime errors, sibling commits, and delayed streamed records. Missing records reject when transport ends. Known pending results survive normal record-stream close. A new stream after client cleanup starts independently of prior failures.

    Empty loading SSR needs no preload. Rendering rows or readiness requires matching query preparation or explicit source Collection preparation. Streaming Suspense prepares its result. Unsupported preparation throws with guidance. Prepared non-streaming Suspense remains supported. The DbClient query hash includes an infinite query's initial limit and offset.

    Apps without DbClient exclude its SSR implementation. Its API stays unchanged.

    Svelte roots initialized with hydrate() must set hydrating on DbProvider. Nested providers inherit it. Each provider clears initial hydration after mount so new children read live rows.

  • Updated dependencies [5649a07, 7538afd, 6c1ca8f, 30175be, 37b8fc2, 1640de8]:

@tanstack/[email protected]

Minor Changes

  • Breaking (1.0): a useLiveQuery backed by a DbClient matches queries by identity hash, so it now throws UnhashableQueryIRError for a query without a stable IR identity unless it supplies a nonempty queryKey. It previously compiled the query without a hydration key. While such a hook is mounted, a different source Collection under a Collection ID it already read throws SourceCollectionIdReuseError, and every result property then throws instead of returning the previous query's state. Queries without a DbClient are unchanged. (#2235)

    A rejected client-backed query now releases every sync start it deferred, so startSyncImmediate() or another hook can still start that source. A setup that throws after the hook returns releases them when its live query is reclaimed. useLiveInfiniteQuery now uses the shared window binding from @tanstack/db.

Patch Changes

  • Breaking: grouping, includes, and pooling are now opt-in. An app bundles an operator's code only when it imports the value for that operator. Joins do not change. A typical app is about 8 kB smaller after gzip. This app has a query collection, a filtered live query, and React useLiveQuery. (#2232)

    • An include needs include(), toArray(), or materialize(). Change issues: q.from(...) in select() to issues: include(q.from(...)). A subquery in select() without one of these throws IncludeOperatorRequiredError.
    • Aggregates such as count() need no change. A groupBy with no aggregate takes groupKeys(): .groupBy(groupKeys(({ todo }) => todo.status)). Without it, the query throws GroupingOperatorRequiredError.
    • Hooks do not pool live queries by default. To share one partition among many equality-filtered queries, pass pool: pooledLiveQueries in the hook's query config: useLiveQuery({ query, pool: pooledLiveQueries }). Results do not change. Angular's { params, query } form takes pool the same way. Any other pool value, such as the old boolean, throws InvalidPoolOptionError, also for a disabled query. For adapter authors: the pool option of resolveLiveQueryValue is now pooledLiveQueries or false, not a boolean. An adapter that reads pool from its own options checks it with configPool first.
    • Code that builds query IR by hand must supply the operator code. IR.Aggregate takes groupingCompiler as its third argument. IR.IncludesSubquery takes includesRuntime as its fifth argument, before parentFilters. Import both from @tanstack/db. IR without them throws GroupingOperatorRequiredError or IncludeOperatorRequiredError when it compiles, unless another aggregate or groupKeys() in the query supplies the grouping compiler. Queries that the query builder builds need no change.
    • Operator code is part of query identity. A hook that re-renders a grouped query without groupKeys() now throws GroupingOperatorRequiredError. Before, React and Preact kept the grouped query.
    • Vue: when a changed query fails to compile, useLiveQuery no longer shows the rows of the previous query.
  • Start the required Collection sync run when an ordinary subscriber follows an abandoned suspended render. Deferred acquisition still starts no idle source sync run or acquisition attempt. (#2229)

    Ordinary subscription admission and deferred acquisition resumption throw during cleanup, including automatic GC. Effects created then return disposed handles. Failed setup releases partial ownership, and throwing callbacks cannot prevent healthy observers receiving cleanup status. Subscribers surviving cleanup retain demand for an explicit restart.

    SSR captures each reader's rows and Collection status. Hydration preserves that view through browser preloads, runtime errors, sibling commits, and delayed streamed records. Missing records reject when transport ends. Known pending results survive normal record-stream close. A new stream after client cleanup starts independently of prior failures.

    Empty loading SSR needs no preload. Rendering rows or readiness requires matching query preparation or explicit source Collection preparation. Streaming Suspense prepares its result. Unsupported preparation throws with guidance. Prepared non-streaming Suspense remains supported. The DbClient query hash includes an infinite query's initial limit and offset.

    Apps without DbClient exclude its SSR implementation. Its API stays unchanged.

    Svelte roots initialized with hydrate() must set hydrating on DbProvider. Nested providers inherit it. Each provider clears initial hydration after mount so new children read live rows.

  • Updated dependencies [5649a07, 7538afd, 6c1ca8f, 30175be, 37b8fc2, 1640de8]:

@tanstack/[email protected]

Patch Changes

  • Breaking: grouping, includes, and pooling are now opt-in. An app bundles an operator's code only when it imports the value for that operator. Joins do not change. A typical app is about 8 kB smaller after gzip. This app has a query collection, a filtered live query, and React useLiveQuery. (#2232)

    • An include needs include(), toArray(), or materialize(). Change issues: q.from(...) in select() to issues: include(q.from(...)). A subquery in select() without one of these throws IncludeOperatorRequiredError.
    • Aggregates such as count() need no change. A groupBy with no aggregate takes groupKeys(): .groupBy(groupKeys(({ todo }) => todo.status)). Without it, the query throws GroupingOperatorRequiredError.
    • Hooks do not pool live queries by default. To share one partition among many equality-filtered queries, pass pool: pooledLiveQueries in the hook's query config: useLiveQuery({ query, pool: pooledLiveQueries }). Results do not change. Angular's { params, query } form takes pool the same way. Any other pool value, such as the old boolean, throws InvalidPoolOptionError, also for a disabled query. For adapter authors: the pool option of resolveLiveQueryValue is now pooledLiveQueries or false, not a boolean. An adapter that reads pool from its own options checks it with configPool first.
    • Code that builds query IR by hand must supply the operator code. IR.Aggregate takes groupingCompiler as its third argument. IR.IncludesSubquery takes includesRuntime as its fifth argument, before parentFilters. Import both from @tanstack/db. IR without them throws GroupingOperatorRequiredError or IncludeOperatorRequiredError when it compiles, unless another aggregate or groupKeys() in the query supplies the grouping compiler. Queries that the query builder builds need no change.
    • Operator code is part of query identity. A hook that re-renders a grouped query without groupKeys() now throws GroupingOperatorRequiredError. Before, React and Preact kept the grouped query.
    • Vue: when a changed query fails to compile, useLiveQuery no longer shows the rows of the previous query.
  • Updated dependencies [5649a07, 7538afd, 6c1ca8f, 30175be, 37b8fc2, 1640de8]:

@tanstack/[email protected]

Patch Changes

  • Add SQLiteConnectionClosedError. A browser OPFS connection now rejects requests made after close starts with this error instead of InvalidPersistedCollectionConfigError. (#2213)

  • Reject pending OPFS requests when closing the SQLite connection, including when the worker reports a close error. Close now stops accepting requests when it starts, and concurrent close() calls share one outcome. The OPFS worker handles one request at a time, so close waits for earlier queries instead of failing while one waits for the OPFS access handle. (#2213)

  • Updated dependencies [45c3329, 205ab71, 37b8fc2, 205ab71, b052e91]:

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

  • Release the shape stream's visibility listener when a sync run is cleaned up. The Electric client registers a visibilitychange listener for each ShapeStream (an AppState subscription on React Native, from @electric-sql/client 1.5.23) and removes it only in unsubscribeAll(), so aborting the stream left the listener behind, and the listener kept the stream reachable. An app that cleans up and recreates collections, or whose on-demand cache rotates its provider session, gained one retained stream each time. (#2257)

  • Updated dependencies [5649a07, 7538afd, 6c1ca8f, 30175be, 37b8fc2, 1640de8]:

@tanstack/[email protected]

Patch Changes

  • Reloaded persisted collections now read their rows before they write a leader election term. A collection still takes its leader lock when it subscribes, but it reserves its durable term only after the database work already queued on the shared scheduler has settled, or as soon as something needs a leader during that election: a local write, a follower request, a sync commit during startup, or ensureLeadership. A need that an earlier leader already served does not let a later takeover skip the wait. A tab that takes over treats the departed leader's route as gone, so a sync commit queued behind one of its reads goes to the new leader and settles without waiting out an RPC timeout. The Electron renderer applies the same rule to its own hydrations. The renderer now has a hydration scope, so its startup runs as one hydration, as a Browser tab's does, and a restart keeps its metadata and row reads in one scope, so a term cannot run between them. (#2219)

    ensureLeadership now resolves when this node becomes leader, keeps its place in the Web Locks queue instead of replacing its lock request, and rejects if the coordinator is disposed.

    Migration for custom persistence adapters: runInRegularScope is now a RegularScope, which must also provide afterQueuedWork(). It resolves once every operation queued or running on the adapter's scheduler at the call has settled. An adapter without a scheduler can return a promise that settles with its running hydrations. A coordinator now rejects an adapter whose runInRegularScope lacks afterQueuedWork with InvalidPersistenceAdapterError.

  • Updated dependencies [45c3329, 205ab71, 37b8fc2, 205ab71, b052e91]:

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

  • Start the required Collection sync run when an ordinary subscriber follows an abandoned suspended render. Deferred acquisition still starts no idle source sync run or acquisition attempt. (#2229)

    Ordinary subscription admission and deferred acquisition resumption throw during cleanup, including automatic GC. Effects created then return disposed handles. Failed setup releases partial ownership, and throwing callbacks cannot prevent healthy observers receiving cleanup status. Subscribers surviving cleanup retain demand for an explicit restart.

    SSR captures each reader's rows and Collection status. Hydration preserves that view through browser preloads, runtime errors, sibling commits, and delayed streamed records. Missing records reject when transport ends. Known pending results survive normal record-stream close. A new stream after client cleanup starts independently of prior failures.

    Empty loading SSR needs no preload. Rendering rows or readiness requires matching query preparation or explicit source Collection preparation. Streaming Suspense prepares its result. Unsupported preparation throws with guidance. Prepared non-streaming Suspense remains supported. The DbClient query hash includes an infinite query's initial limit and offset.

    Apps without DbClient exclude its SSR implementation. Its API stays unchanged.

    Svelte roots initialized with hydrate() must set hydrating on DbProvider. Nested providers inherit it. Each provider clears initial hydration after mount so new children read live rows.

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

  • Breaking: grouping, includes, and pooling are now opt-in. An app bundles an operator's code only when it imports the value for that operator. Joins do not change. A typical app is about 8 kB smaller after gzip. This app has a query collection, a filtered live query, and React useLiveQuery. (#2232)

    • An include needs include(), toArray(), or materialize(). Change issues: q.from(...) in select() to issues: include(q.from(...)). A subquery in select() without one of these throws IncludeOperatorRequiredError.
    • Aggregates such as count() need no change. A groupBy with no aggregate takes groupKeys(): .groupBy(groupKeys(({ todo }) => todo.status)). Without it, the query throws GroupingOperatorRequiredError.
    • Hooks do not pool live queries by default. To share one partition among many equality-filtered queries, pass pool: pooledLiveQueries in the hook's query config: useLiveQuery({ query, pool: pooledLiveQueries }). Results do not change. Angular's { params, query } form takes pool the same way. Any other pool value, such as the old boolean, throws InvalidPoolOptionError, also for a disabled query. For adapter authors: the pool option of resolveLiveQueryValue is now pooledLiveQueries or false, not a boolean. An adapter that reads pool from its own options checks it with configPool first.
    • Code that builds query IR by hand must supply the operator code. IR.Aggregate takes groupingCompiler as its third argument. IR.IncludesSubquery takes includesRuntime as its fifth argument, before parentFilters. Import both from @tanstack/db. IR without them throws GroupingOperatorRequiredError or IncludeOperatorRequiredError when it compiles, unless another aggregate or groupKeys() in the query supplies the grouping compiler. Queries that the query builder builds need no change.
    • Operator code is part of query identity. A hook that re-renders a grouped query without groupKeys() now throws GroupingOperatorRequiredError. Before, React and Preact kept the grouped query.
    • Vue: when a changed query fails to compile, useLiveQuery no longer shows the rows of the previous query.
  • Updated dependencies [5649a07, 7538afd, 6c1ca8f, 30175be, 37b8fc2, 1640de8]:

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

  • Breaking: grouping, includes, and pooling are now opt-in. An app bundles an operator's code only when it imports the value for that operator. Joins do not change. A typical app is about 8 kB smaller after gzip. This app has a query collection, a filtered live query, and React useLiveQuery. (#2232)

    • An include needs include(), toArray(), or materialize(). Change issues: q.from(...) in select() to issues: include(q.from(...)). A subquery in select() without one of these throws IncludeOperatorRequiredError.
    • Aggregates such as count() need no change. A groupBy with no aggregate takes groupKeys(): .groupBy(groupKeys(({ todo }) => todo.status)). Without it, the query throws GroupingOperatorRequiredError.
    • Hooks do not pool live queries by default. To share one partition among many equality-filtered queries, pass pool: pooledLiveQueries in the hook's query config: useLiveQuery({ query, pool: pooledLiveQueries }). Results do not change. Angular's { params, query } form takes pool the same way. Any other pool value, such as the old boolean, throws InvalidPoolOptionError, also for a disabled query. For adapter authors: the pool option of resolveLiveQueryValue is now pooledLiveQueries or false, not a boolean. An adapter that reads pool from its own options checks it with configPool first.
    • Code that builds query IR by hand must supply the operator code. IR.Aggregate takes groupingCompiler as its third argument. IR.IncludesSubquery takes includesRuntime as its fifth argument, before parentFilters. Import both from @tanstack/db. IR without them throws GroupingOperatorRequiredError or IncludeOperatorRequiredError when it compiles, unless another aggregate or groupKeys() in the query supplies the grouping compiler. Queries that the query builder builds need no change.
    • Operator code is part of query identity. A hook that re-renders a grouped query without groupKeys() now throws GroupingOperatorRequiredError. Before, React and Preact kept the grouped query.
    • Vue: when a changed query fails to compile, useLiveQuery no longer shows the rows of the previous query.
  • useLiveInfiniteQuery now uses the shared window binding from @tanstack/db. A window collection it creates starts syncing when the query compiles, as in the other adapters, and an update that changes nothing keeps the current controller. (#2235)

  • Updated dependencies [5649a07, 7538afd, 6c1ca8f, 30175be, 37b8fc2, 1640de8]:

[email protected]

Patch Changes

[email protected]

Patch Changes

[email protected]

Patch Changes

[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@tanstack/[email protected]

Patch Changes

@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 2c1851e4-e2d9-436b-847f-145827b847f4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch 12 times, most recently from 8d2d222 to 793f41a Compare October 26, 2026 23:12
@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 793f41a to 59d37ec Compare October 27, 2026 00:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants