3.3 KiB
registerSqliteMemoryEngine
(no submodules)
Purpose
Registers the in-memory SQLite adapter under engine: "sqlite-memory" in the open @suaveplan/api-db-adapter engine registry. Once called, any consumer that constructs an adapter via createDbAdapter({ engine: "sqlite-memory", ... }) receives an instance produced by this package. The TypeScript-side declaration-merge into DatabaseEngineRegistry means the engine name is accepted as a string-literal-typed argument with no cast.
This is the bridge that lets @suaveplan/api-host/testing's Stage-5 createTestHost boot a plugin entirely against an in-memory SQLite without changing any of The adapter code paths. The registration is idempotent — calling twice replaces the previous factory — and the function returns a disposer so tests can unregister the engine in afterEach.
Features
- Type-level:
declare moduleextendsDatabaseEngineRegistrywith"sqlite-memory": true. - Runtime:
registerEngine("sqlite-memory", factory)against the api-db-adapter registry. - Factory honours
DbAdapterOptions.url→filenameso callers may writeengine: "sqlite-memory"+url: ":memory:"(or a file path). - Forwards
tenantColumn+autoInjectInsertsso The wrapper composes correctly on top. - Returns a disposer
() => booleanthat unregisters the engine.
Usage: Basic
import { createDbAdapter } from "@suaveplan/api-db-adapter";
import { registerSqliteMemoryEngine } from "@suaveplan/api-db-sqlite-memory/engine";
const dispose = registerSqliteMemoryEngine();
const adapter = await createDbAdapter({
engine: "sqlite-memory",
url: ":memory:",
});
await adapter.admin.execute("CREATE TABLE t (id INTEGER PRIMARY KEY)");
await adapter.close();
dispose();
Usage: Advanced
Test lifecycle with deterministic registry teardown:
import {
afterEach,
beforeEach,
describe,
it,
} from "@suaveplan/testing/runner";
import { createDbAdapter } from "@suaveplan/api-db-adapter";
import { registerSqliteMemoryEngine } from "@suaveplan/api-db-sqlite-memory/engine";
describe("plugin install", () => {
let dispose: () => boolean;
beforeEach(() => {
dispose = registerSqliteMemoryEngine();
});
afterEach(() => {
dispose();
});
it("resolves the engine sentinel", { timeout: 5000 }, async () => {
const adapter = await createDbAdapter({
engine: "sqlite-memory",
url: ":memory:",
tenantColumn: "tenant_id",
});
await adapter.close();
});
});
API Reference
registerSqliteMemoryEngine()— returns a disposer() => boolean.
Implementation Notes
The declaration-merge happens inside this module so the type extension is only visible after the consumer imports from @suaveplan/api-db-sqlite-memory/engine (or the package root, which re-exports). That keeps the engine sentinel scoped to plugins that opt in, matching the design intent of the open DatabaseEngineRegistry. The factory normalises an empty or "sqlite-memory:" url to ":memory:" because createDbAdapter's Zod schema requires url to be non-empty — without this normalisation, callers would have to write url: ":memory:" redundantly even when the engine name already implies it.