Skip to content

ci: typecheck ordinary test sources - #1819

Merged
KyleAMathews merged 2 commits into
mainfrom
codex/fix-1812-test-typechecks
Sep 14, 2026
Merged

KyleAMathews merged 2 commits into
mainfrom
codex/fix-1812-test-typechecks

Conversation

@KyleAMathews

@KyleAMathews KyleAMathews commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

Adds an explicit CI gate for ordinary TypeScript test sources in db-ivm and offline-transactions, then fixes the existing strict-type errors that gate exposes. CI will now reject test-only type regressions that runtime tests and declaration builds previously missed.

Root Cause

The PR workflow only ran the workspace build and runtime tests. Those checks do not cover ordinary .test.ts sources: declaration generation is scoped to production source directories, offline-transactions' package typecheck was never invoked from root CI, and db-ivm's Vitest typechecking defaults only include type-test files such as *.test-d.ts.

As a result, stale fixture shapes, unchecked indexed access, mismatched callback signatures, and an incorrect public distinct return annotation could remain green in CI.

Approach

  • Add a root typecheck:tests command covering @tanstack/db-ivm and @tanstack/offline-transactions, and run it as a distinct PR workflow step after package builds.
  • Add the missing db-ivm package typecheck command.
  • Repair the existing test and harness diagnostics with precise types, runtime narrowing, complete fixtures, and explicit indexed-access assertions instead of suppressions or broad casts.
  • Correct distinct's declared output from the input tuple type to KeyValue<number, GetValue<T>>, matching the numeric hash keys it already emits at runtime.
  • Add a patch changeset for the db-ivm public type correction.

Key Invariants

  • The CI typecheck covers ordinary test sources independently of declaration builds and dedicated API type tests.
  • distinct runtime behavior is unchanged; only its public return type now describes the values already emitted.
  • Test fixtures remain representative of production interfaces and strictness is not weakened.
  • Serializer and offline execution behavior remain unchanged.

Non-goals

  • No production runtime logic or serialization format changes.
  • No expansion of the new CI gate beyond db-ivm and offline-transactions.
  • No broad casts, TypeScript suppressions, or weaker compiler settings to make the gate pass.

Trade-offs

This adds a dedicated typecheck step to PR CI, increasing check time slightly in exchange for making test-source type safety explicit and independently visible. The distinct correction is a public type change, but it replaces an impossible type promise with the operator's existing runtime contract.

Verification

pnpm run build
pnpm run typecheck:tests
pnpm run lint
pnpm --filter @tanstack/db-ivm test
pnpm --filter @tanstack/offline-transactions test

The db-ivm suite passed 357 tests. The offline-transactions suite passed 65 tests with one pre-existing skip. A temporary intentional type error in an ordinary .test.ts file was rejected by pnpm run typecheck:tests and removed before commit.

Files changed

  • .github/workflows/pr.yml: separates build, test-source typechecking, and runtime tests into explicit CI steps.
  • package.json: adds the root test-source typecheck target.
  • packages/db-ivm/package.json: adds db-ivm's tsc --noEmit target.
  • packages/db-ivm/src/operators/distinct.ts: aligns the public stream return type with numeric emitted keys and preserved values.
  • packages/db-ivm/tests/graph.test.ts: narrows indexed messages after length assertions.
  • packages/db-ivm/tests/operators/distinct.test.ts: updates tracker and message types to the actual distinct output.
  • packages/db-ivm/tests/operators/filterBy.test.ts: narrows indexed messages after length assertions.
  • packages/db-ivm/tests/operators/join.test.ts: narrows an indexed message after the non-empty assertion.
  • packages/db-ivm/tests/test-utils.ts: narrows the sole positive value after its length check.
  • packages/db-ivm/tests/utils.test.ts: invokes leaf factories with callback-compatible wrappers.
  • packages/offline-transactions/tests/TransactionSerializer.test.ts: replaces incomplete cast fixtures with typed collections, complete transactions, and safe value guards.
  • packages/offline-transactions/tests/harness.ts: accepts real pending mutation shapes, validates test items, supports synchronous mutation callbacks, and removes broad result typing.
  • packages/offline-transactions/tests/leader-failover.test.ts: removes mutation casts and narrows indexed outbox entries.
  • packages/offline-transactions/tests/offline-e2e.test.ts: removes mutation casts and narrows indexed outbox entries.
  • .changeset/fix-distinct-output-type.md: records the db-ivm patch-level type correction.

