@makaio/storage-drizzle
Drizzle ORM extension for storage namespaces with a runtime-selected SQLite/Drizzle client seam.
What This Is
Section titled “What This Is”Extends @makaio/storage-core with:
- Declaration merging - Adds
drizzleproperty toStorageNamespaceExtensions - Database client sub-entry - Async factory that selects Bun SQLite for Bun-local databases and libSQL/Drizzle for Node.js or remote URLs
- Type-safe tables - Access Drizzle schemas directly from storage namespaces
Quick Start
Section titled “Quick Start”Enable drizzle extension (side-effect import):
import '@makaio/storage-drizzle';// Now StorageNamespaceExtensions.drizzle is availableCreate storage namespace with drizzle tables:
import { createStorageNamespace } from '@makaio/storage-drizzle';import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';import { z } from 'zod';
// Define Drizzle tableexport const sessionsTable = sqliteTable('sessions', { id: text('id').primaryKey(), data: text('data'), createdAt: integer('created_at'),});
// Create namespace with extensionexport const SessionStorage = createStorageNamespace('session', { schemas: { get: { request: z.object({ sessionId: z.string() }), response: z.object({ session: SessionSchema.nullable() }), }, }, extensions: { drizzle: { sessions: sessionsTable }, },});
// Type-safe accessconst table = SessionStorage.extensions.drizzle?.sessions;Create database client:
import { createDatabaseClient } from '@makaio/storage-drizzle/client';
// Runtime-selected local SQLite clientconst { db } = await createDatabaseClient();// Uses: file:./makaio.db
// Production with Tursoconst { db } = await createDatabaseClient({ url: process.env.TURSO_DATABASE_URL, authToken: process.env.TURSO_AUTH_TOKEN,});
// Local libSQL serverconst { db } = await createDatabaseClient({ url: 'http://localhost:8080',});Architecture Principles
Section titled “Architecture Principles”1. Extension Point - Uses TypeScript declaration merging, not inheritance
2. Runtime SQLite seam - Client factory selects the appropriate SQLite driver by runtime and
URL while exposing one MakaioDatabase contract
3. Entrypoint Split - Root exports namespace/drizzle helpers; client creation lives under
@makaio/storage-drizzle/client
4. Type Preservation - Specific table types flow through extensions
Key Exports
Section titled “Key Exports”Root entry (@makaio/storage-drizzle):
createStorageNamespace- Re-export from@makaio/storage-coreexecuteTransaction(db, callback)- Execute a callback in a Drizzle transactionregisterDrizzleHandlers(registration)- Wrap typed storage handler registration for extension manifestsDrizzleHandlerRegistration- Typed registration callback consumed byregisterDrizzleHandlerssanitizeFtsQuery(query)- Quote user input for safe SQLite FTS5MATCHusageDrizzleSchemaRecord-Record<string, Table>for table definitionsMakaioDatabase- Canonical database type alias for storage consumersTransactionCallback- Callback type forexecuteTransactionStorageNamespace,StorageNamespaceConfig,StorageNamespaceExtensions- Re-exported core storage types
Client entry (@makaio/storage-drizzle/client):
createDatabaseClient(config)- Async factory for the runtime-selected SQLite driverDatabaseClient-{ db: MakaioDatabase, close(): void }DatabaseClientConfig-{ url?: string, authToken?: string }
Design Philosophy
Section titled “Design Philosophy”“Extend, don’t replace” - Declaration merging adds capabilities without modifying core abstractions.
Part of Makaio Framework