An open API service indexing awesome lists of open source software.

https://github.com/Sheraff/drizzle-orm-crsqlite-wasm


https://github.com/Sheraff/drizzle-orm-crsqlite-wasm

Last synced: about 1 year ago
JSON representation

Awesome Lists containing this project

README

          

> [!TIP]
> The goal of this package is to get merged into the official `drizzle-orm` package. In the meantime it provides a way to use `crsqlite-wasm` as the underlying database engine for `drizzle`.

# What is this?

This package is an adapter for `drizzle` to use `crsqlite-wasm` as the underlying database engine. It is meant to work in the browser (uses web crypto for hashing). It is similar to the other adapters you might find in the official `drizzle-orm` package (like `drizzle-orm/libsql` or `drizzle-orm/better-sqlite3`).

# Quick start

```shell
npm i drizzle-orm-crsqlite-wasm
```

```ts
import { initWasm } from "@vlcn.io/crsqlite-wasm"
import * as schema from "my-regular-drizzle-schema.ts"
import { drizzle } from "drizzle-orm-crsqlite-wasm"

const sqlite = await initWasm()
const sql = await sqlite.open("test")
const db = drizzle(sql)
const countries = await db.select().from(schema.countries).all()
```

# How to use it?

1. export all migrations from the drizzle migrations folder (following example uses `Vite`)

```ts
// /index.ts
export const migrations = Object.fromEntries(
Object.entries(
import.meta.glob("./*.sql", {
eager: true,
query: "?raw",
import: "default",
})
).map(([key, value]) => [key.slice(2, -4), value])
)
```

2. create browser equivalent of node's `crypto.createHash("sha256")`

```ts
// /hash.ts
async function createSha256Hash(query: string) {
const encoder = new TextEncoder()
const data = encoder.encode(query)
const hash = await globalThis.crypto.subtle.digest("SHA-256", data)
const hashArray = Array.from(new Uint8Array(hash))
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join("")
return hashHex
}
```

3. process all migration data into a format useable by `drizzle`

```ts
import migrationJournal from "/meta/_journal.json"
import { migrations } from "/index.ts"
import { createSha256Hash } from "/hash.ts"

function getMigrations() {
const journal = migrationJournal as {
entries: Array<{
idx: number
when: number
tag: string
breakpoints: boolean
}>
}
const migrationQueries: MigrationMeta[] = []
for (const journalEntry of journal.entries) {
const query = migrations[journalEntry.tag as keyof typeof migrations]
const result = query.split("--> statement-breakpoint")
migrationQueries.push({
sql: result,
bps: journalEntry.breakpoints,
folderMillis: journalEntry.when,
hash: await createSha256Hash(query),
})
}
return migrationQueries
}
```

4. create a `drizzle` instance and run the migrations

```ts
import { initWasm } from "@vlcn.io/crsqlite-wasm"
import * as schema from "my-regular-drizzle-schema.ts"
import { drizzle } from "drizzle-orm-crsqlite-wasm"
import { migrate } from "drizzle-orm-crsqlite-wasm/migrator"

const sqlite = await initWasm()
const sql = await sqlite.open()
const db = drizzle(sql, { schema, logger: true })
await migrate(db, { migrations: await getMigrations() })
```

5. use as a regular `drizzle` instance

```ts
const [country] = await db
.select()
.from(schema.countries)
.where(eq(schema.countries.name, "Peru"))
```