Skip to content

docs(query-db-collection): document scoped collection factories#1671

Open
KyleAMathews wants to merge 3 commits into
mainfrom
docs-query-scoped-collection-factories
Open

docs(query-db-collection): document scoped collection factories#1671
KyleAMathews wants to merge 3 commits into
mainfrom
docs-query-scoped-collection-factories

Conversation

@KyleAMathews

@KyleAMathews KyleAMathews commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

Summary

Document how to create Query Collections for tenant, project, account, and route-level business scopes. The new guidance helps users preserve collection identity and lifecycle correctly without confusing business scope with relational subset loading.

Approach

  • Add a typed project-scoped factory that accepts both a runtime QueryClient and a scope parameter.
  • Include the scope in the flat top-level queryKey and queryFn.
  • Show stable memoization keyed by both QueryClient and scope.
  • Explain eviction and collection.cleanup() for unbounded, long-lived scope caches.
  • Keep relational predicates, ordering, limits, and offsets in LoadSubsetOptions rather than creating collections per subset.
  • Link back to the existing runtime QueryClient and predicate push-down guidance instead of duplicating it.

Key invariants

  • A collection is reused for the same QueryClient and business scope.
  • Distinct server resources use distinct business-scoped collections.
  • Relational subsets do not become collection identity and do not cause collection recreation.
  • Examples use the current flat queryCollectionOptions API.

Non-goals

  • No runtime or type changes.
  • No .bind(...) API or nested query configuration.
  • No recommendation to recreate collections per render or relational subset.

Trade-offs

The example uses explicit WeakMap<QueryClient, Map<scope, Collection>> memoization. This is more verbose than an implicit binding API, but keeps dependencies and lifecycle ownership visible while requiring no new runtime abstraction.

Verification

pnpm prettier docs/collections/query-collection.md --check
pnpm exec tsx scripts/verify-links.ts
git diff origin/main --check

All commands pass. The repository's pnpm test:docs wrapper cannot directly execute scripts/verify-links.ts under the current Node environment, so the same verifier was run through the installed tsx runner.

Files changed

  • docs/collections/query-collection.md — adds business-scoped factory, memoization, lifecycle, and relational-subset guidance.
  • .changeset/document-scoped-query-factories.md — records the documentation update for @tanstack/query-db-collection.

Summary by CodeRabbit

  • Documentation
    • Added guidance for creating business-scoped query collections.
    • Clarified how scope identifiers should affect collection queries.
    • Added memoization and lifecycle recommendations for reusing scoped collections.
    • Explained the difference between business-scoped collections and relational subsets.
    • Updated examples to discourage creating separate collections for every filter, sort, or limit.

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8520b9cc-64dc-4659-b033-03940d9aa1a5

📥 Commits

Reviewing files that changed from the base of the PR and between 09d7d67 and 3623b31.

📒 Files selected for processing (2)
  • .changeset/document-scoped-query-factories.md
  • docs/collections/query-collection.md

📝 Walkthrough

Walkthrough

The PR documents business-scoped Query Collection factories, including scope-aware query keys and functions, stable memoization by QueryClient and scope, lifecycle cleanup, and separation from relational subset loading. A patch Changeset records the updated guidance.

Changes

Business-scoped collections

Layer / File(s) Summary
Scoped factory contract
.changeset/document-scoped-query-factories.md, docs/collections/query-collection.md
Documents createProjectTodosCollection, including projectId in both the query key and query function, and records a patch release.
Scoped reuse and subset handling
docs/collections/query-collection.md
Adds nested WeakMap memoization, cleanup guidance for multiple scopes, relational subset-loading clarification, and reuse guidance for where, orderBy, and limit queries.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Suggested reviewers: kevin-dp, samwillis, haznai, lucasweng, 0xlakshan

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: documenting scoped collection factories for query-db-collection.
Description check ✅ Passed The description clearly explains the docs change, rationale, scope, verification, and files touched, so it is mostly complete.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs-query-scoped-collection-factories

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.

@pkg-pr-new

pkg-pr-new Bot commented Jul 13, 2026

Copy link
Copy Markdown
More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@1671

@tanstack/browser-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/browser-db-sqlite-persistence@1671

@tanstack/capacitor-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/capacitor-db-sqlite-persistence@1671

@tanstack/cloudflare-durable-objects-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/cloudflare-durable-objects-db-sqlite-persistence@1671

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@1671

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@1671

@tanstack/db-sqlite-persistence-core

npm i https://pkg.pr.new/@tanstack/db-sqlite-persistence-core@1671

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@1671

@tanstack/electron-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/electron-db-sqlite-persistence@1671

@tanstack/expo-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/expo-db-sqlite-persistence@1671

@tanstack/node-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/node-db-sqlite-persistence@1671

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@1671

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@1671

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@1671

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@1671

@tanstack/react-native-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/react-native-db-sqlite-persistence@1671

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@1671

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@1671

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@1671

@tanstack/tauri-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/tauri-db-sqlite-persistence@1671

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@1671

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@1671

commit: 3623b31

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 125 kB

