Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

This enables tree-shaking by having each operator register its own evaluator when imported, rather than relying on a monolithic switch statement.

Key changes:

  • Add registry.ts with registerOperator/getOperatorEvaluator APIs
  • Create individual operator files (eq, gt, gte, lt, lte, and, or, not, in, like, ilike, upper, lower, length, concat, coalesce, add, subtract, multiply, divide, isNull, isUndefined)
  • Each operator file bundles builder function + evaluator + registration
  • Modify evaluators.ts to use registry lookup instead of switch
  • Update query/index.ts to export from new operator modules
  • Export compileExpressionInternal for operator modules to use

The pattern: importing an operator causes its file to execute, which calls registerOperator, adding it to the registry. By query compile time, all operators in use are already registered.

🎯 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).

This enables tree-shaking by having each operator register its own
evaluator when imported, rather than relying on a monolithic switch
statement.

Key changes:
- Add registry.ts with registerOperator/getOperatorEvaluator APIs
- Create individual operator files (eq, gt, gte, lt, lte, and, or, not,
  in, like, ilike, upper, lower, length, concat, coalesce, add,
  subtract, multiply, divide, isNull, isUndefined)
- Each operator file bundles builder function + evaluator + registration
- Modify evaluators.ts to use registry lookup instead of switch
- Update query/index.ts to export from new operator modules
- Export compileExpressionInternal for operator modules to use

The pattern: importing an operator causes its file to execute, which
calls registerOperator, adding it to the registry. By query compile
time, all operators in use are already registered.
@changeset-bot
Copy link

changeset-bot bot commented Dec 1, 2025

🦋 Changeset detected

Latest commit: 3440d6d

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

This PR includes changesets to release 11 packages
Name Type
@tanstack/db Patch
@tanstack/angular-db Patch
@tanstack/db-collection-e2e Patch
@tanstack/electric-db-collection Patch
@tanstack/powersync-db-collection Patch
@tanstack/react-db Patch
@tanstack/rxdb-db-collection Patch
@tanstack/solid-db Patch
@tanstack/svelte-db Patch
@tanstack/trailbase-db-collection Patch
@tanstack/vue-db 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

@KyleAMathews KyleAMathews marked this pull request as draft December 1, 2025 23:23
@pkg-pr-new
Copy link

pkg-pr-new bot commented Dec 1, 2025

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 3440d6d

@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2025

Size Change: +6.35 kB (+7.28%) 🔍

Total Size: 93.5 kB

Filename Size Change
./packages/db/dist/esm/collection/subscription.js 2.57 kB +23 B (+0.9%)
./packages/db/dist/esm/index.js 2.85 kB +204 B (+7.72%) 🔍
./packages/db/dist/esm/query/builder/functions.js 298 B -435 B (-59.35%) 🏆
./packages/db/dist/esm/query/compiler/evaluators.js 591 B -763 B (-56.35%) 🏆
./packages/db/dist/esm/query/compiler/expressions.js 437 B +7 B (+1.63%)
./packages/db/dist/esm/query/compiler/group-by.js 1.76 kB -38 B (-2.11%)
./packages/db/dist/esm/query/compiler/joins.js 2.01 kB +4 B (+0.2%)
./packages/db/dist/esm/query/ir.js 691 B +18 B (+2.67%)
./packages/db/dist/esm/query/optimizer.js 2.57 kB +14 B (+0.55%)
./packages/db/dist/esm/query/predicate-utils.js 2.97 kB +61 B (+2.09%)
./packages/db/dist/esm/query/builder/aggregates/avg.js 251 B +251 B (new file) 🆕
./packages/db/dist/esm/query/builder/aggregates/count.js 244 B +244 B (new file) 🆕
./packages/db/dist/esm/query/builder/aggregates/max.js 256 B +256 B (new file) 🆕
./packages/db/dist/esm/query/builder/aggregates/min.js 255 B +255 B (new file) 🆕
./packages/db/dist/esm/query/builder/aggregates/sum.js 251 B +251 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/add.js 247 B +247 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/and.js 336 B +336 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/coalesce.js 248 B +248 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/concat.js 290 B +290 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/divide.js 259 B +259 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/eq.js 307 B +307 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/gt.js 263 B +263 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/gte.js 266 B +266 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/ilike.js 287 B +287 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/in.js 279 B +279 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/isNull.js 211 B +211 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/isUndefined.js 222 B +222 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/length.js 258 B +258 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/like.js 431 B +431 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/lower.js 250 B +250 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/lt.js 262 B +262 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/lte.js 265 B +265 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/multiply.js 250 B +250 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/not.js 234 B +234 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/or.js 332 B +332 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/subtract.js 249 B +249 B (new file) 🆕
./packages/db/dist/esm/query/builder/operators/upper.js 249 B +249 B (new file) 🆕
ℹ️ 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.31 kB
./packages/db/dist/esm/collection/state.js 3.43 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/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.75 kB
./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/index.js 1.96 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/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.33 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/subset-dedupe.js 921 B
./packages/db/dist/esm/scheduler.js 1.3 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 Dec 1, 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

Export the registry API so users can create and register their own
custom operators. Also adds a changeset for this patch.
- Export registerOperator, EvaluatorFactory, and CompiledExpression types
- Add comprehensive tests for custom operator registration
- Tests cover between, startsWith, isEmpty, modulo operators
- Demonstrates full pattern: builder function + evaluator + registration
Extend the auto-registration pattern to aggregates (sum, count, avg, min, max):

- Create aggregate-registry.ts with registerAggregate/getAggregateConfig
- Split each aggregate into its own module with builder + auto-registration
- Update group-by.ts to use registry lookup instead of switch statement
- Export registerAggregate and types from public API
- Add tests demonstrating custom aggregate registration

This enables tree-shaking for aggregates and allows users to register
custom aggregates like 'product', 'variance', etc.
- Remove eager imports from evaluators.ts and group-by.ts
- Make functions.ts re-export from operator/aggregate modules
- Add shared types.ts for type helpers preserving nullability
- Update test files to import operators for direct IR testing

Now operators/aggregates are only loaded when user imports them,
enabling true tree-shaking. The compiler no longer pre-loads all
evaluators - they register when their builder functions are imported.
@KyleAMathews KyleAMathews marked this pull request as ready for review December 2, 2025 15:30
Replace global registry pattern with embedded factories for true tree-shaking:
- Func nodes now carry their evaluator factory directly
- Aggregate nodes now carry their config (factory + valueTransform) directly
- Remove registry.ts and aggregate-registry.ts files
- Update all operators to pass factory as 3rd argument to Func
- Update all aggregates to pass config as 3rd argument to Aggregate
- Update internal code (optimizer, predicate-utils, expressions) to
  preserve factories when transforming Func nodes
- Add array overloads to and() and or() for internal usage
- Update tests to use builder functions instead of creating IR directly

This design eliminates the need for side-effect imports and ensures
only imported operators/aggregates are bundled.
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.

3 participants