Skip to content

Commit e6f7a45

Browse files
committed
Migrator init prototype
1 parent 03a5cdc commit e6f7a45

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

drizzle-orm/src/neon-http/migrator.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { MigrationConfig } from '~/migrator.ts';
22
import { readMigrationFiles } from '~/migrator.ts';
33
import type { AnyRelations } from '~/relations.ts';
44
import { type SQL, sql } from '~/sql/sql.ts';
5+
import type { MigratorInitFailResponse } from '~/utils.ts';
56
import type { NeonHttpDatabase } from './driver.ts';
67

78
/**
@@ -15,7 +16,8 @@ import type { NeonHttpDatabase } from './driver.ts';
1516
export async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(
1617
db: NeonHttpDatabase<TSchema, TRelations>,
1718
config: MigrationConfig,
18-
) {
19+
init?: boolean,
20+
): Promise<void | MigratorInitFailResponse> {
1921
const migrations = readMigrationFiles(config);
2022
const migrationsTable = config.migrationsTable ?? '__drizzle_migrations';
2123
const migrationsSchema = config.migrationsSchema ?? 'drizzle';
@@ -35,6 +37,16 @@ export async function migrate<TSchema extends Record<string, unknown>, TRelation
3537
} order by created_at desc limit 1`,
3638
);
3739

40+
if (init) {
41+
if (dbMigrations.length) {
42+
return { exitCode: 'manyMigrationsExist' };
43+
}
44+
45+
if (migrations.length > 1) {
46+
return { exitCode: 'manyMigrationsExist' };
47+
}
48+
}
49+
3850
const lastDbMigration = dbMigrations[0];
3951
const rowsToInsert: SQL[] = [];
4052
for await (const migration of migrations) {

drizzle-orm/src/pg-core/dialect.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ import {
5757
} from '~/sql/sql.ts';
5858
import { Subquery } from '~/subquery.ts';
5959
import { getTableName, getTableUniqueName, Table, TableColumns } from '~/table.ts';
60-
import { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';
60+
import { type Casing, type MigratorInitFailResponse, orderSelectedFields, type UpdateSet } from '~/utils.ts';
6161
import { ViewBaseConfig } from '~/view-common.ts';
6262
import type { PgSession } from './session.ts';
6363
import { PgViewBase } from './view-base.ts';
@@ -77,7 +77,12 @@ export class PgDialect {
7777
this.casing = new CasingCache(config?.casing);
7878
}
7979

80-
async migrate(migrations: MigrationMeta[], session: PgSession, config: string | MigrationConfig): Promise<void> {
80+
async migrate(
81+
migrations: MigrationMeta[],
82+
session: PgSession,
83+
config: string | MigrationConfig,
84+
init?: boolean,
85+
): Promise<void | MigratorInitFailResponse> {
8186
const migrationsTable = typeof config === 'string'
8287
? '__drizzle_migrations'
8388
: config.migrationsTable ?? '__drizzle_migrations';
@@ -98,6 +103,16 @@ export class PgDialect {
98103
} order by created_at desc limit 1`,
99104
);
100105

106+
if (init) {
107+
if (dbMigrations.length) {
108+
return { exitCode: 'manyMigrationsExist' };
109+
}
110+
111+
if (migrations.length > 1) {
112+
return { exitCode: 'manyMigrationsExist' };
113+
}
114+
}
115+
101116
const lastDbMigration = dbMigrations[0];
102117
await session.transaction(async (tx) => {
103118
for await (const migration of migrations) {

drizzle-orm/src/postgres-js/migrator.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import type { PostgresJsDatabase } from './driver.ts';
66
export async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(
77
db: PostgresJsDatabase<TSchema, TRelations>,
88
config: MigrationConfig,
9+
init?: boolean,
910
) {
1011
const migrations = readMigrationFiles(config);
11-
await db.dialect.migrate(migrations, db.session, config);
12+
return await db.dialect.migrate(migrations, db.session, config, init);
1213
}

drizzle-orm/src/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,3 +336,5 @@ export function isConfig(data: any): boolean {
336336
export type NeonAuthToken = string | (() => string | Promise<string>);
337337

338338
export const textDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder();
339+
340+
export type MigratorInitFailResponse = { exitCode: 'migrationsTableExists' | 'manyMigrationsExist' };

0 commit comments

Comments
 (0)