Adapters
Drizzle, Prisma, Kysely, pg, PGlite, better-sqlite3, Memory
Drizzle + Postgres
import { drizzleAdapter } from 'bettersync/adapters/drizzle'
import { projects } from './db/schema'
drizzleAdapter(db, { schema: { project: projects } })Column mapping is automatic from Drizzle table definitions.
Prisma + Postgres
import { prismaAdapter } from 'bettersync/adapters/prisma'
prismaAdapter(prisma)Uses $queryRawUnsafe under the hood. Works with any Prisma schema.
Kysely + Postgres
import { kyselyAdapter } from 'bettersync/adapters/kysely'
kyselyAdapter(db)Uses CompiledQuery.raw() for parameterized queries.
pg (node-postgres)
import { pgAdapter } from 'bettersync/adapters/pg'
import { Pool } from 'pg'
pgAdapter(new Pool({ connectionString: DATABASE_URL }))Raw SQL, no ORM. Minimal dependency.
PGlite (Browser)
import { pgliteAdapter } from 'bettersync/adapters/pglite'
import { PGlite } from '@electric-sql/pglite'
pgliteAdapter(new PGlite('idb://my-app'))Postgres WASM in the browser. Same SQL dialect as server.
better-sqlite3 (Node.js / Electron)
import { betterSqlite3Adapter }
from 'bettersync/adapters/better-sqlite3'
import Database from 'better-sqlite3'
betterSqlite3Adapter(new Database('app.db'))Synchronous SQLite. Ideal for Electron, CLI tools, or edge.
Memory (Tests)
import { memoryAdapter } from 'bettersync/adapters/memory'
memoryAdapter()Conformance Suite
Every adapter passes 19 shared tests:
import { CONFORMANCE_TESTS } from 'bettersync/test'
for (const test of CONFORMANCE_TESTS) {
it(test.name, () =>
test.run({ factory: () => myAdapter() }))
}