ℹ️ View Unchanged
Filename Size
packages/db/dist/esm/collection/change-events.js 1.43 kB
packages/db/dist/esm/collection/changes.js 1.38 kB
packages/db/dist/esm/collection/cleanup-queue.js 810 B
packages/db/dist/esm/collection/events.js 434 B
packages/db/dist/esm/collection/index.js 3.62 kB
packages/db/dist/esm/collection/indexes.js 1.99 kB
packages/db/dist/esm/collection/lifecycle.js 1.69 kB
packages/db/dist/esm/collection/mutations.js 2.47 kB
packages/db/dist/esm/collection/state.js 5.48 kB
packages/db/dist/esm/collection/subscription.js 3.74 kB
packages/db/dist/esm/collection/sync.js 2.88 kB
packages/db/dist/esm/collection/transaction-metadata.js 144 B
packages/db/dist/esm/deferred.js 207 B
packages/db/dist/esm/errors.js 5.1 kB
packages/db/dist/esm/event-emitter.js 748 B
packages/db/dist/esm/index.js 3.16 kB
packages/db/dist/esm/indexes/auto-index.js 829 B
packages/db/dist/esm/indexes/base-index.js 767 B
packages/db/dist/esm/indexes/basic-index.js 2.06 kB
packages/db/dist/esm/indexes/btree-index.js 2.19 kB
packages/db/dist/esm/indexes/index-registry.js 820 B
packages/db/dist/esm/indexes/reverse-index.js 557 B
packages/db/dist/esm/live-query-adapter.js 318 B
packages/db/dist/esm/local-only.js 916 B
packages/db/dist/esm/local-storage.js 2.12 kB
packages/db/dist/esm/optimistic-action.js 359 B
packages/db/dist/esm/paced-mutations.js 496 B
packages/db/dist/esm/proxy.js 3.75 kB
packages/db/dist/esm/query/builder/functions.js 1.47 kB
packages/db/dist/esm/query/builder/index.js 5.84 kB
packages/db/dist/esm/query/builder/ref-proxy.js 1.24 kB
packages/db/dist/esm/query/compiler/evaluators.js 1.89 kB
packages/db/dist/esm/query/compiler/expressions.js 430 B
packages/db/dist/esm/query/compiler/group-by.js 3.56 kB
packages/db/dist/esm/query/compiler/index.js 6.67 kB
packages/db/dist/esm/query/compiler/joins.js 2.5 kB
packages/db/dist/esm/query/compiler/lazy-targets.js 923 B
packages/db/dist/esm/query/compiler/order-by.js 1.74 kB
packages/db/dist/esm/query/compiler/select.js 1.53 kB
packages/db/dist/esm/query/effect.js 4.77 kB
packages/db/dist/esm/query/expression-helpers.js 1.43 kB
packages/db/dist/esm/query/ir.js 1.25 kB
packages/db/dist/esm/query/live-query-collection.js 360 B
packages/db/dist/esm/query/live/collection-config-builder.js 9.1 kB
packages/db/dist/esm/query/live/collection-registry.js 264 B
packages/db/dist/esm/query/live/collection-subscriber.js 1.93 kB
packages/db/dist/esm/query/live/internal.js 145 B
packages/db/dist/esm/query/live/utils.js 1.81 kB
packages/db/dist/esm/query/optimizer.js 2.92 kB
packages/db/dist/esm/query/predicate-utils.js 2.97 kB
packages/db/dist/esm/query/query-once.js 359 B
packages/db/dist/esm/query/subset-dedupe.js 960 B
packages/db/dist/esm/scheduler.js 1.3 kB
packages/db/dist/esm/SortedMap.js 1.3 kB
packages/db/dist/esm/strategies/debounceStrategy.js 247 B
packages/db/dist/esm/strategies/queueStrategy.js 428 B
packages/db/dist/esm/strategies/throttleStrategy.js 246 B
packages/db/dist/esm/transactions.js 3.04 kB
packages/db/dist/esm/utils.js 927 B
packages/db/dist/esm/utils/array-utils.js 273 B
packages/db/dist/esm/utils/browser-polyfills.js 304 B
packages/db/dist/esm/utils/btree.js 5.61 kB
packages/db/dist/esm/utils/comparison.js 1.11 kB
packages/db/dist/esm/utils/cursor.js 457 B
packages/db/dist/esm/utils/index-optimization.js 2.39 kB
packages/db/dist/esm/utils/type-guards.js 157 B
packages/db/dist/esm/utils/uuid.js 449 B
packages/db/dist/esm/virtual-props.js 360 B

compressed-size-action::db-package-size

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 4.22 kB

ℹ️ View Unchanged
Filename Size
packages/react-db/dist/esm/index.js 249 B
packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.32 kB
packages/react-db/dist/esm/useLiveQuery.js 1.33 kB
packages/react-db/dist/esm/useLiveQueryEffect.js 355 B
packages/react-db/dist/esm/useLiveSuspenseQuery.js 567 B
packages/react-db/dist/esm/usePacedMutations.js 401 B

compressed-size-action::react-db-package-size

@@ -0,0 +1,5 @@
---
'@tanstack/query-db-collection': patch

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need for a changeset on a docs only PR

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.

2 participants