everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
87 lines • 3.63 kB
text/typescript
import { MigrationStorage } from "./core.cjs";
import { DatabaseError } from "./errors.cjs";
import { Effect } from "effect";
//#region src/db/run-migrations.d.ts
interface Migration {
idx: number;
when: number;
tag: string;
hash: string;
sql: string[];
}
/**
* Minimal structural view of a drizzle PgDatabase — the concrete per-workspace
* `PgDatabase<PgQueryResultHKT, TSchema>` values satisfy this.
*/
interface MigrationDatabase {
execute(query: unknown): Promise<unknown>;
transaction<T>(fn: (tx: {
execute(query: unknown): Promise<unknown>;
}) => Promise<T>): Promise<T>;
}
interface LoadedMigrations {
migrations: Migration[];
source: "virtual" | "disk";
}
interface DriftReport {
status: "healthy" | "empty" | "untracked-existing-schema" | "drift-safe-repair" | "drift-manual";
expectedTables: string[];
missingTables: string[];
appliedHashes: number;
localHashes: number;
storage: MigrationStorage;
}
interface MigrationReport {
applied: number;
total: number;
storage: MigrationStorage;
schema: string | undefined;
}
interface RunMigrationsOptions {
schemaName?: string;
journal?: MigrationStorage;
duplicateSqlStates?: readonly string[];
}
interface LoadMigrationsOptions {
/** Directory containing the workspace's drizzle `migrations/` folder for the disk fallback. */
fromDir?: string;
/**
* Bundler-provided virtual-module loader (e.g. `virtual:drizzle-migrations.sql`
* registered by rspack). Lives at the call site — the shared package must not
* name the virtual module, which only exists inside plugin bundles.
*/
virtual?: () => Promise<{
default?: Migration[];
}>;
}
declare function loadMigrations(opts?: LoadMigrationsOptions): Effect.Effect<LoadedMigrations, DatabaseError>;
/**
* Apply pending migrations to the target database.
*
* Namespace model: `opts.schemaName` (`plugin_<slug>`) scopes data tables; the
* journal lives in `opts.journal` (default the shared `drizzle.__drizzle_migrations`).
* Undefined `schemaName` means public-schema (api) or dedicated-DB (auth) topology.
*
* Concurrency: the run serializes on a journal-scoped Postgres advisory
* transaction lock, so the dev double-boot (plugin dev-server + the host's
* in-process load), parallel test files, and overlapping production replicas
* converge instead of colliding in pg_catalog. SAVEPOINT-based duplicate-DDL
* tolerance stays as defense-in-depth for non-participants (drizzle-kit).
*
* Reliability floor: hash-tracked idempotence with a preflight that records
* fully-overlapped migrations as applied, everything in one locked
* transaction, retried on deadlock/serialization/lock-timeout/connection
* states — a failed attempt rolls back cleanly and re-runs.
*/
declare function runMigrations(db: MigrationDatabase, migrations: Migration[], opts?: RunMigrationsOptions): Effect.Effect<MigrationReport, DatabaseError>;
/**
* Detect drift between the local migration set and the database journal.
*
* Pass an explicit `journal` resolved from the caller's workspace for reliable
* slug derivation; the default relies on `process.env.npm_package_name`, which is
* unreliable under bundlers and Module Federation remotes.
*/
declare function detectDrift(db: MigrationDatabase, migrations: Migration[], journal?: MigrationStorage, schemaName?: string): Effect.Effect<DriftReport, DatabaseError>;
//#endregion
export { DriftReport, LoadMigrationsOptions, LoadedMigrations, Migration, MigrationDatabase, MigrationReport, RunMigrationsOptions, detectDrift, loadMigrations, runMigrations };
//# sourceMappingURL=run-migrations.d.cts.map