Skip to content

[fix] findOne returns array instead of single object in angular-db (issue #1261) - #1273

Merged
kevin-dp merged 6 commits into
mainfrom
ai/issue-1261-fix
Feb 24, 2026
Merged

[fix] findOne returns array instead of single object in angular-db (issue #1261)#1273
kevin-dp merged 6 commits into
mainfrom
ai/issue-1261-fix

Conversation

@claude

@claudeclaudeBot commented Feb 19, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Fixes injectLiveQuery in @tanstack/angular-db to return a single object (or undefined) when used with findOne(), instead of always returning an array
  • Adds proper type overloads so TypeScript correctly infers Signal<T | undefined> for findOne() queries

Fixes#1261
Repro PR: #1272

Root cause

The angular-db adapter was missing the singleResult handling that was already implemented in react-db and vue-db. Specifically:

  1. Runtime: syncDataFromCollection always converted collection values to an array via Array.from(currentCollection.values()) and set it directly on the data signal. It never checked collection.config.singleResult to decide whether to return a single item or the full array.

  2. Types: InjectLiveQueryResult.data was always typed as Signal<Array<TResult>>, with no way to express Signal<TResult | undefined> for findOne() queries.

Fix

  • Added a computed signal for data that checks collection.config.singleResult and returns either the first element or the full array (matching the pattern in vue-db and react-db)
  • Updated InjectLiveQueryResult to use InferResultType<TContext> for the data signal type, which correctly resolves to T | undefined for SingleResult contexts and Array<T> otherwise
  • Added InjectLiveQueryResultWithCollection and InjectLiveQueryResultWithSingleResultCollection interfaces for pre-created collection overloads

How to test

pnpm --filter @tanstack/angular-db test -- --run

All 21 tests pass, including the new findOne test.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Feb 19, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 60c11dd

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@tanstack/angular-dbPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@claudeclaudeBot mentioned this pull request Feb 19, 2026
1 task
@pkg-pr-new

pkg-pr-newBot commented Feb 19, 2026

Copy link
Copy Markdown
More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 60c11dd

@github-actions

github-actionsBot commented Feb 19, 2026

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 92.1 kB

ℹ️ View Unchanged
FilenameSize
./packages/db/dist/esm/collection/change-events.js1.39 kB
./packages/db/dist/esm/collection/changes.js1.22 kB
./packages/db/dist/esm/collection/events.js388 B
./packages/db/dist/esm/collection/index.js3.32 kB
./packages/db/dist/esm/collection/indexes.js1.1 kB
./packages/db/dist/esm/collection/lifecycle.js1.75 kB
./packages/db/dist/esm/collection/mutations.js2.34 kB
./packages/db/dist/esm/collection/state.js3.49 kB
./packages/db/dist/esm/collection/subscription.js3.71 kB
./packages/db/dist/esm/collection/sync.js2.41 kB
./packages/db/dist/esm/deferred.js207 B
./packages/db/dist/esm/errors.js4.7 kB
./packages/db/dist/esm/event-emitter.js748 B
./packages/db/dist/esm/index.js2.69 kB
./packages/db/dist/esm/indexes/auto-index.js742 B
./packages/db/dist/esm/indexes/base-index.js766 B
./packages/db/dist/esm/indexes/btree-index.js2.17 kB
./packages/db/dist/esm/indexes/lazy-index.js1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js538 B
./packages/db/dist/esm/local-only.js808 B
./packages/db/dist/esm/local-storage.js2.1 kB
./packages/db/dist/esm/optimistic-action.js359 B
./packages/db/dist/esm/paced-mutations.js496 B
./packages/db/dist/esm/proxy.js3.75 kB
./packages/db/dist/esm/query/builder/functions.js733 B
./packages/db/dist/esm/query/builder/index.js4.09 kB
./packages/db/dist/esm/query/builder/ref-proxy.js1.05 kB
./packages/db/dist/esm/query/compiler/evaluators.js1.43 kB
./packages/db/dist/esm/query/compiler/expressions.js430 B
./packages/db/dist/esm/query/compiler/group-by.js1.81 kB
./packages/db/dist/esm/query/compiler/index.js2.02 kB
./packages/db/dist/esm/query/compiler/joins.js2.11 kB
./packages/db/dist/esm/query/compiler/order-by.js1.45 kB
./packages/db/dist/esm/query/compiler/select.js1.06 kB
./packages/db/dist/esm/query/expression-helpers.js1.43 kB
./packages/db/dist/esm/query/ir.js673 B
./packages/db/dist/esm/query/live-query-collection.js360 B
./packages/db/dist/esm/query/live/collection-config-builder.js5.44 kB
./packages/db/dist/esm/query/live/collection-registry.js264 B
./packages/db/dist/esm/query/live/collection-subscriber.js2.42 kB
./packages/db/dist/esm/query/live/internal.js145 B
./packages/db/dist/esm/query/optimizer.js2.62 kB
./packages/db/dist/esm/query/predicate-utils.js2.97 kB
./packages/db/dist/esm/query/subset-dedupe.js921 B
./packages/db/dist/esm/scheduler.js1.3 kB
./packages/db/dist/esm/SortedMap.js1.3 kB
./packages/db/dist/esm/strategies/debounceStrategy.js247 B
./packages/db/dist/esm/strategies/queueStrategy.js428 B
./packages/db/dist/esm/strategies/throttleStrategy.js246 B
./packages/db/dist/esm/transactions.js2.9 kB
./packages/db/dist/esm/utils.js924 B
./packages/db/dist/esm/utils/browser-polyfills.js304 B
./packages/db/dist/esm/utils/btree.js5.61 kB
./packages/db/dist/esm/utils/comparison.js952 B
./packages/db/dist/esm/utils/cursor.js457 B
./packages/db/dist/esm/utils/index-optimization.js1.51 kB
./packages/db/dist/esm/utils/type-guards.js157 B

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

@github-actions

github-actionsBot commented Feb 19, 2026

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 3.7 kB

ℹ️ View Unchanged
FilenameSize
./packages/react-db/dist/esm/index.js225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js1.34 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js559 B
./packages/react-db/dist/esm/usePacedMutations.js401 B

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

Adds inject-live-query.test-d.ts with expectTypeOf assertions verifying that
injectLiveQuery with findOne() types data as Signal<Person | undefined>
and regular queries type data as Signal<Array<T>>.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
kevin-dpand others added 3 commits February 19, 2026 15:35
- Add NonSingleResult to createMockCollection return type since mock
collections are never singleResult
- Add non-null assertions for collection() signal access in tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… (issue #1261)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

@samwillissamwillis left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

@kevin-dp
kevin-dp merged commit 72f2a1c into mainFeb 24, 2026
7 checks passed
@kevin-dp
kevin-dp deleted the ai/issue-1261-fix branch February 24, 2026 10:14
@github-actionsgithub-actionsBot mentioned this pull request Feb 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR has been released!

Thank you for your contribution!

kevin-dp added a commit that referenced this pull request Mar 9, 2026
…ssue #1261) (#1273)
* test: assert findOne returns single object in angular-db (issue #1261)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: add type assertions for injectLiveQuery findOne in angular-db
Adds inject-live-query.test-d.ts with expectTypeOf assertions verifying that
injectLiveQuery with findOne() types data as Signal<Person | undefined>
and regular queries type data as Signal<Array<T>>.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: fix type errors in inject-live-query test helpers
- Add NonSingleResult to createMockCollection return type since mock
collections are never singleResult
- Add non-null assertions for collection() signal access in tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: return single object from findOne in angular-db instead of array (issue #1261)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* ci: apply automated fixes
* chore: add changeset for angular-db findOne fix
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Kevin De Porre <kevin@electric-sql.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Sign up for freeto 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.

findOne still returning array in angular-db

2 participants

@samwillis@kevin-dp