Skip to content

feat(expo-persistence): add official expo sqlite persistence adapter#1376

Open
samwillis wants to merge 2 commits intomainfrom
samwillis/persistence-expo
Open

feat(expo-persistence): add official expo sqlite persistence adapter#1376
samwillis wants to merge 2 commits intomainfrom
samwillis/persistence-expo

Conversation

@samwillis
Copy link
Collaborator

Summary

  • add a dedicated @tanstack/db-expo-sqlite-persisted-collection package backed by the official expo-sqlite async APIs
  • add simulator/emulator-backed Expo smoke coverage plus shimmed contract coverage and runtime harnesses for iOS and Android
  • document the Expo adapter and clarify the split from the React Native op-sqlite wrapper

Test plan

  • pnpm --filter @tanstack/db-expo-sqlite-persisted-collection test:e2e:expo:ios
  • pnpm --filter @tanstack/db-expo-sqlite-persisted-collection test:e2e:expo:android
  • commit hooks (eslint --fix via pre-commit)

Made with Cursor

@changeset-bot
Copy link

changeset-bot bot commented Mar 14, 2026

⚠️ No Changeset found

Latest commit: 75666ef

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

@samwillis samwillis force-pushed the samwillis/persistence-expo branch from aaf18a4 to 3bed14f Compare March 14, 2026 17:37
@samwillis samwillis changed the title feat(expo-persistence): add official expo sqlite adapter feat(expo-persistence): add official expo sqlite persistence adapter Mar 14, 2026
@pkg-pr-new
Copy link

pkg-pr-new bot commented Mar 14, 2026

More templates

@tanstack/angular-db

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

@tanstack/db

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

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

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

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

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

@tanstack/db-ivm

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

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

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

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

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 75666ef

@github-actions
Copy link
Contributor

github-actions bot commented Mar 14, 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 14, 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 branch 2 times, most recently from 37c3bf5 to ca46819 Compare March 16, 2026 11:30
Base automatically changed from kevin/persistence to main March 16, 2026 12:48
samwillis and others added 2 commits March 16, 2026 16:57
Add a dedicated expo-sqlite persistence package with real simulator/emulator smoke coverage so Expo apps can use the official SQLite runtime instead of the op-sqlite wrapper.

Made-with: Cursor
@kevin-dp kevin-dp force-pushed the samwillis/persistence-expo branch from d564126 to 75666ef Compare March 16, 2026 15:57
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: #1376 — feat(expo-persistence): add official expo sqlite persistence adapter

Overall

Good implementation. The driver makes a smart design choice by delegating transaction management to Expo's native withExclusiveTransactionAsync instead of manually issuing BEGIN/COMMIT/ROLLBACK — this is cleaner and lets the Expo SDK handle locking semantics. The persistence layer follows established patterns, and the test coverage is solid (persistence integration, runtime persistence contract, core adapter contract, plus bespoke driver tests). The env-driven test setup for swapping between better-sqlite3 and real emulator runtimes is well-designed.

Issues to address

  1. package.json "files" includes "e2e" — This would publish the entire e2e directory (Expo runtime app, emulator harnesses, conformance suites) to npm. Other persistence packages only include ["dist", "src"]. Remove "e2e" from the files array.

  2. Missing expo-sqlite-driver-contract.test.ts — Every other persistence package runs runSQLiteDriverContractSuite against its driver. This PR has the core adapter contract and runtime persistence contract but not the driver contract. The bespoke driver tests cover the happy path well, but the shared driver contract suite validates edge cases around the SQLiteDriver interface that are easy to miss.

  3. index.ts exports ExpoSQLiteDriver, createExpoSQLiteDriver, and internal types (ExpoSQLiteBindParams, ExpoSQLiteRunResult, ExpoSQLiteTransaction) — Other packages only export the persistence factory and core re-exports from their main entry, keeping the driver class in a sub-entry (e.g., ./capacitor, ./tauri). This is a wider public API surface. Consider whether the driver class and its internal types should be part of the top-level public API, or gated behind a sub-entry.

Worth considering

  • expo-sqlite peer dependency version ^55.0.10 — Expo SDK versions move fast. Worth confirming this is the minimum supported version and documenting whether it requires Expo SDK 53+ or similar.

Summary

Approve with changes — remove "e2e" from "files", add the driver contract test suite. The driver and persistence implementations are correct.

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