Skip to content

feat: add Capacitor SQLite persisted collection package#1363

Open
samwillis wants to merge 6 commits intokevin/persistence-electronfrom
samwillis/persistence-capacitor
Open

feat: add Capacitor SQLite persisted collection package#1363
samwillis wants to merge 6 commits intokevin/persistence-electronfrom
samwillis/persistence-capacitor

Conversation

@samwillis
Copy link
Collaborator

Summary

  • add the new @tanstack/db-capacitor-sqlite-persisted-collection package with the Capacitor SQLite driver, persistence factory, tests, and README
  • move the native runtime harness into packages/db-capacitor-sqlite-persisted-collection/e2e/app and run the full persisted collection conformance suite inside a real Capacitor iOS app
  • extend the shared native harness to Android with a host runner that builds, installs, launches, and reads back native SQLite test results from the app sandbox

Test plan

  • pnpm --filter @tanstack/db-capacitor-sqlite-persisted-collection test
  • pnpm --filter @tanstack/db-capacitor-sqlite-persisted-collection test:e2e
  • pnpm --filter @tanstack/db-capacitor-sqlite-persisted-collection test:e2e:ios
  • pnpm --filter @tanstack/db-capacitor-sqlite-persisted-collection test:e2e:android

Made with Cursor

@changeset-bot
Copy link

changeset-bot bot commented Mar 13, 2026

⚠️ No Changeset found

Latest commit: 56598ba

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

@coderabbitai
Copy link

coderabbitai bot commented Mar 13, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 235032f4-d2c0-4b88-8db0-09374bda5725

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch samwillis/persistence-capacitor
📝 Coding Plan
  • Generate coding plan for human review comments

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 and usage tips.

@samwillis samwillis changed the base branch from main to kevin/persistence-electron March 13, 2026 13:47
@pkg-pr-new
Copy link

pkg-pr-new bot commented Mar 13, 2026

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-browser-wa-sqlite-persisted-collection

npm i https://pkg.pr.new/TanStack/db/@tanstack/db-browser-wa-sqlite-persisted-collection@1363

@tanstack/db-capacitor-sqlite-persisted-collection

npm i https://pkg.pr.new/TanStack/db/@tanstack/db-capacitor-sqlite-persisted-collection@1363

@tanstack/db-electron-sqlite-persisted-collection

npm i https://pkg.pr.new/TanStack/db/@tanstack/db-electron-sqlite-persisted-collection@1363

@tanstack/db-ivm

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

@tanstack/db-node-sqlite-persisted-collection

npm i https://pkg.pr.new/TanStack/db/@tanstack/db-node-sqlite-persisted-collection@1363

@tanstack/db-react-native-sqlite-persisted-collection

npm i https://pkg.pr.new/TanStack/db/@tanstack/db-react-native-sqlite-persisted-collection@1363

@tanstack/db-sqlite-persisted-collection-core

npm i https://pkg.pr.new/TanStack/db/@tanstack/db-sqlite-persisted-collection-core@1363

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

npm i https://pkg.pr.new/TanStack/db/@tanstack/offline-transactions@1363

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 56598ba

@github-actions
Copy link
Contributor

github-actions bot commented Mar 13, 2026

Size Change: 0 B

