@baukit/data-contracts-expo-sqlite
v0.3.0
Published
Expo SQLite implementation of the @baukit/data-contracts base storage contracts.
Downloads
155
Readme
@baukit/data-contracts-expo-sqlite
A zero-product-logic Expo SQLite implementation of @baukit/data-contracts'
base storage contracts.
import { SqliteRecordStore } from '@baukit/data-contracts-expo-sqlite';
import * as SQLite from 'expo-sqlite';
interface CachedRecord {
readonly id: string;
readonly value: string;
}
const database = await SQLite.openDatabaseAsync('product.db');
const records = new SqliteRecordStore<CachedRecord>(database, 'cached-records');
await records.initialize();For key/value data, schema metadata, and atomic compound writes, use the composite adapter:
import { ExpoSqliteStore } from '@baukit/data-contracts-expo-sqlite';
const storage = new ExpoSqliteStore<CachedRecord>(database, 'product');
await storage.initialize();
await storage.withTransaction((transaction) =>
transaction.withTransaction((sameTransaction) =>
sameTransaction.records.put({ id: 'one', value: 'cached' }),
),
);Nested calls made on the transaction-scoped context join the ambient exclusive
transaction. Independent root calls are serialized. close() closes the
logical adapter; pass { closeDatabase: true } when it should also own the
supplied database handle.
Namespaces share one fixed baukit_records table without colliding. Call initialize() before using a store. Records are serialized as JSON, pagination is bounded and keyset-based, and malformed persisted payloads produce a content-free error.
The package's fast Vitest suite uses a deterministic database fake. The
Expo SQLite device-conformance app
mirrors the shared contract cases against real expo-sqlite on Android,
including creation/reopening, namespace isolation, malformed data, rollback,
schema-metadata upgrades, and authenticated E→F→E database isolation. Products
derive the database name and resolve its registry with @baukit/data-contracts
before opening the Expo database. iOS is a scheduled/manual macOS gate.
Boundaries
The package implements @baukit/data-contracts on Expo SQLite and nothing else. It does not choose a
database name, open a singleton, define product entities, or implement cache policy.
Passing the database handle in rather than opening one is what makes an authenticated product able to derive its database name per identity, which is what the shared E→F→E isolation cases exercise.
@baukit/data-contracts-dexie is the same contract on the web.