Fixes #1812

Summary by CodeRabbit

  • Bug Fixes

    • Corrected the distinct operator’s output type to accurately represent numeric keys while preserving the original values.
    • Updated related transaction and operator handling to improve type safety and consistency.
  • Tests

    • Expanded and refined type checking across database and offline transaction packages.
    • Improved transaction serialization and mutation test coverage, including date and record handling.

@coderabbitai

coderabbitai Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 790a1f0c-f0c6-4e5d-8017-dce93434d72a

📥 Commits

Reviewing files that changed from the base of the PR and between a378bd3 and c9cc386.

📒 Files selected for processing (15)
  • .changeset/fix-distinct-output-type.md
  • .github/workflows/pr.yml
  • package.json
  • packages/db-ivm/package.json
  • packages/db-ivm/src/operators/distinct.ts
  • packages/db-ivm/tests/graph.test.ts
  • packages/db-ivm/tests/operators/distinct.test.ts
  • packages/db-ivm/tests/operators/filterBy.test.ts
  • packages/db-ivm/tests/operators/join.test.ts
  • packages/db-ivm/tests/test-utils.ts
  • packages/db-ivm/tests/utils.test.ts
  • packages/offline-transactions/tests/TransactionSerializer.test.ts
  • packages/offline-transactions/tests/harness.ts
  • packages/offline-transactions/tests/leader-failover.test.ts
  • packages/offline-transactions/tests/offline-e2e.test.ts

Included review availability: Your plan provides up to 8 included reviews per hour; 7 remain after this review.


📝 Walkthrough

Walkthrough

The PR corrects the distinct output type, adds explicit test-source typechecking to CI, and updates db-ivm and offline-transactions tests for stricter type checks.

Changes

Distinct output contract

Layer / File(s) Summary
Distinct output contract
.changeset/fix-distinct-output-type.md, packages/db-ivm/src/operators/distinct.ts, packages/db-ivm/tests/operators/distinct.test.ts
distinct now returns KeyValue<number, GetValue<T>>. The implementation and test-local message types use numeric hashed keys. A patch changeset documents the correction.

Test-source typecheck pipeline

Layer / File(s) Summary
Test-source typecheck pipeline
package.json, packages/db-ivm/package.json, .github/workflows/pr.yml
The repository adds test typecheck scripts. CI now runs build, test-source typechecking, and tests as separate steps.
db-ivm test typing updates
packages/db-ivm/tests/graph.test.ts, packages/db-ivm/tests/operators/filterBy.test.ts, packages/db-ivm/tests/operators/join.test.ts, packages/db-ivm/tests/test-utils.ts, packages/db-ivm/tests/utils.test.ts
The tests add non-null assertions and invoke createLeaf without array-mapper arguments. Runtime behavior is unchanged.

Offline transaction test type safety

Layer / File(s) Summary
Transaction serializer test helpers
packages/offline-transactions/tests/TransactionSerializer.test.ts
The serializer tests use a createCollection fixture and shared transaction, record, and date helpers. Date and nested-record assertions use the new helpers.
Mutation harness typing and validation
packages/offline-transactions/tests/harness.ts
The harness uses PendingMutation, unknown return types, inferred mutation collections, and runtime guards for test items. Insert and update handling shares one branch.
Failover and end-to-end test typing
packages/offline-transactions/tests/leader-failover.test.ts, packages/offline-transactions/tests/offline-e2e.test.ts
The tests remove explicit mutation-array casts and unused imports. Known outbox entries use non-null assertions.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Feature · Severity of issue fixed: Medium

