Skip to content

test(conformance): parametrize how adapters surface query errors#1639

Merged
kevin-dp merged 1 commit into
mainfrom
fix/conformance-error-surfacing
Jul 9, 2026
Merged

test(conformance): parametrize how adapters surface query errors#1639
kevin-dp merged 1 commit into
mainfrom
fix/conformance-error-surfacing

Conversation

@kevin-dp

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

Copy link
Copy Markdown
Contributor

Follow-up #3 of 3 to the conformance suite (#1636), resolving the Solid error-status knownGap.

Base: stacked on test/live-query-conformance-suite (#1636). Re-target to main once #1636 lands.

Not a bug — a legitimate framework difference

Unlike the Svelte (#1637) and Angular (#1638) follow-ups, this one isn't an adapter fix. The suite flagged that Solid surfaces query errors differently: it routes them through createResource/Suspense, so reading an errored query throws CollectionStateError (for an <ErrorBoundary> to catch) rather than exposing a readable isError/status === 'error' flag like React/Vue/Svelte/Angular.

That's idiomatic Solid, not something to "fix." So instead of forcing Solid into the flag model, the suite is parametrized to assert whichever model an adapter declares.

Confirmed behavior (probe): the errored collection reaches error status, mount does not throw, and reading the result throws Collection is in error state.

Change

  • contract.ts: add driver.errorSurface?: 'flag' | 'throw' (default flag).
  • suite.ts: the error-status scenario now asserts:
    • flagisError === true / status === 'error' (readable), or
    • throw → reading the errored result throws (boundary model).
  • solid-db driver: declares errorSurface: 'throw', clears its error-status knownGap.
  • React / Vue / Svelte / Angular keep the default flag assertions unchanged.

Verification

All five conformance suites pass 24/24. Solid's error-status now passes via the boundary branch; the other four via the flag branch. Test-infra only — no published-package changes, so no changeset.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • Improved how live-query errors are surfaced, so errored results can now either be marked as errors or thrown for error-boundary handling.
    • Updated conformance coverage to verify both error-reporting behaviors, including the throw-based flow used by Solid.

@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: 823b04bb-6f6b-4a79-bb6c-4419e9f39f4d

📥 Commits

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

📒 Files selected for processing (3)
  • packages/db/tests/conformance/contract.ts
  • packages/db/tests/conformance/suite.ts
  • packages/solid-db/tests/conformance.test.tsx

📝 Walkthrough

Walkthrough

Adds an optional errorSurface property to the LiveQueryDriver conformance contract, allowing adapters to declare whether errored query results surface via a readable status flag or by throwing. Updates the error-status scenario to branch accordingly, and configures the Solid driver to use throw-based surfacing.

Changes

Error surface conformance support

Layer / File(s) Summary
Add errorSurface contract and scenario handling
packages/db/tests/conformance/contract.ts, packages/db/tests/conformance/suite.ts
Adds optional errorSurface?: 'flag' | 'throw' to LiveQueryDriver and updates the error-status scenario to expect h.current() to throw when set to 'throw', otherwise assert status === 'error' and isError === true.
Configure Solid driver for throw-based errors
packages/solid-db/tests/conformance.test.tsx
Sets errorSurface: 'throw' on solidDriver, clears knownGaps (removing 'error-status'), and updates the related comment to reference ErrorBoundary-based validation.

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

✨ 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/conformance-error-surfacing

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@1639

@tanstack/browser-db-sqlite-persistence

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

@tanstack/capacitor-db-sqlite-persistence

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

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

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/db-sqlite-persistence-core

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

@tanstack/electric-db-collection

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

@tanstack/electron-db-sqlite-persistence

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

@tanstack/expo-db-sqlite-persistence

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

@tanstack/node-db-sqlite-persistence

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

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

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/tauri-db-sqlite-persistence

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: c984572

@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

@kevin-dp kevin-dp force-pushed the fix/conformance-error-surfacing branch 2 times, most recently from 0ad8472 to 70b5989 Compare July 7, 2026 10:01
Base automatically changed from test/live-query-conformance-suite to main July 7, 2026 10:20
Solid surfaces query errors by throwing (CollectionStateError) on read, for an
<ErrorBoundary> to catch, rather than exposing a readable isError flag like
React/Vue/Svelte/Angular. That's a framework idiom, not a bug — so instead of
forcing Solid into the flag model, parametrize the error-status scenario.

Adds driver.errorSurface ('flag' | 'throw', default 'flag'). The error-status
scenario asserts a readable isError/status for 'flag', and that reading the
errored result throws for 'throw'. Solid declares 'throw' and clears its
error-status knownGap; the other four keep the default flag assertions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@kevin-dp kevin-dp force-pushed the fix/conformance-error-surfacing branch from 70b5989 to c984572 Compare July 7, 2026 10:24
@kevin-dp kevin-dp marked this pull request as ready for review July 9, 2026 07:35
@kevin-dp kevin-dp merged commit f3ade65 into main Jul 9, 2026
10 of 11 checks passed
@kevin-dp kevin-dp deleted the fix/conformance-error-surfacing branch July 9, 2026 07:36
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