Skip to content

fix(svelte-db): disabled useLiveQuery no longer crashes#1637

Merged
kevin-dp merged 1 commit into
mainfrom
fix/svelte-disabled-query
Jul 9, 2026
Merged

fix(svelte-db): disabled useLiveQuery no longer crashes#1637
kevin-dp merged 1 commit into
mainfrom
fix/svelte-disabled-query

Conversation

@kevin-dp

@kevin-dp kevin-dp commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Follow-up #1 of 3 to the conformance suite (#1636), fixing a knownGap that suite surfaced.

Base: stacked on test/live-query-conformance-suite (#1636) — it depends on the conformance drivers to clear the gap. Re-target to main once #1636 lands.

The bug

A disabled useLiveQuery — the query callback returning null/undefined, which every other adapter treats as "disabled" — crashed in svelte-db:

TypeError: Cannot read properties of undefined (reading '_getQuery')
  ❯ getQueryIR .../query/builder/index.ts
  ❯ createLiveQueryCollection .../query/live-query-collection.ts

Root cause

svelte-db added toValue() unwrapping to support the reactive () => collection input form. But toValue calls any function, so it also calls the query callback. When that callback returns null/undefined (disabled), the unwrapped value became null, which fell through to createLiveQueryCollection({ ...null, startSync: true }) → crash in getQueryIR. The existing disabled short-circuit sat behind a typeof === 'function' check that null never reaches.

It went unnoticed because svelte-db had no disabled-query tests — exactly the gap the conformance suite flagged.

Fix

Treat a null/undefined unwrapped value as a disabled query (return the disabled state), matching React/Vue/Solid/Angular. One guard in the non-function branch.

Verification

Clears the disabled-explicit and disabled-transition knownGaps in the svelte-db conformance driver — both now pass as normal tests. Full svelte-db suite green (54), svelte-check clean. Patch changeset included.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes

    • Fixed useLiveQuery so queries that resolve to null or undefined are treated as disabled instead of causing runtime errors.
    • Improved consistency with other adapters by returning a disabled state in these cases.
  • Tests

    • Updated conformance coverage to reflect that disabled-query scenarios now pass.

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: afb065d9-2c90-400d-9c45-e2e8649c180c

📥 Commits

Reviewing files that changed from the base of the PR and between 3ec3e7a and 36ef0b0.

📒 Files selected for processing (3)
  • .changeset/svelte-disabled-query-fix.md
  • packages/svelte-db/src/useLiveQuery.svelte.ts
  • packages/svelte-db/tests/conformance.svelte.test.ts

📝 Walkthrough

Walkthrough

Adds a guard in Svelte's useLiveQuery to return null when the resolved query parameter is null/undefined, treating it as a disabled query instead of passing it to createLiveQueryCollection. Updates conformance test knownGaps to remove now-passing disabled-query cases, and adds a changeset.

Changes

Disabled Query Handling Fix

Layer / File(s) Summary
Guard against null/undefined query params
packages/svelte-db/src/useLiveQuery.svelte.ts
Returns null early in the reactive collection computation when the unwrapped parameter is undefined/null, avoiding passing invalid values to createLiveQueryCollection.
Conformance test update and changeset
packages/svelte-db/tests/conformance.svelte.test.ts, .changeset/svelte-disabled-query-fix.md
Removes disabled-explicit/disabled-transition from knownGaps in the Svelte driver test config and adds a changeset documenting the patch fix.

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

Possibly related PRs

  • TanStack/db#1641: Both PRs modify the Svelte useLiveQuery.svelte.ts hook's argument handling logic.

Suggested reviewers: samwillis

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/svelte-disabled-query

Warning

Tools execution failed with the following error:

Failed to run tools: 13 INTERNAL: Received RST_STREAM with code 2 (Internal server error)


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 2, 2026

Copy link
Copy Markdown
More templates

@tanstack/angular-db

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

@tanstack/browser-db-sqlite-persistence

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

@tanstack/capacitor-db-sqlite-persistence

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

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

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/db-sqlite-persistence-core

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

@tanstack/electric-db-collection

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

@tanstack/electron-db-sqlite-persistence

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

@tanstack/expo-db-sqlite-persistence

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

@tanstack/node-db-sqlite-persistence

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

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

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/tauri-db-sqlite-persistence

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 36ef0b0

@github-actions

github-actions Bot commented Jul 2, 2026

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.4 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.1 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/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

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 4.26 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.37 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

A disabled query (callback returning null/undefined) crashed: the reactive-getter
unwrapping (`toValue`) called the callback, and the resulting null was spread into
createLiveQueryCollection → throw in getQueryIR. Now a null/undefined unwrapped
value is treated as a disabled query, matching React/Vue/Solid/Angular.

Clears the svelte-db conformance knownGaps (disabled-explicit, disabled-transition);
both now pass as normal tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@kevin-dp kevin-dp force-pushed the fix/svelte-disabled-query branch from f0afcae to 36ef0b0 Compare July 7, 2026 10:24
@kevin-dp kevin-dp marked this pull request as ready for review July 9, 2026 07:32
@kevin-dp kevin-dp merged commit b2f305a into main Jul 9, 2026
10 of 11 checks passed
@kevin-dp kevin-dp deleted the fix/svelte-disabled-query branch July 9, 2026 07:33
@github-actions github-actions Bot mentioned this pull request Jul 9, 2026
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