Skip to content
Effect Days 2026 Get your ticket

SqliteMigrator

Runs database migrations for Bun SQLite projects that use Effect SQL.

This module re-exports the shared migration loaders and errors, then provides run and layer helpers that apply pending migration files with the current SqlClient. It does not add Bun-specific schema dump support; migration execution is handled by the shared SQL migrator.

12 exports Added in v4.0.0 Source

Constructors

make

Added in v4.0.0

Creates a migrator that ensures the migrations table exists, runs pending migrations in a transaction, and optionally dumps the schema after successful migrations.

Signature

declare const make: <RD = never>({ dumpSchema }: {
dumpSchema?: (path: string, migrationsTable: string) => Effect.Effect<void, MigrationError, RD>;
}) => <R2 = never>({ loader, schemaDirectory, table }: MigratorOptions<R2>) => Effect.Effect<ReadonlyArray<readonly [id: number, name: string]>, MigrationError | SqlError, Client.SqlClient | RD | R2>

Errors

MigrationError

Added in v4.0.0

Error raised while loading, validating, locking, or running SQL migrations.

Signature

declare class MigrationError extends MigrationError_base<{
readonly _tag: "MigrationError";
readonly cause?: unknown;
readonly kind: "BadState" | "ImportError" | "Failed" | "Duplicates" | "Locked";
readonly message: string;
}> {
constructor(args: {
readonly cause?: unknown;
readonly kind: "BadState" | "ImportError" | "Failed" | "Duplicates" | "Locked";
readonly message: string;
});
}

Layers

layer

Added in v4.0.0 Source

Creates a layer that runs the configured SQL migrations during layer construction.

Signature

declare function layer<R>(options: MigratorOptions<R>): Layer<never, SqlError | MigrationError, SqlClient | R>

Loaders

fromBabelGlob

Added in v4.0.0

Creates a migration loader from a Babel-style glob record, parsing keys such as _<id>_<name>Js, _<id>_<name>Ts, _<id>_<name>Mjs, or _<id>_<name>Mts and sorting migrations by id.

Signature

declare const fromBabelGlob: (migrations: Record<string, any>) => Loader

fromFileSystem

Added in v4.0.0

Creates a migration loader that reads a directory with FileSystem, imports files named <id>_<name>.js, <id>_<name>.ts, <id>_<name>.mjs, or <id>_<name>.mts, and sorts migrations by id.

Details

Requires a Path service appropriate for the migration directory's path syntax. On Windows, prefer a platform-aware implementation such as NodePath.layer; the core Path.layer uses POSIX semantics and does not preserve Windows drive-letter paths.

Signature

declare const fromFileSystem: (directory: string) => Loader<FileSystem | Path>

fromGlob

Added in v4.0.0

Creates a migration loader from a glob record of dynamic import functions, parsing files named <id>_<name>.js, <id>_<name>.ts, <id>_<name>.mjs, or <id>_<name>.mts and sorting migrations by id.

Signature

declare const fromGlob: (migrations: Record<string, () => Promise<any>>) => Loader

fromRecord

Added in v4.0.0

Creates a migration loader from a record of migration effects keyed by <id>_<name>, sorted by migration id.

Signature

declare const fromRecord: (migrations: Record<string, Effect.Effect<void, unknown, Client.SqlClient>>) => Loader

Models

Loader type

Added in v4.0.0

Effect that resolves the available migrations for the migrator or fails with a MigrationError.

Signature

type Loader<R = never> = Effect.Effect<ReadonlyArray<ResolvedMigration>, MigrationError, R>

Migration interface

Added in v4.0.0

Metadata for a migration recorded in the migrations table, including its id, name, and creation timestamp.

Signature

interface Migration {
readonly createdAt: Date;
readonly id: number;
readonly name: string;
}

ResolvedMigration type

Added in v4.0.0

Tuple produced by a migration loader, containing the migration id, migration name, and an effect that loads the migration implementation.

Signature

type ResolvedMigration = readonly [id: number, name: string, load: Effect.Effect<any, any, Client.SqlClient>]

Options

MigratorOptions interface

Added in v4.0.0

Options for running SQL migrations, including the migration loader, optional schema dump directory, and migrations table name.

Signature

interface MigratorOptions<R = never> {
readonly loader: Loader<R>;
readonly schemaDirectory?: string;
readonly table?: string;
}

Running

run

Added in v4.0.0 Source

Runs SQL migrations using the configured SqlClient, returning the migrations that were applied.

Signature

declare const run: <R2 = never>(options: Migrator.MigratorOptions<R2>) => Effect.Effect<ReadonlyArray<readonly [id: number, name: string]>, Migrator.MigrationError | SqlError, Client.SqlClient | R2>