Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

This was quite thin before.

claude and others added 8 commits October 23, 2025 16:44
…c team

This document clarifies the TInput/TOutput architecture and explains how
PowerSync can support arbitrary type transformations (like Date objects)
by handling serialization in their integration layer rather than
constraining TOutput to match SQLite types.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
This proposal addresses the lack of documentation around TInput/TOutput
schema types and transformations. It includes:

- Complete content outline for new schemas.md guide
- Data flow diagrams and examples
- Guidance for both app developers and integration authors
- Common patterns for Date handling, defaults, and type conversions
- Updates to existing docs (overview, mutations, collection-options-creator)

The proposal directly addresses confusion like what the PowerSync team
experienced regarding how to handle type transformations and
serialization in integrations.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
After investigating all existing docs (overview, mutations, error-handling,
live-queries, collection-options-creator) and examples, created a refined
plan that addresses:

KEY FINDING: Two distinct type conversion mechanisms
1. Integration-level parsing (storage format ↔ in-memory format)
2. Schema validation/transformation (TInput → TOutput for mutations)

The plan includes:
- Analysis of what's currently documented (and gaps)
- Comprehensive schemas.md guide structure (11 sections)
- Specific updates to 5 existing docs with exact content
- Separate guidance for app developers vs integration authors
- Clear distinction between integration parsing and schema validation
- Complete working examples and best practices
- Implementation order and success criteria

This directly addresses the PowerSync confusion about TInput/TOutput and
provides clear guidance for both audiences.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
New guide (docs/guides/schemas.md) covering:

- Introduction with validation-first example
- Core concepts: TInput vs TOutput with data flow diagram
- Validation patterns (types, strings, numbers, enums, arrays, custom)
- Transformation patterns (Date conversion, JSON, computed fields)
- Default values (literals, functions, complex)
- Handling updates with union types pattern
- Error handling with SchemaValidationError
- Best practices (with performance callout)
- Two complete working examples (Todo app, E-commerce)
- Brief integration authors section linking to collection-options-creator
- Related topics links

This addresses the documentation gap identified in the PowerSync question
about TInput/TOutput and provides clear guidance for both app developers
and integration authors on schema validation and type transformations.

~850 lines, 12 sections, 30+ code examples

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Address review feedback to make the guide more focused and practical:

- Add clarification that schemas only validate client changes, not server data
- Remove "Handling Sync Validation Errors" section
- Fix QueryFn example to show manual parsing is required for API responses
- Rename "Handling Updates" to "Handling Timestamps" with better focus on common patterns
- Remove "Safe Parsing (Zod)" section
- Remove "When to Use Schemas" from Best Practices
- Remove "Schema Organization" from Best Practices
- Replace lengthy "For Integration Authors" section with brief link to collection-options-creator.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
- Explicitly mention schemas catch invalid data from optimistic mutations
- Show reusing schema with .parse() in queryFn to transform API responses
- Remove The Data Flow diagram section (had errors and wasn't useful)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Updates across documentation to explain schemas and type transformations:

**overview.md:**
- Expand collection schemas section with comprehensive example
- Add list of what schemas do (validation, transformations, defaults, type safety)
- Link to new schemas guide

**mutations.md:**
- Add "Schema Validation in Mutation Handlers" section
- Explain that handlers receive TOutput (transformed data)
- Show serialization pattern for backends

**error-handling.md:**
- Add "When schema validation occurs" section
- Clarify schemas only validate client mutations, not sync data
- Link to schemas guide

**collection-options-creator.md:**
- Add "Schemas and Type Transformations" section
- Explain three approaches: parse/serialize helpers, user handles, automatic serialization
- Show examples from TrailBase and Query Collection
- Document design principles for integration authors

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@changeset-bot
Copy link

changeset-bot bot commented Oct 31, 2025

⚠️ No Changeset found

Latest commit: be17cff

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@pkg-pr-new
Copy link

pkg-pr-new bot commented Oct 31, 2025

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: d43d711

@KyleAMathews KyleAMathews requested a review from thruflo October 31, 2025 17:10
@github-actions
Copy link
Contributor

github-actions bot commented Oct 31, 2025

Size Change: 0 B

Total Size: 79.1 kB

ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.34 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.12 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.42 kB
./packages/db/dist/esm/collection/sync.js 2.02 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 3.9 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.36 kB
./packages/db/dist/esm/indexes/auto-index.js 731 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.04 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 606 B
./packages/db/dist/esm/query/builder/index.js 3.85 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 917 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.26 kB
./packages/db/dist/esm/query/compiler/expressions.js 674 B
./packages/db/dist/esm/query/compiler/group-by.js 1.78 kB
./packages/db/dist/esm/query/compiler/index.js 1.95 kB
./packages/db/dist/esm/query/compiler/joins.js 2 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.17 kB
./packages/db/dist/esm/query/compiler/select.js 1.07 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 kB
./packages/db/dist/esm/query/live/collection-registry.js 214 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.77 kB
./packages/db/dist/esm/query/optimizer.js 2.6 kB
./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 237 B
./packages/db/dist/esm/strategies/queueStrategy.js 418 B
./packages/db/dist/esm/strategies/throttleStrategy.js 236 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 660 B
./packages/db/dist/esm/utils/index-optimization.js 1.49 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 Oct 31, 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

@KyleAMathews KyleAMathews moved this to Ready for review in 1.0.0 release Nov 4, 2025
Copy link
Collaborator

@samwillis samwillis left a comment

Choose a reason for hiding this comment

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

Looks great. Just one comment above that I think we need to cover, but other than that approved

Comment on lines +101 to +107
### What are TInput and TOutput?

When you define a schema with transformations, it has two types:

- **TInput**: The type users provide when calling `insert()` or `update()`
- **TOutput**: The type stored in the collection and returned from queries

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think it's worth documenting that it's best practice (or even essential) to make TInput and superset of TOutput. This is particularly important due to the draft on update() calls, the draft is typed as TInput but will contain the data from that will be in from the output of the schemas.

We made this tradeoff in the design to keep things simple and understandable, at the expense of having to document it.

We looked at trying to make the draft TOutput | TInput but that has to be computed recursively though the structures - its not just a simple union of the types, but a union of each prop recursively. Documenting that one is a superset of the other seemed better.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Good call — added.

Addresses PR review feedback from samwillis about the critical design principle that TInput must be a superset of TOutput when using transformations.

Key improvements:
- Add prominent "Critical Design Principle" section explaining why TInput must accept all TOutput values
- Clarify that union types are REQUIRED (not optional) for transformations
- Add clear ❌/✅ examples showing what breaks and why
- Explain the draft parameter typing issue in collection.update()
- Strengthen language in Best Practices from "should" to "must"

This makes it clear that when schemas transform type A to type B, you must use z.union([A, B]) to ensure updates work correctly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@KyleAMathews KyleAMathews merged commit b2eb96d into main Nov 5, 2025
5 of 6 checks passed
@KyleAMathews KyleAMathews deleted the claude/tanstack-db-schema-integration-011CUQSQwu63eHsgKcN5Y7wf branch November 5, 2025 15:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Ready for review

Development

Successfully merging this pull request may close these issues.

4 participants