Merge Risk: ⚪ Minimal · up to c9cc3

The change is ready to merge: no actionable behavior, API-contract, or CI-gate risk remains in the supplied evidence.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 15.38% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 13 functions across 11 files. (4 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: adding CI typechecking for ordinary test sources. It is concise and specific.
Description check ✅ Passed The description is detailed and covers the changes, motivation, verification, release impact, and non-goals. It does not reproduce the template headings or checklist, but it provides the required info…
Linked Issues check ✅ Passed The PR satisfies the coding requirements in [#1812]. .github/workflows/pr.yml runs build, typecheck:tests, and tests as separate steps. The root script invokes typecheck in both target packages,…
Out of Scope Changes check ✅ Passed The changes remain within [#1812]. The fixture, serializer, harness, and assertion updates support strict test-source typechecking. The distinct implementation and changeset support the public type …
Full details: Docstring Coverage

Explanation

Docstring coverage is 15.38% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 13 functions across 11 files. (4 skipped: 4 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/fix-1812-test-typechecks

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 Sep 14, 2026

Copy link
Copy Markdown
More templates

@tanstack/angular-db

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

@tanstack/browser-db-sqlite-persistence

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

@tanstack/capacitor-db-sqlite-persistence

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

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

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/db-sqlite-persistence-core

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

@tanstack/electric-db-collection

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

@tanstack/electron-db-sqlite-persistence

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

@tanstack/expo-db-sqlite-persistence

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

@tanstack/node-db-sqlite-persistence

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

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

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

@tanstack/react-router-with-db

npm i https://pkg.pr.new/@tanstack/react-router-with-db@1819

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/tauri-db-sqlite-persistence

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: c9cc386

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 165 kB

ℹ️ View Unchanged
Filename Size
packages/db/dist/esm/client.js 3.66 kB
packages/db/dist/esm/collection-options.js 236 B
packages/db/dist/esm/collection/change-events.js 1.44 kB
packages/db/dist/esm/collection/changes.js 2.23 kB
packages/db/dist/esm/collection/cleanup-queue.js 794 B
packages/db/dist/esm/collection/events.js 481 B
packages/db/dist/esm/collection/index.js 4.58 kB
packages/db/dist/esm/collection/indexes.js 1.99 kB
packages/db/dist/esm/collection/lifecycle.js 2.15 kB
packages/db/dist/esm/collection/mutations.js 2.54 kB
packages/db/dist/esm/collection/state.js 6.47 kB
packages/db/dist/esm/collection/subscription.js 8.72 kB
packages/db/dist/esm/collection/sync.js 4.62 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.26 kB
packages/db/dist/esm/event-emitter.js 964 B
packages/db/dist/esm/index.js 3.68 kB
packages/db/dist/esm/indexes/auto-index.js 829 B
packages/db/dist/esm/indexes/base-index.js 1.14 kB
packages/db/dist/esm/indexes/basic-index.js 2.07 kB
packages/db/dist/esm/indexes/btree-index.js 2.26 kB
packages/db/dist/esm/indexes/index-registry.js 820 B
packages/db/dist/esm/indexes/reverse-index.js 376 B
packages/db/dist/esm/live-query-adapter.js 318 B
packages/db/dist/esm/live-query-observer.js 3.69 kB
packages/db/dist/esm/live-query-options.js 702 B
packages/db/dist/esm/live-query-window-controller.js 4.36 kB
packages/db/dist/esm/local-only.js 975 B
packages/db/dist/esm/local-storage.js 2.15 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.11 kB
packages/db/dist/esm/query/builder/functions.js 1.47 kB
packages/db/dist/esm/query/builder/index.js 6.69 kB
packages/db/dist/esm/query/builder/query-ir.js 116 B
packages/db/dist/esm/query/builder/ref-proxy.js 1.24 kB
packages/db/dist/esm/query/compiler/evaluators.js 1.92 kB
packages/db/dist/esm/query/compiler/expressions.js 560 B
packages/db/dist/esm/query/compiler/group-by.js 4.13 kB
packages/db/dist/esm/query/compiler/index.js 9.06 kB
packages/db/dist/esm/query/compiler/joins.js 3 kB
packages/db/dist/esm/query/compiler/lazy-targets.js 1.1 kB
packages/db/dist/esm/query/compiler/order-by.js 1.91 kB
packages/db/dist/esm/query/compiler/parent-routes.js 319 B
packages/db/dist/esm/query/compiler/route-metadata.js 1.24 kB
packages/db/dist/esm/query/compiler/select.js 1.58 kB
packages/db/dist/esm/query/effect.js 4.6 kB
packages/db/dist/esm/query/equality-value-identity.js 591 B
packages/db/dist/esm/query/expression-helpers.js 1.43 kB
packages/db/dist/esm/query/ir-stable-identity.js 4.04 kB
packages/db/dist/esm/query/ir.js 1.59 kB
packages/db/dist/esm/query/live-query-collection.js 391 B
packages/db/dist/esm/query/live/bucket-facade-adapter.js 2.73 kB
packages/db/dist/esm/query/live/collection-config-builder.js 6.97 kB
packages/db/dist/esm/query/live/collection-registry.js 264 B
packages/db/dist/esm/query/live/collection-subscriber.js 2.25 kB
packages/db/dist/esm/query/live/internal.js 145 B
packages/db/dist/esm/query/live/materialized-pipeline.js 2.32 kB
packages/db/dist/esm/query/live/ordered-source-loader.js 3.14 kB
packages/db/dist/esm/query/live/subset-demand-controller.js 1.26 kB
packages/db/dist/esm/query/live/utils.js 1.14 kB
packages/db/dist/esm/query/optimizer.js 2.91 kB
packages/db/dist/esm/query/query-once.js 359 B
packages/db/dist/esm/query/runtime-reference-identity.js 572 B
packages/db/dist/esm/query/subset-dedupe.js 486 B
packages/db/dist/esm/scheduler.js 1.34 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.51 kB
packages/db/dist/esm/utils.js 1.01 kB
packages/db/dist/esm/utils/array-utils.js 270 B
packages/db/dist/esm/utils/browser-polyfills.js 304 B
packages/db/dist/esm/utils/btree.js 4.51 kB
packages/db/dist/esm/utils/callbacks.js 174 B
packages/db/dist/esm/utils/comparison.js 1.49 kB
packages/db/dist/esm/utils/cursor.js 676 B
packages/db/dist/esm/utils/error.js 167 B
packages/db/dist/esm/utils/get-or-create.js 155 B
packages/db/dist/esm/utils/index-optimization.js 2.42 kB
packages/db/dist/esm/utils/type-guards.js 230 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

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 7.34 kB

ℹ️ View Unchanged
Filename Size
packages/react-db/dist/esm/DbProvider.js 317 B
packages/react-db/dist/esm/HydrationBoundary.js 263 B
packages/react-db/dist/esm/index.js 330 B
packages/react-db/dist/esm/live-query-internals.js 282 B
packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.9 kB
packages/react-db/dist/esm/useLiveQuery.js 2.68 kB
packages/react-db/dist/esm/useLiveQueryEffect.js 355 B
packages/react-db/dist/esm/useLiveSuspenseQuery.js 812 B
packages/react-db/dist/esm/usePacedMutations.js 401 B

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

@KyleAMathews
KyleAMathews merged commit 257d446 into main Sep 14, 2026
11 checks passed
@KyleAMathews
KyleAMathews deleted the codex/fix-1812-test-typechecks branch September 14, 2026 18:16
@github-actions github-actions Bot mentioned this pull request Sep 14, 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.

ci: typecheck ordinary db-ivm and offline test sources

1 participant