Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

@KyleAMathews KyleAMathews commented Nov 20, 2025

Reported here: https://discord.com/channels/719702312431386674/1441107002779631737/1441107002779631737

Previously, the module augmentation for @tanstack/query-core that makes ctx.meta?.loadSubsetOptions type-safe was in query.ts. This meant it wasn't always processed by TypeScript unless something from that file was directly imported.

This commit fixes the issue by:

  1. Moving the module augmentation to a dedicated global.d.ts file
  2. Adding a triple-slash reference in index.ts to ensure global.d.ts is always loaded when the package is imported
  3. Removing the duplicate module augmentation from query.ts

Now, ctx.meta?.loadSubsetOptions is automatically typed as LoadSubsetOptions without requiring users to explicitly import QueryCollectionMeta or add any manual type assertions.

Fixes the issue where users needed to use @ts-ignore or manual type assertions to pass ctx.meta?.loadSubsetOptions to parseLoadSubsetOptions.

🎯 Changes

✅ Checklist

  • I have followed the steps in the Contributing guide.
  • I have tested this code locally with pnpm test:pr.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.
  • This change is docs/CI/dev-only (no release).

Previously, the module augmentation for @tanstack/query-core that makes
ctx.meta?.loadSubsetOptions type-safe was in query.ts. This meant it wasn't
always processed by TypeScript unless something from that file was directly
imported.

This commit fixes the issue by:

1. Moving the module augmentation to a dedicated global.d.ts file
2. Adding a triple-slash reference in index.ts to ensure global.d.ts is
   always loaded when the package is imported
3. Removing the duplicate module augmentation from query.ts

Now, ctx.meta?.loadSubsetOptions is automatically typed as LoadSubsetOptions
without requiring users to explicitly import QueryCollectionMeta or add any
manual type assertions.

Fixes the issue where users needed to use @ts-ignore or manual type assertions
to pass ctx.meta?.loadSubsetOptions to parseLoadSubsetOptions.
@changeset-bot
Copy link

changeset-bot bot commented Nov 20, 2025

🦋 Changeset detected

Latest commit: 2066a4e

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

This PR includes changesets to release 2 packages
Name Type
@tanstack/query-db-collection Patch
@tanstack/db-collection-e2e Patch

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

@pkg-pr-new
Copy link

pkg-pr-new bot commented Nov 20, 2025

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 2066a4e

@github-actions
Copy link
Contributor

github-actions bot commented Nov 20, 2025

Size Change: 0 B

Total Size: 86.3 kB

ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.38 kB
./packages/db/dist/esm/collection/changes.js 977 B
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/index.js 3.24 kB
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.67 kB
./packages/db/dist/esm/collection/mutations.js 2.26 kB
./packages/db/dist/esm/collection/state.js 3.43 kB
./packages/db/dist/esm/collection/subscription.js 2.48 kB
./packages/db/dist/esm/collection/sync.js 2.37 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.19 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.64 kB
./packages/db/dist/esm/indexes/auto-index.js 742 B
./packages/db/dist/esm/indexes/base-index.js 766 B
./packages/db/dist/esm/indexes/btree-index.js 1.87 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js 513 B
./packages/db/dist/esm/local-only.js 837 B
./packages/db/dist/esm/local-storage.js 2.1 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.22 kB
./packages/db/dist/esm/query/builder/functions.js 733 B
./packages/db/dist/esm/query/builder/index.js 3.96 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 917 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.35 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/group-by.js 1.8 kB
./packages/db/dist/esm/query/compiler/index.js 1.96 kB
./packages/db/dist/esm/query/compiler/joins.js 2 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.25 kB
./packages/db/dist/esm/query/compiler/select.js 1.07 kB
./packages/db/dist/esm/query/expression-helpers.js 1.43 kB
./packages/db/dist/esm/query/ir.js 673 B
./packages/db/dist/esm/query/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.26 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.74 kB
./packages/db/dist/esm/query/live/internal.js 130 B
./packages/db/dist/esm/query/optimizer.js 2.56 kB
./packages/db/dist/esm/query/predicate-utils.js 2.88 kB
./packages/db/dist/esm/query/subset-dedupe.js 921 B
./packages/db/dist/esm/scheduler.js 1.21 kB
./packages/db/dist/esm/SortedMap.js 1.18 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 2.9 kB
./packages/db/dist/esm/utils.js 881 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 852 B
./packages/db/dist/esm/utils/index-optimization.js 1.51 kB
./packages/db/dist/esm/utils/type-guards.js 157 B

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

@github-actions
Copy link
Contributor

github-actions bot commented Nov 20, 2025

Size Change: 0 B

Total Size: 3.34 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.11 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 431 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

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

This commit addresses two critical issues identified in code review:

1. **Fixed double export**: Removed duplicate QueryCollectionMeta export from
   the query.ts line in index.ts. QueryCollectionMeta is now only exported
   from global.d.ts, which is its canonical source.

2. **Changed from type alias to interface**: Converting QueryCollectionMeta
   from a type alias to an interface enables proper TypeScript declaration
   merging. This allows users to extend meta with custom properties without
   encountering "Subsequent property declarations must have the same type"
   errors.

The updated documentation now shows the correct pattern for users to extend
meta:

```typescript
declare module "@tanstack/query-db-collection" {
  interface QueryCollectionMeta {
    myCustomProperty: string
  }
}
```

This is safer than the previous pattern which would have caused users to
collide with the library's own Register.queryMeta augmentation.

Added a type test documenting the extension pattern for future reference.
- Replace triple-slash reference with import type {} from './global'
- Remove unused ExtendedMeta interface from test

All errors are now resolved, only pre-existing warnings remain.
Added comprehensive documentation explaining:
- Automatic type-safety for ctx.meta.loadSubsetOptions
- How to extend QueryCollectionMeta with custom properties via module augmentation
- Real-world examples including API request context
- Important notes about TypeScript declaration merging

This aligns with TanStack Query's official approach to typing meta using the Register interface.
Changed global.d.ts to global.ts so TypeScript properly emits it as global.d.ts
in the dist folder. TypeScript's declaration emit only generates .d.ts files from
.ts source files - it does not copy handwritten .d.ts files to the output.

The module augmentation for @tanstack/query-core is now guaranteed to load because:
1. global.ts exports QueryCollectionMeta interface
2. index.ts re-exports it: export type { QueryCollectionMeta } from "./global"
3. When TypeScript processes the built index.d.ts, it must load global.d.ts to
   resolve the export, which triggers processing of the module augmentation

This follows TypeScript best practices:
- Renamed .d.ts → .ts for proper build emission
- Re-export forces TypeScript to process the augmentation file
- No reliance on triple-slash references or side-effect imports

Updated comments to accurately reflect the mechanism.
@utopyin
Copy link
Contributor

utopyin commented Nov 22, 2025

nice, it fixed the issue on my end!
image

Thank you :)

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.

4 participants