Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/workflows/e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,16 @@ jobs:
env:
ELECTRIC_URL: http://localhost:3000

- name: Run Node SQLite persisted collection E2E tests
run: |
cd packages/db-node-sqlite-persisted-collection
pnpm test:e2e

- name: Run Electron SQLite persisted collection E2E tests (full bridge)
run: |
cd packages/db-electron-sqlite-persisted-collection
TANSTACK_DB_ELECTRON_E2E_ALL=1 pnpm test:e2e

- name: Run React Native/Expo persisted collection E2E tests
run: |
cd packages/db-react-native-sqlite-persisted-collection
Expand Down
71 changes: 71 additions & 0 deletions packages/db-electron-sqlite-persisted-collection/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# @tanstack/db-electron-sqlite-persisted-collection

Thin Electron bridge for TanStack DB SQLite persistence.

## Public API

- `exposeElectronSQLitePersistence(...)` (main process)
- `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
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 Database from 'better-sqlite3'

const database = new Database(`./tanstack-db.sqlite`)

const persistence = createNodeSQLitePersistence({
database,
})

const dispose = exposeElectronSQLitePersistence({
ipcMain,
persistence,
})

// Call dispose() and database.close() during shutdown.
```

## Renderer process

```ts
import { createCollection } from '@tanstack/db'
import { ipcRenderer } from 'electron'
import {
createElectronSQLitePersistence,
persistedCollectionOptions,
} from '@tanstack/db-electron-sqlite-persisted-collection'

type Todo = {
id: string
title: string
completed: boolean
}

const persistence = createElectronSQLitePersistence<Todo, string>({
ipcRenderer,
})

export const todosCollection = createCollection(
persistedCollectionOptions<Todo, string>({
id: `todos`,
getKey: (todo) => todo.id,
persistence,
schemaVersion: 1, // Per-collection schema version
}),
)
```

## Notes

- The renderer API mirrors other runtimes: one shared `create...Persistence`.
- Collection mode (`sync-present` vs `sync-absent`) and `schemaVersion` are
resolved per collection and forwarded across IPC automatically.
80 changes: 80 additions & 0 deletions packages/db-electron-sqlite-persisted-collection/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
{
"name": "@tanstack/db-electron-sqlite-persisted-collection",
"version": "0.1.0",
"description": "Electron SQLite persisted collection bridge for TanStack DB",
"author": "TanStack Team",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/TanStack/db.git",
"directory": "packages/db-electron-sqlite-persisted-collection"
},
"homepage": "https://tanstack.com/db",
"keywords": [
"sqlite",
"electron",
"ipc",
"persistence",
"typescript"
],
"scripts": {
"build": "vite build",
"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"
},
"type": "module",
"main": "dist/cjs/index.cjs",
"module": "dist/esm/index.js",
"types": "dist/esm/index.d.ts",
"exports": {
".": {
"import": {
"types": "./dist/esm/index.d.ts",
"default": "./dist/esm/index.js"
},
"require": {
"types": "./dist/cjs/index.d.cts",
"default": "./dist/cjs/index.cjs"
}
},
"./main": {
"import": {
"types": "./dist/esm/main.d.ts",
"default": "./dist/esm/main.js"
},
"require": {
"types": "./dist/cjs/main.d.cts",
"default": "./dist/cjs/main.cjs"
}
},
"./renderer": {
"import": {
"types": "./dist/esm/renderer.d.ts",
"default": "./dist/esm/renderer.js"
},
"require": {
"types": "./dist/cjs/renderer.d.cts",
"default": "./dist/cjs/renderer.cjs"
}
},
"./package.json": "./package.json"
},
"sideEffects": false,
"files": [
"dist",
"src"
],
"dependencies": {
"@tanstack/db-sqlite-persisted-collection-core": "workspace:*"
},
"peerDependencies": {
"typescript": ">=4.7"
},
"devDependencies": {
"@vitest/coverage-istanbul": "^3.2.4",
"electron": "^40.2.1"
}
}
Loading
Loading