Total Size: 110 kB

ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/changes.js 1.38 kB
./packages/db/dist/esm/collection/cleanup-queue.js 810 B
./packages/db/dist/esm/collection/events.js 434 B
./packages/db/dist/esm/collection/index.js 3.69 kB
./packages/db/dist/esm/collection/indexes.js 2.35 kB
./packages/db/dist/esm/collection/lifecycle.js 1.76 kB
./packages/db/dist/esm/collection/mutations.js 2.47 kB
./packages/db/dist/esm/collection/state.js 5.2 kB
./packages/db/dist/esm/collection/subscription.js 3.71 kB
./packages/db/dist/esm/collection/sync.js 2.43 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 4.83 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.85 kB
./packages/db/dist/esm/indexes/auto-index.js 777 B
./packages/db/dist/esm/indexes/base-index.js 766 B
./packages/db/dist/esm/indexes/btree-index.js 2.17 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.24 kB
./packages/db/dist/esm/indexes/reverse-index.js 538 B
./packages/db/dist/esm/local-only.js 890 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/functions.js 792 B
./packages/db/dist/esm/query/builder/index.js 5.15 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 1.05 kB
./packages/db/dist/esm/query/compiler/evaluators.js 1.62 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/group-by.js 2.69 kB
./packages/db/dist/esm/query/compiler/index.js 3.62 kB
./packages/db/dist/esm/query/compiler/joins.js 2.11 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.5 kB
./packages/db/dist/esm/query/compiler/select.js 1.11 kB
./packages/db/dist/esm/query/effect.js 4.78 kB
./packages/db/dist/esm/query/expression-helpers.js 1.43 kB
./packages/db/dist/esm/query/ir.js 784 B
./packages/db/dist/esm/query/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 7.63 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.94 kB
./packages/db/dist/esm/query/live/internal.js 145 B
./packages/db/dist/esm/query/live/utils.js 1.57 kB
./packages/db/dist/esm/query/optimizer.js 2.62 kB
./packages/db/dist/esm/query/predicate-utils.js 2.97 kB
./packages/db/dist/esm/query/query-once.js 359 B
./packages/db/dist/esm/query/subset-dedupe.js 960 B
./packages/db/dist/esm/scheduler.js 1.3 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 2.9 kB
./packages/db/dist/esm/utils.js 927 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 1.05 kB
./packages/db/dist/esm/utils/cursor.js 457 B
./packages/db/dist/esm/utils/index-optimization.js 1.54 kB
./packages/db/dist/esm/utils/type-guards.js 157 B
./packages/db/dist/esm/virtual-props.js 360 B

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

@github-actions
Copy link
Contributor

github-actions bot commented Mar 13, 2026

Size Change: 0 B

Total Size: 4.23 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 249 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.32 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.34 kB
./packages/react-db/dist/esm/useLiveQueryEffect.js 355 B
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 559 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

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

@kevin-dp kevin-dp force-pushed the kevin/persistence-electron branch from 741845b to 90e3a4c Compare March 16, 2026 14:30
kevin-dp and others added 6 commits March 16, 2026 15:50
Restore db-electron-sqlite-persisted-collection with IPC bridge,
ElectronCollectionCoordinator for cross-window sync, and full e2e test suite.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a Capacitor SQLite runtime wrapper so persisted collections can reuse the shared core adapter and test coverage pattern across runtimes.

Made-with: Cursor
Move the Capacitor persisted-collection runtime harness into the package, run the full conformance suite in a native iOS app, and share the suite registration lifecycle across the shimmed and native e2e paths.

Made-with: Cursor
Extend the shared Capacitor test app to support Android, add a host runner that boots or reuses an emulator and reads the native SQLite results database, and document the new Android e2e workflow.

Made-with: Cursor
Pass the detected Android SDK through native build commands, guard the Android runner's piped subprocess output, and align the shared harness teardown hook with the e2e contract's real cleanup path.

Made-with: Cursor
@kevin-dp kevin-dp force-pushed the samwillis/persistence-capacitor branch from 95f4d17 to 56598ba Compare March 16, 2026 14:51
Copy link
Contributor

@kevin-dp kevin-dp left a comment

Choose a reason for hiding this comment

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

PR Review: #1363 — feat: add Capacitor SQLite persisted collection package

Overall

Solid PR. The package structure, public API, test coverage (all four contract suites + bespoke tests + native e2e on both iOS and Android), and persistence wiring all follow established patterns correctly. The README has useful Capacitor-specific platform notes.

Issues to address

capacitor-sqlite-driver.ts:28 — Missing optional chaining on process.versions

return typeof process.versions.node === `string`

In Capacitor's webview, process may be polyfilled (e.g., by Vite/webpack) but process.versions could be undefined, which would throw at runtime. Should be process.versions?.node.

Worth considering

  • close() always closes the database — Since the caller creates and owns the SQLiteDBConnection externally, having the driver's close() unconditionally call database.close() could surprise callers who share a connection across multiple drivers. Consider either documenting this or leaving close() as a no-op and letting the caller manage the connection lifecycle.

  • e2e/app/src/runtime-vitest.ts (545 lines) — This custom test runner is a significant piece of infrastructure. If other native runtime packages need similar e2e harnesses in the future, it may be worth extracting into a shared package rather than duplicating.

  • tsconfig.json includes "jsx": "react" — No JSX in this package; unnecessary.

Summary

Approve with one fix — the process.versions?.node optional chaining bug. The rest are minor suggestions.

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.

2 participants