diff --git a/.changeset/persisted-metadata-followups.md b/.changeset/persisted-metadata-followups.md index 79c48e684..f48f322a5 100644 --- a/.changeset/persisted-metadata-followups.md +++ b/.changeset/persisted-metadata-followups.md @@ -1,6 +1,6 @@ --- '@tanstack/db': patch -'@tanstack/db-sqlite-persisted-collection-core': patch +'@tanstack/db-sqlite-persistence-core': patch '@tanstack/electric-db-collection': patch --- diff --git a/.changeset/sqlite-persistence.md b/.changeset/sqlite-persistence.md index ec4085598..e3fb13cb2 100644 --- a/.changeset/sqlite-persistence.md +++ b/.changeset/sqlite-persistence.md @@ -1,57 +1,57 @@ --- '@tanstack/db': patch -'@tanstack/db-sqlite-persisted-collection-core': patch -'@tanstack/db-browser-wa-sqlite-persisted-collection': patch -'@tanstack/db-cloudflare-do-sqlite-persisted-collection': patch -'@tanstack/db-node-sqlite-persisted-collection': patch -'@tanstack/db-electron-sqlite-persisted-collection': patch -'@tanstack/db-expo-sqlite-persisted-collection': patch -'@tanstack/db-react-native-sqlite-persisted-collection': patch -'@tanstack/db-capacitor-sqlite-persisted-collection': patch -'@tanstack/db-tauri-sqlite-persisted-collection': patch +'@tanstack/db-sqlite-persistence-core': patch +'@tanstack/browser-db-sqlite-persistence': patch +'@tanstack/cloudflare-durable-objects-db-sqlite-persistence': patch +'@tanstack/node-db-sqlite-persistence': patch +'@tanstack/electron-db-sqlite-persistence': patch +'@tanstack/expo-db-sqlite-persistence': patch +'@tanstack/react-native-db-sqlite-persistence': patch +'@tanstack/capacitor-db-sqlite-persistence': patch +'@tanstack/tauri-db-sqlite-persistence': patch --- feat(persistence): add SQLite-based offline persistence for collections Adds a new persistence layer that durably stores collection data in SQLite, enabling applications to survive page reloads and app restarts across browser, Node, mobile, desktop, and edge runtimes. -**Core persistence (`@tanstack/db-sqlite-persisted-collection-core`)** +**Core persistence (`@tanstack/db-sqlite-persistence-core`)** - New package providing the shared SQLite persistence runtime: hydration, streaming, transaction tracking, and applied-tx pruning - SQLite core adapter with full query compilation, index management, and schema migration support - Portable conformance test contracts for runtime-specific adapters -**Browser (`@tanstack/db-browser-wa-sqlite-persisted-collection`)** +**Browser (`@tanstack/browser-db-sqlite-persistence`)** - New package for browser persistence via wa-sqlite backed by OPFS - Single-tab persistence with OPFS-based SQLite storage - `BrowserCollectionCoordinator` for multi-tab leader-election and cross-tab sync -**Cloudflare Durable Objects (`@tanstack/db-cloudflare-do-sqlite-persisted-collection`)** +**Cloudflare Durable Objects (`@tanstack/cloudflare-durable-objects-db-sqlite-persistence`)** - New package for SQLite persistence in Cloudflare Durable Objects runtimes -**Node (`@tanstack/db-node-sqlite-persisted-collection`)** +**Node (`@tanstack/node-db-sqlite-persistence`)** - New package for Node persistence via SQLite -**Electron (`@tanstack/db-electron-sqlite-persisted-collection`)** +**Electron (`@tanstack/electron-db-sqlite-persistence`)** - New package providing Electron main and renderer persistence bridge helpers -**Expo (`@tanstack/db-expo-sqlite-persisted-collection`)** +**Expo (`@tanstack/expo-db-sqlite-persistence`)** - New package for Expo persistence via `expo-sqlite` -**React Native (`@tanstack/db-react-native-sqlite-persisted-collection`)** +**React Native (`@tanstack/react-native-db-sqlite-persistence`)** - New package for React Native persistence via op-sqlite - Adapter with transaction deadlock prevention and runtime parity coverage -**Capacitor (`@tanstack/db-capacitor-sqlite-persisted-collection`)** +**Capacitor (`@tanstack/capacitor-db-sqlite-persistence`)** - New package for Capacitor persistence via `@capacitor-community/sqlite` -**Tauri (`@tanstack/db-tauri-sqlite-persisted-collection`)** +**Tauri (`@tanstack/tauri-db-sqlite-persistence`)** - New package for Tauri persistence via `@tauri-apps/plugin-sql` diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 1716e94b2..6f3d6b54a 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -65,22 +65,22 @@ jobs: - name: Run Node SQLite persisted collection E2E tests run: | - cd packages/db-node-sqlite-persisted-collection + cd packages/node-db-sqlite-persistence pnpm test:e2e - name: Run Electron SQLite persisted collection E2E tests run: | - cd packages/db-electron-sqlite-persisted-collection + cd packages/electron-db-sqlite-persistence pnpm test:e2e - name: Run Cloudflare Durable Object persisted collection E2E tests run: | - cd packages/db-cloudflare-do-sqlite-persisted-collection + cd packages/cloudflare-durable-objects-db-sqlite-persistence pnpm test:e2e - name: Run React Native/Expo persisted collection E2E tests run: | - cd packages/db-react-native-sqlite-persisted-collection + cd packages/react-native-db-sqlite-persistence pnpm test:e2e - name: Run React Native/Expo runtime E2E lane @@ -108,7 +108,7 @@ jobs: exit 0 fi - cd packages/db-react-native-sqlite-persisted-collection + cd packages/react-native-db-sqlite-persistence pnpm test:e2e:runtime env: TANSTACK_DB_MOBILE_SQLITE_FACTORY_MODULE: ${{ vars.TANSTACK_DB_MOBILE_SQLITE_FACTORY_MODULE }} diff --git a/PERSISTNCE-PLAN-SQLITE-ONLY.md b/PERSISTNCE-PLAN-SQLITE-ONLY.md deleted file mode 100644 index e2c264d74..000000000 --- a/PERSISTNCE-PLAN-SQLITE-ONLY.md +++ /dev/null @@ -1,1424 +0,0 @@ -# Persisted Collections + Multi-Tab Query-Driven Sync (SQLite-Only) - -## Summary - -This plan standardizes persistence on SQLite across runtimes and removes raw IndexedDB as a first-class persistence adapter. - -In the browser, persistence is OPFS-only via `wa-sqlite` + `OPFSCoopSyncVFS`, with no SharedWorker requirement. Multi-tab coordination uses Web Locks, Visibility API, and BroadcastChannel. - -Leadership is **per collection** (per table), not global per database. - -`persistedCollectionOptions(...)` infers behavior from the wrapped options: - -1. if wrapped options include `sync`, persistence augments that sync path -2. if wrapped options do not include `sync`, persistence runs sync-absent with SQLite as source of truth - -## Background - -TanStack DB on-demand sync uses `loadSubset(options)` as the choke point for query-driven loading and pagination. Persistence should plug into this same mechanism so: - -- any tab can load from local persistence immediately -- leader tabs handle remote coverage checks when sync is enabled -- tabs receive ordered updates and remain coherent -- persisted indexes mirror collection index creation in user space - -## Locked Decisions - -1. SQLite-only persistence architecture. -2. Browser storage is OPFS-only (`wa-sqlite` + `OPFSCoopSyncVFS`). -3. No SharedWorker requirement in the browser architecture. -4. Leadership is collection-scoped: single writer per collection/table. -5. `persistedCollectionOptions(...)` infers sync-present vs sync-absent behavior from presence of `sync`. -6. Cloudflare Durable Objects SQLite is a supported runtime target. -7. Delete tracking uses per-key tombstone state (one row per deleted key) with monotonic `row_version`. - -## Goals - -1. Local-first `loadSubset` in every runtime. -2. Correct multi-tab behavior with collection-scoped leadership. -3. Fast local reads from SQLite in every tab. -4. Reliable replay ordering via `(term, seq)`. -5. Persisted index parity with TanStack DB index lifecycle. -6. Sync-absent persisted collections with automatic mutation persistence. -7. Runtime coverage for browser, node, RN, Expo, Electron, and Cloudflare Durable Objects. - -## Non-Goals - -1. Raw IndexedDB persistence adapter. -2. SharedWorker-based mandatory architecture. -3. Full SQL pushdown for arbitrary unsupported expressions in v1. -4. Global single-writer guarantee for all tables in one DB file. -5. Perfect index GC/eviction policy in v1. - -## Runtime Scope - -| Runtime | Engine | Notes | -| -------------------------- | -------------------------------- | ------------------------------------------------- | -| Browser | `wa-sqlite` | OPFS + `OPFSCoopSyncVFS`, leader per collection | -| Node | `better-sqlite3` | Reference runtime + CI contract tests | -| React Native | `op-sqlite` | Thin driver over shared core | -| Expo | `op-sqlite` | Thin driver over shared core | -| Electron | `better-sqlite3` in main process | Renderer via IPC | -| Cloudflare Durable Objects | SQLite-backed DO storage | DB executes in-process inside DO; no tab election | - -## High-Level Design - -### 1) `persistedCollectionOptions(...)` Infers Behavior from Wrapped Options - -#### A) `sync` Present in Wrapped Options - -Wrap an existing sync collection and add local SQLite persistence. - -```ts -const tasks = createCollection( - persistedCollectionOptions({ - ...queryCollectionOptions({ - /* existing remote sync */ - }), - persistence: { - adapter: BrowserWASQLiteStorage({ dbName: 'app' }), - coordinator: BrowserCollectionCoordinator({ dbName: 'app' }), - }, - }), -) -``` - -#### B) No `sync` in Wrapped Options - -No wrapped remote sync is required. SQLite persistence is source of truth. - -```ts -const drafts = createCollection( - persistedCollectionOptions({ - id: 'drafts', - getKey: (row) => row.id, - persistence: { - adapter: BrowserWASQLiteStorage({ dbName: 'app' }), - coordinator: BrowserCollectionCoordinator({ dbName: 'app' }), - }, - }), -) -``` - -When `sync` is absent, mutations are automatically persisted (like `localStorageCollectionOptions`) and do not require remote sync. - -### 1.1) TypeScript API Sketch (Inferred Overloads) - -The API should use overloads so mode is inferred at compile-time from whether `sync` exists on wrapped options. - -```ts -type PersistedCollectionPersistence< - T extends object, - TKey extends string | number, -> = { - adapter: PersistenceAdapter - coordinator?: PersistedCollectionCoordinator -} - -type PersistedSyncWrappedOptions< - T extends object, - TKey extends string | number, - TSchema extends StandardSchemaV1 = never, - TUtils extends UtilsRecord = UtilsRecord, -> = CollectionConfig & { - sync: SyncConfig - persistence: PersistedCollectionPersistence -} - -type PersistedLocalOnlyOptions< - T extends object, - TKey extends string | number, - TSchema extends StandardSchemaV1 = never, - TUtils extends UtilsRecord = UtilsRecord, -> = Omit, 'sync'> & { - persistence: PersistedCollectionPersistence -} - -export function persistedCollectionOptions< - T extends object, - TKey extends string | number, - TSchema extends StandardSchemaV1 = never, - TUtils extends UtilsRecord = UtilsRecord, ->( - options: PersistedSyncWrappedOptions, -): CollectionConfig - -export function persistedCollectionOptions< - T extends object, - TKey extends string | number, - TSchema extends StandardSchemaV1 = never, - TUtils extends UtilsRecord = UtilsRecord, ->( - options: PersistedLocalOnlyOptions, -): CollectionConfig -``` - -Runtime rule: - -- `if (options.sync != null)` => sync-present path -- else => sync-absent path -- if `persistence.coordinator` is omitted, use `SingleProcessCoordinator` (intended for DO/node single-process execution) - -Inference edge-case rules (fixed): - -- sync-present requires `options.sync` with callable `sync` function. -- `sync` key present but invalid (`null`, non-object, missing `sync` function) throws `InvalidSyncConfigError`. -- sync-absent path is selected only when `sync` key is not present. -- user-provided `onInsert/onUpdate/onDelete` remain supported in both paths; sync-absent wrappers compose and then persist. - -`PersistedCollectionUtils` should include: - -- `acceptMutations(transaction)` for manual transactions -- optional debug helpers (`getLeadershipState`, `forceReloadSubset`) for tests/devtools - -### 2) Index Lifecycle Mirrors Main-Thread Indexing - -Persisted indexes are created from the same collection index lifecycle as user-space query indexes: - -- manual `collection.createIndex(...)` -- auto indexing (`autoIndex`) - -Required events in `@tanstack/db`: - -- `index:added` -- `index:removed` - -Persistence listens and ensures/removes matching persisted indexes. - -### 3) Storage Backend Options (All SQLite) - -Every backend uses the same logical persistence model (table-per-collection + JSON payloads + expression indexes), but runtime wiring differs. - -#### Browser: `wa-sqlite` + `OPFSCoopSyncVFS` - -- storage: OPFS-only -- coordinator: `BrowserCollectionCoordinator` (Web Locks + Visibility + BroadcastChannel) -- leadership: collection-scoped in-tab election - -Browser capability baseline: - -- Phase 7 (single-tab) requires OPFS with `FileSystemSyncAccessHandle`. -- Phase 8 (multi-tab coordinator) additionally requires Web Locks. -- Target support is evergreen browsers from roughly the last 3 years that satisfy those capabilities. - -##### Browser Coordination (No SharedWorker) - -Election and preference: - -- Web Locks key per collection: - - `tsdb:leader::` -- Web Locks key for SQLite write serialization: - - `tsdb:writer:` -- Visibility API is a preference hint: - - visible tabs should be preferred leaders - - hidden leaders can step down cooperatively - -Visibility handoff protocol: - -- a leader entering hidden state starts `HIDDEN_STEPDOWN_DELAY_MS` (default 5000ms) -- while hidden, it listens for `leader:candidate` announcements from visible tabs -- if a visible contender is observed and delay elapses, current leader releases collection lock -- after handoff, apply `LEADER_HANDOFF_COOLDOWN_MS` (default 3000ms) before trying to re-acquire to prevent thrash - -Messaging: - -- BroadcastChannel namespace per collection: - - `tx` messages with `(term, seq)` and commit metadata - - `rpc` messages for `ensureRemoteSubset`, `ensurePersistedIndex`, `applyLocalMutations` - - `leader` heartbeat/announcement - -Ordering and recovery: - -- each collection stream has ordered `(term, seq)` -- followers track latest `(term, seq)` seen -- followers: - - ignore old terms - - ignore duplicate seq - - trigger catch-up on seq gap via `rpc:pullSince` - - if catch-up fails, fallback to stale-mark + subset reload - -Leadership lifecycle algorithm: - -1. Tab starts collection interest: - -- subscribe to collection channel -- attempt Web Lock acquisition for `tsdb:leader::` - -2. If lock acquired: - -- increment and persist `term` in SQLite metadata (transactional) -- become leader for that collection -- start heartbeat timer - -3. If tab becomes hidden and another visible contender exists: - -- leader may step down cooperatively and release lock - -4. On lock loss or unload: - -- stop sync tasks for that collection -- stop heartbeat -- continue follower read path - -5. Followers watch heartbeat timeout: - -- on timeout, attempt lock acquisition and leadership takeover - -`term` monotonicity requirement: - -- `term` must survive reload/restart and never decrement for a collection. -- leaders read+increment `leader_term` inside a SQLite transaction before emitting heartbeat. - -#### Node - -- storage: local sqlite via `better-sqlite3` -- coordinator: `SingleProcessCoordinator` by default -- common use: tests, server-side execution, tooling - -#### React Native / Expo - -- storage: `op-sqlite` wrappers for RN and Expo -- coordinator: typically `SingleProcessCoordinator` (single process), can be overridden if host adds cross-process sync -- packaging: one shared mobile package with RN/Expo-specific entrypoints only where needed - -#### Electron - -- storage: sqlite in main process -- coordinator: `SingleProcessCoordinator` in main process -- renderer interaction: via IPC bridge only -- packaging: separate electron package that wraps node adapter semantics with IPC transport - -#### Cloudflare Durable Objects (In-Process) - -Cloudflare Durable Objects run as single-threaded stateful actors with attached SQLite-backed storage. For a DO instance: - -- no browser-style leader election is needed -- the DO instance is authoritative writer for its storage -- `loadSubset` and mutation persistence execute directly in-object -- optional upstream sync can still be layered if needed, but sync-absent local persistence is a natural default -- this is an in-runtime execution model (DB + persistence in the same DO process), not a remote persistence adapter pattern - -Example shape inside a DO: - -```ts -export class AppDurableObject extends DurableObject { - private tasks = createCollection( - persistedCollectionOptions({ - id: 'tasks', - getKey: (row) => row.id, - persistence: { - adapter: durableObjectSQLiteAdapter(this.ctx.storage.sql), - // coordinator omitted -> SingleProcessCoordinator - }, - }), - ) -} -``` - -### 4) Collection-Scoped Coordinator - -Coordinator responsibilities per collection: - -- election: one leader per `collectionId` -- ordered broadcast of committed tx (`term`, `seq`) -- RPC: - - `ensureRemoteSubset(collectionId, options)` when `sync` is present - - `ensurePersistedIndex(collectionId, signature, spec)` - - `applyLocalMutations(collectionId, mutations)` when `sync` is absent and follower is not leader - -Tabs do not proxy reads through leaders; each tab reads SQLite directly. - -Runtime note: - -- browser uses `BrowserCollectionCoordinator` (election + BroadcastChannel RPC) -- DO/node single-process execution uses `SingleProcessCoordinator` (no election, no cross-tab RPC) - -Coordinator contract (minimum surface): - -```ts -interface PersistedCollectionCoordinator { - getNodeId(): string - subscribe( - collectionId: string, - onMessage: (message: ProtocolEnvelope) => void, - ): () => void - publish(collectionId: string, message: ProtocolEnvelope): void - isLeader(collectionId: string): boolean - ensureLeadership(collectionId: string): Promise - requestEnsureRemoteSubset?( - collectionId: string, - options: LoadSubsetOptions, - ): Promise - requestEnsurePersistedIndex( - collectionId: string, - signature: string, - spec: PersistedIndexSpec, - ): Promise - requestApplyLocalMutations?( - collectionId: string, - mutations: Array, - ): Promise - pullSince?( - collectionId: string, - fromRowVersion: number, - ): Promise -} -``` - -Coordinator validation rule: - -- wrapper validates required coordinator methods at initialization based on runtime mode. -- browser multi-tab mode requires `requestEnsureRemoteSubset`, `requestApplyLocalMutations`, and `pullSince`. -- single-process coordinators (node/electron/do and browser single-tab) may omit cross-tab RPC helpers. - -### 4.1) Coordinator Protocol (Implementation Draft) - -Message envelope: - -```ts -type ProtocolEnvelope = { - v: 1 - dbName: string - collectionId: string - senderId: string - ts: number - payload: TPayload -} -``` - -Message payloads: - -```ts -type LeaderHeartbeat = { - type: 'leader:heartbeat' - term: number - leaderId: string - latestSeq: number - latestRowVersion: number -} - -type TxCommitted = { - type: 'tx:committed' - term: number - seq: number - txId: string - latestRowVersion: number -} & ( - | { - requiresFullReload: true - } - | { - requiresFullReload: false - changedKeys: Array - deletedKeys: Array - } -) - -type EnsureRemoteSubsetRequest = { - type: 'rpc:ensureRemoteSubset:req' - rpcId: string - options: LoadSubsetOptions -} - -type EnsureRemoteSubsetResponse = - | { - type: 'rpc:ensureRemoteSubset:res' - rpcId: string - ok: true - } - | { - type: 'rpc:ensureRemoteSubset:res' - rpcId: string - ok: false - error: string - } - -type ApplyLocalMutationsRequest = { - type: 'rpc:applyLocalMutations:req' - rpcId: string - envelopeId: string - mutations: Array -} - -type ApplyLocalMutationsResponse = - | { - type: 'rpc:applyLocalMutations:res' - rpcId: string - ok: true - term: number - seq: number - latestRowVersion: number - acceptedMutationIds: Array - } - | { - type: 'rpc:applyLocalMutations:res' - rpcId: string - ok: false - code: 'NOT_LEADER' | 'VALIDATION_ERROR' | 'CONFLICT' | 'TIMEOUT' - error: string - } - -type PullSinceRequest = { - type: 'rpc:pullSince:req' - rpcId: string - fromRowVersion: number -} - -type PullSinceResponse = - | { - type: 'rpc:pullSince:res' - rpcId: string - ok: true - latestTerm: number - latestSeq: number - latestRowVersion: number - requiresFullReload: true - } - | { - type: 'rpc:pullSince:res' - rpcId: string - ok: true - latestTerm: number - latestSeq: number - latestRowVersion: number - requiresFullReload: false - changedKeys: Array - deletedKeys: Array - } - | { - type: 'rpc:pullSince:res' - rpcId: string - ok: false - error: string - } - -type CollectionReset = { - type: 'collection:reset' - schemaVersion: number - resetEpoch: number -} -``` - -Idempotency rules: - -- `tx:committed` idempotency key: `(collectionId, term, seq)` -- local mutation idempotency key: `envelopeId` -- mutation acknowledgment/correlation key: `mutationId` (per mutation inside an envelope) -- RPC response correlation key: `rpcId` -- `applyLocalMutations` is at-least-once delivery; leader must dedupe by `envelopeId` -- catch-up cursor key: `latestRowVersion` (monotonic per collection) -- followers persist `lastSeenRowVersion` from applied `tx:committed` messages and successful `pullSince` responses - -Recommended browser defaults: - -- heartbeat interval: 2000ms -- leader timeout: 6000ms -- RPC timeout: 5000ms -- local mutation retry backoff: 100ms → 2000ms capped exponential -- all timing knobs should be configurable per collection (advanced option) - -## Key Mechanics - -### A) Writer Ownership - -- logical single writer per collection/table at a time -- different tabs can lead different collections simultaneously -- followers do not write that collection directly in browser mode -- follower writes are routed to current leader for serialization - -SQLite write-lock note: - -- SQLite still permits one write transaction at a time per database file. -- collection leaders therefore coordinate through `tsdb:writer:` before write transactions. -- this keeps per-collection leadership for ownership, while serializing physical DB writes to avoid `SQLITE_BUSY` thrash. - -### A.1) Commit + Broadcast Ordering - -Leader commit pipeline for a collection change: - -1. acquire DB writer lock (`tsdb:writer:`) -2. begin SQLite transaction -3. increment collection `latest_row_version` and stamp touched rows with that version -4. apply row and index changes -5. for deletes, insert/update tombstone records with same `row_version` -6. insert idempotency marker in `applied_tx(collection_id, term, seq, applied_at)` -7. read updated `latest_row_version` for broadcast -8. commit SQLite transaction -9. release DB writer lock -10. broadcast `tx:committed(term, seq, latestRowVersion, ...)` - -Delete tracking note: - -- tombstones are the delete source for `pullSince` key-level catch-up. -- tombstones are stateful per key (latest delete only), not append-only history. - -Recovery rule: - -- if commit succeeds but broadcast is missed, followers detect stale `latestSeq` via heartbeat and call `pullSince`. - -### A.2) Subset Invalidation Contract - -Followers maintain an in-memory registry of active loaded subsets per collection. - -Default: - -- `TARGETED_INVALIDATION_KEY_LIMIT = 128` - -On `tx:committed`: - -1. if `requiresFullReload` is true: - -- mark all active subsets for that collection dirty -- schedule debounced reload from local SQLite - -2. else if `changedKeys`/`deletedKeys` present and combined count <= `TARGETED_INVALIDATION_KEY_LIMIT`: - -- refresh only subsets that may contain those keys - -3. else: - -- mark all active subsets for that collection dirty -- schedule debounced reload from local SQLite - -This removes ambiguity around follower refresh behavior while keeping correctness first. - -### B) `loadSubset` Flow by Inferred Behavior - -#### When `sync` Is Present - -1. query local SQLite immediately -2. apply local rows -3. request leader `ensureRemoteSubset(...)` (online path) -4. leader syncs/writes/broadcasts commits -5. tabs refresh from SQLite on broadcast - -#### When `sync` Is Absent - -1. query local SQLite immediately -2. apply local rows -3. no remote ensure call -4. tab refresh remains local/broadcast-driven only - -### C) Hydrate Barrier (Both Modes) - -Problem: updates can arrive during local hydrate. - -Wrapper state per collection: - -- `isHydrating: boolean` -- `queuedTx: PersistedTx[]` -- `applyMutex` serializing write/apply - -Scope: - -- hydrate barrier is collection-scoped (not per-subset) because transactions can affect any active subset in that collection. - -Algorithm: - -1. `loadSubset` sets `isHydrating = true` -2. query cached rows from SQLite -3. apply local rows via `write({ type: 'update', ... })` -4. set `isHydrating = false` -5. flush queued tx in order - -### D) Duplicate-Key Safety (Sync-Present Path) - -To avoid `DuplicateKeySyncError` when cache overlaps remote snapshot: - -- local hydrate uses `update` only (never `insert`) -- remote `insert` payloads are normalized to `update` before DB `write` - -### E) Sync-Absent Mutation Persistence - -When `sync` is absent, mutation changes persist automatically, aligned with `localStorageCollectionOptions` behavior. - -`PersistedMutationEnvelope` shape: - -```ts -type PersistedMutationEnvelope = - | { - mutationId: string - type: 'insert' - key: string | number - value: Record - } - | { - mutationId: string - type: 'update' - key: string | number - value: Record - } - | { - mutationId: string - type: 'delete' - key: string | number - value: Record - } -``` - -- wrap `onInsert`, `onUpdate`, `onDelete` to persist SQLite changes automatically -- confirm optimistic operations through sync-confirm path after persistence -- for manual transactions, expose and use `utils.acceptMutations(transaction)` -- in browser multi-tab, non-leader tabs send local mutations to leader via `applyLocalMutations` -- leader must reply with `applyLocalMutations:res` so follower can confirm or rollback optimistic entries - -### F) Offline/Online Behavior - -- when `sync` is present: - - offline `loadSubset` resolves locally - - queued `ensureRemoteSubset` replays when online -- when `sync` is absent: - - unaffected by network state - -### G) Seq Gap Recovery - -On missing `(term, seq)`: - -1. use follower-tracked `lastSeenRowVersion` (from last applied commit or pull response) and request `pullSince(lastSeenRowVersion)` from current leader -2. if pull succeeds and `requiresFullReload` is true, mark collection subsets dirty -3. if pull succeeds with `changedKeys`/`deletedKeys`, run targeted subset invalidation -4. reload affected subsets from local SQLite (or all active subsets when required) -5. if pull fails, mark view stale and truncate/reload affected in-memory view -6. re-request loaded subsets -7. re-run remote ensure only when `sync` is present - -`pullSince` implementation rule: - -- `changedKeys` are derived from `c_` rows where `row_version > fromRowVersion` -- `deletedKeys` are derived from tombstones `t_` where `row_version > fromRowVersion` -- this computes a delta to latest state (not a full linear event history) -- if either result set exceeds invalidation limits, set `requiresFullReload: true` - -## SQLite Storage + Index Plan - -### Schema (Per Collection) - -Single table per collection: - -- `key` stored as canonical encoded text key (`s:` or `n:`) to preserve `1` vs `'1'` distinction -- `key` TEXT PRIMARY KEY -- `value` JSON string in `TEXT` -- `row_version` INTEGER NOT NULL (monotonic change version stamped by leader; per-transaction watermark shared by all rows touched in one committed tx) -- tombstone table per collection tracks latest delete state per key with row versions (`t_`) -- tombstone `deleted_at` stores deletion timestamp for diagnostics/observability; catch-up logic uses `row_version` - -Key encoding helpers (required): - -```ts -function encodeStorageKey(key: string | number): string { - if (typeof key === 'number') { - if (!Number.isFinite(key)) { - throw new Error('Invalid numeric key: key must be finite') - } - if (Object.is(key, -0)) { - return 'n:-0' - } - return `n:${key}` - } - return `s:${key}` -} - -function decodeStorageKey(encoded: string): string | number { - if (encoded === 'n:-0') { - return -0 - } - return encoded.startsWith('n:') ? Number(encoded.slice(2)) : encoded.slice(2) -} -``` - -Metadata tables: - -- `persisted_index_registry(collection_id, signature, sql, state, last_built_at, last_used_at)` -- `applied_tx(collection_id, term, seq, applied_at)` -- `collection_version(collection_id, latest_row_version)` for catch-up cursor -- `leader_term(collection_id, term, leader_id, updated_at)` for durable term monotonicity -- `schema_version(collection_id, version)` for clear-on-version-change behavior -- `collection_reset_epoch(collection_id, epoch)` for coordinated clear/reload signaling -- `collection_registry(collection_id, table_name)` for safe identifier mapping - -Identifier safety requirement: - -- never interpolate raw `collectionId` into SQL identifiers -- map `collectionId` to safe physical table names using hashed names (for example `c_`) -- store mapping in `collection_registry` - -Reference DDL: - -```sql -CREATE TABLE IF NOT EXISTS c_ ( - key TEXT PRIMARY KEY NOT NULL, - value TEXT NOT NULL, - row_version INTEGER NOT NULL -); - -CREATE TABLE IF NOT EXISTS t_ ( - key TEXT PRIMARY KEY NOT NULL, - row_version INTEGER NOT NULL, - deleted_at INTEGER NOT NULL -); - -CREATE TABLE IF NOT EXISTS collection_registry ( - collection_id TEXT PRIMARY KEY NOT NULL, - table_name TEXT UNIQUE NOT NULL -); - -CREATE TABLE IF NOT EXISTS persisted_index_registry ( - collection_id TEXT NOT NULL, - signature TEXT NOT NULL, - sql TEXT NOT NULL, - state TEXT NOT NULL, - last_built_at INTEGER, - last_used_at INTEGER, - PRIMARY KEY (collection_id, signature) -); - -CREATE TABLE IF NOT EXISTS applied_tx ( - collection_id TEXT NOT NULL, - term INTEGER NOT NULL, - seq INTEGER NOT NULL, - applied_at INTEGER NOT NULL, - PRIMARY KEY (collection_id, term, seq) -); - -CREATE TABLE IF NOT EXISTS collection_version ( - collection_id TEXT PRIMARY KEY NOT NULL, - latest_row_version INTEGER NOT NULL -); - -CREATE TABLE IF NOT EXISTS leader_term ( - collection_id TEXT PRIMARY KEY NOT NULL, - term INTEGER NOT NULL, - leader_id TEXT NOT NULL, - updated_at INTEGER NOT NULL -); - -CREATE TABLE IF NOT EXISTS schema_version ( - collection_id TEXT PRIMARY KEY NOT NULL, - version INTEGER NOT NULL -); - -CREATE TABLE IF NOT EXISTS collection_reset_epoch ( - collection_id TEXT PRIMARY KEY NOT NULL, - epoch INTEGER NOT NULL -); -``` - -### Persisted Index Signatures - -Main-thread `indexId` is not stable across tabs. Use stable signature: - -- `signature = hash(stableStringify({ expression, compareOptions, direction, nulls, stringSort, locale, ... }))` - -### Expression Indexes - -Indexes are created on demand from mirrored index specs, for example: - -- `CREATE INDEX IF NOT EXISTS idx__ ON c_(json_extract(value,'$.path'))` -- compound indexes use multiple expressions -- date/datetime predicates can use expression indexes over canonical extracted values (for example `datetime(json_extract(value,'$.dueAt'))`) - -`ensureIndex(...)` compiles index IR/spec to canonical SQL expression text for reliable planner usage. - -Reference query templates: - -```sql --- Increment and read collection row version (inside txn) -INSERT INTO collection_version(collection_id, latest_row_version) -VALUES (?, 1) -ON CONFLICT(collection_id) DO UPDATE SET latest_row_version = latest_row_version + 1; - -SELECT latest_row_version FROM collection_version WHERE collection_id = ?; - --- Upsert row -INSERT INTO c_(key, value, row_version) -VALUES (?, ?, ?) -ON CONFLICT(key) DO UPDATE SET - value = excluded.value, - row_version = excluded.row_version; - --- Clear tombstone on re-insert/update -DELETE FROM t_ WHERE key = ?; - --- Delete row -DELETE FROM c_ WHERE key = ?; - --- Upsert tombstone for delete tracking -INSERT INTO t_(key, row_version, deleted_at) -VALUES (?, ?, ?) -ON CONFLICT(key) DO UPDATE SET - row_version = excluded.row_version, - deleted_at = excluded.deleted_at; - --- Mark tx applied -INSERT OR IGNORE INTO applied_tx(collection_id, term, seq, applied_at) -VALUES (?, ?, ?, ?); -``` - -### Metadata Retention / Cleanup - -To prevent unbounded metadata growth: - -- `applied_tx`: keep sliding window per collection by seq/time. -- tombstones (`t_`) are per-key latest-delete state and are not version-pruned. -- tombstones are removed when the key is re-inserted/updated (same transaction as row upsert). - -Defaults: - -- `APPLIED_TX_SEQ_RETENTION = 10000` -- `APPLIED_TX_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000` - -### Partial Updates and Index Maintenance - -Updates may be partial (`rowUpdateMode: 'partial'` default). - -Adapters must: - -- read current row -- merge partial update before persist -- compute index old/new values from pre-merge and post-merge rows - -If `rowUpdateMode: 'full'` is configured, adapters can skip read/merge and write replacement rows. - -### Schema Version Policy (No Migrations) - -This plan does not implement structural schema migrations. - -Collection options include `persistence.schemaVersion: number`. - -Behavior on version mismatch: - -- sync-present path: - - default action: coordinated clear persisted state for that collection (rows + indexes + metadata), then rehydrate from remote sync -- sync-absent path: - - default action: throw `PersistenceSchemaVersionMismatchError` - - optional opt-in: allow clear and restart with empty local state - -Coordinated clear sequence (sync-present path): - -1. acquire `tsdb:writer:` - -- note: this serializes writes across the DB file, so schema reset briefly blocks writes for all collections - -2. begin SQLite transaction -3. clear collection rows/tombstones/index metadata -4. reset collection cursor in `collection_version` (delete row or set `latest_row_version = 0`) -5. update `schema_version` -6. increment `reset_epoch` -7. commit transaction -8. broadcast `collection:reset(schemaVersion, resetEpoch)` - -Follower behavior on `collection:reset`: - -- reset tracked `lastSeenRowVersion` for that collection to `0` -- drop in-memory rows for that collection -- clear active subset cache -- re-request loaded subsets - -Guidance for sync-absent collections: - -- prefer additive/backward-compatible schema changes with value-level fallbacks -- because values are JSON payloads, additive evolution is expected to be the common safe path - -### `loadSubset` Query Planning - -v1 pushdown support: - -- `eq`, `in`, `gt/gte/lt/lte`, `like` -- logical composition with both `AND` and `OR` (push down when each branch is pushdown-safe; otherwise fallback) -- `IN` is required in v1 because query-engine incremental join loading depends on it - - handle empty, single, and large `IN` lists correctly - - chunk very large lists to respect SQLite parameter limits when needed -- date/datetime comparisons on JSON fields serialized as canonical ISO-8601 UTC strings - - planner may use canonical string comparison where valid - - planner may compile to SQLite date functions (`datetime`, `strftime`) when normalization is required -- index-aligned `orderBy` - -Unsupported predicate fragments load a superset; query engine filters remainder. - -## Adapter Interfaces - -`PersistedTx` (used by `applyCommittedTx`) shape: - -```ts -type PersistedTx = { - txId: string - term: number - seq: number - rowVersion: number - mutations: Array< - | { type: 'insert'; key: TKey; value: T } - | { type: 'update'; key: TKey; value: T } - | { type: 'delete'; key: TKey; value: T } - > -} -``` - -### Persistence Adapter - -```ts -export interface PersistenceAdapter< - T extends object, - TKey extends string | number, -> { - // Read path (all tabs / all runtimes) - loadSubset( - collectionId: string, - options: LoadSubsetOptions, - ctx?: { requiredIndexSignatures?: string[] }, - ): Promise> - - // Write path (leader for this collection, or DO instance) - applyCommittedTx( - collectionId: string, - tx: PersistedTx, - ): Promise - - // Index management - ensureIndex( - collectionId: string, - signature: string, - spec: PersistedIndexSpec, - ): Promise - - // Optional: some adapters handle index cleanup lazily or via collection reset flows. - markIndexRemoved?(collectionId: string, signature: string): Promise -} -``` - -`PersistedIndexSpec` must be serializable and derived from index lifecycle events. - -### SQLite Driver Interface - -```ts -export interface SQLiteDriver { - exec(sql: string): Promise - query(sql: string, params?: readonly unknown[]): Promise - run(sql: string, params?: readonly unknown[]): Promise - transaction(fn: () => Promise): Promise -} -``` - -Driver adaptation note: - -- sync drivers (for example `better-sqlite3`) are adapted via thin `Promise.resolve(...)` wrappers. -- this keeps one core async adapter path across runtimes; sync overhead is accepted for API consistency in v1. - -## Package Plan - -1. `@tanstack/db-sqlite-persisted-collection-core` -2. `@tanstack/db-browser-wa-sqlite-persisted-collection` -3. `@tanstack/db-node-sqlite-persisted-collection` -4. `@tanstack/db-react-native-sqlite-persisted-collection` (RN + Expo) -5. `@tanstack/db-electron-sqlite-persisted-collection` -6. `@tanstack/db-cloudflare-do-sqlite-persisted-collection` - -SQLite core package contents (combined): - -- `persistedCollectionOptions(...)` with inferred behavior based on presence of `sync` -- stable signature/hash utilities -- coordinator protocol types -- sync-absent mutation persistence helpers (`acceptMutations` flow) -- shared `SQLiteCoreAdapter(driver)` -- SQL expression compiler for index/query pushdown -- index registry management -- in-memory adapter + in-memory coordinator for unit tests - -Future packaging note: - -- if a non-SQLite backend is introduced later, split backend-agnostic surface out of this package at that time. - -Cloudflare DO package contents: - -- adapter binding to DO SQLite-backed storage APIs (for code executing inside DO) -- DO-friendly wrapper that defaults to `SingleProcessCoordinator` and omits browser election paths -- optional helper for mapping `collectionId` to table naming and schema-version handling - -Electron package contents: - -- thin wrapper over node sqlite package semantics -- IPC transport between renderer calls and main-process persistence execution -- does not duplicate node adapter/core logic; reuses node package implementation behind the IPC boundary - -## Implementation Phases - -### Phase 0: API + Runtime Feasibility - -1. Finalize `persistedCollectionOptions` inference API (`sync` present vs absent). -2. Confirm Cloudflare DO adapter surface and runtime constraints. -3. Finalize coordinator protocol (`rpc`, `tx`, `leader`, `(term, seq)`), with browser multi-tab parts phase-gated. -4. Finalize key encoding and identifier hashing rules. -5. Finalize package boundaries around SQLite-only core. -6. Define staged rollout gates (single-process first, browser multi-tab last). - -Deliverable: finalized API, package plan, capability matrix, and protocol spec. - -### Phase 1: Add Index Lifecycle Events to `@tanstack/db` - -1. Extend collection events with: - -- `index:added` -- `index:removed` - -2. Update `CollectionIndexesManager` to emit stable index metadata. -3. Add index removal API (`removeIndex(...)`) and emit `index:removed`. - -Deliverable: index lifecycle observable and stable across tabs. - -### Phase 2: Core Persisted Wrapper (Inferred Behavior) - -1. Implement `sync`-present wrapper over `sync.sync(params)`. -2. Implement sync-absent behavior without required wrapped sync. -3. Add hydrate barrier + queued tx behavior. -4. Normalize remote inserts to updates (when `sync` is present). -5. Implement automatic mutation persistence wrappers (when `sync` is absent). -6. Add `utils.acceptMutations(transaction)` support for manual transactions. -7. Wire coordinator RPC (`ensureRemoteSubset`, `ensurePersistedIndex`, `applyLocalMutations`). -8. Implement seq-gap recovery path. -9. Implement inference edge-case validation (`InvalidSyncConfigError`). - -Deliverable: core wrapper passes in-memory tests for both inferred paths. - -### Phase 3: SQLite Core Adapter - -1. Implement `applyCommittedTx`, `ensureIndex`, `loadSubset` SQL pushdown (`eq`, `in`, range, `like`, `AND`, `OR`, date/datetime predicates). -2. Implement partial update merge semantics. -3. Implement `leader_term`, `schema_version`, and identifier registry tables. -4. Implement schema-version mismatch behavior (clear vs error by path). -5. Implement applied_tx pruning jobs. -6. Add adapter contract tests in node sqlite runtime. - -Deliverable: SQLite adapter contract passing in node. - -### Phase 4: Node + Electron - -1. Implement node wrapper over `better-sqlite3`. -2. Implement electron main-process ownership + renderer IPC over `better-sqlite3`. -3. Run shared contract/integration suites. - -Deliverable: node/electron parity with core semantics. - -### Phase 5: React Native + Expo - -1. Implement shared mobile package over `op-sqlite`. -2. Provide RN/Expo-specific entrypoints only where host bootstrapping differs. -3. Validate mobile lifecycle and transaction semantics on both RN and Expo. - -Deliverable: unified RN/Expo mobile package passes contract tests. - -### Phase 6: Cloudflare Durable Objects - -1. Implement DO SQLite adapter package. -2. Provide helper for per-object schema initialization and schema-version checks. -3. Support both inferred wrapper paths inside DO runtime (`sync` present or absent), with in-process execution only. -4. Add integration tests using Workers/DO test harness. - -Deliverable: DB and persistence running in-process in Durable Objects with SQLite-backed storage. - -### Phase 7: Browser Single-Tab (`wa-sqlite`, No Election) - -1. Implement OPFS driver (`OPFSCoopSyncVFS`). -2. Implement browser adapter path with `SingleProcessCoordinator` semantics for single-tab usage. -3. Validate offline-first read/write path without BroadcastChannel/Web Locks dependencies. -4. Add browser single-tab integration tests. - -Deliverable: stable browser persistence for single-tab sessions. - -### Phase 8: Browser Multi-Tab Coordinator (Final Phase) - -1. Implement Web Locks + Visibility + BroadcastChannel coordinator. -2. Implement per-collection leader/follower behavior for both inferred paths. -3. Implement follower local mutation RPC to leader with ack/rollback semantics. -4. Implement DB write serialization lock (`tsdb:writer:`) and busy retry policy. -5. Add Playwright multi-tab tests. - -Deliverable: stable browser local-first multi-tab behavior when `sync` is present or absent. - -## Testing Strategy - -### Unit Tests (Core Wrapper) - -1. Index lifecycle: - -- `createIndex` emits `index:added` with stable signature -- `removeIndex` emits `index:removed` - -2. Local hydrate safety: - -- hydrate uses `update` only -- remote inserts normalized to update - -3. Hydrate barrier: - -- tx during hydrate is queued then flushed in order - -4. Sync-present offline/online queue: - -- offline local resolve -- queued remote ensures replay online - -5. Sync-absent mutation persistence: - -- insert/update/delete auto-persist -- manual transaction `acceptMutations` persists and confirms - -6. Seq-gap recovery: - -- missing seq triggers `pullSince`; fallback to stale/reload/re-ensure - -7. Inference validation: - -- invalid `sync` shape throws `InvalidSyncConfigError` - -8. Key encoding: - -- `1` and `'1'` persist distinctly and round-trip correctly - -9. Local mutation acking: - -- `applyLocalMutations:res.acceptedMutationIds` maps to submitted `mutationId`s - -### Adapter Contract Tests - -Run same suite against: - -- in-memory adapter -- browser `wa-sqlite` adapter -- node sqlite adapter -- electron wrapper (`better-sqlite3`) and unified mobile wrapper (`op-sqlite`) where harness supports -- cloudflare durable object sqlite adapter - -Covers: - -- `ensureIndex` + `loadSubset` index-path usage -- pushdown parity for `AND`/`OR`, `IN` (including empty/single/large lists), `LIKE`, and date/datetime comparisons -- `applyCommittedTx` row/index correctness -- idempotency and replay handling on `(term, seq)` -- monotonic `row_version` behavior and `pullSince` cursor correctness -- `pullSince` discriminated response shape correctness (`requiresFullReload=true` returns no key lists) -- tombstone-based delete catch-up correctness -- per-key tombstone state semantics (latest delete only) correctness -- applied_tx pruning does not break row-version catch-up correctness -- schema reset clears `collection_version` cursor and follower resets tracked `lastSeenRowVersion` to `0` -- sync-absent auto-persist semantics -- schema-version mismatch behavior (clear vs error by path) -- identifier safety mapping (unsafe collectionId still produces safe physical table names) - -### Browser Single-Tab Integration Tests (Phase 7) - -1. OPFS-backed init and reopen behavior. -2. Local-first `loadSubset` and mutation persistence correctness. -3. Sync-present offline local path and reconnect replay without leader election. -4. No dependency on BroadcastChannel/Web Locks for correctness in single-tab mode. - -### Browser Multi-Tab Integration Tests (Playwright, Phase 8) - -1. Two tabs with different collection leaders: - -- tab A leads collection X -- tab B leads collection Y - -2. Local reads do not round-trip through leader. -3. Sync-absent follower mutation is serialized via leader and persisted. -4. Auto-index creates persisted index and speeds repeated lookups. -5. Leader handoff on visibility change / tab close. -6. Sync-present offline local-first and reconnect catch-up. -7. Cross-collection leaders contend for DB writes without correctness loss (`tsdb:writer` lock test). -8. Commit-broadcast gap recovers via heartbeat `latestSeq` + `pullSince`. - -### Cloudflare Durable Objects Integration Tests - -1. Schema init + schema-version mismatch behavior per DO instance. -2. `loadSubset` + index pushdown correctness. -3. Sync-absent mutation persistence correctness in DO runtime. -4. Restart/rehydration behavior with persisted SQLite state. -5. No browser coordinator path in DO (`SingleProcessCoordinator` only). - -### Corruption Recovery Tests - -1. Corrupted sqlite open path triggers integrity failure handling. -2. Sync-present path clears persistence and rehydrates from remote. -3. Sync-absent path raises `PersistenceCorruptionError` unless explicit reset is requested. - -## Agent Guard Rails (Implementation + Testing) - -These are mandatory rules for agents implementing this plan. - -1. No implementation step is complete without tests in the same change set. - -- bug fixes must include a regression test -- new behavior must include positive and negative-path coverage - -2. Do not progress to the next phase until the current phase exit criteria and tests are green. - -- phase completion requires local pass and CI pass for the phase test scope - -3. Operator support must be proven on both paths: - -- pushdown path (SQL execution) -- fallback path (superset load + in-memory filtering) -- applies to `IN`, `AND`, `OR`, `LIKE`, and date/datetime predicates - -4. `IN` is a v1 hard requirement because incremental join loading depends on it. - -- test `IN` with empty lists, single value lists, and large lists -- test parameter chunking behavior for large lists against SQLite parameter limits - -5. Date/datetime support requires canonical serialization and deterministic tests. - -- JSON date values must use canonical ISO-8601 UTC strings -- include timezone/offset boundary tests -- test both lexical comparison mode and SQLite date-function mode when normalization is required - -6. Any change to ordering, leadership, mutation routing, or replay must include failure-path tests. - -- dropped broadcast handling -- heartbeat timeout and takeover -- leader stepdown/lock loss -- retry/idempotency behavior for mutation RPC - -7. Cross-runtime parity is required for shared behavior. - -- if behavior is intended to be shared, contract tests must pass across supported adapters -- runtime-specific deviations must be documented and explicitly tested - -8. Schema safety and recovery semantics are non-optional. - -- sync-present mismatch path must prove clear + rehydrate behavior -- sync-absent mismatch path must prove explicit error behavior (unless opt-in reset path is enabled) - -9. Never loosen correctness for optimization without equivalence coverage. - -- any pushdown/performance optimization must include query-equivalence tests against fallback behavior - -## Failure Modes and Handling - -1. OPFS unavailable in browser: - -- when `sync` is absent: throw `PersistenceUnavailableError` at initialization -- when `sync` is present: default to disabling persistence for session and run remote sync path only -- expose capability/error to application so users can decide whether to hard-fail UI - -2. Invalid inferred sync config: - -- if `sync` key exists but is not a valid `SyncConfig`, throw `InvalidSyncConfigError` - -3. No current leader for a collection in browser: - -- local `loadSubset` still reads SQLite -- queue/timeout remote ensure or local-mutation RPC until election completes - -4. Leader crash or tab close: - -- Web Lock releases -- follower acquires leadership and resumes responsibilities - -5. Broadcast gap: - -- follower triggers collection recovery -- attempt `pullSince` catch-up first -- fallback to reload local subset and re-ensure when `sync` is present - -6. Durable Object instance restart: - -- in-memory state is rebuilt from persistent SQLite storage -- schema-version checks and clear/error policy run on initialization path - -7. Coordinated schema reset while tabs are active: - -- leader broadcasts `collection:reset` -- followers drop in-memory cache for that collection and reload subsets - -8. SQLite corruption / integrity failure: - -- detect on open/init (initial query failure or optional integrity check path) -- sync-present: clear persisted state and rehydrate from remote -- sync-absent: throw `PersistenceCorruptionError` and require explicit user reset -- expose `resetPersistence({ collectionId })` utility for app-level recovery - -## Risks and Mitigations - -1. Risk: browser differences in OPFS/Web Locks/visibility behavior. - Mitigation: capability matrix + conservative fallback behavior. - -2. Risk: cross-collection write contention causes `SQLITE_BUSY`. - Mitigation: serialize physical writes via `tsdb:writer:` + bounded retry/backoff. - -3. Risk: WASM startup overhead. - Mitigation: lazy init + connection reuse per tab. - -4. Risk: SQL pushdown mismatch vs query-engine semantics. - Mitigation: equivalence tests + fallback filtering for unsupported fragments. - -5. Risk: driver divergence across runtimes. - Mitigation: strict adapter contract suite and minimal driver interface. - -6. Risk: sync-absent follower mutation queuing during leader churn. - Mitigation: durable RPC retry/backoff and idempotent mutation envelopes. - -## Implementation Readiness Checklist - -1. API: - -- overload signatures compile and infer correctly for `sync` present/absent -- runtime branch matches compile-time discrimination (`options.sync != null`) - -2. Core semantics: - -- hydrate barrier + queued tx ordering implemented -- insert-to-update normalization implemented for sync-present path -- sync-absent auto-persist wrappers implemented - -3. Coordinator: - -- lock acquisition, heartbeat, timeout, and stepdown logic implemented -- protocol envelope and RPC correlation/idempotency implemented -- heartbeat carries `latestSeq` and followers perform `pullSince` catch-up - -4. SQLite adapter: - -- DDL initialization and schema-version checks implemented -- key encoding/decoding preserves string vs number identity -- identifier hashing/mapping prevents unsafe SQL identifiers -- pushdown planner + fallback filtering implemented -- applied tx idempotency table enforced -- tombstone per-key delete-state tracking implemented -- durable `leader_term` monotonicity and schema-version policy implemented -- corruption detection and reset utility implemented - -5. Runtime adapters: - -- browser OPFS adapter passes single-tab integration tests (Phase 7) -- browser multi-tab coordinator/election tests pass (Phase 8) -- node/electron/mobile (rn+expo) adapters passing contract suite -- cloudflare DO adapter passing integration suite - -6. Test coverage: - -- unit + contract + browser integration + DO integration green in CI - -## Open Decisions - -1. Electron renderer read policy: direct read vs strict main-process proxy. -2. Whether `ensureRemoteSubset` is always background or optionally awaited. - -Blocking-before-implementation: - -- none (runtime driver choices and package shape are fixed in this plan: Node/Electron `better-sqlite3`, `@tanstack/db-react-native-sqlite-persisted-collection` for RN/Expo via `op-sqlite`) - -Blocking-before-browser phases: - -- Phase 7: verify OPFS + `FileSystemSyncAccessHandle` in target evergreen browsers. -- Phase 8: verify Web Locks in the same target browsers. - -Non-blocking (can be phased after initial implementation): - -- electron renderer read policy refinements -- awaited vs background `ensureRemoteSubset` behavior toggle - -## Notes and Implications - -1. First-time index build has unavoidable cost; subsequent indexed reads are fast. -2. Local performance depends on index coverage; use `autoIndex` or explicit `createIndex(...)` on hot paths. -3. Reads never round-trip through leader; leader handles write serialization and sync responsibilities. -4. Sync-absent usage provides a persistence-first option without requiring remote sync wiring. -5. `loadSubset` currently returns materialized arrays; cursor/streaming read API can be explored after v1. diff --git a/eslint.config.js b/eslint.config.js index 934ff92d0..34cfc4c5e 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -10,10 +10,10 @@ export default [ `**/traildepot/**`, `examples/angular/**`, `packages/db-collection-e2e/vite.config.ts`, - `packages/db-capacitor-sqlite-persisted-collection/e2e/app/android/**`, - `packages/db-capacitor-sqlite-persisted-collection/e2e/app/ios/**`, + `packages/capacitor-db-sqlite-persistence/e2e/app/android/**`, + `packages/capacitor-db-sqlite-persistence/e2e/app/ios/**`, // Expo expects Metro config in CommonJS format. - `packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/metro.config.js`, + `packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/metro.config.js`, ], }, { diff --git a/examples/electron/offline-first/electron/main.ts b/examples/electron/offline-first/electron/main.ts index b4cc574ca..f397934d2 100644 --- a/examples/electron/offline-first/electron/main.ts +++ b/examples/electron/offline-first/electron/main.ts @@ -2,8 +2,8 @@ import path from 'node:path' import { fileURLToPath } from 'node:url' import { BrowserWindow, Menu, app, ipcMain } from 'electron' import Database from 'better-sqlite3' -import { createNodeSQLitePersistence } from '@tanstack/db-node-sqlite-persisted-collection' -import { exposeElectronSQLitePersistence } from '@tanstack/db-electron-sqlite-persisted-collection' +import { createNodeSQLitePersistence } from '@tanstack/node-db-sqlite-persistence' +import { exposeElectronSQLitePersistence } from '@tanstack/electron-db-sqlite-persistence' const __dirname = path.dirname(fileURLToPath(import.meta.url)) diff --git a/examples/electron/offline-first/package.json b/examples/electron/offline-first/package.json index 8fdc35c2c..57d66a055 100644 --- a/examples/electron/offline-first/package.json +++ b/examples/electron/offline-first/package.json @@ -13,8 +13,8 @@ "postinstall": "prebuild-install --runtime electron --target 40.2.1 --arch arm64 || echo 'prebuild-install failed, try: npx @electron/rebuild'" }, "dependencies": { - "@tanstack/db-electron-sqlite-persisted-collection": "workspace:*", - "@tanstack/db-node-sqlite-persisted-collection": "workspace:*", + "@tanstack/electron-db-sqlite-persistence": "workspace:*", + "@tanstack/node-db-sqlite-persistence": "workspace:*", "@tanstack/offline-transactions": "workspace:*", "@tanstack/query-db-collection": "workspace:*", "@tanstack/react-db": "workspace:*", diff --git a/examples/electron/offline-first/src/db/todos.ts b/examples/electron/offline-first/src/db/todos.ts index e8cdc6513..4a9aa3eb5 100644 --- a/examples/electron/offline-first/src/db/todos.ts +++ b/examples/electron/offline-first/src/db/todos.ts @@ -5,7 +5,7 @@ import { ElectronCollectionCoordinator, createElectronSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-electron-sqlite-persisted-collection' +} from '@tanstack/electron-db-sqlite-persistence' import { z } from 'zod' import { queryClient } from '../utils/queryClient' import type { StorageAdapter } from '@tanstack/offline-transactions' diff --git a/examples/react-native/offline-transactions/metro.config.js b/examples/react-native/offline-transactions/metro.config.js index 18b7c545c..c3c403143 100644 --- a/examples/react-native/offline-transactions/metro.config.js +++ b/examples/react-native/offline-transactions/metro.config.js @@ -51,15 +51,9 @@ config.resolver.resolveRequest = (context, moduleName, platform) => { ) } -// Force singleton packages to resolve from the app's local node_modules -config.resolver.extraNodeModules = new Proxy(singletonPaths, { - get: (target, name) => { - if (target[name]) { - return target[name] - } - return path.resolve(localNodeModules, name) - }, -}) +// Only singleton packages need explicit remapping. Let Metro resolve all other +// transitive dependencies from the package that requested them. +config.resolver.extraNodeModules = singletonPaths // Block react-native 0.83 from root node_modules const escMonorepoRoot = monorepoRoot.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') diff --git a/examples/react-native/offline-transactions/package.json b/examples/react-native/offline-transactions/package.json index a378784cd..aace07ae9 100644 --- a/examples/react-native/offline-transactions/package.json +++ b/examples/react-native/offline-transactions/package.json @@ -16,10 +16,10 @@ "@react-native-async-storage/async-storage": "2.1.2", "@react-native-community/netinfo": "11.4.1", "@tanstack/db": "workspace:*", - "@tanstack/db-react-native-sqlite-persisted-collection": "workspace:*", "@tanstack/offline-transactions": "^1.0.24", "@tanstack/query-db-collection": "^1.0.30", "@tanstack/react-db": "^0.1.77", + "@tanstack/react-native-db-sqlite-persistence": "workspace:*", "@tanstack/react-query": "^5.90.20", "expo": "~53.0.26", "expo-constants": "~17.1.0", @@ -31,6 +31,7 @@ "react-native": "0.79.6", "react-native-safe-area-context": "5.4.0", "react-native-screens": "~4.11.1", + "use-latest-callback": "^0.3.3", "zod": "^3.25.76" }, "devDependencies": { diff --git a/examples/react-native/offline-transactions/src/db/todos.ts b/examples/react-native/offline-transactions/src/db/todos.ts index ff98c13f7..ebd47ea84 100644 --- a/examples/react-native/offline-transactions/src/db/todos.ts +++ b/examples/react-native/offline-transactions/src/db/todos.ts @@ -3,7 +3,7 @@ import { createCollection } from '@tanstack/react-db' import { createReactNativeSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-react-native-sqlite-persisted-collection' +} from '@tanstack/react-native-db-sqlite-persistence' import { queryCollectionOptions } from '@tanstack/query-db-collection' import { startOfflineExecutor } from '@tanstack/offline-transactions/react-native' import { queryClient } from '../utils/queryClient' diff --git a/examples/react-native/shopping-list/metro.config.js b/examples/react-native/shopping-list/metro.config.js index 02d1935d6..5bc3d1466 100644 --- a/examples/react-native/shopping-list/metro.config.js +++ b/examples/react-native/shopping-list/metro.config.js @@ -52,15 +52,9 @@ config.resolver.resolveRequest = (context, moduleName, platform) => { ) } -// Force singleton packages to resolve from the app's local node_modules -config.resolver.extraNodeModules = new Proxy(singletonPaths, { - get: (target, name) => { - if (target[name]) { - return target[name] - } - return path.resolve(localNodeModules, name) - }, -}) +// Only singleton packages need explicit remapping. Let Metro resolve all other +// transitive dependencies from the package that requested them. +config.resolver.extraNodeModules = singletonPaths // Block react-native 0.83 from root node_modules const escMonorepoRoot = monorepoRoot.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') diff --git a/examples/react-native/shopping-list/package.json b/examples/react-native/shopping-list/package.json index ad2dd8b42..b13490d40 100644 --- a/examples/react-native/shopping-list/package.json +++ b/examples/react-native/shopping-list/package.json @@ -19,10 +19,10 @@ "@react-native-async-storage/async-storage": "2.1.2", "@react-native-community/netinfo": "11.4.1", "@tanstack/db": "workspace:*", - "@tanstack/db-react-native-sqlite-persisted-collection": "workspace:*", "@tanstack/electric-db-collection": "workspace:*", "@tanstack/offline-transactions": "^1.0.24", "@tanstack/react-db": "^0.1.77", + "@tanstack/react-native-db-sqlite-persistence": "workspace:*", "@tanstack/react-query": "^5.90.20", "expo": "~53.0.26", "expo-constants": "~17.1.0", @@ -34,7 +34,8 @@ "react": "19.0.0", "react-native": "0.79.6", "react-native-safe-area-context": "5.4.0", - "react-native-screens": "~4.11.1" + "react-native-screens": "~4.11.1", + "use-latest-callback": "^0.3.3" }, "devDependencies": { "@babel/core": "^7.29.0", diff --git a/examples/react-native/shopping-list/src/db/collections.ts b/examples/react-native/shopping-list/src/db/collections.ts index 5ae0ca49f..0e9d944dc 100644 --- a/examples/react-native/shopping-list/src/db/collections.ts +++ b/examples/react-native/shopping-list/src/db/collections.ts @@ -4,14 +4,14 @@ import { electricCollectionOptions } from '@tanstack/electric-db-collection' import { createReactNativeSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-react-native-sqlite-persisted-collection' +} from '@tanstack/react-native-db-sqlite-persistence' import { startOfflineExecutor } from '@tanstack/offline-transactions/react-native' import { API_URL, itemsApi, listsApi } from '../utils/api' import { createOfflineAwareFetch } from '../network/simulatedOffline' import { simulatedOnlineDetector } from '../network/SimulatedOnlineDetector' import { AsyncStorageAdapter } from './AsyncStorageAdapter' import type { PendingMutation } from '@tanstack/db' -import type { OpSQLiteDatabaseLike } from '@tanstack/db-react-native-sqlite-persisted-collection' +import type { OpSQLiteDatabaseLike } from '@tanstack/react-native-db-sqlite-persistence' import type { ElectricCollectionUtils } from '@tanstack/electric-db-collection' export type ShoppingList = { diff --git a/examples/react/offline-transactions/package.json b/examples/react/offline-transactions/package.json index 4af7dbde9..434a4fab6 100644 --- a/examples/react/offline-transactions/package.json +++ b/examples/react/offline-transactions/package.json @@ -9,8 +9,8 @@ "start": "node .output/server/index.mjs" }, "dependencies": { + "@tanstack/browser-db-sqlite-persistence": "workspace:*", "@tanstack/db": "workspace:*", - "@tanstack/db-browser-wa-sqlite-persisted-collection": "workspace:*", "@tanstack/offline-transactions": "^1.0.24", "@tanstack/query-db-collection": "^1.0.30", "@tanstack/react-db": "^0.1.77", diff --git a/examples/react/offline-transactions/src/db/persisted-todos.ts b/examples/react/offline-transactions/src/db/persisted-todos.ts index eae071fe4..18537b98d 100644 --- a/examples/react/offline-transactions/src/db/persisted-todos.ts +++ b/examples/react/offline-transactions/src/db/persisted-todos.ts @@ -4,7 +4,7 @@ import { createBrowserWASQLitePersistence, openBrowserWASQLiteOPFSDatabase, persistedCollectionOptions, -} from '@tanstack/db-browser-wa-sqlite-persisted-collection' +} from '@tanstack/browser-db-sqlite-persistence' import type { Collection } from '@tanstack/db' export type PersistedTodo = { diff --git a/examples/react/offline-transactions/vite.config.ts b/examples/react/offline-transactions/vite.config.ts index ad1dcf0fe..28ef3c3bd 100644 --- a/examples/react/offline-transactions/vite.config.ts +++ b/examples/react/offline-transactions/vite.config.ts @@ -16,11 +16,11 @@ function watchWorkspacePackages() { path.resolve(__dirname, `../../../packages/offline-transactions/dist`), path.resolve( __dirname, - `../../../packages/db-browser-wa-sqlite-persisted-collection/src`, + `../../../packages/browser-db-sqlite-persistence/src`, ), path.resolve( __dirname, - `../../../packages/db-sqlite-persisted-collection-core/dist`, + `../../../packages/db-sqlite-persistence-core/dist`, ), ] @@ -77,14 +77,14 @@ export default defineConfig({ resolve: { alias: { // Resolve to source so Vite can process the ?worker import natively - '@tanstack/db-browser-wa-sqlite-persisted-collection': path.resolve( + '@tanstack/browser-db-sqlite-persistence': path.resolve( __dirname, - `../../../packages/db-browser-wa-sqlite-persisted-collection/src/index.ts`, + `../../../packages/browser-db-sqlite-persistence/src/index.ts`, ), // Required because the browser package's source re-exports from core - '@tanstack/db-sqlite-persisted-collection-core': path.resolve( + '@tanstack/db-sqlite-persistence-core': path.resolve( __dirname, - `../../../packages/db-sqlite-persisted-collection-core/src/index.ts`, + `../../../packages/db-sqlite-persistence-core/src/index.ts`, ), }, }, @@ -92,8 +92,8 @@ export default defineConfig({ exclude: [ `@tanstack/db`, `@tanstack/offline-transactions`, - `@tanstack/db-browser-wa-sqlite-persisted-collection`, - `@tanstack/db-sqlite-persisted-collection-core`, + `@tanstack/browser-db-sqlite-persistence`, + `@tanstack/db-sqlite-persistence-core`, `@journeyapps/wa-sqlite`, ], }, diff --git a/packages/db-browser-wa-sqlite-persisted-collection/README.md b/packages/browser-db-sqlite-persistence/README.md similarity index 92% rename from packages/db-browser-wa-sqlite-persisted-collection/README.md rename to packages/browser-db-sqlite-persistence/README.md index 5b6806525..b14c83b32 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/README.md +++ b/packages/browser-db-sqlite-persistence/README.md @@ -1,4 +1,4 @@ -# @tanstack/db-browser-wa-sqlite-persisted-collection +# @tanstack/browser-db-sqlite-persistence Thin browser SQLite persistence for TanStack DB using `wa-sqlite` + OPFS. @@ -16,7 +16,7 @@ import { createBrowserWASQLitePersistence, openBrowserWASQLiteOPFSDatabase, persistedCollectionOptions, -} from '@tanstack/db-browser-wa-sqlite-persisted-collection' +} from '@tanstack/browser-db-sqlite-persistence' type Todo = { id: string diff --git a/packages/db-browser-wa-sqlite-persisted-collection/e2e/browser-single-tab-persisted-collection.e2e.test.ts b/packages/browser-db-sqlite-persistence/e2e/browser-single-tab-persisted-collection.e2e.test.ts similarity index 97% rename from packages/db-browser-wa-sqlite-persisted-collection/e2e/browser-single-tab-persisted-collection.e2e.test.ts rename to packages/browser-db-sqlite-persistence/e2e/browser-single-tab-persisted-collection.e2e.test.ts index d8f2effa3..ae3dfe6e9 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/e2e/browser-single-tab-persisted-collection.e2e.test.ts +++ b/packages/browser-db-sqlite-persistence/e2e/browser-single-tab-persisted-collection.e2e.test.ts @@ -2,13 +2,13 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, afterEach, beforeAll } from 'vitest' -import { createCollection, BTreeIndex } from '@tanstack/db' +import { BTreeIndex, createCollection } from '@tanstack/db' import { createBrowserWASQLitePersistence, persistedCollectionOptions, } from '../src' import { generateSeedData } from '../../db-collection-e2e/src/fixtures/seed-data' -import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/persisted-collection-conformance-contract' +import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persistence-core/tests/contracts/persisted-collection-conformance-contract' import { createWASQLiteTestDatabase } from '../tests/helpers/wa-sqlite-test-db' import type { Collection } from '@tanstack/db' import type { BrowserWASQLiteDatabase } from '../src' diff --git a/packages/db-browser-wa-sqlite-persisted-collection/package.json b/packages/browser-db-sqlite-persistence/package.json similarity index 80% rename from packages/db-browser-wa-sqlite-persisted-collection/package.json rename to packages/browser-db-sqlite-persistence/package.json index f38019d56..f4e43700c 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/package.json +++ b/packages/browser-db-sqlite-persistence/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-browser-wa-sqlite-persisted-collection", + "name": "@tanstack/browser-db-sqlite-persistence", "version": "0.1.0", "description": "Browser wa-sqlite persisted collection adapter for TanStack DB", "author": "TanStack Team", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "git+https://github.com/TanStack/db.git", - "directory": "packages/db-browser-wa-sqlite-persisted-collection" + "directory": "packages/browser-db-sqlite-persistence" }, "homepage": "https://tanstack.com/db", "keywords": [ @@ -23,7 +23,7 @@ "dev": "vite build --watch", "lint": "eslint . --fix", "test": "vitest --run", - "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-browser-wa-sqlite-persisted-collection build && vitest --config vitest.e2e.config.ts --run" + "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/browser-db-sqlite-persistence build && vitest --config vitest.e2e.config.ts --run" }, "type": "module", "main": "dist/cjs/index.cjs", @@ -48,7 +48,7 @@ "src" ], "dependencies": { - "@tanstack/db-sqlite-persisted-collection-core": "workspace:*" + "@tanstack/db-sqlite-persistence-core": "workspace:*" }, "peerDependencies": { "@journeyapps/wa-sqlite": "^1.4.1", diff --git a/packages/db-browser-wa-sqlite-persisted-collection/src/browser-coordinator.ts b/packages/browser-db-sqlite-persistence/src/browser-coordinator.ts similarity index 99% rename from packages/db-browser-wa-sqlite-persisted-collection/src/browser-coordinator.ts rename to packages/browser-db-sqlite-persistence/src/browser-coordinator.ts index 2fdef161a..272cf56f5 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/src/browser-coordinator.ts +++ b/packages/browser-db-sqlite-persistence/src/browser-coordinator.ts @@ -6,7 +6,7 @@ import type { PersistenceAdapter, ProtocolEnvelope, PullSinceResponse, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { LoadSubsetOptions } from '@tanstack/db' // --------------------------------------------------------------------------- diff --git a/packages/db-browser-wa-sqlite-persisted-collection/src/browser-persistence.ts b/packages/browser-db-sqlite-persistence/src/browser-persistence.ts similarity index 97% rename from packages/db-browser-wa-sqlite-persisted-collection/src/browser-persistence.ts rename to packages/browser-db-sqlite-persistence/src/browser-persistence.ts index 616029d1a..2d69bc160 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/src/browser-persistence.ts +++ b/packages/browser-db-sqlite-persistence/src/browser-persistence.ts @@ -1,7 +1,7 @@ import { SingleProcessCoordinator, createSQLiteCorePersistenceAdapter, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { BrowserCollectionCoordinator } from './browser-coordinator' import { BrowserWASQLiteDriver } from './wa-sqlite-driver' import type { @@ -10,7 +10,7 @@ import type { PersistedCollectionPersistence, SQLiteCoreAdapterOptions, SQLiteDriver, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { BrowserWASQLiteDatabase } from './wa-sqlite-driver' export type { BrowserWASQLiteDatabase } from './wa-sqlite-driver' diff --git a/packages/db-browser-wa-sqlite-persisted-collection/src/index.ts b/packages/browser-db-sqlite-persistence/src/index.ts similarity index 88% rename from packages/db-browser-wa-sqlite-persisted-collection/src/index.ts rename to packages/browser-db-sqlite-persistence/src/index.ts index 243503db6..5931b8ade 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/src/index.ts +++ b/packages/browser-db-sqlite-persistence/src/index.ts @@ -8,8 +8,8 @@ export type { } from './browser-persistence' export type { OpenBrowserWASQLiteOPFSDatabaseOptions } from './opfs-database' export type { BrowserCollectionCoordinatorOptions } from './browser-coordinator' -export { persistedCollectionOptions } from '@tanstack/db-sqlite-persisted-collection-core' +export { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core' export type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' diff --git a/packages/db-browser-wa-sqlite-persisted-collection/src/opfs-database.ts b/packages/browser-db-sqlite-persistence/src/opfs-database.ts similarity index 99% rename from packages/db-browser-wa-sqlite-persisted-collection/src/opfs-database.ts rename to packages/browser-db-sqlite-persistence/src/opfs-database.ts index 249da4004..81a5f7d2f 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/src/opfs-database.ts +++ b/packages/browser-db-sqlite-persistence/src/opfs-database.ts @@ -1,7 +1,7 @@ import { InvalidPersistedCollectionConfigError, PersistenceUnavailableError, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import OPFSWorkerConstructor from './opfs-worker?worker' import type { BrowserWASQLiteDatabase } from './wa-sqlite-driver' import type { diff --git a/packages/db-browser-wa-sqlite-persisted-collection/src/opfs-worker-protocol.ts b/packages/browser-db-sqlite-persistence/src/opfs-worker-protocol.ts similarity index 100% rename from packages/db-browser-wa-sqlite-persisted-collection/src/opfs-worker-protocol.ts rename to packages/browser-db-sqlite-persistence/src/opfs-worker-protocol.ts diff --git a/packages/db-browser-wa-sqlite-persisted-collection/src/opfs-worker.ts b/packages/browser-db-sqlite-persistence/src/opfs-worker.ts similarity index 99% rename from packages/db-browser-wa-sqlite-persisted-collection/src/opfs-worker.ts rename to packages/browser-db-sqlite-persistence/src/opfs-worker.ts index 5928a9da4..8be4f1afd 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/src/opfs-worker.ts +++ b/packages/browser-db-sqlite-persistence/src/opfs-worker.ts @@ -4,7 +4,7 @@ import { OPFSCoopSyncVFS } from '@journeyapps/wa-sqlite/src/examples/OPFSCoopSyn import { InvalidPersistedCollectionConfigError, PersistenceUnavailableError, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { BrowserOPFSWorkerErrorCode, BrowserOPFSWorkerRequest, diff --git a/packages/db-browser-wa-sqlite-persisted-collection/src/vite-env.d.ts b/packages/browser-db-sqlite-persistence/src/vite-env.d.ts similarity index 100% rename from packages/db-browser-wa-sqlite-persisted-collection/src/vite-env.d.ts rename to packages/browser-db-sqlite-persistence/src/vite-env.d.ts diff --git a/packages/db-browser-wa-sqlite-persisted-collection/src/wa-sqlite-driver.ts b/packages/browser-db-sqlite-persistence/src/wa-sqlite-driver.ts similarity index 97% rename from packages/db-browser-wa-sqlite-persisted-collection/src/wa-sqlite-driver.ts rename to packages/browser-db-sqlite-persistence/src/wa-sqlite-driver.ts index 77c341a1e..c1ae91b9e 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/src/wa-sqlite-driver.ts +++ b/packages/browser-db-sqlite-persistence/src/wa-sqlite-driver.ts @@ -1,5 +1,5 @@ -import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persisted-collection-core' -import type { SQLiteDriver } from '@tanstack/db-sqlite-persisted-collection-core' +import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core' +import type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core' export type BrowserWASQLiteDatabase = { execute: ( diff --git a/packages/db-browser-wa-sqlite-persisted-collection/src/wa-sqlite-examples.d.ts b/packages/browser-db-sqlite-persistence/src/wa-sqlite-examples.d.ts similarity index 100% rename from packages/db-browser-wa-sqlite-persisted-collection/src/wa-sqlite-examples.d.ts rename to packages/browser-db-sqlite-persistence/src/wa-sqlite-examples.d.ts diff --git a/packages/db-browser-wa-sqlite-persisted-collection/tests/browser-coordinator.test.ts b/packages/browser-db-sqlite-persistence/tests/browser-coordinator.test.ts similarity index 99% rename from packages/db-browser-wa-sqlite-persisted-collection/tests/browser-coordinator.test.ts rename to packages/browser-db-sqlite-persistence/tests/browser-coordinator.test.ts index c740ccd62..f7a8f78f4 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/tests/browser-coordinator.test.ts +++ b/packages/browser-db-sqlite-persistence/tests/browser-coordinator.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { BrowserCollectionCoordinator } from '../src/browser-coordinator' import type { BrowserCollectionCoordinatorOptions } from '../src/browser-coordinator' -import type { PersistenceAdapter } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistenceAdapter } from '@tanstack/db-sqlite-persistence-core' // --------------------------------------------------------------------------- // BroadcastChannel mock diff --git a/packages/db-browser-wa-sqlite-persisted-collection/tests/browser-persistence.test.ts b/packages/browser-db-sqlite-persistence/tests/browser-persistence.test.ts similarity index 96% rename from packages/db-browser-wa-sqlite-persisted-collection/tests/browser-persistence.test.ts rename to packages/browser-db-sqlite-persistence/tests/browser-persistence.test.ts index f5521e9a0..1e1db719c 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/tests/browser-persistence.test.ts +++ b/packages/browser-db-sqlite-persistence/tests/browser-persistence.test.ts @@ -7,13 +7,13 @@ import { persistedCollectionOptions, } from '../src' import { BrowserWASQLiteDriver } from '../src/wa-sqlite-driver' -import { SingleProcessCoordinator } from '../../db-sqlite-persisted-collection-core/src' -import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +import { SingleProcessCoordinator } from '../../db-sqlite-persistence-core/src' +import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' import { createWASQLiteTestDatabase } from './helpers/wa-sqlite-test-db' import type { RuntimePersistenceContractTodo, RuntimePersistenceDatabaseHarness, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' function createRuntimeDatabaseHarness(): RuntimePersistenceDatabaseHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-browser-persistence-`)) diff --git a/packages/db-browser-wa-sqlite-persisted-collection/tests/browser-single-tab.test.ts b/packages/browser-db-sqlite-persistence/tests/browser-single-tab.test.ts similarity index 98% rename from packages/db-browser-wa-sqlite-persisted-collection/tests/browser-single-tab.test.ts rename to packages/browser-db-sqlite-persistence/tests/browser-single-tab.test.ts index 0aaf1f0b3..73443876c 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/tests/browser-single-tab.test.ts +++ b/packages/browser-db-sqlite-persistence/tests/browser-single-tab.test.ts @@ -5,7 +5,7 @@ import { afterEach, expect, it } from 'vitest' import { InvalidPersistedCollectionConfigError, PersistenceUnavailableError, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { createBrowserWASQLitePersistence, openBrowserWASQLiteOPFSDatabase, diff --git a/packages/db-browser-wa-sqlite-persisted-collection/tests/helpers/wa-sqlite-test-db.ts b/packages/browser-db-sqlite-persistence/tests/helpers/wa-sqlite-test-db.ts similarity index 100% rename from packages/db-browser-wa-sqlite-persisted-collection/tests/helpers/wa-sqlite-test-db.ts rename to packages/browser-db-sqlite-persistence/tests/helpers/wa-sqlite-test-db.ts diff --git a/packages/db-browser-wa-sqlite-persisted-collection/tests/opfs-database.test.ts b/packages/browser-db-sqlite-persistence/tests/opfs-database.test.ts similarity index 99% rename from packages/db-browser-wa-sqlite-persisted-collection/tests/opfs-database.test.ts rename to packages/browser-db-sqlite-persistence/tests/opfs-database.test.ts index 4379a1ea9..24e60b199 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/tests/opfs-database.test.ts +++ b/packages/browser-db-sqlite-persistence/tests/opfs-database.test.ts @@ -2,7 +2,7 @@ import { afterEach, describe, expect, it } from 'vitest' import { InvalidPersistedCollectionConfigError, PersistenceUnavailableError, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { openBrowserWASQLiteOPFSDatabase } from '../src/opfs-database' import type { BrowserOPFSWorkerErrorCode, diff --git a/packages/db-browser-wa-sqlite-persisted-collection/tests/wa-sqlite-driver.test.ts b/packages/browser-db-sqlite-persistence/tests/wa-sqlite-driver.test.ts similarity index 87% rename from packages/db-browser-wa-sqlite-persisted-collection/tests/wa-sqlite-driver.test.ts rename to packages/browser-db-sqlite-persistence/tests/wa-sqlite-driver.test.ts index 0fe28bdb4..03f7086e2 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/tests/wa-sqlite-driver.test.ts +++ b/packages/browser-db-sqlite-persistence/tests/wa-sqlite-driver.test.ts @@ -1,10 +1,10 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteDriverContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import { runSQLiteDriverContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' import { BrowserWASQLiteDriver } from '../src/wa-sqlite-driver' import { createWASQLiteTestDatabase } from './helpers/wa-sqlite-test-db' -import type { SQLiteDriverContractHarness } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import type { SQLiteDriverContractHarness } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' function createDriverHarness(): SQLiteDriverContractHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-browser-wa-sqlite-`)) diff --git a/packages/db-browser-wa-sqlite-persisted-collection/tsconfig.docs.json b/packages/browser-db-sqlite-persistence/tsconfig.docs.json similarity index 57% rename from packages/db-browser-wa-sqlite-persisted-collection/tsconfig.docs.json rename to packages/browser-db-sqlite-persistence/tsconfig.docs.json index 5fddb4598..dec9e98d1 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/tsconfig.docs.json +++ b/packages/browser-db-sqlite-persistence/tsconfig.docs.json @@ -3,8 +3,8 @@ "compilerOptions": { "paths": { "@tanstack/db": ["../db/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-browser-wa-sqlite-persisted-collection/tsconfig.json b/packages/browser-db-sqlite-persistence/tsconfig.json similarity index 83% rename from packages/db-browser-wa-sqlite-persisted-collection/tsconfig.json rename to packages/browser-db-sqlite-persistence/tsconfig.json index 4074d193d..5b14f299c 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/tsconfig.json +++ b/packages/browser-db-sqlite-persistence/tsconfig.json @@ -14,8 +14,8 @@ "paths": { "@tanstack/db": ["../db/src"], "@tanstack/db-ivm": ["../db-ivm/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-browser-wa-sqlite-persisted-collection/vite.config.ts b/packages/browser-db-sqlite-persistence/vite.config.ts similarity index 100% rename from packages/db-browser-wa-sqlite-persisted-collection/vite.config.ts rename to packages/browser-db-sqlite-persistence/vite.config.ts diff --git a/packages/db-browser-wa-sqlite-persisted-collection/vitest.e2e.config.ts b/packages/browser-db-sqlite-persistence/vitest.e2e.config.ts similarity index 82% rename from packages/db-browser-wa-sqlite-persisted-collection/vitest.e2e.config.ts rename to packages/browser-db-sqlite-persistence/vitest.e2e.config.ts index 063029e51..a72f12feb 100644 --- a/packages/db-browser-wa-sqlite-persisted-collection/vitest.e2e.config.ts +++ b/packages/browser-db-sqlite-persistence/vitest.e2e.config.ts @@ -9,9 +9,9 @@ export default defineConfig({ alias: { '@tanstack/db': resolve(packageDirectory, `../db/src`), '@tanstack/db-ivm': resolve(packageDirectory, `../db-ivm/src`), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( packageDirectory, - `../db-sqlite-persisted-collection-core/src`, + `../db-sqlite-persistence-core/src`, ), }, }, diff --git a/packages/db-capacitor-sqlite-persisted-collection/README.md b/packages/capacitor-db-sqlite-persistence/README.md similarity index 89% rename from packages/db-capacitor-sqlite-persisted-collection/README.md rename to packages/capacitor-db-sqlite-persistence/README.md index 1588a664c..afa9b6418 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/README.md +++ b/packages/capacitor-db-sqlite-persistence/README.md @@ -1,4 +1,4 @@ -# @tanstack/db-capacitor-sqlite-persisted-collection +# @tanstack/capacitor-db-sqlite-persistence Thin SQLite persistence for Capacitor apps using `@capacitor-community/sqlite`. @@ -11,7 +11,7 @@ Thin SQLite persistence for Capacitor apps using ## Install ```bash -pnpm add @tanstack/db-capacitor-sqlite-persisted-collection @capacitor-community/sqlite +pnpm add @tanstack/capacitor-db-sqlite-persistence @capacitor-community/sqlite ``` ## Quick start @@ -24,7 +24,7 @@ import { queryCollectionOptions } from '@tanstack/query-db-collection' import { createCapacitorSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-capacitor-sqlite-persisted-collection' +} from '@tanstack/capacitor-db-sqlite-persistence' type Todo = { id: string @@ -89,13 +89,13 @@ export const todosCollection = createCollection( ## Testing -- `pnpm --filter @tanstack/db-capacitor-sqlite-persisted-collection test:e2e` +- `pnpm --filter @tanstack/capacitor-db-sqlite-persistence test:e2e` runs the package e2e suite against the default `better-sqlite3` harness. -- `pnpm --filter @tanstack/db-capacitor-sqlite-persisted-collection test:e2e:ios` +- `pnpm --filter @tanstack/capacitor-db-sqlite-persistence test:e2e:ios` builds the package-local Capacitor harness in `e2e/app`, launches the iOS simulator, and runs the full persisted collection e2e suite inside the real native Capacitor runtime. -- `pnpm --filter @tanstack/db-capacitor-sqlite-persisted-collection test:e2e:android` +- `pnpm --filter @tanstack/capacitor-db-sqlite-persistence test:e2e:android` builds the same package-local Capacitor harness in `e2e/app`, launches an Android emulator or uses a connected debug target, and runs the full persisted collection e2e suite inside the real native Capacitor runtime. diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/.gitignore b/packages/capacitor-db-sqlite-persistence/e2e/app/.gitignore similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/.gitignore rename to packages/capacitor-db-sqlite-persistence/e2e/app/.gitignore diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/capacitor.config.ts b/packages/capacitor-db-sqlite-persistence/e2e/app/capacitor.config.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/capacitor.config.ts rename to packages/capacitor-db-sqlite-persistence/e2e/app/capacitor.config.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/index.html b/packages/capacitor-db-sqlite-persistence/e2e/app/index.html similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/index.html rename to packages/capacitor-db-sqlite-persistence/e2e/app/index.html diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/package.json b/packages/capacitor-db-sqlite-persistence/e2e/app/package.json similarity index 82% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/package.json rename to packages/capacitor-db-sqlite-persistence/e2e/app/package.json index abeb82f79..cb76d7f5d 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/package.json +++ b/packages/capacitor-db-sqlite-persistence/e2e/app/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-capacitor-sqlite-persisted-collection-e2e-app", + "name": "@tanstack/capacitor-db-sqlite-persistence-e2e-app", "private": true, "version": "0.0.0", "type": "module", @@ -15,7 +15,7 @@ "@capacitor-community/sqlite": "^8.0.1", "@capacitor/core": "^8.2.0", "@tanstack/db": "workspace:*", - "@tanstack/db-capacitor-sqlite-persisted-collection": "workspace:*" + "@tanstack/capacitor-db-sqlite-persistence": "workspace:*" }, "devDependencies": { "@capacitor/android": "^8.2.0", diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/main.ts b/packages/capacitor-db-sqlite-persistence/e2e/app/src/main.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/main.ts rename to packages/capacitor-db-sqlite-persistence/e2e/app/src/main.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/native-capacitor-sqlite-test-db.ts b/packages/capacitor-db-sqlite-persistence/e2e/app/src/native-capacitor-sqlite-test-db.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/native-capacitor-sqlite-test-db.ts rename to packages/capacitor-db-sqlite-persistence/e2e/app/src/native-capacitor-sqlite-test-db.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/node-crypto.ts b/packages/capacitor-db-sqlite-persistence/e2e/app/src/node-crypto.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/node-crypto.ts rename to packages/capacitor-db-sqlite-persistence/e2e/app/src/node-crypto.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/register-capacitor-e2e-suite.ts b/packages/capacitor-db-sqlite-persistence/e2e/app/src/register-capacitor-e2e-suite.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/register-capacitor-e2e-suite.ts rename to packages/capacitor-db-sqlite-persistence/e2e/app/src/register-capacitor-e2e-suite.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/runtime-vitest.ts b/packages/capacitor-db-sqlite-persistence/e2e/app/src/runtime-vitest.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/src/runtime-vitest.ts rename to packages/capacitor-db-sqlite-persistence/e2e/app/src/runtime-vitest.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/tsconfig.json b/packages/capacitor-db-sqlite-persistence/e2e/app/tsconfig.json similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/tsconfig.json rename to packages/capacitor-db-sqlite-persistence/e2e/app/tsconfig.json diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/vite.config.ts b/packages/capacitor-db-sqlite-persistence/e2e/app/vite.config.ts similarity index 82% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/app/vite.config.ts rename to packages/capacitor-db-sqlite-persistence/e2e/app/vite.config.ts index 0c004c7e0..c87d89f28 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/e2e/app/vite.config.ts +++ b/packages/capacitor-db-sqlite-persistence/e2e/app/vite.config.ts @@ -11,9 +11,9 @@ export default defineConfig({ 'node:crypto': resolve(appDirectory, `src/node-crypto.ts`), '@tanstack/db': resolve(appDirectory, `../../../db/src`), '@tanstack/db-ivm': resolve(appDirectory, `../../../db-ivm/src`), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( appDirectory, - `../../../db-sqlite-persisted-collection-core/src`, + `../../../db-sqlite-persistence-core/src`, ), }, }, diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/capacitor-persisted-collection-conformance-suite.ts b/packages/capacitor-db-sqlite-persistence/e2e/capacitor-persisted-collection-conformance-suite.ts similarity index 97% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/capacitor-persisted-collection-conformance-suite.ts rename to packages/capacitor-db-sqlite-persistence/e2e/capacitor-persisted-collection-conformance-suite.ts index 649868c9a..031c4bc51 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/e2e/capacitor-persisted-collection-conformance-suite.ts +++ b/packages/capacitor-db-sqlite-persistence/e2e/capacitor-persisted-collection-conformance-suite.ts @@ -4,7 +4,7 @@ import { join } from 'node:path' import { createCapacitorSQLiteTestDatabase } from '../tests/helpers/capacitor-sqlite-test-db' import { createCapacitorPersistedCollectionHarnessConfig } from './shared/capacitor-persisted-collection-harness' import { registerPersistedCollectionConformanceSuite } from './shared/register-persisted-collection-conformance-suite' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' type CapacitorPersistenceFactory = ( database: ReturnType, diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/capacitor-persisted-collection.e2e.test.ts b/packages/capacitor-db-sqlite-persistence/e2e/capacitor-persisted-collection.e2e.test.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/capacitor-persisted-collection.e2e.test.ts rename to packages/capacitor-db-sqlite-persistence/e2e/capacitor-persisted-collection.e2e.test.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/run-android-e2e.ts b/packages/capacitor-db-sqlite-persistence/e2e/run-android-e2e.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/run-android-e2e.ts rename to packages/capacitor-db-sqlite-persistence/e2e/run-android-e2e.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/run-ios-e2e.ts b/packages/capacitor-db-sqlite-persistence/e2e/run-ios-e2e.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/run-ios-e2e.ts rename to packages/capacitor-db-sqlite-persistence/e2e/run-ios-e2e.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/shared/capacitor-persisted-collection-harness.ts b/packages/capacitor-db-sqlite-persistence/e2e/shared/capacitor-persisted-collection-harness.ts similarity index 98% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/shared/capacitor-persisted-collection-harness.ts rename to packages/capacitor-db-sqlite-persistence/e2e/shared/capacitor-persisted-collection-harness.ts index aa4def0dd..054fee4e0 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/e2e/shared/capacitor-persisted-collection-harness.ts +++ b/packages/capacitor-db-sqlite-persistence/e2e/shared/capacitor-persisted-collection-harness.ts @@ -1,8 +1,8 @@ -import { createCollection, BTreeIndex } from '@tanstack/db' +import { BTreeIndex, createCollection } from '@tanstack/db' import { persistedCollectionOptions } from '../../src' import { generateSeedData } from '../../../db-collection-e2e/src/fixtures/seed-data' import type { Collection } from '@tanstack/db' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' import type { Comment, E2ETestConfig, diff --git a/packages/db-capacitor-sqlite-persisted-collection/e2e/shared/register-persisted-collection-conformance-suite.ts b/packages/capacitor-db-sqlite-persistence/e2e/shared/register-persisted-collection-conformance-suite.ts similarity index 92% rename from packages/db-capacitor-sqlite-persisted-collection/e2e/shared/register-persisted-collection-conformance-suite.ts rename to packages/capacitor-db-sqlite-persistence/e2e/shared/register-persisted-collection-conformance-suite.ts index 661912407..f4f656118 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/e2e/shared/register-persisted-collection-conformance-suite.ts +++ b/packages/capacitor-db-sqlite-persistence/e2e/shared/register-persisted-collection-conformance-suite.ts @@ -1,5 +1,5 @@ import { afterAll, afterEach, beforeAll } from 'vitest' -import { runPersistedCollectionConformanceSuite } from '../../../db-sqlite-persisted-collection-core/tests/contracts/persisted-collection-conformance-contract' +import { runPersistedCollectionConformanceSuite } from '../../../db-sqlite-persistence-core/tests/contracts/persisted-collection-conformance-contract' import type { CapacitorPersistedCollectionHarnessConfig } from './capacitor-persisted-collection-harness' type RegisteredHarness = { diff --git a/packages/db-capacitor-sqlite-persisted-collection/package.json b/packages/capacitor-db-sqlite-persistence/package.json similarity index 83% rename from packages/db-capacitor-sqlite-persisted-collection/package.json rename to packages/capacitor-db-sqlite-persistence/package.json index bef0fe87a..094b39e4c 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/package.json +++ b/packages/capacitor-db-sqlite-persistence/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-capacitor-sqlite-persisted-collection", + "name": "@tanstack/capacitor-db-sqlite-persistence", "version": "0.1.0", "description": "Capacitor SQLite persisted collection adapter for TanStack DB", "author": "TanStack Team", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "git+https://github.com/TanStack/db.git", - "directory": "packages/db-capacitor-sqlite-persisted-collection" + "directory": "packages/capacitor-db-sqlite-persistence" }, "homepage": "https://tanstack.com/db", "keywords": [ @@ -22,7 +22,7 @@ "dev": "vite build --watch", "lint": "eslint . --fix", "test": "vitest --run", - "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-capacitor-sqlite-persisted-collection build && vitest --config vitest.e2e.config.ts --run", + "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/capacitor-db-sqlite-persistence build && vitest --config vitest.e2e.config.ts --run", "test:e2e:android": "pnpm exec tsx ./e2e/run-android-e2e.ts", "test:e2e:ios": "pnpm exec tsx ./e2e/run-ios-e2e.ts" }, @@ -59,7 +59,7 @@ "src" ], "dependencies": { - "@tanstack/db-sqlite-persisted-collection-core": "workspace:*" + "@tanstack/db-sqlite-persistence-core": "workspace:*" }, "peerDependencies": { "@capacitor-community/sqlite": "^8.0.1", diff --git a/packages/db-capacitor-sqlite-persisted-collection/src/capacitor-persistence.ts b/packages/capacitor-db-sqlite-persistence/src/capacitor-persistence.ts similarity index 97% rename from packages/db-capacitor-sqlite-persisted-collection/src/capacitor-persistence.ts rename to packages/capacitor-db-sqlite-persistence/src/capacitor-persistence.ts index 8db87985f..785f07a50 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/src/capacitor-persistence.ts +++ b/packages/capacitor-db-sqlite-persistence/src/capacitor-persistence.ts @@ -1,7 +1,7 @@ import { SingleProcessCoordinator, createSQLiteCorePersistenceAdapter, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { CapacitorSQLiteDriver } from './capacitor-sqlite-driver' import type { SQLiteDBConnection } from '@capacitor-community/sqlite' import type { @@ -10,7 +10,7 @@ import type { PersistedCollectionPersistence, SQLiteCoreAdapterOptions, SQLiteDriver, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' export type { CapacitorSQLiteDatabaseLike } from './capacitor-sqlite-driver' export type { SQLiteDBConnection } from '@capacitor-community/sqlite' diff --git a/packages/db-capacitor-sqlite-persisted-collection/src/capacitor-sqlite-driver.ts b/packages/capacitor-db-sqlite-persistence/src/capacitor-sqlite-driver.ts similarity index 98% rename from packages/db-capacitor-sqlite-persisted-collection/src/capacitor-sqlite-driver.ts rename to packages/capacitor-db-sqlite-persistence/src/capacitor-sqlite-driver.ts index a4b8f86df..1bc788e47 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/src/capacitor-sqlite-driver.ts +++ b/packages/capacitor-db-sqlite-persistence/src/capacitor-sqlite-driver.ts @@ -1,5 +1,5 @@ -import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persisted-collection-core' -import type { SQLiteDriver } from '@tanstack/db-sqlite-persisted-collection-core' +import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core' +import type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core' import type { capSQLiteValues as CapacitorSQLiteValues, SQLiteDBConnection, diff --git a/packages/db-capacitor-sqlite-persisted-collection/src/capacitor.ts b/packages/capacitor-db-sqlite-persistence/src/capacitor.ts similarity index 96% rename from packages/db-capacitor-sqlite-persisted-collection/src/capacitor.ts rename to packages/capacitor-db-sqlite-persistence/src/capacitor.ts index 5f09aca20..fcf7d8eef 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/src/capacitor.ts +++ b/packages/capacitor-db-sqlite-persistence/src/capacitor.ts @@ -3,7 +3,7 @@ import type { CapacitorSQLitePersistenceOptions as CapacitorSQLitePersistenceOptionsBase, CapacitorSQLiteSchemaMismatchPolicy as CapacitorSQLiteSchemaMismatchPolicyBase, } from './capacitor-persistence' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' export type CapacitorSQLitePersistenceOptions = CapacitorSQLitePersistenceOptionsBase diff --git a/packages/db-capacitor-sqlite-persisted-collection/src/index.ts b/packages/capacitor-db-sqlite-persistence/src/index.ts similarity index 81% rename from packages/db-capacitor-sqlite-persisted-collection/src/index.ts rename to packages/capacitor-db-sqlite-persistence/src/index.ts index 072b6535b..81f8b6c40 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/src/index.ts +++ b/packages/capacitor-db-sqlite-persistence/src/index.ts @@ -5,8 +5,8 @@ export type { CapacitorSQLiteSchemaMismatchPolicy, SQLiteDBConnection, } from './capacitor' -export { persistedCollectionOptions } from '@tanstack/db-sqlite-persisted-collection-core' +export { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core' export type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' diff --git a/packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-persistence.test.ts b/packages/capacitor-db-sqlite-persistence/tests/capacitor-persistence.test.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-persistence.test.ts rename to packages/capacitor-db-sqlite-persistence/tests/capacitor-persistence.test.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-runtime-persistence-contract.test.ts b/packages/capacitor-db-sqlite-persistence/tests/capacitor-runtime-persistence-contract.test.ts similarity index 96% rename from packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-runtime-persistence-contract.test.ts rename to packages/capacitor-db-sqlite-persistence/tests/capacitor-runtime-persistence-contract.test.ts index b8bfc39dd..82da3c0ad 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-runtime-persistence-contract.test.ts +++ b/packages/capacitor-db-sqlite-persistence/tests/capacitor-runtime-persistence-contract.test.ts @@ -7,18 +7,18 @@ import { persistedCollectionOptions, } from '../src' import { CapacitorSQLiteDriver } from '../src/capacitor-sqlite-driver' -import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' -import { SingleProcessCoordinator } from '../../db-sqlite-persisted-collection-core/src' +import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' +import { SingleProcessCoordinator } from '../../db-sqlite-persistence-core/src' import { createCapacitorSQLiteTestDatabase } from './helpers/capacitor-sqlite-test-db' import type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { CapacitorSQLiteDatabaseLike } from '../src/capacitor-sqlite-driver' import type { RuntimePersistenceContractTodo, RuntimePersistenceDatabaseHarness, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' type RuntimePersistenceFactory = (options: { database: CapacitorSQLiteDatabaseLike diff --git a/packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-sqlite-core-adapter-contract.test.ts b/packages/capacitor-db-sqlite-persistence/tests/capacitor-sqlite-core-adapter-contract.test.ts similarity index 86% rename from packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-sqlite-core-adapter-contract.test.ts rename to packages/capacitor-db-sqlite-persistence/tests/capacitor-sqlite-core-adapter-contract.test.ts index b788d57ff..8ebc45566 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-sqlite-core-adapter-contract.test.ts +++ b/packages/capacitor-db-sqlite-persistence/tests/capacitor-sqlite-core-adapter-contract.test.ts @@ -1,14 +1,14 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' import { CapacitorSQLiteDriver } from '../src/capacitor-sqlite-driver' -import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persisted-collection-core/src' +import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persistence-core/src' import { createCapacitorSQLiteTestDatabase } from './helpers/capacitor-sqlite-test-db' import type { SQLiteCoreAdapterContractTodo, SQLiteCoreAdapterHarnessFactory, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' const createHarness: SQLiteCoreAdapterHarnessFactory = (options) => { const tempDirectory = mkdtempSync(join(tmpdir(), `db-capacitor-core-`)) diff --git a/packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-sqlite-driver-contract.test.ts b/packages/capacitor-db-sqlite-persistence/tests/capacitor-sqlite-driver-contract.test.ts similarity index 88% rename from packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-sqlite-driver-contract.test.ts rename to packages/capacitor-db-sqlite-persistence/tests/capacitor-sqlite-driver-contract.test.ts index 6cd8a0ea4..9aba0a1e0 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-sqlite-driver-contract.test.ts +++ b/packages/capacitor-db-sqlite-persistence/tests/capacitor-sqlite-driver-contract.test.ts @@ -1,10 +1,10 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteDriverContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import { runSQLiteDriverContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' import { CapacitorSQLiteDriver } from '../src/capacitor-sqlite-driver' import { createCapacitorSQLiteTestDatabase } from './helpers/capacitor-sqlite-test-db' -import type { SQLiteDriverContractHarness } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import type { SQLiteDriverContractHarness } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' function createDriverHarness(): SQLiteDriverContractHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-capacitor-sqlite-`)) diff --git a/packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-sqlite-driver.test.ts b/packages/capacitor-db-sqlite-persistence/tests/capacitor-sqlite-driver.test.ts similarity index 99% rename from packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-sqlite-driver.test.ts rename to packages/capacitor-db-sqlite-persistence/tests/capacitor-sqlite-driver.test.ts index c4fe0e3e9..9be089418 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/tests/capacitor-sqlite-driver.test.ts +++ b/packages/capacitor-db-sqlite-persistence/tests/capacitor-sqlite-driver.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, expect, it, vi } from 'vitest' import { CapacitorSQLiteDriver } from '../src/capacitor-sqlite-driver' -import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persisted-collection-core/src' +import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persistence-core/src' import { createCapacitorSQLiteTestDatabase } from './helpers/capacitor-sqlite-test-db' import type { CapacitorSQLiteDatabaseLike } from '../src/capacitor-sqlite-driver' diff --git a/packages/db-capacitor-sqlite-persisted-collection/tests/helpers/capacitor-sqlite-test-db.ts b/packages/capacitor-db-sqlite-persistence/tests/helpers/capacitor-sqlite-test-db.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/tests/helpers/capacitor-sqlite-test-db.ts rename to packages/capacitor-db-sqlite-persistence/tests/helpers/capacitor-sqlite-test-db.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/tsconfig.docs.json b/packages/capacitor-db-sqlite-persistence/tsconfig.docs.json similarity index 57% rename from packages/db-capacitor-sqlite-persisted-collection/tsconfig.docs.json rename to packages/capacitor-db-sqlite-persistence/tsconfig.docs.json index 5fddb4598..dec9e98d1 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/tsconfig.docs.json +++ b/packages/capacitor-db-sqlite-persistence/tsconfig.docs.json @@ -3,8 +3,8 @@ "compilerOptions": { "paths": { "@tanstack/db": ["../db/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-capacitor-sqlite-persisted-collection/tsconfig.json b/packages/capacitor-db-sqlite-persistence/tsconfig.json similarity index 83% rename from packages/db-capacitor-sqlite-persisted-collection/tsconfig.json rename to packages/capacitor-db-sqlite-persistence/tsconfig.json index ccccba1d6..280b57af7 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/tsconfig.json +++ b/packages/capacitor-db-sqlite-persistence/tsconfig.json @@ -13,8 +13,8 @@ "paths": { "@tanstack/db": ["../db/src"], "@tanstack/db-ivm": ["../db-ivm/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-capacitor-sqlite-persisted-collection/vite.config.ts b/packages/capacitor-db-sqlite-persistence/vite.config.ts similarity index 100% rename from packages/db-capacitor-sqlite-persisted-collection/vite.config.ts rename to packages/capacitor-db-sqlite-persistence/vite.config.ts diff --git a/packages/db-capacitor-sqlite-persisted-collection/vitest.e2e.config.ts b/packages/capacitor-db-sqlite-persistence/vitest.e2e.config.ts similarity index 84% rename from packages/db-capacitor-sqlite-persisted-collection/vitest.e2e.config.ts rename to packages/capacitor-db-sqlite-persistence/vitest.e2e.config.ts index ede08cdc4..7cc82a2b5 100644 --- a/packages/db-capacitor-sqlite-persisted-collection/vitest.e2e.config.ts +++ b/packages/capacitor-db-sqlite-persistence/vitest.e2e.config.ts @@ -9,9 +9,9 @@ export default defineConfig({ alias: { '@tanstack/db': resolve(packageDirectory, `../db/src`), '@tanstack/db-ivm': resolve(packageDirectory, `../db-ivm/src`), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( packageDirectory, - `../db-sqlite-persisted-collection-core/src`, + `../db-sqlite-persistence-core/src`, ), }, }, diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/README.md b/packages/cloudflare-durable-objects-db-sqlite-persistence/README.md similarity index 89% rename from packages/db-cloudflare-do-sqlite-persisted-collection/README.md rename to packages/cloudflare-durable-objects-db-sqlite-persistence/README.md index 2393faea0..3473d7ce8 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/README.md +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/README.md @@ -1,4 +1,4 @@ -# @tanstack/db-cloudflare-do-sqlite-persisted-collection +# @tanstack/cloudflare-durable-objects-db-sqlite-persistence Thin SQLite persistence for Cloudflare Durable Objects. @@ -14,7 +14,7 @@ import { createCollection } from '@tanstack/db' import { createCloudflareDOSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-cloudflare-do-sqlite-persisted-collection' +} from '@tanstack/cloudflare-durable-objects-db-sqlite-persistence' type Todo = { id: string diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/e2e/cloudflare-do-runtime-bridge.e2e.test.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/e2e/cloudflare-do-runtime-bridge.e2e.test.ts similarity index 98% rename from packages/db-cloudflare-do-sqlite-persisted-collection/e2e/cloudflare-do-runtime-bridge.e2e.test.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/e2e/cloudflare-do-runtime-bridge.e2e.test.ts index 0cb1c1435..ef31396cb 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/e2e/cloudflare-do-runtime-bridge.e2e.test.ts +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/e2e/cloudflare-do-runtime-bridge.e2e.test.ts @@ -5,13 +5,13 @@ import { setTimeout as delay } from 'node:timers/promises' import { fileURLToPath } from 'node:url' import { spawn } from 'node:child_process' import { describe, expect, it } from 'vitest' -import { runRuntimeBridgeE2EContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-bridge-e2e-contract' +import { runRuntimeBridgeE2EContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/runtime-bridge-e2e-contract' import type { RuntimeBridgeE2EContractError, RuntimeBridgeE2EContractHarness, RuntimeBridgeE2EContractHarnessFactory, RuntimeBridgeE2EContractTodo, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-bridge-e2e-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/runtime-bridge-e2e-contract' type RuntimeProcessHarness = { baseUrl: string diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/e2e/fixtures/worker.mjs b/packages/cloudflare-durable-objects-db-sqlite-persistence/e2e/fixtures/worker.mjs similarity index 100% rename from packages/db-cloudflare-do-sqlite-persisted-collection/e2e/fixtures/worker.mjs rename to packages/cloudflare-durable-objects-db-sqlite-persistence/e2e/fixtures/worker.mjs diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/e2e/fixtures/wrangler.toml b/packages/cloudflare-durable-objects-db-sqlite-persistence/e2e/fixtures/wrangler.toml similarity index 100% rename from packages/db-cloudflare-do-sqlite-persisted-collection/e2e/fixtures/wrangler.toml rename to packages/cloudflare-durable-objects-db-sqlite-persistence/e2e/fixtures/wrangler.toml diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/package.json b/packages/cloudflare-durable-objects-db-sqlite-persistence/package.json similarity index 79% rename from packages/db-cloudflare-do-sqlite-persisted-collection/package.json rename to packages/cloudflare-durable-objects-db-sqlite-persistence/package.json index 44ed62eda..cf14bec8c 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/package.json +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-cloudflare-do-sqlite-persisted-collection", + "name": "@tanstack/cloudflare-durable-objects-db-sqlite-persistence", "version": "0.1.0", "description": "Cloudflare Durable Object SQLite persisted collection adapter for TanStack DB", "author": "TanStack Team", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "git+https://github.com/TanStack/db.git", - "directory": "packages/db-cloudflare-do-sqlite-persisted-collection" + "directory": "packages/cloudflare-durable-objects-db-sqlite-persistence" }, "homepage": "https://tanstack.com/db", "keywords": [ @@ -22,7 +22,7 @@ "dev": "vite build --watch", "lint": "eslint . --fix", "test": "vitest --run", - "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-cloudflare-do-sqlite-persisted-collection build && vitest --config vitest.e2e.config.ts --run" + "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/cloudflare-durable-objects-db-sqlite-persistence build && vitest --config vitest.e2e.config.ts --run" }, "type": "module", "main": "dist/cjs/index.cjs", @@ -47,7 +47,7 @@ "src" ], "dependencies": { - "@tanstack/db-sqlite-persisted-collection-core": "workspace:*" + "@tanstack/db-sqlite-persistence-core": "workspace:*" }, "peerDependencies": { "typescript": ">=4.7" diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/src/do-driver.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/src/do-driver.ts similarity index 98% rename from packages/db-cloudflare-do-sqlite-persisted-collection/src/do-driver.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/src/do-driver.ts index 4cd98bdf9..35e7313f8 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/src/do-driver.ts +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/src/do-driver.ts @@ -1,5 +1,5 @@ -import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persisted-collection-core' -import type { SQLiteDriver } from '@tanstack/db-sqlite-persisted-collection-core' +import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core' +import type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core' type DurableObjectSqlRow = Record diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/src/do-persistence.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/src/do-persistence.ts similarity index 97% rename from packages/db-cloudflare-do-sqlite-persisted-collection/src/do-persistence.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/src/do-persistence.ts index d33302847..c9043c5d4 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/src/do-persistence.ts +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/src/do-persistence.ts @@ -1,7 +1,7 @@ import { SingleProcessCoordinator, createSQLiteCorePersistenceAdapter, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { CloudflareDOSQLiteDriver } from './do-driver' import type { PersistedCollectionCoordinator, @@ -9,7 +9,7 @@ import type { PersistedCollectionPersistence, SQLiteCoreAdapterOptions, SQLiteDriver, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { DurableObjectStorageLike } from './do-driver' export type { DurableObjectStorageLike } from './do-driver' diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/src/index.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/src/index.ts similarity index 81% rename from packages/db-cloudflare-do-sqlite-persisted-collection/src/index.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/src/index.ts index b7c212b0c..5740c803b 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/src/index.ts +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/src/index.ts @@ -4,8 +4,8 @@ export type { CloudflareDOSQLitePersistenceOptions, DurableObjectStorageLike, } from './do-persistence' -export { persistedCollectionOptions } from '@tanstack/db-sqlite-persisted-collection-core' +export { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core' export type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/tests/do-driver.test.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/tests/do-driver.test.ts similarity index 94% rename from packages/db-cloudflare-do-sqlite-persisted-collection/tests/do-driver.test.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/tests/do-driver.test.ts index e5c47f4f0..f45c27d07 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/tests/do-driver.test.ts +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/tests/do-driver.test.ts @@ -2,11 +2,11 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { describe, expect, it } from 'vitest' -import { runSQLiteDriverContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import { runSQLiteDriverContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' import { CloudflareDOSQLiteDriver } from '../src/do-driver' -import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persisted-collection-core/src' +import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persistence-core/src' import { createBetterSqliteDoStorageHarness } from './helpers/better-sqlite-do-storage' -import type { SQLiteDriverContractHarness } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import type { SQLiteDriverContractHarness } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' function createDriverHarness(): SQLiteDriverContractHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-cf-do-driver-`)) diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/tests/do-persistence.test.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/tests/do-persistence.test.ts similarity index 96% rename from packages/db-cloudflare-do-sqlite-persisted-collection/tests/do-persistence.test.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/tests/do-persistence.test.ts index 2f2f58712..805c6dff4 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/tests/do-persistence.test.ts +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/tests/do-persistence.test.ts @@ -7,13 +7,13 @@ import { persistedCollectionOptions, } from '../src' import { CloudflareDOSQLiteDriver } from '../src/do-driver' -import { SingleProcessCoordinator } from '../../db-sqlite-persisted-collection-core/src' -import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +import { SingleProcessCoordinator } from '../../db-sqlite-persistence-core/src' +import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' import { createBetterSqliteDoStorageHarness } from './helpers/better-sqlite-do-storage' import type { RuntimePersistenceContractTodo, RuntimePersistenceDatabaseHarness, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' function createRuntimeDatabaseHarness(): RuntimePersistenceDatabaseHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-cf-do-persistence-`)) diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/tests/do-sqlite-core-adapter-contract.test.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/tests/do-sqlite-core-adapter-contract.test.ts similarity index 86% rename from packages/db-cloudflare-do-sqlite-persisted-collection/tests/do-sqlite-core-adapter-contract.test.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/tests/do-sqlite-core-adapter-contract.test.ts index 2e0c866e8..7a056deae 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/tests/do-sqlite-core-adapter-contract.test.ts +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/tests/do-sqlite-core-adapter-contract.test.ts @@ -1,14 +1,14 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' import { CloudflareDOSQLiteDriver } from '../src/do-driver' -import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persisted-collection-core/src' +import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persistence-core/src' import { createBetterSqliteDoStorageHarness } from './helpers/better-sqlite-do-storage' import type { SQLiteCoreAdapterContractTodo, SQLiteCoreAdapterHarnessFactory, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' const createHarness: SQLiteCoreAdapterHarnessFactory = (options) => { const tempDirectory = mkdtempSync(join(tmpdir(), `db-cf-do-sql-core-`)) diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/tests/helpers/better-sqlite-do-storage.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/tests/helpers/better-sqlite-do-storage.ts similarity index 100% rename from packages/db-cloudflare-do-sqlite-persisted-collection/tests/helpers/better-sqlite-do-storage.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/tests/helpers/better-sqlite-do-storage.ts diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/tsconfig.docs.json b/packages/cloudflare-durable-objects-db-sqlite-persistence/tsconfig.docs.json similarity index 57% rename from packages/db-cloudflare-do-sqlite-persisted-collection/tsconfig.docs.json rename to packages/cloudflare-durable-objects-db-sqlite-persistence/tsconfig.docs.json index 5fddb4598..dec9e98d1 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/tsconfig.docs.json +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/tsconfig.docs.json @@ -3,8 +3,8 @@ "compilerOptions": { "paths": { "@tanstack/db": ["../db/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/tsconfig.json b/packages/cloudflare-durable-objects-db-sqlite-persistence/tsconfig.json similarity index 84% rename from packages/db-cloudflare-do-sqlite-persisted-collection/tsconfig.json rename to packages/cloudflare-durable-objects-db-sqlite-persistence/tsconfig.json index 97ec70305..722e23f3d 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/tsconfig.json +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/tsconfig.json @@ -14,8 +14,8 @@ "paths": { "@tanstack/db": ["../db/src"], "@tanstack/db-ivm": ["../db-ivm/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/vite.config.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/vite.config.ts similarity index 100% rename from packages/db-cloudflare-do-sqlite-persisted-collection/vite.config.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/vite.config.ts diff --git a/packages/db-cloudflare-do-sqlite-persisted-collection/vitest.e2e.config.ts b/packages/cloudflare-durable-objects-db-sqlite-persistence/vitest.e2e.config.ts similarity index 85% rename from packages/db-cloudflare-do-sqlite-persisted-collection/vitest.e2e.config.ts rename to packages/cloudflare-durable-objects-db-sqlite-persistence/vitest.e2e.config.ts index b17779a39..d36a509e3 100644 --- a/packages/db-cloudflare-do-sqlite-persisted-collection/vitest.e2e.config.ts +++ b/packages/cloudflare-durable-objects-db-sqlite-persistence/vitest.e2e.config.ts @@ -9,9 +9,9 @@ export default defineConfig({ alias: { '@tanstack/db': resolve(packageDirectory, `../db/src`), '@tanstack/db-ivm': resolve(packageDirectory, `../db-ivm/src`), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( packageDirectory, - `../db-sqlite-persisted-collection-core/src`, + `../db-sqlite-persistence-core/src`, ), }, }, diff --git a/packages/db-electron-sqlite-persisted-collection/tsconfig.docs.json b/packages/db-electron-sqlite-persisted-collection/tsconfig.docs.json deleted file mode 100644 index 3fd384ad1..000000000 --- a/packages/db-electron-sqlite-persisted-collection/tsconfig.docs.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "paths": { - "@tanstack/db": ["../db/src"], - "@tanstack/db-node-sqlite-persisted-collection": [ - "../db-node-sqlite-persisted-collection/src" - ], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" - ] - } - }, - "include": ["src"] -} diff --git a/packages/db-node-sqlite-persisted-collection/tsconfig.docs.json b/packages/db-node-sqlite-persisted-collection/tsconfig.docs.json deleted file mode 100644 index 5fddb4598..000000000 --- a/packages/db-node-sqlite-persisted-collection/tsconfig.docs.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "paths": { - "@tanstack/db": ["../db/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" - ] - } - }, - "include": ["src"] -} diff --git a/packages/db-react-native-sqlite-persisted-collection/tsconfig.docs.json b/packages/db-react-native-sqlite-persisted-collection/tsconfig.docs.json deleted file mode 100644 index 5fddb4598..000000000 --- a/packages/db-react-native-sqlite-persisted-collection/tsconfig.docs.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "paths": { - "@tanstack/db": ["../db/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" - ] - } - }, - "include": ["src"] -} diff --git a/packages/db-sqlite-persisted-collection-core/README.md b/packages/db-sqlite-persistence-core/README.md similarity index 89% rename from packages/db-sqlite-persisted-collection-core/README.md rename to packages/db-sqlite-persistence-core/README.md index 58da4a36a..1ed225957 100644 --- a/packages/db-sqlite-persisted-collection-core/README.md +++ b/packages/db-sqlite-persistence-core/README.md @@ -1,4 +1,4 @@ -# @tanstack/db-sqlite-persisted-collection-core +# @tanstack/db-sqlite-persistence-core Shared SQLite persistence primitives for TanStack DB. Runtime-specific wrappers (Node, Electron, React Native, Cloudflare Durable Objects) build on top of this @@ -86,10 +86,10 @@ while still handling per-collection schema versions correctly. In most applications, use a runtime package directly: -- `@tanstack/db-node-sqlite-persisted-collection` -- `@tanstack/db-browser-wa-sqlite-persisted-collection` -- `@tanstack/db-electron-sqlite-persisted-collection` -- `@tanstack/db-react-native-sqlite-persisted-collection` -- `@tanstack/db-cloudflare-do-sqlite-persisted-collection` +- `@tanstack/node-db-sqlite-persistence` +- `@tanstack/browser-db-sqlite-persistence` +- `@tanstack/electron-db-sqlite-persistence` +- `@tanstack/react-native-db-sqlite-persistence` +- `@tanstack/cloudflare-durable-objects-db-sqlite-persistence` Those packages provide concrete drivers and runtime wiring. diff --git a/packages/db-sqlite-persisted-collection-core/package.json b/packages/db-sqlite-persistence-core/package.json similarity index 90% rename from packages/db-sqlite-persisted-collection-core/package.json rename to packages/db-sqlite-persistence-core/package.json index 26a550831..a23786df3 100644 --- a/packages/db-sqlite-persisted-collection-core/package.json +++ b/packages/db-sqlite-persistence-core/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-sqlite-persisted-collection-core", + "name": "@tanstack/db-sqlite-persistence-core", "version": "0.1.0", "description": "SQLite persisted collection core for TanStack DB", "author": "TanStack Team", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "git+https://github.com/TanStack/db.git", - "directory": "packages/db-sqlite-persisted-collection-core" + "directory": "packages/db-sqlite-persistence-core" }, "homepage": "https://tanstack.com/db", "keywords": [ diff --git a/packages/db-sqlite-persisted-collection-core/src/errors.ts b/packages/db-sqlite-persistence-core/src/errors.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/src/errors.ts rename to packages/db-sqlite-persistence-core/src/errors.ts diff --git a/packages/db-sqlite-persisted-collection-core/src/index.ts b/packages/db-sqlite-persistence-core/src/index.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/src/index.ts rename to packages/db-sqlite-persistence-core/src/index.ts diff --git a/packages/db-sqlite-persisted-collection-core/src/persisted.ts b/packages/db-sqlite-persistence-core/src/persisted.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/src/persisted.ts rename to packages/db-sqlite-persistence-core/src/persisted.ts diff --git a/packages/db-sqlite-persisted-collection-core/src/sqlite-core-adapter.ts b/packages/db-sqlite-persistence-core/src/sqlite-core-adapter.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/src/sqlite-core-adapter.ts rename to packages/db-sqlite-persistence-core/src/sqlite-core-adapter.ts diff --git a/packages/db-sqlite-persisted-collection-core/tests/contracts/persisted-collection-conformance-contract.ts b/packages/db-sqlite-persistence-core/tests/contracts/persisted-collection-conformance-contract.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tests/contracts/persisted-collection-conformance-contract.ts rename to packages/db-sqlite-persistence-core/tests/contracts/persisted-collection-conformance-contract.ts diff --git a/packages/db-sqlite-persisted-collection-core/tests/contracts/runtime-bridge-e2e-contract.ts b/packages/db-sqlite-persistence-core/tests/contracts/runtime-bridge-e2e-contract.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tests/contracts/runtime-bridge-e2e-contract.ts rename to packages/db-sqlite-persistence-core/tests/contracts/runtime-bridge-e2e-contract.ts diff --git a/packages/db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract.ts b/packages/db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract.ts rename to packages/db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract.ts diff --git a/packages/db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract.ts b/packages/db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract.ts rename to packages/db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract.ts diff --git a/packages/db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract.ts b/packages/db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract.ts rename to packages/db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract.ts diff --git a/packages/db-sqlite-persisted-collection-core/tests/persisted.test-d.ts b/packages/db-sqlite-persistence-core/tests/persisted.test-d.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tests/persisted.test-d.ts rename to packages/db-sqlite-persistence-core/tests/persisted.test-d.ts diff --git a/packages/db-sqlite-persisted-collection-core/tests/persisted.test.ts b/packages/db-sqlite-persistence-core/tests/persisted.test.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tests/persisted.test.ts rename to packages/db-sqlite-persistence-core/tests/persisted.test.ts index 1613e0f3c..63af1f5d4 100644 --- a/packages/db-sqlite-persisted-collection-core/tests/persisted.test.ts +++ b/packages/db-sqlite-persistence-core/tests/persisted.test.ts @@ -1,9 +1,9 @@ import { describe, expect, it } from 'vitest' import { + BasicIndex, IR, createCollection, createTransaction, - BasicIndex, } from '@tanstack/db' import { InvalidPersistedCollectionCoordinatorError, diff --git a/packages/db-sqlite-persisted-collection-core/tests/sqlite-core-adapter-cli-runtime.test.ts b/packages/db-sqlite-persistence-core/tests/sqlite-core-adapter-cli-runtime.test.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tests/sqlite-core-adapter-cli-runtime.test.ts rename to packages/db-sqlite-persistence-core/tests/sqlite-core-adapter-cli-runtime.test.ts diff --git a/packages/db-sqlite-persisted-collection-core/tests/sqlite-core-adapter.test.ts b/packages/db-sqlite-persistence-core/tests/sqlite-core-adapter.test.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tests/sqlite-core-adapter.test.ts rename to packages/db-sqlite-persistence-core/tests/sqlite-core-adapter.test.ts diff --git a/packages/db-sqlite-persisted-collection-core/tsconfig.docs.json b/packages/db-sqlite-persistence-core/tsconfig.docs.json similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tsconfig.docs.json rename to packages/db-sqlite-persistence-core/tsconfig.docs.json diff --git a/packages/db-sqlite-persisted-collection-core/tsconfig.json b/packages/db-sqlite-persistence-core/tsconfig.json similarity index 100% rename from packages/db-sqlite-persisted-collection-core/tsconfig.json rename to packages/db-sqlite-persistence-core/tsconfig.json diff --git a/packages/db-sqlite-persisted-collection-core/vite.config.ts b/packages/db-sqlite-persistence-core/vite.config.ts similarity index 100% rename from packages/db-sqlite-persisted-collection-core/vite.config.ts rename to packages/db-sqlite-persistence-core/vite.config.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/tsconfig.docs.json b/packages/db-tauri-sqlite-persisted-collection/tsconfig.docs.json deleted file mode 100644 index 5fddb4598..000000000 --- a/packages/db-tauri-sqlite-persisted-collection/tsconfig.docs.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "paths": { - "@tanstack/db": ["../db/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" - ] - } - }, - "include": ["src"] -} diff --git a/packages/electric-db-collection/tests/electric.test.ts b/packages/electric-db-collection/tests/electric.test.ts index 15bdcb4f2..30b15887b 100644 --- a/packages/electric-db-collection/tests/electric.test.ts +++ b/packages/electric-db-collection/tests/electric.test.ts @@ -4,7 +4,7 @@ import { createCollection, createTransaction, } from '@tanstack/db' -import { persistedCollectionOptions } from '../../db-sqlite-persisted-collection-core/src' +import { persistedCollectionOptions } from '../../db-sqlite-persistence-core/src' import { electricCollectionOptions, isChangeMessage } from '../src/electric' import { stripVirtualProps } from '../../db/tests/utils' import type { ElectricCollectionUtils } from '../src/electric' diff --git a/packages/db-electron-sqlite-persisted-collection/README.md b/packages/electron-db-sqlite-persistence/README.md similarity index 76% rename from packages/db-electron-sqlite-persisted-collection/README.md rename to packages/electron-db-sqlite-persistence/README.md index d439d36ec..8f288dab3 100644 --- a/packages/db-electron-sqlite-persisted-collection/README.md +++ b/packages/electron-db-sqlite-persistence/README.md @@ -1,4 +1,4 @@ -# @tanstack/db-electron-sqlite-persisted-collection +# @tanstack/electron-db-sqlite-persistence Thin Electron bridge for TanStack DB SQLite persistence. @@ -8,16 +8,16 @@ Thin Electron bridge for TanStack DB SQLite persistence. - `createElectronSQLitePersistence(...)` (renderer process) - `persistedCollectionOptions(...)` (re-exported from core) -Use `@tanstack/db-electron-sqlite-persisted-collection/main` and -`@tanstack/db-electron-sqlite-persisted-collection/renderer` if you prefer +Use `@tanstack/electron-db-sqlite-persistence/main` and +`@tanstack/electron-db-sqlite-persistence/renderer` if you prefer explicit process-specific entrypoints. ## Main process ```ts import { ipcMain } from 'electron' -import { createNodeSQLitePersistence } from '@tanstack/db-node-sqlite-persisted-collection' -import { exposeElectronSQLitePersistence } from '@tanstack/db-electron-sqlite-persisted-collection/main' +import { createNodeSQLitePersistence } from '@tanstack/node-db-sqlite-persistence' +import { exposeElectronSQLitePersistence } from '@tanstack/electron-db-sqlite-persistence/main' import Database from 'better-sqlite3' const database = new Database(`./tanstack-db.sqlite`) @@ -42,7 +42,7 @@ import { ipcRenderer } from 'electron' import { createElectronSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-electron-sqlite-persisted-collection' +} from '@tanstack/electron-db-sqlite-persistence' type Todo = { id: string diff --git a/packages/db-electron-sqlite-persisted-collection/package.json b/packages/electron-db-sqlite-persistence/package.json similarity index 72% rename from packages/db-electron-sqlite-persisted-collection/package.json rename to packages/electron-db-sqlite-persistence/package.json index 3e39b25a2..7864e9483 100644 --- a/packages/db-electron-sqlite-persisted-collection/package.json +++ b/packages/electron-db-sqlite-persistence/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-electron-sqlite-persisted-collection", + "name": "@tanstack/electron-db-sqlite-persistence", "version": "0.1.0", "description": "Electron SQLite persisted collection bridge for TanStack DB", "author": "TanStack Team", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "git+https://github.com/TanStack/db.git", - "directory": "packages/db-electron-sqlite-persisted-collection" + "directory": "packages/electron-db-sqlite-persistence" }, "homepage": "https://tanstack.com/db", "keywords": [ @@ -22,8 +22,8 @@ "dev": "vite build --watch", "lint": "eslint . --fix", "test": "vitest --run", - "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-node-sqlite-persisted-collection build && pnpm --filter @tanstack/db-electron-sqlite-persisted-collection build && vitest --config vitest.e2e.config.ts --run", - "test:e2e:all": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-node-sqlite-persisted-collection build && pnpm --filter @tanstack/db-electron-sqlite-persisted-collection build && TANSTACK_DB_ELECTRON_E2E_ALL=1 vitest --run && TANSTACK_DB_ELECTRON_E2E_ALL=1 vitest --config vitest.e2e.config.ts --run" + "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/node-db-sqlite-persistence build && pnpm --filter @tanstack/electron-db-sqlite-persistence build && vitest --config vitest.e2e.config.ts --run", + "test:e2e:all": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/node-db-sqlite-persistence build && pnpm --filter @tanstack/electron-db-sqlite-persistence build && TANSTACK_DB_ELECTRON_E2E_ALL=1 vitest --run && TANSTACK_DB_ELECTRON_E2E_ALL=1 vitest --config vitest.e2e.config.ts --run" }, "type": "module", "main": "dist/cjs/index.cjs", @@ -68,7 +68,7 @@ "src" ], "dependencies": { - "@tanstack/db-sqlite-persisted-collection-core": "workspace:*" + "@tanstack/db-sqlite-persistence-core": "workspace:*" }, "peerDependencies": { "typescript": ">=4.7" diff --git a/packages/db-electron-sqlite-persisted-collection/src/electron-coordinator.ts b/packages/electron-db-sqlite-persistence/src/electron-coordinator.ts similarity index 99% rename from packages/db-electron-sqlite-persisted-collection/src/electron-coordinator.ts rename to packages/electron-db-sqlite-persistence/src/electron-coordinator.ts index b8e93f3bb..c7d48d17a 100644 --- a/packages/db-electron-sqlite-persisted-collection/src/electron-coordinator.ts +++ b/packages/electron-db-sqlite-persistence/src/electron-coordinator.ts @@ -6,7 +6,7 @@ import type { PersistenceAdapter, ProtocolEnvelope, PullSinceResponse, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { LoadSubsetOptions } from '@tanstack/db' // --------------------------------------------------------------------------- diff --git a/packages/db-electron-sqlite-persisted-collection/src/errors.ts b/packages/electron-db-sqlite-persistence/src/errors.ts similarity index 100% rename from packages/db-electron-sqlite-persisted-collection/src/errors.ts rename to packages/electron-db-sqlite-persistence/src/errors.ts diff --git a/packages/db-electron-sqlite-persisted-collection/src/index.ts b/packages/electron-db-sqlite-persistence/src/index.ts similarity index 88% rename from packages/db-electron-sqlite-persisted-collection/src/index.ts rename to packages/electron-db-sqlite-persistence/src/index.ts index d06335511..65c571726 100644 --- a/packages/db-electron-sqlite-persisted-collection/src/index.ts +++ b/packages/electron-db-sqlite-persistence/src/index.ts @@ -10,8 +10,8 @@ export type { } from './renderer' export { ElectronCollectionCoordinator } from './electron-coordinator' export type { ElectronCollectionCoordinatorOptions } from './electron-coordinator' -export { persistedCollectionOptions } from '@tanstack/db-sqlite-persisted-collection-core' +export { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core' export type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' diff --git a/packages/db-electron-sqlite-persisted-collection/src/main.ts b/packages/electron-db-sqlite-persistence/src/main.ts similarity index 98% rename from packages/db-electron-sqlite-persisted-collection/src/main.ts rename to packages/electron-db-sqlite-persistence/src/main.ts index 4d6ca8d49..609a6c1c7 100644 --- a/packages/db-electron-sqlite-persisted-collection/src/main.ts +++ b/packages/electron-db-sqlite-persistence/src/main.ts @@ -1,4 +1,4 @@ -import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persisted-collection-core' +import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core' import { DEFAULT_ELECTRON_PERSISTENCE_CHANNEL, ELECTRON_PERSISTENCE_PROTOCOL_VERSION, @@ -7,7 +7,7 @@ import type { PersistedCollectionPersistence, PersistenceAdapter, SQLitePullSinceResult, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { ElectronPersistedKey, ElectronPersistedRow, diff --git a/packages/db-electron-sqlite-persisted-collection/src/protocol.ts b/packages/electron-db-sqlite-persistence/src/protocol.ts similarity index 98% rename from packages/db-electron-sqlite-persisted-collection/src/protocol.ts rename to packages/electron-db-sqlite-persistence/src/protocol.ts index 441cd93bc..7dcdc8dec 100644 --- a/packages/db-electron-sqlite-persisted-collection/src/protocol.ts +++ b/packages/electron-db-sqlite-persistence/src/protocol.ts @@ -4,7 +4,7 @@ import type { PersistedIndexSpec, PersistedTx, SQLitePullSinceResult, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' export const ELECTRON_PERSISTENCE_PROTOCOL_VERSION = 1 as const export const DEFAULT_ELECTRON_PERSISTENCE_CHANNEL = `tanstack-db:sqlite-persistence` diff --git a/packages/db-electron-sqlite-persisted-collection/src/renderer.ts b/packages/electron-db-sqlite-persistence/src/renderer.ts similarity index 99% rename from packages/db-electron-sqlite-persisted-collection/src/renderer.ts rename to packages/electron-db-sqlite-persistence/src/renderer.ts index ab2dba887..fe0f97aed 100644 --- a/packages/db-electron-sqlite-persisted-collection/src/renderer.ts +++ b/packages/electron-db-sqlite-persistence/src/renderer.ts @@ -1,7 +1,7 @@ import { InvalidPersistedCollectionConfigError, SingleProcessCoordinator, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { ElectronCollectionCoordinator } from './electron-coordinator' import { DEFAULT_ELECTRON_PERSISTENCE_CHANNEL, @@ -14,7 +14,7 @@ import type { PersistedIndexSpec, PersistedTx, SQLitePullSinceResult, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { ElectronPersistedKey, ElectronPersistedRow, diff --git a/packages/db-electron-sqlite-persisted-collection/tests/e2e/electron-process-client.ts b/packages/electron-db-sqlite-persistence/tests/e2e/electron-process-client.ts similarity index 100% rename from packages/db-electron-sqlite-persisted-collection/tests/e2e/electron-process-client.ts rename to packages/electron-db-sqlite-persistence/tests/e2e/electron-process-client.ts diff --git a/packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/electron-main.mjs b/packages/electron-db-sqlite-persistence/tests/e2e/fixtures/electron-main.mjs similarity index 99% rename from packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/electron-main.mjs rename to packages/electron-db-sqlite-persistence/tests/e2e/fixtures/electron-main.mjs index 94ff930b9..048483e93 100644 --- a/packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/electron-main.mjs +++ b/packages/electron-db-sqlite-persistence/tests/e2e/fixtures/electron-main.mjs @@ -7,7 +7,7 @@ import { tmpdir } from 'node:os' import { fileURLToPath } from 'node:url' import { serialize } from 'node:v8' import { BrowserWindow, app, ipcMain } from 'electron' -import { createSQLiteCorePersistenceAdapter } from '@tanstack/db-sqlite-persisted-collection-core' +import { createSQLiteCorePersistenceAdapter } from '@tanstack/db-sqlite-persistence-core' import { exposeElectronSQLitePersistence } from '../../../dist/esm/main.js' const E2E_RESULT_PREFIX = `__TANSTACK_DB_E2E_RESULT__:` diff --git a/packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/renderer-page.html b/packages/electron-db-sqlite-persistence/tests/e2e/fixtures/renderer-page.html similarity index 100% rename from packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/renderer-page.html rename to packages/electron-db-sqlite-persistence/tests/e2e/fixtures/renderer-page.html diff --git a/packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/renderer-preload.cjs b/packages/electron-db-sqlite-persistence/tests/e2e/fixtures/renderer-preload.cjs similarity index 100% rename from packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/renderer-preload.cjs rename to packages/electron-db-sqlite-persistence/tests/e2e/fixtures/renderer-preload.cjs diff --git a/packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/runtime-bridge-types.ts b/packages/electron-db-sqlite-persistence/tests/e2e/fixtures/runtime-bridge-types.ts similarity index 94% rename from packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/runtime-bridge-types.ts rename to packages/electron-db-sqlite-persistence/tests/e2e/fixtures/runtime-bridge-types.ts index 3ec1283af..39be75ce0 100644 --- a/packages/db-electron-sqlite-persisted-collection/tests/e2e/fixtures/runtime-bridge-types.ts +++ b/packages/electron-db-sqlite-persistence/tests/e2e/fixtures/runtime-bridge-types.ts @@ -1,8 +1,8 @@ import type { RuntimeBridgeE2EContractError, RuntimeBridgeE2EContractTodo, -} from '../../../../db-sqlite-persisted-collection-core/tests/contracts/runtime-bridge-e2e-contract' -import type { SQLiteCoreAdapterOptions } from '@tanstack/db-sqlite-persisted-collection-core' +} from '../../../../db-sqlite-persistence-core/tests/contracts/runtime-bridge-e2e-contract' +import type { SQLiteCoreAdapterOptions } from '@tanstack/db-sqlite-persistence-core' import type { ElectronPersistenceRequestEnvelope, ElectronPersistenceResponseEnvelope, diff --git a/packages/db-electron-sqlite-persisted-collection/tests/electron-ipc.test-d.ts b/packages/electron-db-sqlite-persistence/tests/electron-ipc.test-d.ts similarity index 100% rename from packages/db-electron-sqlite-persisted-collection/tests/electron-ipc.test-d.ts rename to packages/electron-db-sqlite-persistence/tests/electron-ipc.test-d.ts diff --git a/packages/db-electron-sqlite-persisted-collection/tests/electron-ipc.test.ts b/packages/electron-db-sqlite-persistence/tests/electron-ipc.test.ts similarity index 97% rename from packages/db-electron-sqlite-persisted-collection/tests/electron-ipc.test.ts rename to packages/electron-db-sqlite-persistence/tests/electron-ipc.test.ts index a97131d1b..6754539f3 100644 --- a/packages/db-electron-sqlite-persisted-collection/tests/electron-ipc.test.ts +++ b/packages/electron-db-sqlite-persistence/tests/electron-ipc.test.ts @@ -2,9 +2,9 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' -import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persisted-collection-core' -import { createNodeSQLitePersistence } from '@tanstack/db-node-sqlite-persisted-collection' -import { BetterSqlite3SQLiteDriver } from '../../db-node-sqlite-persisted-collection/src/node-driver' +import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core' +import { createNodeSQLitePersistence } from '@tanstack/node-db-sqlite-persistence' +import { BetterSqlite3SQLiteDriver } from '../../node-db-sqlite-persistence/src/node-driver' import { createElectronSQLitePersistence, exposeElectronSQLitePersistence, @@ -17,7 +17,7 @@ import { createElectronRuntimeBridgeInvoke, isElectronFullE2EEnabled, } from './e2e/electron-process-client' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' import type { ElectronPersistenceInvoke, ElectronPersistenceRequestEnvelope, diff --git a/packages/db-electron-sqlite-persisted-collection/tests/electron-persisted-collection.e2e.test.ts b/packages/electron-db-sqlite-persistence/tests/electron-persisted-collection.e2e.test.ts similarity index 95% rename from packages/db-electron-sqlite-persisted-collection/tests/electron-persisted-collection.e2e.test.ts rename to packages/electron-db-sqlite-persistence/tests/electron-persisted-collection.e2e.test.ts index 3b4e70f2a..23976a234 100644 --- a/packages/db-electron-sqlite-persisted-collection/tests/electron-persisted-collection.e2e.test.ts +++ b/packages/electron-db-sqlite-persistence/tests/electron-persisted-collection.e2e.test.ts @@ -2,21 +2,21 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, afterEach, beforeAll } from 'vitest' -import { createCollection, BTreeIndex } from '@tanstack/db' -import { persistedCollectionOptions } from '@tanstack/db-sqlite-persisted-collection-core' -import { createNodeSQLitePersistence } from '@tanstack/db-node-sqlite-persisted-collection' -import { BetterSqlite3SQLiteDriver } from '../../db-node-sqlite-persisted-collection/src/node-driver' +import { BTreeIndex, createCollection } from '@tanstack/db' +import { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core' +import { createNodeSQLitePersistence } from '@tanstack/node-db-sqlite-persistence' +import { BetterSqlite3SQLiteDriver } from '../../node-db-sqlite-persistence/src/node-driver' import { createElectronSQLitePersistence, exposeElectronSQLitePersistence, } from '../src' import { generateSeedData } from '../../db-collection-e2e/src/fixtures/seed-data' -import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/persisted-collection-conformance-contract' +import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persistence-core/tests/contracts/persisted-collection-conformance-contract' import { createElectronRuntimeBridgeInvoke, isElectronFullE2EEnabled, } from './e2e/electron-process-client' -import type { PersistedTx } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedTx } from '@tanstack/db-sqlite-persistence-core' import type { Collection } from '@tanstack/db' import type { ElectronPersistenceInvoke, diff --git a/packages/db-electron-sqlite-persisted-collection/tests/electron-runtime-bridge.e2e.test.ts b/packages/electron-db-sqlite-persistence/tests/electron-runtime-bridge.e2e.test.ts similarity index 94% rename from packages/db-electron-sqlite-persisted-collection/tests/electron-runtime-bridge.e2e.test.ts rename to packages/electron-db-sqlite-persistence/tests/electron-runtime-bridge.e2e.test.ts index ae163bbd4..f514c6650 100644 --- a/packages/db-electron-sqlite-persisted-collection/tests/electron-runtime-bridge.e2e.test.ts +++ b/packages/electron-db-sqlite-persistence/tests/electron-runtime-bridge.e2e.test.ts @@ -1,14 +1,14 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runRuntimeBridgeE2EContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-bridge-e2e-contract' +import { runRuntimeBridgeE2EContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/runtime-bridge-e2e-contract' import { runElectronRuntimeBridgeScenario } from './e2e/electron-process-client' import type { RuntimeBridgeE2EContractError, RuntimeBridgeE2EContractHarness, RuntimeBridgeE2EContractHarnessFactory, RuntimeBridgeE2EContractTodo, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-bridge-e2e-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/runtime-bridge-e2e-contract' import type { ElectronRuntimeBridgeInput, ElectronRuntimeBridgeScenarioResult, diff --git a/packages/db-electron-sqlite-persisted-collection/tests/electron-sqlite-core-adapter-contract.test.ts b/packages/electron-db-sqlite-persistence/tests/electron-sqlite-core-adapter-contract.test.ts similarity index 91% rename from packages/db-electron-sqlite-persisted-collection/tests/electron-sqlite-core-adapter-contract.test.ts rename to packages/electron-db-sqlite-persistence/tests/electron-sqlite-core-adapter-contract.test.ts index 22651f0e3..663bae336 100644 --- a/packages/db-electron-sqlite-persisted-collection/tests/electron-sqlite-core-adapter-contract.test.ts +++ b/packages/electron-db-sqlite-persistence/tests/electron-sqlite-core-adapter-contract.test.ts @@ -1,9 +1,9 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { createSQLiteCorePersistenceAdapter } from '@tanstack/db-sqlite-persisted-collection-core' -import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' -import { BetterSqlite3SQLiteDriver } from '../../db-node-sqlite-persisted-collection/src/node-driver' +import { createSQLiteCorePersistenceAdapter } from '@tanstack/db-sqlite-persistence-core' +import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' +import { BetterSqlite3SQLiteDriver } from '../../node-db-sqlite-persistence/src/node-driver' import { createElectronSQLitePersistence, exposeElectronSQLitePersistence, @@ -15,7 +15,7 @@ import { import type { SQLiteCoreAdapterContractTodo, SQLiteCoreAdapterHarnessFactory, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' import type { ElectronPersistenceInvoke, ElectronPersistenceResponseEnvelope, diff --git a/packages/electron-db-sqlite-persistence/tsconfig.docs.json b/packages/electron-db-sqlite-persistence/tsconfig.docs.json new file mode 100644 index 000000000..7131ed70a --- /dev/null +++ b/packages/electron-db-sqlite-persistence/tsconfig.docs.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "@tanstack/db": ["../db/src"], + "@tanstack/node-db-sqlite-persistence": [ + "../node-db-sqlite-persistence/src" + ], + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" + ] + } + }, + "include": ["src"] +} diff --git a/packages/db-electron-sqlite-persisted-collection/tsconfig.json b/packages/electron-db-sqlite-persistence/tsconfig.json similarity index 74% rename from packages/db-electron-sqlite-persisted-collection/tsconfig.json rename to packages/electron-db-sqlite-persistence/tsconfig.json index b07723d02..d2f1d836a 100644 --- a/packages/db-electron-sqlite-persisted-collection/tsconfig.json +++ b/packages/electron-db-sqlite-persistence/tsconfig.json @@ -14,11 +14,11 @@ "paths": { "@tanstack/db": ["../db/src"], "@tanstack/db-ivm": ["../db-ivm/src"], - "@tanstack/db-node-sqlite-persisted-collection": [ - "../db-node-sqlite-persisted-collection/src" + "@tanstack/node-db-sqlite-persistence": [ + "../node-db-sqlite-persistence/src" ], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-electron-sqlite-persisted-collection/vite.config.ts b/packages/electron-db-sqlite-persistence/vite.config.ts similarity index 100% rename from packages/db-electron-sqlite-persisted-collection/vite.config.ts rename to packages/electron-db-sqlite-persistence/vite.config.ts diff --git a/packages/db-electron-sqlite-persisted-collection/vitest.e2e.config.ts b/packages/electron-db-sqlite-persistence/vitest.e2e.config.ts similarity index 75% rename from packages/db-electron-sqlite-persisted-collection/vitest.e2e.config.ts rename to packages/electron-db-sqlite-persistence/vitest.e2e.config.ts index 70fe559f0..a4390eb59 100644 --- a/packages/db-electron-sqlite-persisted-collection/vitest.e2e.config.ts +++ b/packages/electron-db-sqlite-persistence/vitest.e2e.config.ts @@ -9,13 +9,13 @@ export default defineConfig({ alias: { '@tanstack/db': resolve(packageDirectory, `../db/src`), '@tanstack/db-ivm': resolve(packageDirectory, `../db-ivm/src`), - '@tanstack/db-node-sqlite-persisted-collection': resolve( + '@tanstack/node-db-sqlite-persistence': resolve( packageDirectory, - `../db-node-sqlite-persisted-collection/src`, + `../node-db-sqlite-persistence/src`, ), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( packageDirectory, - `../db-sqlite-persisted-collection-core/src`, + `../db-sqlite-persistence-core/src`, ), }, }, diff --git a/packages/db-expo-sqlite-persisted-collection/README.md b/packages/expo-db-sqlite-persistence/README.md similarity index 77% rename from packages/db-expo-sqlite-persisted-collection/README.md rename to packages/expo-db-sqlite-persistence/README.md index 0bfcac5b6..8798a2b99 100644 --- a/packages/db-expo-sqlite-persisted-collection/README.md +++ b/packages/expo-db-sqlite-persistence/README.md @@ -1,4 +1,4 @@ -# @tanstack/db-expo-sqlite-persisted-collection +# @tanstack/expo-db-sqlite-persistence Thin SQLite persistence for Expo apps using the official `expo-sqlite` adapter. @@ -7,7 +7,7 @@ Thin SQLite persistence for Expo apps using the official `expo-sqlite` adapter. - `createExpoSQLitePersistence(...)` - `persistedCollectionOptions(...)` (re-exported from core) - Advanced driver entrypoint: - `@tanstack/db-expo-sqlite-persisted-collection/expo-sqlite-driver` + `@tanstack/expo-db-sqlite-persistence/expo-sqlite-driver` ## Quick start @@ -17,7 +17,7 @@ import { createCollection } from '@tanstack/db' import { createExpoSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-expo-sqlite-persisted-collection' +} from '@tanstack/expo-db-sqlite-persistence' type Todo = { id: string @@ -50,15 +50,15 @@ export const todosCollection = createCollection( - Mode defaults (`sync-present` vs `sync-absent`) are inferred from whether a `sync` config is present in `persistedCollectionOptions`. - The React Native `op-sqlite` wrapper remains available in - `@tanstack/db-react-native-sqlite-persisted-collection`. + `@tanstack/react-native-db-sqlite-persistence`. - Expo web is not part of the emulator-backed E2E path in this package. Use the browser SQLite package for browser-focused persistence coverage. ## E2E -- `pnpm --filter @tanstack/db-expo-sqlite-persisted-collection test:e2e` +- `pnpm --filter @tanstack/expo-db-sqlite-persistence test:e2e` runs the shared Node-backed conformance suite. -- `pnpm --filter @tanstack/db-expo-sqlite-persisted-collection test:e2e:expo:ios` +- `pnpm --filter @tanstack/expo-db-sqlite-persistence test:e2e:expo:ios` runs the real Expo iOS Simulator path. -- `pnpm --filter @tanstack/db-expo-sqlite-persisted-collection test:e2e:expo:android` +- `pnpm --filter @tanstack/expo-db-sqlite-persistence test:e2e:expo:android` runs the real Expo Android Emulator path. diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/expo-emulator-smoke.e2e.test.ts b/packages/expo-db-sqlite-persistence/e2e/expo-emulator-smoke.e2e.test.ts similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/e2e/expo-emulator-smoke.e2e.test.ts rename to packages/expo-db-sqlite-persistence/e2e/expo-emulator-smoke.e2e.test.ts diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/expo-persisted-collection.e2e.test.ts b/packages/expo-db-sqlite-persistence/e2e/expo-persisted-collection.e2e.test.ts similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/e2e/expo-persisted-collection.e2e.test.ts rename to packages/expo-db-sqlite-persistence/e2e/expo-persisted-collection.e2e.test.ts diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/App.tsx b/packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/App.tsx similarity index 99% rename from packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/App.tsx rename to packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/App.tsx index a1cac71a5..616b733f7 100644 --- a/packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/App.tsx +++ b/packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/App.tsx @@ -5,7 +5,7 @@ import { createCollection } from '@tanstack/db' import { createExpoSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-expo-sqlite-persisted-collection' +} from '@tanstack/expo-db-sqlite-persistence' import type { ExpoRuntimeCommand, ExpoRuntimeCommandResult, diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/app.json b/packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/app.json similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/app.json rename to packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/app.json diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/index.js b/packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/index.js similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/index.js rename to packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/index.js diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/metro.config.js b/packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/metro.config.js similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/metro.config.js rename to packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/metro.config.js diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/package.json b/packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/package.json similarity index 72% rename from packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/package.json rename to packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/package.json index 89d937dbb..971cc13b2 100644 --- a/packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/package.json +++ b/packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-expo-sqlite-persisted-collection-e2e-app", + "name": "@tanstack/expo-db-sqlite-persistence-e2e-app", "private": true, "version": "0.0.0", "main": "index.js", @@ -10,7 +10,7 @@ }, "dependencies": { "@tanstack/db": "workspace:*", - "@tanstack/db-expo-sqlite-persisted-collection": "workspace:*", + "@tanstack/expo-db-sqlite-persistence": "workspace:*", "expo": "~55.0.6", "expo-sqlite": "^55.0.10", "react": "19.2.0", diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/polyfills.js b/packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/polyfills.js similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/polyfills.js rename to packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/polyfills.js diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/tsconfig.json b/packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/tsconfig.json similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app/tsconfig.json rename to packages/expo-db-sqlite-persistence/e2e/expo-runtime-app/tsconfig.json diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/mobile-persisted-collection-conformance-suite.ts b/packages/expo-db-sqlite-persistence/e2e/mobile-persisted-collection-conformance-suite.ts similarity index 97% rename from packages/db-expo-sqlite-persisted-collection/e2e/mobile-persisted-collection-conformance-suite.ts rename to packages/expo-db-sqlite-persistence/e2e/mobile-persisted-collection-conformance-suite.ts index 4d5f66740..fd5e1ff39 100644 --- a/packages/db-expo-sqlite-persisted-collection/e2e/mobile-persisted-collection-conformance-suite.ts +++ b/packages/expo-db-sqlite-persistence/e2e/mobile-persisted-collection-conformance-suite.ts @@ -2,13 +2,13 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, afterEach, beforeAll } from 'vitest' -import { createCollection, BTreeIndex } from '@tanstack/db' +import { BTreeIndex, createCollection } from '@tanstack/db' import { persistedCollectionOptions } from '../src' import { generateSeedData } from '../../db-collection-e2e/src/fixtures/seed-data' -import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/persisted-collection-conformance-contract' +import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persistence-core/tests/contracts/persisted-collection-conformance-contract' import { createExpoSQLiteTestDatabase } from '../tests/helpers/expo-sqlite-test-db' import type { Collection } from '@tanstack/db' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' import type { Comment, E2ETestConfig, diff --git a/packages/db-expo-sqlite-persisted-collection/e2e/runtime-protocol.ts b/packages/expo-db-sqlite-persistence/e2e/runtime-protocol.ts similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/e2e/runtime-protocol.ts rename to packages/expo-db-sqlite-persistence/e2e/runtime-protocol.ts diff --git a/packages/db-expo-sqlite-persisted-collection/package.json b/packages/expo-db-sqlite-persistence/package.json similarity index 66% rename from packages/db-expo-sqlite-persisted-collection/package.json rename to packages/expo-db-sqlite-persistence/package.json index 7054b7b80..9f1b03396 100644 --- a/packages/db-expo-sqlite-persisted-collection/package.json +++ b/packages/expo-db-sqlite-persistence/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-expo-sqlite-persisted-collection", + "name": "@tanstack/expo-db-sqlite-persistence", "version": "0.1.0", "description": "Expo SQLite persisted collection adapter for TanStack DB", "author": "TanStack Team", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "git+https://github.com/TanStack/db.git", - "directory": "packages/db-expo-sqlite-persisted-collection" + "directory": "packages/expo-db-sqlite-persistence" }, "homepage": "https://tanstack.com/db", "keywords": [ @@ -22,9 +22,9 @@ "dev": "vite build --watch", "lint": "eslint . --fix", "test": "vitest --run", - "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-expo-sqlite-persisted-collection build && vitest --config vitest.e2e.config.ts --run", - "test:e2e:expo:ios": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-expo-sqlite-persisted-collection build && TANSTACK_DB_MOBILE_REQUIRE_RUNTIME_FACTORY=1 TANSTACK_DB_MOBILE_SQLITE_FACTORY_MODULE=./tests/helpers/expo-emulator-database-factory.ts TANSTACK_DB_EXPO_RUNTIME_PLATFORM=ios vitest --config vitest.e2e.config.ts --run", - "test:e2e:expo:android": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-expo-sqlite-persisted-collection build && TANSTACK_DB_MOBILE_REQUIRE_RUNTIME_FACTORY=1 TANSTACK_DB_MOBILE_SQLITE_FACTORY_MODULE=./tests/helpers/expo-emulator-database-factory.ts TANSTACK_DB_EXPO_RUNTIME_PLATFORM=android vitest --config vitest.e2e.config.ts --run" + "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/expo-db-sqlite-persistence build && vitest --config vitest.e2e.config.ts --run", + "test:e2e:expo:ios": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/expo-db-sqlite-persistence build && TANSTACK_DB_MOBILE_REQUIRE_RUNTIME_FACTORY=1 TANSTACK_DB_MOBILE_SQLITE_FACTORY_MODULE=./tests/helpers/expo-emulator-database-factory.ts TANSTACK_DB_EXPO_RUNTIME_PLATFORM=ios vitest --config vitest.e2e.config.ts --run", + "test:e2e:expo:android": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/expo-db-sqlite-persistence build && TANSTACK_DB_MOBILE_REQUIRE_RUNTIME_FACTORY=1 TANSTACK_DB_MOBILE_SQLITE_FACTORY_MODULE=./tests/helpers/expo-emulator-database-factory.ts TANSTACK_DB_EXPO_RUNTIME_PLATFORM=android vitest --config vitest.e2e.config.ts --run" }, "type": "module", "main": "dist/cjs/index.cjs", @@ -59,7 +59,7 @@ "src" ], "dependencies": { - "@tanstack/db-sqlite-persisted-collection-core": "workspace:*" + "@tanstack/db-sqlite-persistence-core": "workspace:*" }, "peerDependencies": { "expo-sqlite": "^55.0.10", diff --git a/packages/db-expo-sqlite-persisted-collection/src/expo-sqlite-driver.ts b/packages/expo-db-sqlite-persistence/src/expo-sqlite-driver.ts similarity index 98% rename from packages/db-expo-sqlite-persisted-collection/src/expo-sqlite-driver.ts rename to packages/expo-db-sqlite-persistence/src/expo-sqlite-driver.ts index ea84d6a28..e85df20aa 100644 --- a/packages/db-expo-sqlite-persisted-collection/src/expo-sqlite-driver.ts +++ b/packages/expo-db-sqlite-persistence/src/expo-sqlite-driver.ts @@ -1,5 +1,5 @@ -import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persisted-collection-core' -import type { SQLiteDriver } from '@tanstack/db-sqlite-persisted-collection-core' +import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core' +import type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core' export type ExpoSQLiteBindParams = | ReadonlyArray diff --git a/packages/db-expo-sqlite-persisted-collection/src/expo.ts b/packages/expo-db-sqlite-persistence/src/expo.ts similarity index 97% rename from packages/db-expo-sqlite-persisted-collection/src/expo.ts rename to packages/expo-db-sqlite-persistence/src/expo.ts index daf4bce39..fda560d97 100644 --- a/packages/db-expo-sqlite-persisted-collection/src/expo.ts +++ b/packages/expo-db-sqlite-persistence/src/expo.ts @@ -1,7 +1,7 @@ import { SingleProcessCoordinator, createSQLiteCorePersistenceAdapter, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { ExpoSQLiteDriver } from './expo-sqlite-driver' import type { PersistedCollectionCoordinator, @@ -9,7 +9,7 @@ import type { PersistedCollectionPersistence, SQLiteCoreAdapterOptions, SQLiteDriver, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { ExpoSQLiteDatabaseLike } from './expo-sqlite-driver' export type { ExpoSQLiteDatabaseLike } from './expo-sqlite-driver' diff --git a/packages/db-expo-sqlite-persisted-collection/src/index.ts b/packages/expo-db-sqlite-persistence/src/index.ts similarity index 79% rename from packages/db-expo-sqlite-persisted-collection/src/index.ts rename to packages/expo-db-sqlite-persistence/src/index.ts index 3e4246d94..6b6968dca 100644 --- a/packages/db-expo-sqlite-persisted-collection/src/index.ts +++ b/packages/expo-db-sqlite-persistence/src/index.ts @@ -4,8 +4,8 @@ export type { ExpoSQLitePersistenceOptions, ExpoSQLiteSchemaMismatchPolicy, } from './expo' -export { persistedCollectionOptions } from '@tanstack/db-sqlite-persisted-collection-core' +export { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core' export type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' diff --git a/packages/db-expo-sqlite-persisted-collection/tests/expo-persistence.test.ts b/packages/expo-db-sqlite-persistence/tests/expo-persistence.test.ts similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/tests/expo-persistence.test.ts rename to packages/expo-db-sqlite-persistence/tests/expo-persistence.test.ts diff --git a/packages/db-expo-sqlite-persisted-collection/tests/expo-runtime-persistence-contract.test.ts b/packages/expo-db-sqlite-persistence/tests/expo-runtime-persistence-contract.test.ts similarity index 96% rename from packages/db-expo-sqlite-persisted-collection/tests/expo-runtime-persistence-contract.test.ts rename to packages/expo-db-sqlite-persistence/tests/expo-runtime-persistence-contract.test.ts index 22af21d29..8e88a3f1d 100644 --- a/packages/db-expo-sqlite-persisted-collection/tests/expo-runtime-persistence-contract.test.ts +++ b/packages/expo-db-sqlite-persistence/tests/expo-runtime-persistence-contract.test.ts @@ -4,18 +4,18 @@ import { join } from 'node:path' import { describe, expect, it } from 'vitest' import { createExpoSQLitePersistence, persistedCollectionOptions } from '../src' import { createExpoSQLiteDriver } from '../src/expo-sqlite-driver' -import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' -import { SingleProcessCoordinator } from '../../db-sqlite-persisted-collection-core/src' +import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' +import { SingleProcessCoordinator } from '../../db-sqlite-persistence-core/src' import { createExpoSQLiteTestDatabase } from './helpers/expo-sqlite-test-db' import type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { ExpoSQLiteDatabaseLike } from '../src/expo-sqlite-driver' import type { RuntimePersistenceContractTodo, RuntimePersistenceDatabaseHarness, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' type RuntimePersistenceFactory = (options: { database: ExpoSQLiteDatabaseLike diff --git a/packages/db-expo-sqlite-persisted-collection/tests/expo-sqlite-core-adapter-contract.test.ts b/packages/expo-db-sqlite-persistence/tests/expo-sqlite-core-adapter-contract.test.ts similarity index 85% rename from packages/db-expo-sqlite-persisted-collection/tests/expo-sqlite-core-adapter-contract.test.ts rename to packages/expo-db-sqlite-persistence/tests/expo-sqlite-core-adapter-contract.test.ts index 8aac6fa3f..c6cfdf816 100644 --- a/packages/db-expo-sqlite-persisted-collection/tests/expo-sqlite-core-adapter-contract.test.ts +++ b/packages/expo-db-sqlite-persistence/tests/expo-sqlite-core-adapter-contract.test.ts @@ -1,14 +1,14 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' import { ExpoSQLiteDriver } from '../src/expo-sqlite-driver' -import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persisted-collection-core/src' +import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persistence-core/src' import { createExpoSQLiteTestDatabase } from './helpers/expo-sqlite-test-db' import type { SQLiteCoreAdapterContractTodo, SQLiteCoreAdapterHarnessFactory, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' const createHarness: SQLiteCoreAdapterHarnessFactory = (options) => { const tempDirectory = mkdtempSync(join(tmpdir(), `db-expo-core-`)) diff --git a/packages/db-expo-sqlite-persisted-collection/tests/expo-sqlite-driver-contract.test.ts b/packages/expo-db-sqlite-persistence/tests/expo-sqlite-driver-contract.test.ts similarity index 88% rename from packages/db-expo-sqlite-persisted-collection/tests/expo-sqlite-driver-contract.test.ts rename to packages/expo-db-sqlite-persistence/tests/expo-sqlite-driver-contract.test.ts index aa9da5164..8860b6805 100644 --- a/packages/db-expo-sqlite-persisted-collection/tests/expo-sqlite-driver-contract.test.ts +++ b/packages/expo-db-sqlite-persistence/tests/expo-sqlite-driver-contract.test.ts @@ -1,10 +1,10 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteDriverContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import { runSQLiteDriverContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' import { ExpoSQLiteDriver } from '../src/expo-sqlite-driver' import { createExpoSQLiteTestDatabase } from './helpers/expo-sqlite-test-db' -import type { SQLiteDriverContractHarness } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import type { SQLiteDriverContractHarness } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' function createDriverHarness(): SQLiteDriverContractHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-expo-driver-contract-`)) diff --git a/packages/db-expo-sqlite-persisted-collection/tests/expo-sqlite-driver.test.ts b/packages/expo-db-sqlite-persistence/tests/expo-sqlite-driver.test.ts similarity index 99% rename from packages/db-expo-sqlite-persisted-collection/tests/expo-sqlite-driver.test.ts rename to packages/expo-db-sqlite-persistence/tests/expo-sqlite-driver.test.ts index a959a9dfe..cff37d7c5 100644 --- a/packages/db-expo-sqlite-persisted-collection/tests/expo-sqlite-driver.test.ts +++ b/packages/expo-db-sqlite-persistence/tests/expo-sqlite-driver.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, expect, it } from 'vitest' import { ExpoSQLiteDriver } from '../src/expo-sqlite-driver' -import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persisted-collection-core/src' +import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persistence-core/src' import { createExpoSQLiteTestDatabase } from './helpers/expo-sqlite-test-db' const activeCleanupFns: Array<() => void | Promise> = [] diff --git a/packages/db-expo-sqlite-persisted-collection/tests/helpers/expo-emulator-database-factory.ts b/packages/expo-db-sqlite-persistence/tests/helpers/expo-emulator-database-factory.ts similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/tests/helpers/expo-emulator-database-factory.ts rename to packages/expo-db-sqlite-persistence/tests/helpers/expo-emulator-database-factory.ts diff --git a/packages/db-expo-sqlite-persisted-collection/tests/helpers/expo-emulator-runtime.ts b/packages/expo-db-sqlite-persistence/tests/helpers/expo-emulator-runtime.ts similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/tests/helpers/expo-emulator-runtime.ts rename to packages/expo-db-sqlite-persistence/tests/helpers/expo-emulator-runtime.ts diff --git a/packages/db-expo-sqlite-persisted-collection/tests/helpers/expo-sqlite-test-db.ts b/packages/expo-db-sqlite-persistence/tests/helpers/expo-sqlite-test-db.ts similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/tests/helpers/expo-sqlite-test-db.ts rename to packages/expo-db-sqlite-persistence/tests/helpers/expo-sqlite-test-db.ts diff --git a/packages/db-expo-sqlite-persisted-collection/tests/helpers/mobile-runtime-test-setup.ts b/packages/expo-db-sqlite-persistence/tests/helpers/mobile-runtime-test-setup.ts similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/tests/helpers/mobile-runtime-test-setup.ts rename to packages/expo-db-sqlite-persistence/tests/helpers/mobile-runtime-test-setup.ts diff --git a/packages/db-expo-sqlite-persisted-collection/tsconfig.docs.json b/packages/expo-db-sqlite-persistence/tsconfig.docs.json similarity index 57% rename from packages/db-expo-sqlite-persisted-collection/tsconfig.docs.json rename to packages/expo-db-sqlite-persistence/tsconfig.docs.json index 5fddb4598..dec9e98d1 100644 --- a/packages/db-expo-sqlite-persisted-collection/tsconfig.docs.json +++ b/packages/expo-db-sqlite-persistence/tsconfig.docs.json @@ -3,8 +3,8 @@ "compilerOptions": { "paths": { "@tanstack/db": ["../db/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-expo-sqlite-persisted-collection/tsconfig.json b/packages/expo-db-sqlite-persistence/tsconfig.json similarity index 84% rename from packages/db-expo-sqlite-persisted-collection/tsconfig.json rename to packages/expo-db-sqlite-persistence/tsconfig.json index c51df7306..2f95646ec 100644 --- a/packages/db-expo-sqlite-persisted-collection/tsconfig.json +++ b/packages/expo-db-sqlite-persistence/tsconfig.json @@ -14,8 +14,8 @@ "paths": { "@tanstack/db": ["../db/src"], "@tanstack/db-ivm": ["../db-ivm/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-expo-sqlite-persisted-collection/vite.config.ts b/packages/expo-db-sqlite-persistence/vite.config.ts similarity index 100% rename from packages/db-expo-sqlite-persisted-collection/vite.config.ts rename to packages/expo-db-sqlite-persistence/vite.config.ts diff --git a/packages/db-expo-sqlite-persisted-collection/vitest.e2e.config.ts b/packages/expo-db-sqlite-persistence/vitest.e2e.config.ts similarity index 86% rename from packages/db-expo-sqlite-persisted-collection/vitest.e2e.config.ts rename to packages/expo-db-sqlite-persistence/vitest.e2e.config.ts index cc5e6d535..8a7fff173 100644 --- a/packages/db-expo-sqlite-persisted-collection/vitest.e2e.config.ts +++ b/packages/expo-db-sqlite-persistence/vitest.e2e.config.ts @@ -9,9 +9,9 @@ export default defineConfig({ alias: { '@tanstack/db': resolve(packageDirectory, `../db/src`), '@tanstack/db-ivm': resolve(packageDirectory, `../db-ivm/src`), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( packageDirectory, - `../db-sqlite-persisted-collection-core/src`, + `../db-sqlite-persistence-core/src`, ), }, }, diff --git a/packages/db-node-sqlite-persisted-collection/README.md b/packages/node-db-sqlite-persistence/README.md similarity index 91% rename from packages/db-node-sqlite-persisted-collection/README.md rename to packages/node-db-sqlite-persistence/README.md index d13b9224b..fc2fdb2f6 100644 --- a/packages/db-node-sqlite-persisted-collection/README.md +++ b/packages/node-db-sqlite-persistence/README.md @@ -1,4 +1,4 @@ -# @tanstack/db-node-sqlite-persisted-collection +# @tanstack/node-db-sqlite-persistence Thin Node SQLite persistence for TanStack DB. @@ -14,7 +14,7 @@ import { createCollection } from '@tanstack/db' import { createNodeSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-node-sqlite-persisted-collection' +} from '@tanstack/node-db-sqlite-persistence' import Database from 'better-sqlite3' type Todo = { diff --git a/packages/db-node-sqlite-persisted-collection/e2e/node-persisted-collection.e2e.test.ts b/packages/node-db-sqlite-persistence/e2e/node-persisted-collection.e2e.test.ts similarity index 97% rename from packages/db-node-sqlite-persisted-collection/e2e/node-persisted-collection.e2e.test.ts rename to packages/node-db-sqlite-persistence/e2e/node-persisted-collection.e2e.test.ts index 393291434..221fdd950 100644 --- a/packages/db-node-sqlite-persisted-collection/e2e/node-persisted-collection.e2e.test.ts +++ b/packages/node-db-sqlite-persistence/e2e/node-persisted-collection.e2e.test.ts @@ -2,11 +2,11 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, afterEach, beforeAll } from 'vitest' -import { createCollection, BTreeIndex } from '@tanstack/db' +import { BTreeIndex, createCollection } from '@tanstack/db' import BetterSqlite3 from 'better-sqlite3' import { createNodeSQLitePersistence, persistedCollectionOptions } from '../src' import { generateSeedData } from '../../db-collection-e2e/src/fixtures/seed-data' -import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/persisted-collection-conformance-contract' +import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persistence-core/tests/contracts/persisted-collection-conformance-contract' import type { Collection } from '@tanstack/db' import type { Comment, diff --git a/packages/db-node-sqlite-persisted-collection/package.json b/packages/node-db-sqlite-persistence/package.json similarity index 80% rename from packages/db-node-sqlite-persisted-collection/package.json rename to packages/node-db-sqlite-persistence/package.json index 727b95159..aaec289d8 100644 --- a/packages/db-node-sqlite-persisted-collection/package.json +++ b/packages/node-db-sqlite-persistence/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-node-sqlite-persisted-collection", + "name": "@tanstack/node-db-sqlite-persistence", "version": "0.1.0", "description": "Node SQLite persisted collection adapter for TanStack DB", "author": "TanStack Team", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "git+https://github.com/TanStack/db.git", - "directory": "packages/db-node-sqlite-persisted-collection" + "directory": "packages/node-db-sqlite-persistence" }, "homepage": "https://tanstack.com/db", "keywords": [ @@ -22,7 +22,7 @@ "dev": "vite build --watch", "lint": "eslint . --fix", "test": "vitest --run", - "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-node-sqlite-persisted-collection build && vitest --config vitest.e2e.config.ts --run" + "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/node-db-sqlite-persistence build && vitest --config vitest.e2e.config.ts --run" }, "type": "module", "main": "dist/cjs/index.cjs", @@ -47,7 +47,7 @@ "src" ], "dependencies": { - "@tanstack/db-sqlite-persisted-collection-core": "workspace:*", + "@tanstack/db-sqlite-persistence-core": "workspace:*", "better-sqlite3": "^12.6.2" }, "peerDependencies": { diff --git a/packages/db-node-sqlite-persisted-collection/src/index.ts b/packages/node-db-sqlite-persistence/src/index.ts similarity index 80% rename from packages/db-node-sqlite-persisted-collection/src/index.ts rename to packages/node-db-sqlite-persistence/src/index.ts index 0e649333f..52c936c1d 100644 --- a/packages/db-node-sqlite-persisted-collection/src/index.ts +++ b/packages/node-db-sqlite-persistence/src/index.ts @@ -4,8 +4,8 @@ export type { NodeSQLitePersistenceOptions, NodeSQLiteSchemaMismatchPolicy, } from './node-persistence' -export { persistedCollectionOptions } from '@tanstack/db-sqlite-persisted-collection-core' +export { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core' export type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' diff --git a/packages/db-node-sqlite-persisted-collection/src/node-driver.ts b/packages/node-db-sqlite-persistence/src/node-driver.ts similarity index 98% rename from packages/db-node-sqlite-persisted-collection/src/node-driver.ts rename to packages/node-db-sqlite-persistence/src/node-driver.ts index b849a9f3d..eb42ee135 100644 --- a/packages/db-node-sqlite-persisted-collection/src/node-driver.ts +++ b/packages/node-db-sqlite-persistence/src/node-driver.ts @@ -1,7 +1,7 @@ import { AsyncLocalStorage } from 'node:async_hooks' import BetterSqlite3 from 'better-sqlite3' -import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persisted-collection-core' -import type { SQLiteDriver } from '@tanstack/db-sqlite-persisted-collection-core' +import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core' +import type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core' const DEFAULT_PRAGMAS = [ `journal_mode = WAL`, diff --git a/packages/db-node-sqlite-persisted-collection/src/node-persistence.ts b/packages/node-db-sqlite-persistence/src/node-persistence.ts similarity index 97% rename from packages/db-node-sqlite-persisted-collection/src/node-persistence.ts rename to packages/node-db-sqlite-persistence/src/node-persistence.ts index 993a1418a..f63031e81 100644 --- a/packages/db-node-sqlite-persisted-collection/src/node-persistence.ts +++ b/packages/node-db-sqlite-persistence/src/node-persistence.ts @@ -1,7 +1,7 @@ import { SingleProcessCoordinator, createSQLiteCorePersistenceAdapter, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { BetterSqlite3SQLiteDriver } from './node-driver' import type { PersistedCollectionCoordinator, @@ -9,7 +9,7 @@ import type { PersistedCollectionPersistence, SQLiteCoreAdapterOptions, SQLiteDriver, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { BetterSqlite3Database } from './node-driver' export type { BetterSqlite3Database } from './node-driver' diff --git a/packages/db-node-sqlite-persisted-collection/tests/node-driver.test.ts b/packages/node-db-sqlite-persistence/tests/node-driver.test.ts similarity index 86% rename from packages/db-node-sqlite-persisted-collection/tests/node-driver.test.ts rename to packages/node-db-sqlite-persistence/tests/node-driver.test.ts index 2979b9983..fa356622c 100644 --- a/packages/db-node-sqlite-persisted-collection/tests/node-driver.test.ts +++ b/packages/node-db-sqlite-persistence/tests/node-driver.test.ts @@ -1,9 +1,9 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteDriverContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import { runSQLiteDriverContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' import { BetterSqlite3SQLiteDriver } from '../src/node-driver' -import type { SQLiteDriverContractHarness } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import type { SQLiteDriverContractHarness } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' function createDriverHarness(): SQLiteDriverContractHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-node-sqlite-`)) diff --git a/packages/db-node-sqlite-persisted-collection/tests/node-persistence.test.ts b/packages/node-db-sqlite-persistence/tests/node-persistence.test.ts similarity index 97% rename from packages/db-node-sqlite-persisted-collection/tests/node-persistence.test.ts rename to packages/node-db-sqlite-persistence/tests/node-persistence.test.ts index c4f3a5f17..4cf036c13 100644 --- a/packages/db-node-sqlite-persisted-collection/tests/node-persistence.test.ts +++ b/packages/node-db-sqlite-persistence/tests/node-persistence.test.ts @@ -5,12 +5,12 @@ import BetterSqlite3 from 'better-sqlite3' import { describe, expect, it } from 'vitest' import { createNodeSQLitePersistence, persistedCollectionOptions } from '../src' import { BetterSqlite3SQLiteDriver } from '../src/node-driver' -import { SingleProcessCoordinator } from '../../db-sqlite-persisted-collection-core/src' -import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +import { SingleProcessCoordinator } from '../../db-sqlite-persistence-core/src' +import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' import type { RuntimePersistenceContractTodo, RuntimePersistenceDatabaseHarness, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' function createRuntimeDatabaseHarness(): RuntimePersistenceDatabaseHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-node-persistence-`)) diff --git a/packages/db-node-sqlite-persisted-collection/tests/node-sqlite-core-adapter-contract.test.ts b/packages/node-db-sqlite-persistence/tests/node-sqlite-core-adapter-contract.test.ts similarity index 84% rename from packages/db-node-sqlite-persisted-collection/tests/node-sqlite-core-adapter-contract.test.ts rename to packages/node-db-sqlite-persistence/tests/node-sqlite-core-adapter-contract.test.ts index eb37c05d9..77035b6df 100644 --- a/packages/db-node-sqlite-persisted-collection/tests/node-sqlite-core-adapter-contract.test.ts +++ b/packages/node-db-sqlite-persistence/tests/node-sqlite-core-adapter-contract.test.ts @@ -1,13 +1,13 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' import { BetterSqlite3SQLiteDriver } from '../src/node-driver' -import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persisted-collection-core/src' +import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persistence-core/src' import type { SQLiteCoreAdapterContractTodo, SQLiteCoreAdapterHarnessFactory, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' const createHarness: SQLiteCoreAdapterHarnessFactory = (options) => { const tempDirectory = mkdtempSync(join(tmpdir(), `db-node-sqlite-core-`)) diff --git a/packages/node-db-sqlite-persistence/tsconfig.docs.json b/packages/node-db-sqlite-persistence/tsconfig.docs.json new file mode 100644 index 000000000..dec9e98d1 --- /dev/null +++ b/packages/node-db-sqlite-persistence/tsconfig.docs.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "@tanstack/db": ["../db/src"], + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" + ] + } + }, + "include": ["src"] +} diff --git a/packages/db-node-sqlite-persisted-collection/tsconfig.json b/packages/node-db-sqlite-persistence/tsconfig.json similarity index 83% rename from packages/db-node-sqlite-persisted-collection/tsconfig.json rename to packages/node-db-sqlite-persistence/tsconfig.json index 4074d193d..5b14f299c 100644 --- a/packages/db-node-sqlite-persisted-collection/tsconfig.json +++ b/packages/node-db-sqlite-persistence/tsconfig.json @@ -14,8 +14,8 @@ "paths": { "@tanstack/db": ["../db/src"], "@tanstack/db-ivm": ["../db-ivm/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-node-sqlite-persisted-collection/vite.config.ts b/packages/node-db-sqlite-persistence/vite.config.ts similarity index 100% rename from packages/db-node-sqlite-persisted-collection/vite.config.ts rename to packages/node-db-sqlite-persistence/vite.config.ts diff --git a/packages/db-node-sqlite-persisted-collection/vitest.e2e.config.ts b/packages/node-db-sqlite-persistence/vitest.e2e.config.ts similarity index 82% rename from packages/db-node-sqlite-persisted-collection/vitest.e2e.config.ts rename to packages/node-db-sqlite-persistence/vitest.e2e.config.ts index 063029e51..a72f12feb 100644 --- a/packages/db-node-sqlite-persisted-collection/vitest.e2e.config.ts +++ b/packages/node-db-sqlite-persistence/vitest.e2e.config.ts @@ -9,9 +9,9 @@ export default defineConfig({ alias: { '@tanstack/db': resolve(packageDirectory, `../db/src`), '@tanstack/db-ivm': resolve(packageDirectory, `../db-ivm/src`), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( packageDirectory, - `../db-sqlite-persisted-collection-core/src`, + `../db-sqlite-persistence-core/src`, ), }, }, diff --git a/packages/query-db-collection/tests/query.test.ts b/packages/query-db-collection/tests/query.test.ts index c2d4fe857..113fc0e1e 100644 --- a/packages/query-db-collection/tests/query.test.ts +++ b/packages/query-db-collection/tests/query.test.ts @@ -1,16 +1,16 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { QueryClient, hashKey } from '@tanstack/query-core' import { + BTreeIndex, createCollection, createLiveQueryCollection, eq, ilike, inArray, or, - BTreeIndex, } from '@tanstack/db' import { stripVirtualProps } from '../../db/tests/utils' -import { persistedCollectionOptions } from '../../db-sqlite-persisted-collection-core/src' +import { persistedCollectionOptions } from '../../db-sqlite-persistence-core/src' import { queryCollectionOptions } from '../src/query' import type { QueryFunctionContext } from '@tanstack/query-core' import type { diff --git a/packages/db-react-native-sqlite-persisted-collection/README.md b/packages/react-native-db-sqlite-persistence/README.md similarity index 90% rename from packages/db-react-native-sqlite-persisted-collection/README.md rename to packages/react-native-db-sqlite-persistence/README.md index 7c944bc30..84f5597e3 100644 --- a/packages/db-react-native-sqlite-persisted-collection/README.md +++ b/packages/react-native-db-sqlite-persistence/README.md @@ -1,4 +1,4 @@ -# @tanstack/db-react-native-sqlite-persisted-collection +# @tanstack/react-native-db-sqlite-persistence Thin SQLite persistence for React Native apps (including Expo runtime). @@ -15,7 +15,7 @@ import { createCollection } from '@tanstack/db' import { createReactNativeSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-react-native-sqlite-persisted-collection' +} from '@tanstack/react-native-db-sqlite-persistence' type Todo = { id: string diff --git a/packages/db-react-native-sqlite-persisted-collection/e2e/expo-persisted-collection.e2e.test.ts b/packages/react-native-db-sqlite-persistence/e2e/expo-persisted-collection.e2e.test.ts similarity index 100% rename from packages/db-react-native-sqlite-persisted-collection/e2e/expo-persisted-collection.e2e.test.ts rename to packages/react-native-db-sqlite-persistence/e2e/expo-persisted-collection.e2e.test.ts diff --git a/packages/db-react-native-sqlite-persisted-collection/e2e/mobile-persisted-collection-conformance-suite.ts b/packages/react-native-db-sqlite-persistence/e2e/mobile-persisted-collection-conformance-suite.ts similarity index 97% rename from packages/db-react-native-sqlite-persisted-collection/e2e/mobile-persisted-collection-conformance-suite.ts rename to packages/react-native-db-sqlite-persistence/e2e/mobile-persisted-collection-conformance-suite.ts index bf7080319..a85b9cd41 100644 --- a/packages/db-react-native-sqlite-persisted-collection/e2e/mobile-persisted-collection-conformance-suite.ts +++ b/packages/react-native-db-sqlite-persistence/e2e/mobile-persisted-collection-conformance-suite.ts @@ -2,13 +2,13 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, afterEach, beforeAll } from 'vitest' -import { createCollection, BTreeIndex } from '@tanstack/db' +import { BTreeIndex, createCollection } from '@tanstack/db' import { persistedCollectionOptions } from '../src' import { generateSeedData } from '../../db-collection-e2e/src/fixtures/seed-data' -import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/persisted-collection-conformance-contract' +import { runPersistedCollectionConformanceSuite } from '../../db-sqlite-persistence-core/tests/contracts/persisted-collection-conformance-contract' import { createOpSQLiteTestDatabase } from '../tests/helpers/op-sqlite-test-db' import type { Collection } from '@tanstack/db' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' import type { Comment, E2ETestConfig, diff --git a/packages/db-react-native-sqlite-persisted-collection/e2e/react-native-persisted-collection.e2e.test.ts b/packages/react-native-db-sqlite-persistence/e2e/react-native-persisted-collection.e2e.test.ts similarity index 100% rename from packages/db-react-native-sqlite-persisted-collection/e2e/react-native-persisted-collection.e2e.test.ts rename to packages/react-native-db-sqlite-persistence/e2e/react-native-persisted-collection.e2e.test.ts diff --git a/packages/db-react-native-sqlite-persisted-collection/package.json b/packages/react-native-db-sqlite-persistence/package.json similarity index 76% rename from packages/db-react-native-sqlite-persisted-collection/package.json rename to packages/react-native-db-sqlite-persistence/package.json index 5cecaade5..ed84a3ee1 100644 --- a/packages/db-react-native-sqlite-persisted-collection/package.json +++ b/packages/react-native-db-sqlite-persistence/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-react-native-sqlite-persisted-collection", + "name": "@tanstack/react-native-db-sqlite-persistence", "version": "0.1.0", "description": "React Native and Expo SQLite persisted collection adapter for TanStack DB", "author": "TanStack Team", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "git+https://github.com/TanStack/db.git", - "directory": "packages/db-react-native-sqlite-persisted-collection" + "directory": "packages/react-native-db-sqlite-persistence" }, "homepage": "https://tanstack.com/db", "keywords": [ @@ -22,8 +22,8 @@ "dev": "vite build --watch", "lint": "eslint . --fix", "test": "vitest --run", - "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-react-native-sqlite-persisted-collection build && vitest --config vitest.e2e.config.ts --run", - "test:e2e:runtime": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-react-native-sqlite-persisted-collection build && TANSTACK_DB_MOBILE_REQUIRE_RUNTIME_FACTORY=1 vitest --config vitest.e2e.config.ts --run" + "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/react-native-db-sqlite-persistence build && vitest --config vitest.e2e.config.ts --run", + "test:e2e:runtime": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/react-native-db-sqlite-persistence build && TANSTACK_DB_MOBILE_REQUIRE_RUNTIME_FACTORY=1 vitest --config vitest.e2e.config.ts --run" }, "type": "module", "main": "dist/cjs/index.cjs", @@ -58,7 +58,7 @@ "src" ], "dependencies": { - "@tanstack/db-sqlite-persisted-collection-core": "workspace:*" + "@tanstack/db-sqlite-persistence-core": "workspace:*" }, "peerDependencies": { "@op-engineering/op-sqlite": "^15.2.5", diff --git a/packages/db-react-native-sqlite-persisted-collection/src/index.ts b/packages/react-native-db-sqlite-persistence/src/index.ts similarity index 81% rename from packages/db-react-native-sqlite-persisted-collection/src/index.ts rename to packages/react-native-db-sqlite-persistence/src/index.ts index cbd46b6a2..842298336 100644 --- a/packages/db-react-native-sqlite-persisted-collection/src/index.ts +++ b/packages/react-native-db-sqlite-persistence/src/index.ts @@ -4,8 +4,8 @@ export type { ReactNativeSQLitePersistenceOptions, ReactNativeSQLiteSchemaMismatchPolicy, } from './react-native' -export { persistedCollectionOptions } from '@tanstack/db-sqlite-persisted-collection-core' +export { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core' export type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' diff --git a/packages/db-react-native-sqlite-persisted-collection/src/mobile-persistence.ts b/packages/react-native-db-sqlite-persistence/src/mobile-persistence.ts similarity index 97% rename from packages/db-react-native-sqlite-persisted-collection/src/mobile-persistence.ts rename to packages/react-native-db-sqlite-persistence/src/mobile-persistence.ts index e8416b2bf..099a51c17 100644 --- a/packages/db-react-native-sqlite-persisted-collection/src/mobile-persistence.ts +++ b/packages/react-native-db-sqlite-persistence/src/mobile-persistence.ts @@ -1,7 +1,7 @@ import { SingleProcessCoordinator, createSQLiteCorePersistenceAdapter, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { OpSQLiteDriver } from './op-sqlite-driver' import type { PersistedCollectionCoordinator, @@ -9,7 +9,7 @@ import type { PersistedCollectionPersistence, SQLiteCoreAdapterOptions, SQLiteDriver, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { OpSQLiteDatabaseLike } from './op-sqlite-driver' export type { OpSQLiteDatabaseLike } from './op-sqlite-driver' diff --git a/packages/db-react-native-sqlite-persisted-collection/src/op-sqlite-driver.ts b/packages/react-native-db-sqlite-persistence/src/op-sqlite-driver.ts similarity index 99% rename from packages/db-react-native-sqlite-persisted-collection/src/op-sqlite-driver.ts rename to packages/react-native-db-sqlite-persistence/src/op-sqlite-driver.ts index 432d80630..3fae4aaf8 100644 --- a/packages/db-react-native-sqlite-persisted-collection/src/op-sqlite-driver.ts +++ b/packages/react-native-db-sqlite-persistence/src/op-sqlite-driver.ts @@ -1,5 +1,5 @@ -import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persisted-collection-core' -import type { SQLiteDriver } from '@tanstack/db-sqlite-persisted-collection-core' +import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core' +import type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core' type OpSQLiteExecuteFn = ( sql: string, diff --git a/packages/db-react-native-sqlite-persisted-collection/src/react-native.ts b/packages/react-native-db-sqlite-persistence/src/react-native.ts similarity index 95% rename from packages/db-react-native-sqlite-persisted-collection/src/react-native.ts rename to packages/react-native-db-sqlite-persistence/src/react-native.ts index a862cac4a..354855d30 100644 --- a/packages/db-react-native-sqlite-persisted-collection/src/react-native.ts +++ b/packages/react-native-db-sqlite-persistence/src/react-native.ts @@ -3,7 +3,7 @@ import type { MobileSQLitePersistenceOptions, MobileSQLiteSchemaMismatchPolicy, } from './mobile-persistence' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' export type ReactNativeSQLitePersistenceOptions = MobileSQLitePersistenceOptions export type ReactNativeSQLiteSchemaMismatchPolicy = diff --git a/packages/db-react-native-sqlite-persisted-collection/tests/expo-sqlite-core-adapter-contract.test.ts b/packages/react-native-db-sqlite-persistence/tests/expo-sqlite-core-adapter-contract.test.ts similarity index 86% rename from packages/db-react-native-sqlite-persisted-collection/tests/expo-sqlite-core-adapter-contract.test.ts rename to packages/react-native-db-sqlite-persistence/tests/expo-sqlite-core-adapter-contract.test.ts index a1f89f00a..d2f741a6e 100644 --- a/packages/db-react-native-sqlite-persisted-collection/tests/expo-sqlite-core-adapter-contract.test.ts +++ b/packages/react-native-db-sqlite-persistence/tests/expo-sqlite-core-adapter-contract.test.ts @@ -1,14 +1,14 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' import { OpSQLiteDriver } from '../src/op-sqlite-driver' -import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persisted-collection-core/src' +import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persistence-core/src' import { createOpSQLiteTestDatabase } from './helpers/op-sqlite-test-db' import type { SQLiteCoreAdapterContractTodo, SQLiteCoreAdapterHarnessFactory, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' const createHarness: SQLiteCoreAdapterHarnessFactory = (options) => { const tempDirectory = mkdtempSync(join(tmpdir(), `db-expo-sqlite-core-`)) diff --git a/packages/db-react-native-sqlite-persisted-collection/tests/helpers/mobile-runtime-test-setup.ts b/packages/react-native-db-sqlite-persistence/tests/helpers/mobile-runtime-test-setup.ts similarity index 100% rename from packages/db-react-native-sqlite-persisted-collection/tests/helpers/mobile-runtime-test-setup.ts rename to packages/react-native-db-sqlite-persistence/tests/helpers/mobile-runtime-test-setup.ts diff --git a/packages/db-react-native-sqlite-persisted-collection/tests/helpers/op-sqlite-test-db.ts b/packages/react-native-db-sqlite-persistence/tests/helpers/op-sqlite-test-db.ts similarity index 100% rename from packages/db-react-native-sqlite-persisted-collection/tests/helpers/op-sqlite-test-db.ts rename to packages/react-native-db-sqlite-persistence/tests/helpers/op-sqlite-test-db.ts diff --git a/packages/db-react-native-sqlite-persisted-collection/tests/mobile-runtime-persistence-contract.test.ts b/packages/react-native-db-sqlite-persistence/tests/mobile-runtime-persistence-contract.test.ts similarity index 96% rename from packages/db-react-native-sqlite-persisted-collection/tests/mobile-runtime-persistence-contract.test.ts rename to packages/react-native-db-sqlite-persistence/tests/mobile-runtime-persistence-contract.test.ts index 2c33cce60..94194a538 100644 --- a/packages/db-react-native-sqlite-persisted-collection/tests/mobile-runtime-persistence-contract.test.ts +++ b/packages/react-native-db-sqlite-persistence/tests/mobile-runtime-persistence-contract.test.ts @@ -7,18 +7,18 @@ import { persistedCollectionOptions, } from '../src' import { OpSQLiteDriver } from '../src/op-sqlite-driver' -import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' -import { SingleProcessCoordinator } from '../../db-sqlite-persisted-collection-core/src' +import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' +import { SingleProcessCoordinator } from '../../db-sqlite-persistence-core/src' import { createOpSQLiteTestDatabase } from './helpers/op-sqlite-test-db' import type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { OpSQLiteDatabaseLike } from '../src/op-sqlite-driver' import type { RuntimePersistenceContractTodo, RuntimePersistenceDatabaseHarness, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' type RuntimePersistenceFactory = (options: { database: OpSQLiteDatabaseLike diff --git a/packages/db-react-native-sqlite-persisted-collection/tests/op-sqlite-driver.test.ts b/packages/react-native-db-sqlite-persistence/tests/op-sqlite-driver.test.ts similarity index 99% rename from packages/db-react-native-sqlite-persisted-collection/tests/op-sqlite-driver.test.ts rename to packages/react-native-db-sqlite-persistence/tests/op-sqlite-driver.test.ts index ca34a80c0..8c482af1c 100644 --- a/packages/db-react-native-sqlite-persisted-collection/tests/op-sqlite-driver.test.ts +++ b/packages/react-native-db-sqlite-persistence/tests/op-sqlite-driver.test.ts @@ -3,7 +3,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, expect, it } from 'vitest' import { OpSQLiteDriver } from '../src/op-sqlite-driver' -import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persisted-collection-core/src' +import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persistence-core/src' import { createOpSQLiteTestDatabase } from './helpers/op-sqlite-test-db' const activeCleanupFns: Array<() => void | Promise> = [] diff --git a/packages/db-react-native-sqlite-persisted-collection/tests/react-native-persistence.test.ts b/packages/react-native-db-sqlite-persistence/tests/react-native-persistence.test.ts similarity index 100% rename from packages/db-react-native-sqlite-persisted-collection/tests/react-native-persistence.test.ts rename to packages/react-native-db-sqlite-persistence/tests/react-native-persistence.test.ts diff --git a/packages/db-react-native-sqlite-persisted-collection/tests/react-native-sqlite-core-adapter-contract.test.ts b/packages/react-native-db-sqlite-persistence/tests/react-native-sqlite-core-adapter-contract.test.ts similarity index 86% rename from packages/db-react-native-sqlite-persisted-collection/tests/react-native-sqlite-core-adapter-contract.test.ts rename to packages/react-native-db-sqlite-persistence/tests/react-native-sqlite-core-adapter-contract.test.ts index 548f3fdd5..03e34dcf0 100644 --- a/packages/db-react-native-sqlite-persisted-collection/tests/react-native-sqlite-core-adapter-contract.test.ts +++ b/packages/react-native-db-sqlite-persistence/tests/react-native-sqlite-core-adapter-contract.test.ts @@ -1,14 +1,14 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' import { OpSQLiteDriver } from '../src/op-sqlite-driver' -import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persisted-collection-core/src' +import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persistence-core/src' import { createOpSQLiteTestDatabase } from './helpers/op-sqlite-test-db' import type { SQLiteCoreAdapterContractTodo, SQLiteCoreAdapterHarnessFactory, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' const createHarness: SQLiteCoreAdapterHarnessFactory = (options) => { const tempDirectory = mkdtempSync(join(tmpdir(), `db-rn-sqlite-core-`)) diff --git a/packages/react-native-db-sqlite-persistence/tsconfig.docs.json b/packages/react-native-db-sqlite-persistence/tsconfig.docs.json new file mode 100644 index 000000000..dec9e98d1 --- /dev/null +++ b/packages/react-native-db-sqlite-persistence/tsconfig.docs.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "@tanstack/db": ["../db/src"], + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" + ] + } + }, + "include": ["src"] +} diff --git a/packages/db-react-native-sqlite-persisted-collection/tsconfig.json b/packages/react-native-db-sqlite-persistence/tsconfig.json similarity index 83% rename from packages/db-react-native-sqlite-persisted-collection/tsconfig.json rename to packages/react-native-db-sqlite-persistence/tsconfig.json index 4074d193d..5b14f299c 100644 --- a/packages/db-react-native-sqlite-persisted-collection/tsconfig.json +++ b/packages/react-native-db-sqlite-persistence/tsconfig.json @@ -14,8 +14,8 @@ "paths": { "@tanstack/db": ["../db/src"], "@tanstack/db-ivm": ["../db-ivm/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-react-native-sqlite-persisted-collection/vite.config.ts b/packages/react-native-db-sqlite-persistence/vite.config.ts similarity index 100% rename from packages/db-react-native-sqlite-persisted-collection/vite.config.ts rename to packages/react-native-db-sqlite-persistence/vite.config.ts diff --git a/packages/db-react-native-sqlite-persisted-collection/vitest.e2e.config.ts b/packages/react-native-db-sqlite-persistence/vitest.e2e.config.ts similarity index 86% rename from packages/db-react-native-sqlite-persisted-collection/vitest.e2e.config.ts rename to packages/react-native-db-sqlite-persistence/vitest.e2e.config.ts index daac5ed6d..318a68d07 100644 --- a/packages/db-react-native-sqlite-persisted-collection/vitest.e2e.config.ts +++ b/packages/react-native-db-sqlite-persistence/vitest.e2e.config.ts @@ -9,9 +9,9 @@ export default defineConfig({ alias: { '@tanstack/db': resolve(packageDirectory, `../db/src`), '@tanstack/db-ivm': resolve(packageDirectory, `../db-ivm/src`), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( packageDirectory, - `../db-sqlite-persisted-collection-core/src`, + `../db-sqlite-persistence-core/src`, ), }, }, diff --git a/packages/db-tauri-sqlite-persisted-collection/README.md b/packages/tauri-db-sqlite-persistence/README.md similarity index 87% rename from packages/db-tauri-sqlite-persisted-collection/README.md rename to packages/tauri-db-sqlite-persistence/README.md index 3c2c6b32f..99b4e0423 100644 --- a/packages/db-tauri-sqlite-persisted-collection/README.md +++ b/packages/tauri-db-sqlite-persistence/README.md @@ -1,4 +1,4 @@ -# @tanstack/db-tauri-sqlite-persisted-collection +# @tanstack/tauri-db-sqlite-persistence Thin SQLite persistence for Tauri apps using `@tauri-apps/plugin-sql`. @@ -10,7 +10,7 @@ Thin SQLite persistence for Tauri apps using `@tauri-apps/plugin-sql`. ## Install ```bash -pnpm add @tanstack/db-tauri-sqlite-persisted-collection @tauri-apps/plugin-sql +pnpm add @tanstack/tauri-db-sqlite-persistence @tauri-apps/plugin-sql ``` ## Consumer-side Tauri setup @@ -49,7 +49,7 @@ import { createCollection } from '@tanstack/db' import { createTauriSQLitePersistence, persistedCollectionOptions, -} from '@tanstack/db-tauri-sqlite-persisted-collection' +} from '@tanstack/tauri-db-sqlite-persistence' type Todo = { id: string @@ -89,8 +89,8 @@ export const todosCollection = createCollection( ## Testing -- `pnpm --filter @tanstack/db-tauri-sqlite-persisted-collection test` +- `pnpm --filter @tanstack/tauri-db-sqlite-persistence test` runs the driver and shared adapter contract tests. -- `pnpm --filter @tanstack/db-tauri-sqlite-persisted-collection test:e2e` +- `pnpm --filter @tanstack/tauri-db-sqlite-persistence test:e2e` builds the repo-local Tauri harness and runs the persisted collection conformance suite inside a real Tauri runtime. diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/index.html b/packages/tauri-db-sqlite-persistence/e2e/app/index.html similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/index.html rename to packages/tauri-db-sqlite-persistence/e2e/app/index.html diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/package.json b/packages/tauri-db-sqlite-persistence/e2e/app/package.json similarity index 75% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/package.json rename to packages/tauri-db-sqlite-persistence/e2e/app/package.json index 053802d95..879842345 100644 --- a/packages/db-tauri-sqlite-persisted-collection/e2e/app/package.json +++ b/packages/tauri-db-sqlite-persistence/e2e/app/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-tauri-sqlite-persisted-collection-e2e-app", + "name": "@tanstack/tauri-db-sqlite-persistence-e2e-app", "private": true, "version": "0.0.0", "type": "module", @@ -12,7 +12,7 @@ "@tauri-apps/api": "^2.10.1", "@tauri-apps/plugin-sql": "^2.3.2", "@tanstack/db": "workspace:*", - "@tanstack/db-tauri-sqlite-persisted-collection": "workspace:*" + "@tanstack/tauri-db-sqlite-persistence": "workspace:*" }, "devDependencies": { "@tauri-apps/cli": "^2.10.1", diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/.gitignore b/packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/.gitignore similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/.gitignore rename to packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/.gitignore diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/Cargo.toml b/packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/Cargo.toml similarity index 87% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/Cargo.toml rename to packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/Cargo.toml index 719913622..e32e56e99 100644 --- a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/Cargo.toml +++ b/packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "db-tauri-sqlite-persisted-collection-e2e-app" +name = "tauri-db-sqlite-persistence-e2e-app" version = "0.0.0" description = "Repo-local Tauri e2e harness for TanStack DB SQLite persistence" authors = ["TanStack Team"] diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/build.rs b/packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/build.rs similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/build.rs rename to packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/build.rs diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/capabilities/default.json b/packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/capabilities/default.json similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/capabilities/default.json rename to packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/capabilities/default.json diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/icons/icon.png b/packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/icons/icon.png similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/icons/icon.png rename to packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/icons/icon.png diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/src/main.rs b/packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/src/main.rs similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/src/main.rs rename to packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/src/main.rs diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/tauri.conf.json b/packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/tauri.conf.json similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src-tauri/tauri.conf.json rename to packages/tauri-db-sqlite-persistence/e2e/app/src-tauri/tauri.conf.json diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src/main.ts b/packages/tauri-db-sqlite-persistence/e2e/app/src/main.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src/main.ts rename to packages/tauri-db-sqlite-persistence/e2e/app/src/main.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src/native-tauri-sql-test-db.ts b/packages/tauri-db-sqlite-persistence/e2e/app/src/native-tauri-sql-test-db.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src/native-tauri-sql-test-db.ts rename to packages/tauri-db-sqlite-persistence/e2e/app/src/native-tauri-sql-test-db.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src/node-crypto.ts b/packages/tauri-db-sqlite-persistence/e2e/app/src/node-crypto.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src/node-crypto.ts rename to packages/tauri-db-sqlite-persistence/e2e/app/src/node-crypto.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src/register-tauri-e2e-suite.ts b/packages/tauri-db-sqlite-persistence/e2e/app/src/register-tauri-e2e-suite.ts similarity index 96% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src/register-tauri-e2e-suite.ts rename to packages/tauri-db-sqlite-persistence/e2e/app/src/register-tauri-e2e-suite.ts index 7a14029d6..594c7abd3 100644 --- a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src/register-tauri-e2e-suite.ts +++ b/packages/tauri-db-sqlite-persistence/e2e/app/src/register-tauri-e2e-suite.ts @@ -1,7 +1,7 @@ import { createTauriSQLitePersistence } from '../../../src' import { createTauriPersistedCollectionHarnessConfig } from '../../shared/tauri-persisted-collection-harness' import { registerPersistedCollectionConformanceSuite } from '../../shared/register-persisted-collection-conformance-suite' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' import type { TauriSQLiteDatabaseLike } from '../../../src' type PersistableRow = { diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src/runtime-vitest.ts b/packages/tauri-db-sqlite-persistence/e2e/app/src/runtime-vitest.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src/runtime-vitest.ts rename to packages/tauri-db-sqlite-persistence/e2e/app/src/runtime-vitest.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/src/vite-env.d.ts b/packages/tauri-db-sqlite-persistence/e2e/app/src/vite-env.d.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/src/vite-env.d.ts rename to packages/tauri-db-sqlite-persistence/e2e/app/src/vite-env.d.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/tsconfig.json b/packages/tauri-db-sqlite-persistence/e2e/app/tsconfig.json similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/tsconfig.json rename to packages/tauri-db-sqlite-persistence/e2e/app/tsconfig.json diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/app/vite.config.ts b/packages/tauri-db-sqlite-persistence/e2e/app/vite.config.ts similarity index 84% rename from packages/db-tauri-sqlite-persisted-collection/e2e/app/vite.config.ts rename to packages/tauri-db-sqlite-persistence/e2e/app/vite.config.ts index fb33e888a..4f6b95646 100644 --- a/packages/db-tauri-sqlite-persisted-collection/e2e/app/vite.config.ts +++ b/packages/tauri-db-sqlite-persistence/e2e/app/vite.config.ts @@ -11,9 +11,9 @@ export default defineConfig({ 'node:crypto': resolve(appDirectory, `src/node-crypto.ts`), '@tanstack/db': resolve(appDirectory, `../../../db/src`), '@tanstack/db-ivm': resolve(appDirectory, `../../../db-ivm/src`), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( appDirectory, - `../../../db-sqlite-persisted-collection-core/src`, + `../../../db-sqlite-persistence-core/src`, ), }, }, diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/run-tauri-e2e.ts b/packages/tauri-db-sqlite-persistence/e2e/run-tauri-e2e.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/run-tauri-e2e.ts rename to packages/tauri-db-sqlite-persistence/e2e/run-tauri-e2e.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/shared/register-persisted-collection-conformance-suite.ts b/packages/tauri-db-sqlite-persistence/e2e/shared/register-persisted-collection-conformance-suite.ts similarity index 92% rename from packages/db-tauri-sqlite-persisted-collection/e2e/shared/register-persisted-collection-conformance-suite.ts rename to packages/tauri-db-sqlite-persistence/e2e/shared/register-persisted-collection-conformance-suite.ts index 413485c4e..07bb4d1f6 100644 --- a/packages/db-tauri-sqlite-persisted-collection/e2e/shared/register-persisted-collection-conformance-suite.ts +++ b/packages/tauri-db-sqlite-persistence/e2e/shared/register-persisted-collection-conformance-suite.ts @@ -1,5 +1,5 @@ import { afterAll, afterEach, beforeAll } from 'vitest' -import { runPersistedCollectionConformanceSuite } from '../../../db-sqlite-persisted-collection-core/tests/contracts/persisted-collection-conformance-contract' +import { runPersistedCollectionConformanceSuite } from '../../../db-sqlite-persistence-core/tests/contracts/persisted-collection-conformance-contract' import type { TauriPersistedCollectionHarnessConfig } from './tauri-persisted-collection-harness' type RegisteredHarness = { diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/shared/tauri-persisted-collection-harness.ts b/packages/tauri-db-sqlite-persistence/e2e/shared/tauri-persisted-collection-harness.ts similarity index 98% rename from packages/db-tauri-sqlite-persisted-collection/e2e/shared/tauri-persisted-collection-harness.ts rename to packages/tauri-db-sqlite-persistence/e2e/shared/tauri-persisted-collection-harness.ts index a4fcb3c0e..ca64f141e 100644 --- a/packages/db-tauri-sqlite-persisted-collection/e2e/shared/tauri-persisted-collection-harness.ts +++ b/packages/tauri-db-sqlite-persistence/e2e/shared/tauri-persisted-collection-harness.ts @@ -1,4 +1,4 @@ -import { createCollection, BTreeIndex } from '@tanstack/db' +import { BTreeIndex, createCollection } from '@tanstack/db' import { persistedCollectionOptions } from '../../src' import { generateSeedData } from '../../../db-collection-e2e/src/fixtures/seed-data' import type { Collection } from '@tanstack/db' @@ -8,7 +8,7 @@ import type { Post, User, } from '../../../db-collection-e2e/src/types' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' type PersistableRow = { id: string diff --git a/packages/db-tauri-sqlite-persisted-collection/e2e/tauri-persisted-collection.e2e.test.ts b/packages/tauri-db-sqlite-persistence/e2e/tauri-persisted-collection.e2e.test.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/e2e/tauri-persisted-collection.e2e.test.ts rename to packages/tauri-db-sqlite-persistence/e2e/tauri-persisted-collection.e2e.test.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/package.json b/packages/tauri-db-sqlite-persistence/package.json similarity index 83% rename from packages/db-tauri-sqlite-persisted-collection/package.json rename to packages/tauri-db-sqlite-persistence/package.json index 6ccbe5f65..9774ebab8 100644 --- a/packages/db-tauri-sqlite-persisted-collection/package.json +++ b/packages/tauri-db-sqlite-persistence/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/db-tauri-sqlite-persisted-collection", + "name": "@tanstack/tauri-db-sqlite-persistence", "version": "0.1.0", "description": "Tauri SQLite persisted collection adapter for TanStack DB", "author": "TanStack Team", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "git+https://github.com/TanStack/db.git", - "directory": "packages/db-tauri-sqlite-persisted-collection" + "directory": "packages/tauri-db-sqlite-persistence" }, "homepage": "https://tanstack.com/db", "keywords": [ @@ -21,7 +21,7 @@ "dev": "vite build --watch", "lint": "eslint . --fix", "test": "vitest --run", - "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persisted-collection-core build && pnpm --filter @tanstack/db-tauri-sqlite-persisted-collection build && vitest --config vitest.e2e.config.ts --run" + "test:e2e": "pnpm --filter @tanstack/db-ivm build && pnpm --filter @tanstack/db build && pnpm --filter @tanstack/db-sqlite-persistence-core build && pnpm --filter @tanstack/tauri-db-sqlite-persistence build && vitest --config vitest.e2e.config.ts --run" }, "type": "module", "main": "dist/cjs/index.cjs", @@ -56,7 +56,7 @@ "src" ], "dependencies": { - "@tanstack/db-sqlite-persisted-collection-core": "workspace:*" + "@tanstack/db-sqlite-persistence-core": "workspace:*" }, "peerDependencies": { "@tauri-apps/plugin-sql": "^2.3.2", diff --git a/packages/db-tauri-sqlite-persisted-collection/src/index.ts b/packages/tauri-db-sqlite-persistence/src/index.ts similarity index 79% rename from packages/db-tauri-sqlite-persisted-collection/src/index.ts rename to packages/tauri-db-sqlite-persistence/src/index.ts index 5e2642ca4..7a750708d 100644 --- a/packages/db-tauri-sqlite-persisted-collection/src/index.ts +++ b/packages/tauri-db-sqlite-persistence/src/index.ts @@ -4,8 +4,8 @@ export type { TauriSQLitePersistenceOptions, TauriSQLiteSchemaMismatchPolicy, } from './tauri' -export { persistedCollectionOptions } from '@tanstack/db-sqlite-persisted-collection-core' +export { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core' export type { PersistedCollectionCoordinator, PersistedCollectionPersistence, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' diff --git a/packages/db-tauri-sqlite-persisted-collection/src/tauri-persistence.ts b/packages/tauri-db-sqlite-persistence/src/tauri-persistence.ts similarity index 97% rename from packages/db-tauri-sqlite-persisted-collection/src/tauri-persistence.ts rename to packages/tauri-db-sqlite-persistence/src/tauri-persistence.ts index 2d7f011c3..e21f1718d 100644 --- a/packages/db-tauri-sqlite-persisted-collection/src/tauri-persistence.ts +++ b/packages/tauri-db-sqlite-persistence/src/tauri-persistence.ts @@ -1,7 +1,7 @@ import { SingleProcessCoordinator, createSQLiteCorePersistenceAdapter, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import { TauriSQLiteDriver } from './tauri-sql-driver' import type { PersistedCollectionCoordinator, @@ -9,7 +9,7 @@ import type { PersistedCollectionPersistence, SQLiteCoreAdapterOptions, SQLiteDriver, -} from '@tanstack/db-sqlite-persisted-collection-core' +} from '@tanstack/db-sqlite-persistence-core' import type { TauriSQLiteDatabaseLike } from './tauri-sql-driver' export type { TauriSQLiteDatabaseLike } from './tauri-sql-driver' diff --git a/packages/db-tauri-sqlite-persisted-collection/src/tauri-sql-driver.ts b/packages/tauri-db-sqlite-persistence/src/tauri-sql-driver.ts similarity index 98% rename from packages/db-tauri-sqlite-persisted-collection/src/tauri-sql-driver.ts rename to packages/tauri-db-sqlite-persistence/src/tauri-sql-driver.ts index 6738680d9..916ddc6a5 100644 --- a/packages/db-tauri-sqlite-persisted-collection/src/tauri-sql-driver.ts +++ b/packages/tauri-db-sqlite-persistence/src/tauri-sql-driver.ts @@ -1,5 +1,5 @@ -import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persisted-collection-core' -import type { SQLiteDriver } from '@tanstack/db-sqlite-persisted-collection-core' +import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core' +import type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core' import type Database from '@tauri-apps/plugin-sql' export type TauriSQLiteDatabaseLike = Pick< diff --git a/packages/db-tauri-sqlite-persisted-collection/src/tauri.ts b/packages/tauri-db-sqlite-persistence/src/tauri.ts similarity index 95% rename from packages/db-tauri-sqlite-persisted-collection/src/tauri.ts rename to packages/tauri-db-sqlite-persistence/src/tauri.ts index 69e98095c..73d954962 100644 --- a/packages/db-tauri-sqlite-persisted-collection/src/tauri.ts +++ b/packages/tauri-db-sqlite-persistence/src/tauri.ts @@ -3,7 +3,7 @@ import type { TauriSQLitePersistenceOptions as TauriSQLitePersistenceOptionsBase, TauriSQLiteSchemaMismatchPolicy as TauriSQLiteSchemaMismatchPolicyBase, } from './tauri-persistence' -import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persisted-collection-core' +import type { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core' export type TauriSQLitePersistenceOptions = TauriSQLitePersistenceOptionsBase export type TauriSQLiteSchemaMismatchPolicy = diff --git a/packages/db-tauri-sqlite-persisted-collection/tests/helpers/tauri-sql-test-db.ts b/packages/tauri-db-sqlite-persistence/tests/helpers/tauri-sql-test-db.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/tests/helpers/tauri-sql-test-db.ts rename to packages/tauri-db-sqlite-persistence/tests/helpers/tauri-sql-test-db.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/tests/tauri-persistence.test.ts b/packages/tauri-db-sqlite-persistence/tests/tauri-persistence.test.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/tests/tauri-persistence.test.ts rename to packages/tauri-db-sqlite-persistence/tests/tauri-persistence.test.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/tests/tauri-runtime-persistence-contract.test.ts b/packages/tauri-db-sqlite-persistence/tests/tauri-runtime-persistence-contract.test.ts similarity index 97% rename from packages/db-tauri-sqlite-persisted-collection/tests/tauri-runtime-persistence-contract.test.ts rename to packages/tauri-db-sqlite-persistence/tests/tauri-runtime-persistence-contract.test.ts index 55c6096a3..c77486d53 100644 --- a/packages/db-tauri-sqlite-persisted-collection/tests/tauri-runtime-persistence-contract.test.ts +++ b/packages/tauri-db-sqlite-persistence/tests/tauri-runtime-persistence-contract.test.ts @@ -7,13 +7,13 @@ import { persistedCollectionOptions, } from '../src' import { TauriSQLiteDriver } from '../src/tauri-sql-driver' -import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' -import { SingleProcessCoordinator } from '../../db-sqlite-persisted-collection-core/src' +import { runRuntimePersistenceContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' +import { SingleProcessCoordinator } from '../../db-sqlite-persistence-core/src' import { createTauriSQLiteTestDatabase } from './helpers/tauri-sql-test-db' import type { RuntimePersistenceContractTodo, RuntimePersistenceDatabaseHarness, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/runtime-persistence-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/runtime-persistence-contract' function createRuntimeDatabaseHarness(): RuntimePersistenceDatabaseHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-tauri-persistence-`)) diff --git a/packages/db-tauri-sqlite-persisted-collection/tests/tauri-sql-driver-contract.test.ts b/packages/tauri-db-sqlite-persistence/tests/tauri-sql-driver-contract.test.ts similarity index 87% rename from packages/db-tauri-sqlite-persisted-collection/tests/tauri-sql-driver-contract.test.ts rename to packages/tauri-db-sqlite-persistence/tests/tauri-sql-driver-contract.test.ts index 343e4f1bf..dd5d6296d 100644 --- a/packages/db-tauri-sqlite-persisted-collection/tests/tauri-sql-driver-contract.test.ts +++ b/packages/tauri-db-sqlite-persistence/tests/tauri-sql-driver-contract.test.ts @@ -1,10 +1,10 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteDriverContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import { runSQLiteDriverContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' import { TauriSQLiteDriver } from '../src/tauri-sql-driver' import { createTauriSQLiteTestDatabase } from './helpers/tauri-sql-test-db' -import type { SQLiteDriverContractHarness } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-driver-contract' +import type { SQLiteDriverContractHarness } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-driver-contract' function createDriverHarness(): SQLiteDriverContractHarness { const tempDirectory = mkdtempSync(join(tmpdir(), `db-tauri-sqlite-`)) diff --git a/packages/db-tauri-sqlite-persisted-collection/tests/tauri-sql-driver.test.ts b/packages/tauri-db-sqlite-persistence/tests/tauri-sql-driver.test.ts similarity index 99% rename from packages/db-tauri-sqlite-persisted-collection/tests/tauri-sql-driver.test.ts rename to packages/tauri-db-sqlite-persistence/tests/tauri-sql-driver.test.ts index 36f667042..15c872305 100644 --- a/packages/db-tauri-sqlite-persisted-collection/tests/tauri-sql-driver.test.ts +++ b/packages/tauri-db-sqlite-persistence/tests/tauri-sql-driver.test.ts @@ -2,7 +2,7 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, expect, it } from 'vitest' -import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persisted-collection-core/src' +import { InvalidPersistedCollectionConfigError } from '../../db-sqlite-persistence-core/src' import { TauriSQLiteDriver } from '../src/tauri-sql-driver' import { createTauriSQLiteTestDatabase } from './helpers/tauri-sql-test-db' diff --git a/packages/db-tauri-sqlite-persisted-collection/tests/tauri-sqlite-core-adapter-contract.test.ts b/packages/tauri-db-sqlite-persistence/tests/tauri-sqlite-core-adapter-contract.test.ts similarity index 86% rename from packages/db-tauri-sqlite-persisted-collection/tests/tauri-sqlite-core-adapter-contract.test.ts rename to packages/tauri-db-sqlite-persistence/tests/tauri-sqlite-core-adapter-contract.test.ts index 572d8db39..ea1561984 100644 --- a/packages/db-tauri-sqlite-persisted-collection/tests/tauri-sqlite-core-adapter-contract.test.ts +++ b/packages/tauri-db-sqlite-persistence/tests/tauri-sqlite-core-adapter-contract.test.ts @@ -1,14 +1,14 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +import { runSQLiteCoreAdapterContractSuite } from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' import { TauriSQLiteDriver } from '../src/tauri-sql-driver' -import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persisted-collection-core/src' +import { SQLiteCorePersistenceAdapter } from '../../db-sqlite-persistence-core/src' import { createTauriSQLiteTestDatabase } from './helpers/tauri-sql-test-db' import type { SQLiteCoreAdapterContractTodo, SQLiteCoreAdapterHarnessFactory, -} from '../../db-sqlite-persisted-collection-core/tests/contracts/sqlite-core-adapter-contract' +} from '../../db-sqlite-persistence-core/tests/contracts/sqlite-core-adapter-contract' const createHarness: SQLiteCoreAdapterHarnessFactory = (options) => { const tempDirectory = mkdtempSync(join(tmpdir(), `db-tauri-core-`)) diff --git a/packages/tauri-db-sqlite-persistence/tsconfig.docs.json b/packages/tauri-db-sqlite-persistence/tsconfig.docs.json new file mode 100644 index 000000000..dec9e98d1 --- /dev/null +++ b/packages/tauri-db-sqlite-persistence/tsconfig.docs.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "@tanstack/db": ["../db/src"], + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" + ] + } + }, + "include": ["src"] +} diff --git a/packages/db-tauri-sqlite-persisted-collection/tsconfig.json b/packages/tauri-db-sqlite-persistence/tsconfig.json similarity index 85% rename from packages/db-tauri-sqlite-persisted-collection/tsconfig.json rename to packages/tauri-db-sqlite-persistence/tsconfig.json index 4c52e365d..e874082b6 100644 --- a/packages/db-tauri-sqlite-persisted-collection/tsconfig.json +++ b/packages/tauri-db-sqlite-persistence/tsconfig.json @@ -13,8 +13,8 @@ "paths": { "@tanstack/db": ["../db/src"], "@tanstack/db-ivm": ["../db-ivm/src"], - "@tanstack/db-sqlite-persisted-collection-core": [ - "../db-sqlite-persisted-collection-core/src" + "@tanstack/db-sqlite-persistence-core": [ + "../db-sqlite-persistence-core/src" ] } }, diff --git a/packages/db-tauri-sqlite-persisted-collection/vite.config.ts b/packages/tauri-db-sqlite-persistence/vite.config.ts similarity index 100% rename from packages/db-tauri-sqlite-persisted-collection/vite.config.ts rename to packages/tauri-db-sqlite-persistence/vite.config.ts diff --git a/packages/db-tauri-sqlite-persisted-collection/vitest.e2e.config.ts b/packages/tauri-db-sqlite-persistence/vitest.e2e.config.ts similarity index 85% rename from packages/db-tauri-sqlite-persisted-collection/vitest.e2e.config.ts rename to packages/tauri-db-sqlite-persistence/vitest.e2e.config.ts index 64236583c..2e782ab6b 100644 --- a/packages/db-tauri-sqlite-persisted-collection/vitest.e2e.config.ts +++ b/packages/tauri-db-sqlite-persistence/vitest.e2e.config.ts @@ -9,9 +9,9 @@ export default defineConfig({ alias: { '@tanstack/db': resolve(packageDirectory, `../db/src`), '@tanstack/db-ivm': resolve(packageDirectory, `../db-ivm/src`), - '@tanstack/db-sqlite-persisted-collection-core': resolve( + '@tanstack/db-sqlite-persistence-core': resolve( packageDirectory, - `../db-sqlite-persisted-collection-core/src`, + `../db-sqlite-persistence-core/src`, ), }, }, diff --git a/persistance-plan/README.md b/persistance-plan/README.md deleted file mode 100644 index 142792285..000000000 --- a/persistance-plan/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Persistence Plan - Phase Breakdown - -This folder contains the detailed execution plan for the SQLite-only persisted collection architecture. - -## Phase Files - -1. [Phase 0 - API + Runtime Feasibility](./phase-0-api-runtime-feasibility.md) -2. [Phase 1 - Index Lifecycle Events in `@tanstack/db`](./phase-1-index-lifecycle-events.md) -3. [Phase 2 - Core Persisted Wrapper](./phase-2-core-persisted-wrapper.md) -4. [Phase 3 - SQLite Core Adapter](./phase-3-sqlite-core-adapter.md) -5. [Phase 4 - Node + Electron](./phase-4-node-electron.md) -6. [Phase 5 - React Native + Expo](./phase-5-react-native-expo.md) -7. [Phase 6 - Cloudflare Durable Objects](./phase-6-cloudflare-durable-objects.md) -8. [Phase 7 - Browser Single-Tab (OPFS)](./phase-7-browser-single-tab.md) -9. [Phase 8 - Browser Multi-Tab Coordinator](./phase-8-browser-multi-tab.md) - -## Delivery Principles - -- SQLite-only persistence architecture across all runtimes. -- Collection-scoped leadership with DB-level write serialization. -- Local-first `loadSubset` behavior in both sync-present and sync-absent modes. -- One shared contract test suite across adapters. -- Browser multi-tab is intentionally the final rollout gate. - -## Suggested Milestone Gates - -- **Gate A (Core Semantics):** Phases 0-2 complete. -- **Gate B (Storage Correctness):** Phase 3 complete with contract tests green. -- **Gate C (Runtime Parity):** Phases 4-6 complete. -- **Gate D (Browser Readiness):** Phases 7-8 complete with integration tests. - -## Agent Guard Rails - -Use these rules when implementing any phase: - -1. No work is complete without tests in the same change. -2. Do not advance phases unless current-phase exit criteria and CI are green. -3. For query operators (`IN`, `AND`, `OR`, `LIKE`, date/datetime), always test: - - SQL pushdown path - - fallback filtering path -4. `IN` is mandatory for v1 incremental join loading: - - cover empty/single/large lists and SQLite parameter chunking -5. Date/datetime predicates require: - - canonical ISO-8601 UTC serialization - - timezone/offset boundary tests - - coverage for both lexical compare and SQLite date-function normalization paths -6. Any leadership/replay/mutation routing change must include failure-path tests. -7. Shared semantics must pass cross-runtime contract tests. -8. Schema mismatch and corruption behavior must be explicitly tested by mode. diff --git a/persistance-plan/phase-0-api-runtime-feasibility.md b/persistance-plan/phase-0-api-runtime-feasibility.md deleted file mode 100644 index 6e5ed96a7..000000000 --- a/persistance-plan/phase-0-api-runtime-feasibility.md +++ /dev/null @@ -1,124 +0,0 @@ -# Phase 0 - API + Runtime Feasibility - -## Objective - -Lock down the API surface, protocol shape, packaging boundaries, and runtime capability assumptions before implementation begins. - -## Why This Phase Exists - -The later phases depend on a stable contract for: - -- `persistedCollectionOptions(...)` mode inference -- coordinator protocol and required/optional methods -- runtime feature gates (browser, node, mobile, electron, DO) -- SQL key/identifier safety rules - -A weak Phase 0 creates churn in every downstream package. - -## Inputs - -- Root design doc (`/PERSISTNCE-PLAN-SQLITE-ONLY.md`) -- Current `@tanstack/db` collection API and sync API -- Existing runtime adapter patterns in monorepo - -## Scope - -1. Finalize TypeScript overloads for sync-present vs sync-absent mode. -2. Finalize runtime validation rules for invalid `sync` shape. -3. Finalize coordinator protocol envelope, payload types, and idempotency keys. -4. Finalize key encoding (`s:` / `n:` with `-0` handling) and safe identifier mapping strategy. -5. Freeze package boundaries and ownership. -6. Define staged rollout gates and kill-switch/fallback strategy. -7. Freeze the v1 pushdown operator matrix for `loadSubset` (`IN`, `AND`, `OR`, `LIKE`, and date/datetime predicates). - -## Out of Scope - -- Implementing storage adapter logic -- Implementing browser election -- Implementing runtime-specific packages - -## Detailed Workstreams - -### Workstream A - API and Type Inference - -- [ ] Draft final overload signatures for `persistedCollectionOptions`. -- [ ] Define `PersistedCollectionUtils` and where it appears in inferred return type. -- [ ] Document compile-time and runtime discrimination rules. -- [ ] Specify all runtime validation errors: - - `InvalidSyncConfigError` - - `PersistenceUnavailableError` - - `PersistenceSchemaVersionMismatchError` - -**Acceptance criteria** - -- Two minimal compile tests prove inference for both modes. -- Invalid `sync` shapes are unambiguous and deterministic. - -### Workstream B - Coordinator Contract and Protocol - -- [ ] Freeze required coordinator methods shared by all runtimes. -- [ ] Identify browser-only optional methods (`pullSince`, mutation RPC helpers). -- [ ] Finalize message envelope versioning (`v: 1`) and forward-compat guidance. -- [ ] Define timeout/retry semantics and defaults. -- [ ] Define idempotency correlation keys and persistence requirements. - -**Acceptance criteria** - -- Protocol type definitions reviewed and approved. -- Browser and single-process coordinators can both satisfy the interface. - -### Workstream C - Storage Safety Rules - -- [ ] Finalize canonical key encoding and decode edge cases. -- [ ] Finalize collectionId -> hashed table name mapping contract. -- [ ] Confirm no SQL identifier interpolation with raw user values. -- [ ] Finalize canonical JSON date/datetime serialization contract (ISO-8601 UTC string format). - -**Acceptance criteria** - -- Safety invariants are codified in testable helper contracts. - -### Workstream D - Packaging and Rollout - -- [ ] Confirm package list and scope ownership. -- [ ] Decide what lives in sqlite core vs runtime wrappers. -- [ ] Define phase gates and success metrics. -- [ ] Define fallback behavior by runtime when persistence capability is missing. -- [ ] Freeze pushdown behavior for v1 operators, including `IN` as mandatory for incremental join loading. - -**Acceptance criteria** - -- Package ownership is explicit (no overlap ambiguity). -- Rollout order is accepted by maintainers. -- v1 query-planning operator commitments are explicit and testable. - -## Deliverables - -1. Finalized API signature document (types + runtime rules). -2. Coordinator protocol spec (envelope, payloads, retries, idempotency). -3. Capability matrix by runtime. -4. Package boundary matrix (core vs wrappers). -5. Query-planning operator matrix and date serialization contract. -6. Phase gate checklist used by later phases. - -## Testing Plan - -- Type-level tests for overload inference. -- Runtime validation unit tests for invalid sync config. -- Protocol shape tests (serialization and discriminated unions). - -## Risks and Mitigations - -- **Risk:** ambiguous mode detection with optional `sync`. - - **Mitigation:** strict runtime guard: `sync` key present but invalid throws. -- **Risk:** coordinator contract too browser-specific. - - **Mitigation:** optionalize browser RPC methods and validate per runtime. -- **Risk:** package boundary drift. - - **Mitigation:** explicit ownership matrix checked in design review. - -## Exit Criteria - -- API and protocol types are frozen for Phases 1-3. -- Runtime capability assumptions are documented and approved. -- Package boundaries accepted by maintainers. -- No blocking unresolved decisions remain for implementation start. diff --git a/persistance-plan/phase-1-index-lifecycle-events.md b/persistance-plan/phase-1-index-lifecycle-events.md deleted file mode 100644 index 45552d6b0..000000000 --- a/persistance-plan/phase-1-index-lifecycle-events.md +++ /dev/null @@ -1,88 +0,0 @@ -# Phase 1 - Add Index Lifecycle Events to `@tanstack/db` - -## Objective - -Expose index lifecycle events in `@tanstack/db` so persistence can mirror index create/remove behavior consistently across tabs and runtimes. - -## Dependencies - -- Phase 0 protocol and signature finalization complete. -- Agreement on stable index signature strategy. - -## Scope - -1. Emit `index:added` and `index:removed` events. -2. Add index removal API (`removeIndex(...)`) to collection/index manager. -3. Ensure emitted payloads contain stable, serializable metadata. - -## Non-Goals - -- Building persisted SQLite indexes (Phase 3+) -- Browser tab synchronization behavior - -## Detailed Workstreams - -### Workstream A - Event Surface Design - -- [ ] Define event payload types for `index:added` and `index:removed`. -- [ ] Ensure payload includes fields needed to generate stable signature. -- [ ] Add versioning guidance if payload schema evolves. - -**Acceptance criteria** - -- Event payloads can be serialized and replayed. -- Payload includes enough data to build deterministic signature hash. - -### Workstream B - Index Manager Integration - -- [ ] Update `CollectionIndexesManager` to emit `index:added` after successful registration. -- [ ] Implement `removeIndex(...)` and emit `index:removed` on successful removal. -- [ ] Ensure idempotent behavior for duplicate remove calls. - -**Acceptance criteria** - -- Add/remove events fire exactly once per state transition. -- Removing unknown index is deterministic (documented behavior). - -### Workstream C - Backward Compatibility - -- [ ] Verify existing index consumers are not broken by new API. -- [ ] Add compatibility notes in changelog/docs. -- [ ] Confirm no behavior changes to query semantics. - -**Acceptance criteria** - -- Existing tests pass without relying on new events. -- New APIs are additive and non-breaking. - -## Deliverables - -1. Event types and public API changes in `@tanstack/db`. -2. `removeIndex(...)` implementation with tests. -3. Updated docs/examples for index lifecycle events. - -## Test Plan - -### Unit Tests - -- `createIndex` emits `index:added` with stable metadata. -- `removeIndex` emits `index:removed`. -- Duplicate remove handling is deterministic. - -### Integration Tests - -- Event ordering under rapid create/remove sequences. -- Auto-index interaction with lifecycle events. - -## Risks and Mitigations - -- **Risk:** unstable index metadata across tabs/processes. - - **Mitigation:** enforce canonical serialization before emitting. -- **Risk:** event emission before internal state update. - - **Mitigation:** emit only after successful state transition. - -## Exit Criteria - -- Lifecycle events are available and documented. -- `removeIndex(...)` is production-ready. -- Test coverage confirms stable metadata and event ordering. diff --git a/persistance-plan/phase-2-core-persisted-wrapper.md b/persistance-plan/phase-2-core-persisted-wrapper.md deleted file mode 100644 index 9808f54ae..000000000 --- a/persistance-plan/phase-2-core-persisted-wrapper.md +++ /dev/null @@ -1,130 +0,0 @@ -# Phase 2 - Core Persisted Wrapper (Inferred Behavior) - -## Objective - -Implement `persistedCollectionOptions(...)` behavior for both runtime-inferred modes: - -- sync-present: persistence augments remote sync flow -- sync-absent: persistence is local source of truth with automatic mutation persistence - -## Dependencies - -- Phase 0 API/protocol finalized -- Phase 1 index lifecycle events available - -## Scope - -1. Implement inferred mode branching with runtime validation. -2. Implement hydrate barrier and ordered tx queueing. -3. Implement sync-present remote insert normalization (`insert` -> `update`). -4. Implement sync-absent mutation persistence wrappers. -5. Implement `utils.acceptMutations(transaction)` path. -6. Wire coordinator RPC stubs and fallbacks. -7. Implement seq-gap detection and recovery orchestration. - -## Non-Goals - -- SQLite SQL pushdown implementation (Phase 3) -- Browser leader election internals (Phase 8) - -## Detailed Workstreams - -### Workstream A - Wrapper Initialization and Validation - -- [ ] Implement mode selection based on presence of `sync` key. -- [ ] Throw `InvalidSyncConfigError` for invalid `sync` shapes. -- [ ] Default coordinator to `SingleProcessCoordinator` when omitted. -- [ ] Validate coordinator capabilities based on runtime mode. -- [ ] Bootstrap persisted index mirror from `collection.getIndexMetadata()` before listening to lifecycle events. - -**Acceptance criteria** - -- Runtime behavior matches compile-time discrimination. -- Validation errors are deterministic and tested. - -### Workstream B - Hydrate Barrier + Apply Queue - -- [ ] Add collection-scoped hydrate state (`isHydrating`, queued tx list). -- [ ] Ensure tx events received during hydrate are queued. -- [ ] Flush queued tx in strict order after hydrate completion. -- [ ] Ensure apply mutex serializes write/apply paths. -- [ ] Start index lifecycle listeners only after bootstrap snapshot is applied to avoid missing pre-sync indexes. - -**Acceptance criteria** - -- No lost updates during hydrate. -- Ordered replay across queued tx. - -### Workstream C - Sync-Present Semantics - -- [ ] Wrap `sync.sync(params)` and preserve existing semantics. -- [ ] Normalize remote insert payloads to update before write. -- [ ] Trigger leader remote ensure flow through coordinator request path. -- [ ] Maintain offline-first local load behavior. - -**Acceptance criteria** - -- Duplicate-key conflicts do not occur on overlapping cache/snapshot data. -- Offline `loadSubset` resolves from local persistence. - -### Workstream D - Sync-Absent Semantics - -- [ ] Wrap `onInsert/onUpdate/onDelete` to persist first, then confirm optimistic state. -- [ ] Implement mutation envelope construction with stable `mutationId`. -- [ ] Implement follower->leader mutation RPC path (coordinator capability gated). -- [ ] Implement `acceptMutations(transaction)` utility for manual transaction support. - -**Acceptance criteria** - -- All mutation entry points persist consistently. -- Mutation acknowledgments map to submitted ids. - -### Workstream E - Recovery and Invalidation - -- [ ] Detect seq gaps from `(term, seq)` stream. -- [ ] Trigger `pullSince(lastSeenRowVersion)` when possible. -- [ ] Support fallback stale-mark + subset reload when pull fails. -- [ ] Implement targeted invalidation threshold behavior. - -**Acceptance criteria** - -- Gap recovery path is deterministic and tested. -- Full-reload fallback keeps state correct. - -## Deliverables - -1. Core persisted wrapper implementation. -2. Mode-specific mutation behavior and utilities. -3. Hydrate barrier and queueing logic. -4. Recovery orchestration implementation. - -## Test Plan - -### Core Unit Tests - -- Inference validation and mode branching. -- Hydrate barrier queue and flush ordering. -- Sync-present insert-to-update normalization. -- Sync-absent auto-persist for insert/update/delete. -- Manual transaction persistence via `acceptMutations`. -- Seq-gap detection and pull fallback behavior. - -### In-Memory Integration Tests - -- Multi-node coordinator simulation for tx ordering. -- Mutation ack and rollback behavior under retries. - -## Risks and Mitigations - -- **Risk:** hidden race between hydrate and incoming tx. - - **Mitigation:** collection-scoped mutex and explicit queue flushing. -- **Risk:** divergent behavior between wrapped hooks and manual transactions. - - **Mitigation:** shared mutation envelope pipeline used by both paths. -- **Risk:** coordinator optional methods missing at runtime. - - **Mitigation:** upfront capability validation with clear errors. - -## Exit Criteria - -- Both inferred modes pass in-memory suites. -- Recovery paths are validated for success and failure branches. -- Public utilities and error semantics documented. diff --git a/persistance-plan/phase-3-sqlite-core-adapter.md b/persistance-plan/phase-3-sqlite-core-adapter.md deleted file mode 100644 index bd8a51f12..000000000 --- a/persistance-plan/phase-3-sqlite-core-adapter.md +++ /dev/null @@ -1,145 +0,0 @@ -# Phase 3 - SQLite Core Adapter - -## Objective - -Deliver the runtime-agnostic SQLite adapter core that powers persisted collection reads/writes, index management, row-version catch-up, and schema policy handling. - -## Dependencies - -- Phase 2 wrapper behavior complete -- Stable index lifecycle metadata from Phase 1 - -## Scope - -1. Implement adapter operations: `loadSubset`, `applyCommittedTx`, `ensureIndex`. -2. Implement metadata schema initialization and evolution checks. -3. Implement partial update merge semantics. -4. Implement idempotency via `applied_tx`. -5. Implement row-version catch-up inputs and tombstone behavior. -6. Implement schema mismatch policies per mode. -7. Implement metadata pruning policies. - -## Non-Goals - -- Runtime-specific driver bindings beyond SQLiteDriver interface -- Browser/Web Locks behavior - -## Detailed Workstreams - -### Workstream A - DDL and Initialization - -- [ ] Create collection table and tombstone table mapping. -- [ ] Create metadata tables: - - `collection_registry` - - `persisted_index_registry` - - `applied_tx` - - `collection_version` - - `leader_term` - - `schema_version` - - `collection_reset_epoch` -- [ ] Add deterministic bootstrap order and migrationless checks. - -**Acceptance criteria** - -- Adapter can initialize clean DB from empty state. -- Re-initialization is idempotent. - -### Workstream B - Key and Identifier Safety - -- [ ] Implement `encodeStorageKey` / `decodeStorageKey` helpers. -- [ ] Handle `-0`, finite number checks, and string/number identity. -- [ ] Implement safe `collectionId` -> physical table name registry mapping. - -**Acceptance criteria** - -- No collisions between numeric and string keys. -- No unsafe identifier interpolation paths remain. - -### Workstream C - Transaction Apply Pipeline - -- [ ] Implement DB writer transaction logic for committed tx apply. -- [ ] Increment/read `collection_version.latest_row_version` per tx. -- [ ] Upsert rows and clear tombstones on upsert. -- [ ] Upsert tombstones on delete. -- [ ] Insert idempotency marker in `applied_tx`. - -**Acceptance criteria** - -- Replaying `(term, seq)` does not duplicate mutations. -- Row version is monotonic and shared across tx mutations. - -### Workstream D - Query Planning and Pushdown - -- [ ] Implement supported predicate pushdown (`eq`, `in`, `gt/gte/lt/lte`, `like`, `AND`, `OR`). -- [ ] Treat `IN` as required v1 functionality for incremental join loading paths. -- [ ] Handle `IN` edge cases (`[]`, single item, large lists with parameter batching). -- [ ] Implement date/datetime predicate compilation for JSON string fields. - - prefer canonical ISO-8601 UTC string comparisons when possible - - compile to `datetime(...)` / `strftime(...)` when normalization is required -- [ ] Implement `orderBy` alignment with index expressions. -- [ ] Implement fallback to superset + in-memory filter for unsupported fragments. - -**Acceptance criteria** - -- Query results match query-engine semantics. -- Incremental join loading paths using `IN` are fully pushdown-capable in v1. -- Unsupported expressions still return correct result after filtering. - -### Workstream E - Index Management - -- [ ] Compile persisted index spec to canonical SQL expression text. -- [ ] Implement `ensureIndex` with stable signature tracking. -- [ ] Track index state and usage timestamps in registry. -- [ ] Implement optional removal/mark-removed behavior. - -**Acceptance criteria** - -- Same logical index spec yields same signature and SQL. -- Repeated ensure calls are idempotent. - -### Workstream F - Schema Policy and Cleanup - -- [ ] Implement schema version checks per collection. -- [ ] Sync-present mismatch path: coordinated clear + reset epoch. -- [ ] Sync-absent mismatch path: throw (unless opt-in reset). -- [ ] Implement `applied_tx` pruning by seq/time policy. - -**Acceptance criteria** - -- Schema mismatch behavior follows design contract by mode. -- Pruning does not break pull/catch-up correctness. - -## Deliverables - -1. Shared SQLite core adapter implementation. -2. DDL bootstrap and metadata policy implementation. -3. Query pushdown + fallback logic. -4. Index registry and signature management. - -## Test Plan - -### Contract Test Matrix (Node runtime first) - -- `applyCommittedTx` correctness and idempotency. -- `loadSubset` correctness with/without index pushdown. -- Pushdown parity tests for `AND`/`OR`, `IN` (empty/single/large), `LIKE`, and date/datetime filters. -- Tombstone catch-up and key-level delta behavior. -- Schema version mismatch mode behavior. -- Key encoding round-trips and collision safety. -- Identifier safety for hostile collection ids. -- Pruning behavior and recovery correctness. - -## Risks and Mitigations - -- **Risk:** pushdown mismatch with query engine semantics. - - **Mitigation:** equivalence tests with randomized predicates. -- **Risk:** SQL busy/contention in concurrent runtimes. - - **Mitigation:** writer lock integration in upper coordinator layers plus retries. -- **Risk:** schema clear races with active reads. - - **Mitigation:** reset epoch and explicit collection reset handling. - -## Exit Criteria - -- Node-based adapter contract suite is green. -- Metadata/state invariants are validated under replay and recovery. -- Adapter is ready for runtime wrapper integration (Phases 4-8). diff --git a/persistance-plan/phase-4-node-electron.md b/persistance-plan/phase-4-node-electron.md deleted file mode 100644 index deaabfda0..000000000 --- a/persistance-plan/phase-4-node-electron.md +++ /dev/null @@ -1,87 +0,0 @@ -# Phase 4 - Node + Electron - -## Objective - -Ship production-ready Node and Electron adapters on top of the shared SQLite core, ensuring behavioral parity and clear process boundaries. - -## Dependencies - -- Phase 3 adapter contract green in Node harness. -- Phase 2 wrapper semantics stable. - -## Scope - -1. Node package over `better-sqlite3` using shared `SQLiteDriver` adapter. -2. Electron package with main-process ownership and renderer IPC bridge. -3. Parity validation between Node and Electron behavior. - -## Non-Goals - -- Browser coordination or OPFS concerns -- Mobile runtime adaptation - -## Detailed Workstreams - -### Workstream A - Node Package - -- [ ] Implement `better-sqlite3` driver adapter with Promise-based interface. -- [ ] Expose `persistedCollectionOptions` wiring for node usage. -- [ ] Validate transaction and error semantics in sync + async wrappers. - -**Acceptance criteria** - -- Node package passes all shared adapter contract tests. -- API ergonomics match core expectations. - -### Workstream B - Electron Architecture - -- [ ] Define IPC API surface (renderer requests -> main execution). -- [ ] Keep SQLite and persistence execution in main process only. -- [ ] Implement request/response timeout and structured error transport. -- [ ] Ensure renderer cannot bypass main-process ownership. - -**Acceptance criteria** - -- Renderer operations function through IPC with no direct DB access. -- Error and timeout behavior are deterministic. - -### Workstream C - Parity and Reliability - -- [ ] Reuse Node adapter logic in Electron main process. -- [ ] Run shared contract suite against electron harness where supported. -- [ ] Add smoke tests for app lifecycle (start/restart/close). - -**Acceptance criteria** - -- Node and Electron behavior are equivalent for core flows. -- No Electron-specific correctness regressions. - -## Deliverables - -1. `@tanstack/db-node-sqlite-persisted-collection` -2. `@tanstack/db-electron-sqlite-persisted-collection` -3. Electron IPC bridge docs and example integration - -## Test Plan - -- Full adapter contract suite on Node. -- Electron integration tests: - - read/write round-trip through IPC - - process restart and persistence durability - - error propagation and timeout handling -- Regression tests for schema mismatch and reset flows. - -## Risks and Mitigations - -- **Risk:** IPC latency impacts hot-path operations. - - **Mitigation:** batch operations where possible and keep payloads compact. -- **Risk:** Electron renderer attempts direct file/db access. - - **Mitigation:** hard architecture rule: DB in main process only. -- **Risk:** subtle sync-vs-async wrapper mismatch. - - **Mitigation:** strict parity tests and adapter abstraction boundaries. - -## Exit Criteria - -- Node and Electron packages published with parity tests green. -- IPC boundary validated for correctness and reliability. -- Documentation includes integration guidance for app teams. diff --git a/persistance-plan/phase-5-react-native-expo.md b/persistance-plan/phase-5-react-native-expo.md deleted file mode 100644 index b145b1813..000000000 --- a/persistance-plan/phase-5-react-native-expo.md +++ /dev/null @@ -1,85 +0,0 @@ -# Phase 5 - React Native + Expo - -## Objective - -Provide a unified mobile SQLite persistence package for both React Native and Expo using `op-sqlite`, with minimal platform divergence. - -## Dependencies - -- Phase 3 core adapter stable. -- Phase 2 wrapper semantics stable. - -## Scope - -1. Build shared mobile adapter package over `op-sqlite`. -2. Add RN/Expo-specific entrypoints only where host initialization differs. -3. Validate lifecycle, transaction, and persistence semantics on both hosts. - -## Non-Goals - -- Cross-process mobile coordination -- Browser multi-tab semantics - -## Detailed Workstreams - -### Workstream A - Shared Mobile Driver Layer - -- [ ] Implement `SQLiteDriver` wrapper around `op-sqlite`. -- [ ] Ensure consistent transaction boundaries and error mapping. -- [ ] Validate serialization/parsing paths for JSON payloads. - -**Acceptance criteria** - -- Same core adapter code runs unchanged on RN and Expo. -- Driver behavior matches node contract expectations. - -### Workstream B - Runtime Entrypoints - -- [ ] Provide RN entrypoint for bare/native setup. -- [ ] Provide Expo entrypoint for managed workflow setup. -- [ ] Keep API parity with node/browser wrappers where possible. - -**Acceptance criteria** - -- Consumers can swap runtimes with minimal app-level code change. - -### Workstream C - Mobile Lifecycle Hardening - -- [ ] Validate foreground/background transitions. -- [ ] Validate reopen behavior after app process restart. -- [ ] Confirm no data loss under rapid mutation bursts. - -**Acceptance criteria** - -- Persistence survives app restarts. -- Transaction semantics hold under lifecycle transitions. - -## Deliverables - -1. `@tanstack/db-react-native-sqlite-persisted-collection` -2. RN and Expo entrypoint docs/examples -3. Mobile-focused integration tests - -## Test Plan - -- Shared adapter contract suite where harness supports mobile runtime. -- RN integration tests: - - loadSubset startup path - - mutation persistence - - restart durability -- Expo integration tests with equivalent scenarios. - -## Risks and Mitigations - -- **Risk:** runtime differences between RN and Expo initialization. - - **Mitigation:** isolate host bootstrapping in thin entrypoint layer. -- **Risk:** mobile backgrounding interrupts in-flight writes. - - **Mitigation:** short transactions and robust retry/rollback handling. -- **Risk:** driver behavior divergence from node. - - **Mitigation:** enforce shared contract tests against both runtimes. - -## Exit Criteria - -- Unified mobile package works on RN and Expo. -- Contract and lifecycle tests pass in both environments. -- Documentation clearly explains host-specific setup steps. diff --git a/persistance-plan/phase-6-cloudflare-durable-objects.md b/persistance-plan/phase-6-cloudflare-durable-objects.md deleted file mode 100644 index e29d6a903..000000000 --- a/persistance-plan/phase-6-cloudflare-durable-objects.md +++ /dev/null @@ -1,86 +0,0 @@ -# Phase 6 - Cloudflare Durable Objects - -## Objective - -Implement Durable Object-native SQLite persistence using in-process execution (no browser election path), while preserving wrapper semantics for both inferred modes. - -## Dependencies - -- Phase 2 wrapper behavior complete -- Phase 3 core adapter complete - -## Scope - -1. Build DO SQLite adapter package for code executing inside the DO instance. -2. Provide schema initialization and version check helper utilities. -3. Support sync-present and sync-absent wrapper modes in DO runtime. -4. Validate behavior with Workers/DO integration harness. - -## Non-Goals - -- Browser lock/election protocols -- Remote DB proxy adapter pattern - -## Detailed Workstreams - -### Workstream A - DO Adapter Binding - -- [ ] Map DO SQL storage APIs to `SQLiteDriver` contract. -- [ ] Ensure transaction semantics align with core adapter expectations. -- [ ] Provide helper for collection table mapping initialization. - -**Acceptance criteria** - -- Core adapter runs with no DO-specific branching beyond driver wrapper. - -### Workstream B - Runtime Semantics - -- [ ] Default coordinator to `SingleProcessCoordinator`. -- [ ] Confirm no browser RPC/election method requirements. -- [ ] Ensure sync-absent mode behaves as first-class local persistence path. - -**Acceptance criteria** - -- DO runtime operates correctly without multi-tab coordination logic. - -### Workstream C - Schema and Recovery - -- [ ] Implement startup schema version checks per object instance. -- [ ] Support clear-on-mismatch for sync-present mode. -- [ ] Support throw-on-mismatch default for sync-absent mode. -- [ ] Validate restart and rehydrate paths. - -**Acceptance criteria** - -- Schema policy matches global design contract. -- Object restarts recover state cleanly. - -## Deliverables - -1. `@tanstack/db-cloudflare-do-sqlite-persisted-collection` -2. DO initialization helpers and usage docs -3. DO integration test suite - -## Test Plan - -- Workers/DO integration tests for: - - schema init and mismatch behavior - - local-first `loadSubset` - - sync-absent mutation persistence - - restart durability - - no-election path correctness - -## Risks and Mitigations - -- **Risk:** subtle API mismatch in DO SQL wrapper. - - **Mitigation:** adapter conformance tests at driver boundary. -- **Risk:** incorrect assumptions about single-threaded execution. - - **Mitigation:** explicit `SingleProcessCoordinator` semantics and tests. -- **Risk:** schema resets during active request bursts. - - **Mitigation:** transactional reset flow and deterministic error handling. - -## Exit Criteria - -- DO package passes integration suite. -- Both inferred modes work in DO runtime. -- Runtime docs clarify in-process model and limitations. diff --git a/persistance-plan/phase-7-browser-single-tab.md b/persistance-plan/phase-7-browser-single-tab.md deleted file mode 100644 index 213ce7b21..000000000 --- a/persistance-plan/phase-7-browser-single-tab.md +++ /dev/null @@ -1,85 +0,0 @@ -# Phase 7 - Browser Single-Tab (`wa-sqlite`, No Election) - -## Objective - -Deliver stable browser persistence for single-tab usage using `wa-sqlite` + `OPFSCoopSyncVFS`, without requiring BroadcastChannel or Web Locks. - -## Dependencies - -- Phase 2 wrapper behavior complete -- Phase 3 core adapter complete - -## Scope - -1. Implement OPFS-backed browser SQLite driver. -2. Run wrapper in single-process coordination mode. -3. Validate local-first behavior with offline/online transitions. -4. Ensure system is correct without multi-tab infrastructure. - -## Non-Goals - -- Web Locks leadership election -- Cross-tab mutation RPC - -## Detailed Workstreams - -### Workstream A - Browser Driver Implementation - -- [x] Integrate `wa-sqlite` with `OPFSCoopSyncVFS`. -- [x] Build browser `SQLiteDriver` wrapper. -- [x] Handle startup/open/reopen lifecycle and capability checks. -- [x] Run OPFS sync-handle access inside a dedicated Web Worker. - -**Acceptance criteria** - -- Browser driver initializes and reopens persisted DB correctly. -- Capability errors are surfaced as `PersistenceUnavailableError` where required. - -### Workstream B - Single-Tab Runtime Wiring - -- [x] Use `SingleProcessCoordinator` semantics in browser single-tab mode. -- [x] Ensure no dependencies on BroadcastChannel/Web Locks. -- [x] Validate sync-present and sync-absent wrapper modes. - -**Acceptance criteria** - -- Single-tab mode functions fully offline-first with local writes and reads. - -### Workstream C - Offline/Online Behavior - -- [x] Validate offline `loadSubset` local path for sync-present mode. -- [x] Validate remote ensure replay on reconnect. -- [x] Validate sync-absent behavior unaffected by network transitions. - -**Acceptance criteria** - -- Correct data convergence after reconnect. - -## Deliverables - -1. Browser single-tab adapter/runtime package updates. -2. Capability detection and error handling behavior. -3. Browser integration tests for single-tab mode. - -## Test Plan - -- Browser integration suite: - - OPFS init and reopen - - mutation persistence correctness - - sync-present offline + reconnect replay - - no Web Locks/BroadcastChannel dependency - -## Risks and Mitigations - -- **Risk:** OPFS support differences across browsers. - - **Mitigation:** capability matrix and clear fallback policy. -- **Risk:** WASM startup latency. - - **Mitigation:** lazy init and connection reuse. -- **Risk:** accidental dependency on multi-tab APIs. - - **Mitigation:** explicit tests with those APIs unavailable. - -## Exit Criteria - -- Browser single-tab integration tests are green. -- Offline-first behavior proven for both inferred modes. -- No election/multi-tab runtime requirements remain in this phase. diff --git a/persistance-plan/phase-8-browser-multi-tab.md b/persistance-plan/phase-8-browser-multi-tab.md deleted file mode 100644 index 7ee8ee497..000000000 --- a/persistance-plan/phase-8-browser-multi-tab.md +++ /dev/null @@ -1,157 +0,0 @@ -# Phase 8 - Browser Multi-Tab Coordinator (Final Phase) - -## Objective - -Implement robust multi-tab coordination using Web Locks, Visibility API, and BroadcastChannel with collection-scoped leadership and DB-wide write serialization. - -## Dependencies - -- Phase 7 browser single-tab stable -- Phase 2/3 recovery and row-version logic available - -## Scope - -1. Implement `BrowserCollectionCoordinator` with election and heartbeat. -2. Implement collection-scoped leader/follower behavior for both inferred modes. -3. Implement mutation RPC and follower acknowledgment/rollback handling. -4. Implement seq-gap recovery (`pullSince`) and stale fallback. -5. Implement DB writer lock (`tsdb:writer:`) and contention policy. -6. Validate multi-tab behavior via Playwright. - -## Non-Goals - -- SharedWorker architecture -- Global single-writer ownership across all collections - -## Implementation Status - -> **Overall: IMPLEMENTED** — `BrowserCollectionCoordinator` class implemented in -> `packages/db-browser-wa-sqlite-persisted-collection/src/browser-coordinator.ts`. -> Exported from package index. Unit tests with Web Locks and BroadcastChannel -> mocks pass (15 tests). Remaining: hidden-tab stepdown, heartbeat timeout -> detection, and Playwright multi-tab integration tests. - -## Detailed Workstreams - -### Workstream A - Leadership and Heartbeats - -- [x] Acquire per-collection Web Lock (`tsdb:leader::`). _(implemented in `browser-coordinator.ts` via `navigator.locks.request` with abort signal)_ -- [x] Increment durable `leader_term` transactionally on leadership gain. _(storage-level `leader_term` table in `sqlite-core-adapter.ts`; coordinator increments in-memory term on lock acquisition after restoring from `getStreamPosition`)_ -- [x] Emit leader heartbeat with latest seq/rowVersion. _(implemented in `browser-coordinator.ts` via `emitHeartbeat` on interval `HEARTBEAT_INTERVAL_MS=3000`)_ -- [ ] Detect heartbeat timeout and trigger takeover attempts. _(not needed for Web Locks approach — lock release is automatic on tab close/crash; deferred to future iteration if needed)_ -- [ ] Implement hidden-tab cooperative stepdown and cooldown. _(deferred — Web Locks handle crash/close; Visibility API stepdown is a future optimization)_ - -**Acceptance criteria** - -- Exactly one leader per collection at a time. -- Leadership term never decrements across reload/restart. - -### Workstream B - Protocol Transport and RPC - -- [x] Implement BroadcastChannel envelope transport per collection. _(single `BroadcastChannel` per coordinator instance `tsdb:coord:`, messages routed by `collectionId` field)_ -- [x] Implement request/response correlation via `rpcId`. _(implemented in `sendRPCOnce` with `pendingRPCs` map and timeout)_ -- [x] Implement RPC handlers: - - `ensureRemoteSubset` _(leader handler returns ok — leader's own sync handles the subset)_ - - `ensurePersistedIndex` _(leader handler calls `adapter.ensureIndex` under writer lock)_ - - `applyLocalMutations` _(leader handler applies tx, broadcasts `tx:committed`, returns accepted ids)_ - - `pullSince` _(leader handler delegates to `adapter.pullSince` and returns result)_ -- [x] Implement retry/backoff and timeout behavior. _(RPC_TIMEOUT_MS=10000, RPC_RETRY_ATTEMPTS=2, RPC_RETRY_DELAY_MS=200 with linear backoff)_ - -**Acceptance criteria** - -- RPCs are correlated, timed out, retried, and idempotent where required. - -### Workstream C - Mutation Routing and Acknowledgment - -- [x] Route follower sync-absent mutations to current leader. _(follower calls `requestApplyLocalMutations` which sends RPC to leader via BroadcastChannel)_ -- [x] Dedupe mutation envelopes by `envelopeId` at leader. _(`appliedEnvelopeIds` map with 60s TTL pruning)_ -- [x] Return accepted mutation ids and resulting `(term, seq, rowVersion)`. _(leader handler returns full `ApplyLocalMutationsResponse`)_ -- [x] Confirm/rollback optimistic local entries in follower based on response. _(caller side in `persisted.ts:1340-1368` handles ok/error responses and validates accepted mutation ids)_ - -**Acceptance criteria** - -- At-least-once mutation delivery yields exactly-once logical apply. - -### Workstream D - Commit Ordering and Recovery - -- [x] Broadcast `tx:committed` after DB commit only. _(implemented in `persisted.ts:1201-1215` and `persisted.ts:1376-1389`; leader handler in coordinator broadcasts after `applyCommittedTx`)_ -- [x] Track follower last seen `(term, seq)` and rowVersion. _(implemented in `persisted.ts:1449-1474` via `observeStreamPosition`; restored from DB on startup via `getStreamPosition`)_ -- [x] On seq gap, invoke `pullSince(lastSeenRowVersion)`. _(implemented in `persisted.ts:1642-1651` gap detection and `persisted.ts:1662-1684` recovery)_ -- [x] Apply targeted invalidation when key count is within limit. _(implemented in `persisted.ts:1705-1738` with `TARGETED_INVALIDATION_KEY_LIMIT` and inline row data in `changedRows`)_ -- [x] Trigger full reload when required or when pull fails. _(implemented in `persisted.ts:1708-1711` for `requiresFullReload`, `persisted.ts:1715-1718` for over-limit, and `persisted.ts:1684` as fallback)_ - -**Acceptance criteria** - -- Followers converge after dropped broadcasts. -- Recovery works without full page reload. - -### Workstream E - DB Write Serialization - -- [x] Implement DB writer lock (`tsdb:writer:`). _(implemented in `browser-coordinator.ts` via `withWriterLock` using `navigator.locks.request`)_ -- [x] Serialize physical SQLite write transactions across collection leaders. _(all leader-side adapter writes go through `withWriterLock`)_ -- [x] Apply bounded busy retries and backoff policy. _(WRITER_LOCK_MAX_RETRIES=20, WRITER_LOCK_BUSY_RETRY_MS=50 with capped linear backoff)_ - -**Acceptance criteria** - -- No correctness loss under cross-collection write contention. - -## Deliverables - -1. Browser multi-tab coordinator implementation. -2. Protocol transport and RPC machinery. -3. Recovery and invalidation orchestration in browser runtime. -4. Playwright multi-tab test suite. - -## Test Plan - -### Unit Tests (Completed) - -Tests in `tests/browser-coordinator.test.ts` using Web Locks and BroadcastChannel mocks: - -1. Leadership acquisition and release. -2. Leadership takeover on dispose. -3. Independent leadership per collection. -4. Message transport between coordinators. -5. Self-message filtering. -6. Leader applies mutations directly. -7. Follower routes mutations to leader via RPC. -8. Envelope ID deduplication. -9. Leader handles pullSince directly. -10. Follower routes pullSince to leader via RPC. -11. Leader ensures persisted index locally. -12. Follower routes ensurePersistedIndex to leader. -13. Cleanup on dispose. - -### Playwright Multi-Tab Scenarios (Not Yet Implemented) - -1. Two tabs leading different collections simultaneously. -2. Reads served locally without leader-proxy round trips. -3. Follower mutation routing and ack/rollback flow. -4. Visibility-driven leader handoff behavior. -5. Tab close/crash leadership takeover. -6. Commit-broadcast gap recovery via heartbeat + pullSince. -7. Cross-collection write contention correctness under writer lock. -8. Sync-present offline-first and reconnect convergence. - -### Fault Injection Tests (Not Yet Implemented) - -- Drop selected BroadcastChannel messages. -- Delay/reorder RPC responses. -- Force leader stepdown mid-mutation. - -## Risks and Mitigations - -- **Risk:** browser API inconsistencies (Web Locks/visibility). - - **Mitigation:** strict capability checks and conservative fallbacks. -- **Risk:** lock thrash during visibility transitions. - - **Mitigation:** stepdown delay + reacquire cooldown. -- **Risk:** high contention causes latency spikes. - - **Mitigation:** DB writer lock + bounded retry with telemetry. -- **Risk:** mutation duplicates under retries. - - **Mitigation:** `envelopeId` dedupe and idempotent leader apply. - -## Exit Criteria - -- Playwright multi-tab suite is green and stable. -- Leadership, ordering, mutation routing, and recovery invariants hold under fault tests. -- Browser multi-tab marked GA-ready for both inferred modes. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 534d4163c..10318ff19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -208,12 +208,12 @@ importers: examples/electron/offline-first: dependencies: - '@tanstack/db-electron-sqlite-persisted-collection': + '@tanstack/electron-db-sqlite-persistence': specifier: workspace:* - version: link:../../../packages/db-electron-sqlite-persisted-collection - '@tanstack/db-node-sqlite-persisted-collection': + version: link:../../../packages/electron-db-sqlite-persistence + '@tanstack/node-db-sqlite-persistence': specifier: workspace:* - version: link:../../../packages/db-node-sqlite-persisted-collection + version: link:../../../packages/node-db-sqlite-persistence '@tanstack/offline-transactions': specifier: workspace:* version: link:../../../packages/offline-transactions @@ -302,9 +302,6 @@ importers: '@tanstack/db': specifier: workspace:* version: link:../../../packages/db - '@tanstack/db-react-native-sqlite-persisted-collection': - specifier: workspace:* - version: link:../../../packages/db-react-native-sqlite-persisted-collection '@tanstack/offline-transactions': specifier: ^1.0.24 version: link:../../../packages/offline-transactions @@ -314,6 +311,9 @@ importers: '@tanstack/react-db': specifier: ^0.1.77 version: link:../../../packages/react-db + '@tanstack/react-native-db-sqlite-persistence': + specifier: workspace:* + version: link:../../../packages/react-native-db-sqlite-persistence '@tanstack/react-query': specifier: ^5.90.20 version: 5.90.21(react@19.0.0) @@ -347,6 +347,9 @@ importers: react-native-screens: specifier: ~4.11.1 version: 4.11.1(react-native@0.79.6(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.0.0))(react@19.0.0) + use-latest-callback: + specifier: ^0.3.3 + version: 0.3.3(react@19.0.0) zod: specifier: ^3.25.76 version: 3.25.76 @@ -396,9 +399,6 @@ importers: '@tanstack/db': specifier: workspace:* version: link:../../../packages/db - '@tanstack/db-react-native-sqlite-persisted-collection': - specifier: workspace:* - version: link:../../../packages/db-react-native-sqlite-persisted-collection '@tanstack/electric-db-collection': specifier: workspace:* version: link:../../../packages/electric-db-collection @@ -408,6 +408,9 @@ importers: '@tanstack/react-db': specifier: ^0.1.77 version: link:../../../packages/react-db + '@tanstack/react-native-db-sqlite-persistence': + specifier: workspace:* + version: link:../../../packages/react-native-db-sqlite-persistence '@tanstack/react-query': specifier: ^5.90.20 version: 5.90.21(react@19.0.0) @@ -444,6 +447,9 @@ importers: react-native-screens: specifier: ~4.11.1 version: 4.11.1(react-native@0.79.6(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.0.0))(react@19.0.0) + use-latest-callback: + specifier: ^0.3.3 + version: 0.3.3(react@19.0.0) devDependencies: '@babel/core': specifier: ^7.29.0 @@ -475,12 +481,12 @@ importers: examples/react/offline-transactions: dependencies: + '@tanstack/browser-db-sqlite-persistence': + specifier: workspace:* + version: link:../../../packages/browser-db-sqlite-persistence '@tanstack/db': specifier: workspace:* version: link:../../../packages/db - '@tanstack/db-browser-wa-sqlite-persisted-collection': - specifier: workspace:* - version: link:../../../packages/db-browser-wa-sqlite-persisted-collection '@tanstack/offline-transactions': specifier: ^1.0.24 version: link:../../../packages/offline-transactions @@ -977,45 +983,11 @@ importers: specifier: ~0.15.0 version: 0.15.1 - packages/db: + packages/browser-db-sqlite-persistence: dependencies: - '@standard-schema/spec': - specifier: ^1.1.0 - version: 1.1.0 - '@tanstack/db-ivm': + '@tanstack/db-sqlite-persistence-core': specifier: workspace:* - version: link:../db-ivm - '@tanstack/pacer-lite': - specifier: ^0.2.1 - version: 0.2.1 - typescript: - specifier: '>=4.7' - version: 5.9.3 - devDependencies: - '@tanstack/config': - specifier: ^0.22.2 - version: 0.22.2(@types/node@25.2.2)(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@vitest/coverage-istanbul': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4) - arktype: - specifier: ^2.1.29 - version: 2.1.29 - mitt: - specifier: ^3.0.1 - version: 3.0.1 - superjson: - specifier: ^2.2.6 - version: 2.2.6 - temporal-polyfill: - specifier: ^0.3.0 - version: 0.3.0 - - packages/db-browser-wa-sqlite-persisted-collection: - dependencies: - '@tanstack/db-sqlite-persisted-collection-core': - specifier: workspace:* - version: link:../db-sqlite-persisted-collection-core + version: link:../db-sqlite-persistence-core typescript: specifier: '>=4.7' version: 5.9.3 @@ -1033,14 +1005,14 @@ importers: specifier: ^12.6.2 version: 12.8.0 - packages/db-capacitor-sqlite-persisted-collection: + packages/capacitor-db-sqlite-persistence: dependencies: '@capacitor-community/sqlite': specifier: ^8.0.1 version: 8.0.1(@capacitor/core@8.2.0) - '@tanstack/db-sqlite-persisted-collection-core': + '@tanstack/db-sqlite-persistence-core': specifier: workspace:* - version: link:../db-sqlite-persisted-collection-core + version: link:../db-sqlite-persistence-core typescript: specifier: '>=4.7' version: 5.9.3 @@ -1055,7 +1027,7 @@ importers: specifier: ^12.6.2 version: 12.8.0 - packages/db-capacitor-sqlite-persisted-collection/e2e/app: + packages/capacitor-db-sqlite-persistence/e2e/app: dependencies: '@capacitor-community/sqlite': specifier: ^8.0.1 @@ -1063,12 +1035,12 @@ importers: '@capacitor/core': specifier: ^8.2.0 version: 8.2.0 + '@tanstack/capacitor-db-sqlite-persistence': + specifier: workspace:* + version: link:../.. '@tanstack/db': specifier: workspace:* version: link:../../../db - '@tanstack/db-capacitor-sqlite-persisted-collection': - specifier: workspace:* - version: link:../.. devDependencies: '@capacitor/android': specifier: ^8.2.0 @@ -1089,11 +1061,11 @@ importers: specifier: ^7.3.1 version: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - packages/db-cloudflare-do-sqlite-persisted-collection: + packages/cloudflare-durable-objects-db-sqlite-persistence: dependencies: - '@tanstack/db-sqlite-persisted-collection-core': + '@tanstack/db-sqlite-persistence-core': specifier: workspace:* - version: link:../db-sqlite-persisted-collection-core + version: link:../db-sqlite-persistence-core typescript: specifier: '>=4.7' version: 5.9.3 @@ -1111,6 +1083,40 @@ importers: specifier: ^4.64.0 version: 4.75.0 + packages/db: + dependencies: + '@standard-schema/spec': + specifier: ^1.1.0 + version: 1.1.0 + '@tanstack/db-ivm': + specifier: workspace:* + version: link:../db-ivm + '@tanstack/pacer-lite': + specifier: ^0.2.1 + version: 0.2.1 + typescript: + specifier: '>=4.7' + version: 5.9.3 + devDependencies: + '@tanstack/config': + specifier: ^0.22.2 + version: 0.22.2(@types/node@25.2.2)(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/coverage-istanbul': + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) + arktype: + specifier: ^2.1.29 + version: 2.1.29 + mitt: + specifier: ^3.0.1 + version: 3.0.1 + superjson: + specifier: ^2.2.6 + version: 2.2.6 + temporal-polyfill: + specifier: ^0.3.0 + version: 0.3.0 + packages/db-collection-e2e: dependencies: '@tanstack/db': @@ -1144,65 +1150,6 @@ importers: packages/db-collections: {} - packages/db-electron-sqlite-persisted-collection: - dependencies: - '@tanstack/db-sqlite-persisted-collection-core': - specifier: workspace:* - version: link:../db-sqlite-persisted-collection-core - typescript: - specifier: '>=4.7' - version: 5.9.3 - devDependencies: - '@vitest/coverage-istanbul': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4) - electron: - specifier: ^40.2.1 - version: 40.8.0 - - packages/db-expo-sqlite-persisted-collection: - dependencies: - '@tanstack/db-sqlite-persisted-collection-core': - specifier: workspace:* - version: link:../db-sqlite-persisted-collection-core - expo-sqlite: - specifier: ^55.0.10 - version: 55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) - typescript: - specifier: '>=4.7' - version: 5.9.3 - devDependencies: - '@types/better-sqlite3': - specifier: ^7.6.13 - version: 7.6.13 - '@vitest/coverage-istanbul': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4) - better-sqlite3: - specifier: ^12.6.2 - version: 12.8.0 - - packages/db-expo-sqlite-persisted-collection/e2e/expo-runtime-app: - dependencies: - '@tanstack/db': - specifier: workspace:* - version: link:../../../db - '@tanstack/db-expo-sqlite-persisted-collection': - specifier: workspace:* - version: link:../.. - expo: - specifier: ~55.0.6 - version: 55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@5.1.11)(react-dom@19.2.4(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-sqlite: - specifier: ^55.0.10 - version: 55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - react: - specifier: 19.2.0 - version: 19.2.0 - react-native: - specifier: 0.83.2 - version: 0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.0) - packages/db-ivm: dependencies: fractional-indexing: @@ -1225,55 +1172,58 @@ importers: specifier: ^0.3.0 version: 0.3.0 - packages/db-node-sqlite-persisted-collection: + packages/db-sqlite-persistence-core: dependencies: - '@tanstack/db-sqlite-persisted-collection-core': + '@standard-schema/spec': + specifier: ^1.1.0 + version: 1.1.0 + '@tanstack/db': specifier: workspace:* - version: link:../db-sqlite-persisted-collection-core - better-sqlite3: - specifier: ^12.6.2 - version: 12.8.0 + version: link:../db typescript: specifier: '>=4.7' version: 5.9.3 devDependencies: - '@types/better-sqlite3': - specifier: ^7.6.13 - version: 7.6.13 '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) - packages/db-react-native-sqlite-persisted-collection: + packages/electric-db-collection: dependencies: - '@op-engineering/op-sqlite': - specifier: ^15.2.5 - version: 15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) - '@tanstack/db-sqlite-persisted-collection-core': + '@electric-sql/client': + specifier: ^1.5.13 + version: 1.5.13 + '@standard-schema/spec': + specifier: ^1.1.0 + version: 1.1.0 + '@tanstack/db': specifier: workspace:* - version: link:../db-sqlite-persisted-collection-core - typescript: - specifier: '>=4.7' - version: 5.9.3 + version: link:../db + '@tanstack/store': + specifier: ^0.9.2 + version: 0.9.2 + debug: + specifier: ^4.4.3 + version: 4.4.3 devDependencies: - '@types/better-sqlite3': - specifier: ^7.6.13 - version: 7.6.13 + '@types/debug': + specifier: ^4.1.12 + version: 4.1.12 + '@types/pg': + specifier: ^8.16.0 + version: 8.18.0 '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) - better-sqlite3: - specifier: ^12.6.2 - version: 12.8.0 + pg: + specifier: ^8.20.0 + version: 8.20.0 - packages/db-sqlite-persisted-collection-core: + packages/electron-db-sqlite-persistence: dependencies: - '@standard-schema/spec': - specifier: ^1.1.0 - version: 1.1.0 - '@tanstack/db': + '@tanstack/db-sqlite-persistence-core': specifier: workspace:* - version: link:../db + version: link:../db-sqlite-persistence-core typescript: specifier: '>=4.7' version: 5.9.3 @@ -1281,19 +1231,22 @@ importers: '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) + electron: + specifier: ^40.2.1 + version: 40.8.0 - packages/db-tauri-sqlite-persisted-collection: + packages/expo-db-sqlite-persistence: dependencies: - '@tanstack/db-sqlite-persisted-collection-core': + '@tanstack/db-sqlite-persistence-core': specifier: workspace:* - version: link:../db-sqlite-persisted-collection-core + version: link:../db-sqlite-persistence-core + expo-sqlite: + specifier: ^55.0.10 + version: 55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) typescript: specifier: '>=4.7' version: 5.9.3 devDependencies: - '@tauri-apps/plugin-sql': - specifier: ^2.3.2 - version: 2.3.2 '@types/better-sqlite3': specifier: ^7.6.13 version: 7.6.13 @@ -1304,64 +1257,45 @@ importers: specifier: ^12.6.2 version: 12.8.0 - packages/db-tauri-sqlite-persisted-collection/e2e/app: + packages/expo-db-sqlite-persistence/e2e/expo-runtime-app: dependencies: '@tanstack/db': specifier: workspace:* version: link:../../../db - '@tanstack/db-tauri-sqlite-persisted-collection': + '@tanstack/expo-db-sqlite-persistence': specifier: workspace:* version: link:../.. - '@tauri-apps/api': - specifier: ^2.10.1 - version: 2.10.1 - '@tauri-apps/plugin-sql': - specifier: ^2.3.2 - version: 2.3.2 - devDependencies: - '@tauri-apps/cli': - specifier: ^2.10.1 - version: 2.10.1 - '@types/node': - specifier: ^25.2.2 - version: 25.2.2 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vite: - specifier: ^7.3.1 - version: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + expo: + specifier: ~55.0.6 + version: 55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@5.1.11)(react-dom@19.2.4(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-sqlite: + specifier: ^55.0.10 + version: 55.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react: + specifier: 19.2.0 + version: 19.2.0 + react-native: + specifier: 0.83.2 + version: 0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.0) - packages/electric-db-collection: + packages/node-db-sqlite-persistence: dependencies: - '@electric-sql/client': - specifier: ^1.5.13 - version: 1.5.13 - '@standard-schema/spec': - specifier: ^1.1.0 - version: 1.1.0 - '@tanstack/db': + '@tanstack/db-sqlite-persistence-core': specifier: workspace:* - version: link:../db - '@tanstack/store': - specifier: ^0.9.2 - version: 0.9.2 - debug: - specifier: ^4.4.3 - version: 4.4.3 + version: link:../db-sqlite-persistence-core + better-sqlite3: + specifier: ^12.6.2 + version: 12.8.0 + typescript: + specifier: '>=4.7' + version: 5.9.3 devDependencies: - '@types/debug': - specifier: ^4.1.12 - version: 4.1.12 - '@types/pg': - specifier: ^8.16.0 - version: 8.18.0 + '@types/better-sqlite3': + specifier: ^7.6.13 + version: 7.6.13 '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) - pg: - specifier: ^8.20.0 - version: 8.20.0 packages/offline-transactions: dependencies: @@ -1478,6 +1412,28 @@ importers: specifier: ^19.2.4 version: 19.2.4(react@19.2.4) + packages/react-native-db-sqlite-persistence: + dependencies: + '@op-engineering/op-sqlite': + specifier: ^15.2.5 + version: 15.2.7(react-native@0.83.2(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) + '@tanstack/db-sqlite-persistence-core': + specifier: workspace:* + version: link:../db-sqlite-persistence-core + typescript: + specifier: '>=4.7' + version: 5.9.3 + devDependencies: + '@types/better-sqlite3': + specifier: ^7.6.13 + version: 7.6.13 + '@vitest/coverage-istanbul': + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) + better-sqlite3: + specifier: ^12.6.2 + version: 12.8.0 + packages/rxdb-db-collection: dependencies: '@standard-schema/spec': @@ -1565,6 +1521,56 @@ importers: specifier: ^4.3.6 version: 4.4.4(picomatch@4.0.3)(svelte@5.53.6)(typescript@5.9.3) + packages/tauri-db-sqlite-persistence: + dependencies: + '@tanstack/db-sqlite-persistence-core': + specifier: workspace:* + version: link:../db-sqlite-persistence-core + typescript: + specifier: '>=4.7' + version: 5.9.3 + devDependencies: + '@tauri-apps/plugin-sql': + specifier: ^2.3.2 + version: 2.3.2 + '@types/better-sqlite3': + specifier: ^7.6.13 + version: 7.6.13 + '@vitest/coverage-istanbul': + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) + better-sqlite3: + specifier: ^12.6.2 + version: 12.8.0 + + packages/tauri-db-sqlite-persistence/e2e/app: + dependencies: + '@tanstack/db': + specifier: workspace:* + version: link:../../../db + '@tanstack/tauri-db-sqlite-persistence': + specifier: workspace:* + version: link:../.. + '@tauri-apps/api': + specifier: ^2.10.1 + version: 2.10.1 + '@tauri-apps/plugin-sql': + specifier: ^2.3.2 + version: 2.3.2 + devDependencies: + '@tauri-apps/cli': + specifier: ^2.10.1 + version: 2.10.1 + '@types/node': + specifier: ^25.2.2 + version: 25.2.2 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + packages/trailbase-db-collection: dependencies: '@standard-schema/spec': @@ -11844,6 +11850,11 @@ packages: peerDependencies: react: '>=16.8' + use-latest-callback@0.3.3: + resolution: {integrity: sha512-G9A/EL7okx4wzBfATt8bdGg0v1K0Gp0IClTzljffM63gtPisgDKCaLCLUb4g2M4CoXDg5yyHjOU+g3SUPbXwrA==} + peerDependencies: + react: '>=16.8' + use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: @@ -15478,7 +15489,7 @@ snapshots: '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.2 + minipass: 7.1.3 '@isaacs/ttlcache@1.4.1': {} @@ -18952,7 +18963,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.21.0 + undici: 7.24.4 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -20858,7 +20869,7 @@ snapshots: foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 - minipass: 7.1.2 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 @@ -22085,7 +22096,7 @@ snapshots: '@npmcli/agent': 4.0.0 cacache: 20.0.3 http-cache-semantics: 4.2.0 - minipass: 7.1.2 + minipass: 7.1.3 minipass-fetch: 5.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -22405,7 +22416,7 @@ snapshots: minipass-collect@2.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 minipass-fetch@2.1.2: dependencies: @@ -22417,7 +22428,7 @@ snapshots: minipass-fetch@5.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 minipass-sized: 2.0.0 minizlib: 3.1.0 optionalDependencies: @@ -22456,7 +22467,7 @@ snapshots: minizlib@3.1.0: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 mitt@3.0.1: {} @@ -22999,7 +23010,7 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 - minipass: 7.1.2 + minipass: 7.1.3 path-scurry@2.0.2: dependencies: @@ -24681,7 +24692,7 @@ snapshots: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.2 + minipass: 7.1.3 minizlib: 3.1.0 yallist: 5.0.0 @@ -25054,6 +25065,10 @@ snapshots: react: 19.2.4 optional: true + use-latest-callback@0.3.3(react@19.0.0): + dependencies: + react: 19.0.0 + use-sync-external-store@1.6.0(react@19.0.0): dependencies: react: 19.0.0