zenstack-kit 0.1.17 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/app.d.ts.map +1 -1
- package/dist/cli/app.js +3 -0
- package/dist/cli/commands.d.ts +1 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +11 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/migrations/prisma/apply.d.ts +2 -0
- package/dist/migrations/prisma/apply.d.ts.map +1 -1
- package/dist/migrations/prisma/apply.js +12 -8
- package/dist/migrations/prisma/diff.d.ts.map +1 -1
- package/dist/migrations/prisma/diff.js +12 -2
- package/dist/migrations/prisma/log.d.ts +9 -3
- package/dist/migrations/prisma/log.d.ts.map +1 -1
- package/dist/migrations/prisma/log.js +25 -4
- package/dist/migrations/prisma.d.ts +1 -1
- package/dist/migrations/prisma.d.ts.map +1 -1
- package/dist/migrations/prisma.js +1 -1
- package/dist/sql/compiler.d.ts +1 -1
- package/dist/sql/compiler.d.ts.map +1 -1
- package/dist/sql/compiler.js +15 -5
- package/package.json +1 -1
package/dist/cli/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.tsx"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.tsx"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AA8YH,wBAAgB,MAAM,SA4BrB"}
|
package/dist/cli/app.js
CHANGED
package/dist/cli/commands.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -10,7 +10,7 @@ import * as os from "os";
|
|
|
10
10
|
import { execFileSync } from "child_process";
|
|
11
11
|
import { loadConfig } from "../config/loader.js";
|
|
12
12
|
import { pullSchema } from "../schema/pull.js";
|
|
13
|
-
import { createPrismaMigration, createEmptyMigration, applyPrismaMigrations, previewPrismaMigrations, hasPrismaSchemaChanges, hasSnapshot, scanMigrationFolders, readMigrationLog, writeMigrationLog, getMigrationLogPath, calculateChecksum, initializeSnapshot, createInitialMigration, detectPotentialRenames, } from "../migrations/prisma.js";
|
|
13
|
+
import { createPrismaMigration, createEmptyMigration, applyPrismaMigrations, previewPrismaMigrations, hasPrismaSchemaChanges, hasSnapshot, scanMigrationFolders, readMigrationLog, writeMigrationLog, getMigrationLogPath, calculateChecksum, rehashWithSameVersion, initializeSnapshot, createInitialMigration, detectPotentialRenames, } from "../migrations/prisma.js";
|
|
14
14
|
export class CommandError extends Error {
|
|
15
15
|
constructor(message) {
|
|
16
16
|
super(message);
|
|
@@ -220,6 +220,7 @@ export async function runMigrateApply(ctx) {
|
|
|
220
220
|
markApplied: ctx.options.markApplied,
|
|
221
221
|
strict,
|
|
222
222
|
targetMigration: ctx.options.migration,
|
|
223
|
+
ignoreOrderMismatch: ctx.options.ignoreOrderMismatch,
|
|
223
224
|
});
|
|
224
225
|
// Handle coherence errors
|
|
225
226
|
if (result.coherenceErrors && result.coherenceErrors.length > 0) {
|
|
@@ -267,9 +268,11 @@ export async function runMigrateRehash(ctx) {
|
|
|
267
268
|
throw new CommandError(`Migration not found: ${targetMigration}`);
|
|
268
269
|
}
|
|
269
270
|
const sqlContent = await fs.promises.readFile(sqlPath, "utf-8");
|
|
270
|
-
const checksum = calculateChecksum(sqlContent);
|
|
271
271
|
const entries = await readMigrationLog(outputPath);
|
|
272
272
|
const existingIndex = entries.findIndex((e) => e.name === targetMigration);
|
|
273
|
+
const checksum = existingIndex !== -1
|
|
274
|
+
? rehashWithSameVersion(sqlContent, entries[existingIndex].checksum)
|
|
275
|
+
: calculateChecksum(sqlContent);
|
|
273
276
|
if (existingIndex === -1) {
|
|
274
277
|
entries.push({ name: targetMigration, checksum });
|
|
275
278
|
}
|
|
@@ -283,7 +286,9 @@ export async function runMigrateRehash(ctx) {
|
|
|
283
286
|
ctx.log("warning", "If this migration was already applied, make sure the database checksum matches the updated log.");
|
|
284
287
|
return;
|
|
285
288
|
}
|
|
286
|
-
const
|
|
289
|
+
const existingLog = await readMigrationLog(outputPath);
|
|
290
|
+
const existingByName = new Map(existingLog.map((e) => [e.name, e]));
|
|
291
|
+
const migrations = await scanMigrationFolders(outputPath, existingByName);
|
|
287
292
|
if (migrations.length === 0) {
|
|
288
293
|
ctx.log("warning", "No migrations found.");
|
|
289
294
|
return;
|
|
@@ -313,8 +318,10 @@ export async function runInit(ctx) {
|
|
|
313
318
|
return;
|
|
314
319
|
}
|
|
315
320
|
ctx.log("info", "Reinitializing...");
|
|
321
|
+
const existingLogBeforeReinit = await readMigrationLog(outputPath);
|
|
322
|
+
const existingByNameBeforeReinit = new Map(existingLogBeforeReinit.map((e) => [e.name, e]));
|
|
316
323
|
const result = await initializeSnapshot({ schemaPath, outputPath });
|
|
317
|
-
const migrations = await scanMigrationFolders(outputPath);
|
|
324
|
+
const migrations = await scanMigrationFolders(outputPath, existingByNameBeforeReinit);
|
|
318
325
|
await writeMigrationLog(outputPath, migrations);
|
|
319
326
|
ctx.log("success", `Snapshot recreated: ${result.snapshotPath}`);
|
|
320
327
|
ctx.log("success", `Migration log rebuilt with ${migrations.length} migration(s)`);
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export { introspectSchema, type SchemaInfo, type ModelInfo, type FieldInfo } fro
|
|
|
10
10
|
export { createMigration, getSchemaDiff, hasSchemaChanges, initSnapshot, type MigrationOptions, type Migration, type InitSnapshotOptions, type InitSnapshotResult, } from "./migrations/diff.js";
|
|
11
11
|
export { applyMigrations, type ApplyMigrationsOptions } from "./migrations/apply.js";
|
|
12
12
|
export { setPromptProvider, type PromptProvider } from "./cli/prompt-provider.js";
|
|
13
|
-
export { createPrismaMigration, createEmptyMigration, applyPrismaMigrations, previewPrismaMigrations, hasPrismaSchemaChanges, createInitialMigration, initializeSnapshot, hasSnapshot, scanMigrationFolders, readMigrationLog, writeMigrationLog, appendToMigrationLog, getMigrationLogPath, calculateChecksum, detectPotentialRenames, type PrismaMigrationOptions, type PrismaMigration, type CreateEmptyMigrationOptions, type ApplyPrismaMigrationsOptions, type ApplyPrismaMigrationsResult, type PreviewPrismaMigrationsResult, type CreateInitialMigrationOptions, type MigrationLogEntry, type PotentialTableRename, type PotentialColumnRename, type PotentialRenames, } from "./migrations/prisma.js";
|
|
13
|
+
export { createPrismaMigration, createEmptyMigration, applyPrismaMigrations, previewPrismaMigrations, hasPrismaSchemaChanges, createInitialMigration, initializeSnapshot, hasSnapshot, scanMigrationFolders, readMigrationLog, writeMigrationLog, appendToMigrationLog, getMigrationLogPath, calculateChecksum, rehashWithSameVersion, detectPotentialRenames, type PrismaMigrationOptions, type PrismaMigration, type CreateEmptyMigrationOptions, type ApplyPrismaMigrationsOptions, type ApplyPrismaMigrationsResult, type PreviewPrismaMigrationsResult, type CreateInitialMigrationOptions, type MigrationLogEntry, type PotentialTableRename, type PotentialColumnRename, type PotentialRenames, } from "./migrations/prisma.js";
|
|
14
14
|
export { migrate, type MigrateOptions, type MigrateResult } from "./migrate.js";
|
|
15
15
|
export { defineConfig, type ZenStackKitConfig } from "./config/index.js";
|
|
16
16
|
export { type RenameChoice } from "./cli/prompts.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGlF,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,EAClC,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhF,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGlF,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,EAClC,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhF,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ export { createMigration, getSchemaDiff, hasSchemaChanges, initSnapshot, } from
|
|
|
12
12
|
export { applyMigrations } from "./migrations/apply.js";
|
|
13
13
|
export { setPromptProvider } from "./cli/prompt-provider.js";
|
|
14
14
|
// Prisma-compatible migrations (default)
|
|
15
|
-
export { createPrismaMigration, createEmptyMigration, applyPrismaMigrations, previewPrismaMigrations, hasPrismaSchemaChanges, createInitialMigration, initializeSnapshot, hasSnapshot, scanMigrationFolders, readMigrationLog, writeMigrationLog, appendToMigrationLog, getMigrationLogPath, calculateChecksum, detectPotentialRenames, } from "./migrations/prisma.js";
|
|
15
|
+
export { createPrismaMigration, createEmptyMigration, applyPrismaMigrations, previewPrismaMigrations, hasPrismaSchemaChanges, createInitialMigration, initializeSnapshot, hasSnapshot, scanMigrationFolders, readMigrationLog, writeMigrationLog, appendToMigrationLog, getMigrationLogPath, calculateChecksum, rehashWithSameVersion, detectPotentialRenames, } from "./migrations/prisma.js";
|
|
16
16
|
// High-level programmatic API
|
|
17
17
|
export { migrate } from "./migrate.js";
|
|
18
18
|
// CLI utilities
|
|
@@ -18,6 +18,8 @@ export interface ApplyPrismaMigrationsOptions {
|
|
|
18
18
|
strict?: boolean;
|
|
19
19
|
/** Apply a single migration by name */
|
|
20
20
|
targetMigration?: string;
|
|
21
|
+
/** Apply all unapplied migrations regardless of gaps in applied history */
|
|
22
|
+
ignoreOrderMismatch?: boolean;
|
|
21
23
|
}
|
|
22
24
|
export interface ApplyPrismaMigrationsResult {
|
|
23
25
|
applied: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/migrations/prisma/apply.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAIjE,MAAM,WAAW,4BAA4B;IAC3C,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/migrations/prisma/apply.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAIjE,MAAM,WAAW,4BAA4B;IAC3C,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;IAC5G,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,uBAAuB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AA6QD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAyLtC;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,6BAA6B,CAAC,CA0DxC"}
|
|
@@ -3,7 +3,7 @@ import * as path from "path";
|
|
|
3
3
|
import * as crypto from "crypto";
|
|
4
4
|
import { sql } from "kysely";
|
|
5
5
|
import { createKyselyAdapter } from "../../sql/kysely-adapter.js";
|
|
6
|
-
import { calculateChecksum, readMigrationLog, writeMigrationLog } from "./log.js";
|
|
6
|
+
import { calculateChecksum, rehashWithSameVersion, readMigrationLog, writeMigrationLog } from "./log.js";
|
|
7
7
|
/**
|
|
8
8
|
* Ensure _prisma_migrations table exists
|
|
9
9
|
*/
|
|
@@ -27,7 +27,7 @@ async function ensureMigrationsTable(db, tableName, schema, dialect) {
|
|
|
27
27
|
await sql `
|
|
28
28
|
CREATE TABLE IF NOT EXISTS ${sql.raw(`"${schema}"."${tableName}"`)} (
|
|
29
29
|
id VARCHAR(36) PRIMARY KEY,
|
|
30
|
-
checksum VARCHAR(
|
|
30
|
+
checksum VARCHAR(128) NOT NULL,
|
|
31
31
|
finished_at TIMESTAMPTZ,
|
|
32
32
|
migration_name VARCHAR(255) NOT NULL,
|
|
33
33
|
logs TEXT,
|
|
@@ -41,7 +41,7 @@ async function ensureMigrationsTable(db, tableName, schema, dialect) {
|
|
|
41
41
|
await sql `
|
|
42
42
|
CREATE TABLE IF NOT EXISTS ${sql.raw(`\`${tableName}\``)} (
|
|
43
43
|
id VARCHAR(36) PRIMARY KEY,
|
|
44
|
-
checksum VARCHAR(
|
|
44
|
+
checksum VARCHAR(128) NOT NULL,
|
|
45
45
|
finished_at DATETIME,
|
|
46
46
|
migration_name VARCHAR(255) NOT NULL,
|
|
47
47
|
logs TEXT,
|
|
@@ -109,7 +109,7 @@ async function recordMigration(db, tableName, schema, dialect, migrationName, ch
|
|
|
109
109
|
* 2. Applied migrations must be a prefix of the log (no gaps)
|
|
110
110
|
* 3. Checksums must match for applied migrations
|
|
111
111
|
*/
|
|
112
|
-
function validateMigrationCoherence(appliedMigrations, migrationLog, migrationFolders) {
|
|
112
|
+
function validateMigrationCoherence(appliedMigrations, migrationLog, migrationFolders, ignoreOrderMismatch = false) {
|
|
113
113
|
const errors = [];
|
|
114
114
|
// Build a set of log migration names for quick lookup
|
|
115
115
|
const logMigrationNames = new Set(migrationLog.map((e) => e.name));
|
|
@@ -140,13 +140,14 @@ function validateMigrationCoherence(appliedMigrations, migrationLog, migrationFo
|
|
|
140
140
|
}
|
|
141
141
|
// Check 2: Applied migrations should be a continuous prefix of the log
|
|
142
142
|
// i.e., if migration N is applied, all migrations before N in the log must also be applied
|
|
143
|
+
// This check can be skipped with ignoreOrderMismatch to allow applying out-of-order migrations.
|
|
143
144
|
let lastAppliedIndex = -1;
|
|
144
145
|
for (let i = 0; i < migrationLog.length; i++) {
|
|
145
146
|
const logEntry = migrationLog[i];
|
|
146
147
|
const isApplied = appliedMigrations.has(logEntry.name);
|
|
147
148
|
if (isApplied) {
|
|
148
149
|
// Check for gaps: if this is applied, all previous should be applied
|
|
149
|
-
if (lastAppliedIndex !== i - 1) {
|
|
150
|
+
if (!ignoreOrderMismatch && lastAppliedIndex !== i - 1) {
|
|
150
151
|
// There's a gap - find the missing migrations
|
|
151
152
|
for (let j = lastAppliedIndex + 1; j < i; j++) {
|
|
152
153
|
const missing = migrationLog[j];
|
|
@@ -264,7 +265,7 @@ export async function applyPrismaMigrations(options) {
|
|
|
264
265
|
}
|
|
265
266
|
// Read migration log and validate coherence
|
|
266
267
|
const migrationLog = await readMigrationLog(options.migrationsFolder);
|
|
267
|
-
const coherence = validateMigrationCoherence(appliedMigrations, migrationLog, migrationFoldersWithSql);
|
|
268
|
+
const coherence = validateMigrationCoherence(appliedMigrations, migrationLog, migrationFoldersWithSql, options.ignoreOrderMismatch);
|
|
268
269
|
if (!coherence.isCoherent) {
|
|
269
270
|
return {
|
|
270
271
|
applied: [],
|
|
@@ -316,9 +317,12 @@ export async function applyPrismaMigrations(options) {
|
|
|
316
317
|
catch {
|
|
317
318
|
continue; // Skip if no migration.sql
|
|
318
319
|
}
|
|
319
|
-
|
|
320
|
-
// Verify or update checksum against migration log (pending migrations only)
|
|
320
|
+
// Compute checksum using same version as existing log entry, or v2 for new entries
|
|
321
321
|
const logEntryIndex = logIndex.get(folderName);
|
|
322
|
+
const checksum = logEntryIndex !== undefined
|
|
323
|
+
? rehashWithSameVersion(sqlContent, migrationLog[logEntryIndex].checksum)
|
|
324
|
+
: calculateChecksum(sqlContent);
|
|
325
|
+
// Verify or update checksum against migration log (pending migrations only)
|
|
322
326
|
if (logEntryIndex === undefined) {
|
|
323
327
|
if (options.strict) {
|
|
324
328
|
result.failed = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/migrations/prisma/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AA4KtG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,EAAE,OAAO,EAAE,cAAc;;;;mBAsB5C,MAAM;gBAAU,YAAY;;;mBAC1B,MAAM;gBAAU,YAAY;;;mBAEvD,MAAM;oBACL,MAAM;kBACR,YAAY;iBACb,YAAY;;;mBAGV,MAAM;oBACL;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;;mBAGpC,MAAM;oBACL;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;;mBAGpC,MAAM;eACV;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;;mBAG/B,MAAM;eACV;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;;mBAG/B,MAAM;oBACL;YACV,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,CAAC;YAClB,eAAe,EAAE,MAAM,CAAC;YACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;SAC7B;;;mBAGU,MAAM;oBACL;YACV,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,CAAC;YAClB,eAAe,EAAE,MAAM,CAAC;YACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;SAC7B;;;mBAGU,MAAM;mBACN;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;kBACpC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;mBA4ExB,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;oBAClC,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;;;;kBA/ClE,MAAM;qBACH,MAAM,EAAE;uBACN,MAAM,EAAE;;EAkD1B;AAED,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAkGjD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,YAAY,GAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAM,EACtD,aAAa,GAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAM,GACrE,UAAU,CA8FZ;AA2CD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,EACpC,OAAO,EAAE,aAAa,GACrB;IAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/migrations/prisma/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AA4KtG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,EAAE,OAAO,EAAE,cAAc;;;;mBAsB5C,MAAM;gBAAU,YAAY;;;mBAC1B,MAAM;gBAAU,YAAY;;;mBAEvD,MAAM;oBACL,MAAM;kBACR,YAAY;iBACb,YAAY;;;mBAGV,MAAM;oBACL;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;;mBAGpC,MAAM;oBACL;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;;mBAGpC,MAAM;eACV;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;;mBAG/B,MAAM;eACV;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;;mBAG/B,MAAM;oBACL;YACV,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,CAAC;YAClB,eAAe,EAAE,MAAM,CAAC;YACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;SAC7B;;;mBAGU,MAAM;oBACL;YACV,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,CAAC;YAClB,eAAe,EAAE,MAAM,CAAC;YACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;SAC7B;;;mBAGU,MAAM;mBACN;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;kBACpC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;;mBA4ExB,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;oBAClC,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;;;;kBA/ClE,MAAM;qBACH,MAAM,EAAE;uBACN,MAAM,EAAE;;EAkD1B;AAED,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAkGjD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,YAAY,GAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAM,EACtD,aAAa,GAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAM,GACrE,UAAU,CA8FZ;AA2CD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,EACpC,OAAO,EAAE,aAAa,GACrB;IAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAqQlC"}
|
|
@@ -448,8 +448,18 @@ export function buildSqlStatements(diff, dialect) {
|
|
|
448
448
|
const nullChanged = change.previous.notNull !== change.current.notNull;
|
|
449
449
|
const defaultChanged = change.previous.default !== change.current.default;
|
|
450
450
|
if (typeChanged) {
|
|
451
|
-
|
|
452
|
-
|
|
451
|
+
// In PostgreSQL, an existing default on an enum column blocks the TYPE change
|
|
452
|
+
// because the old default value can't be automatically cast to the new type.
|
|
453
|
+
// Drop the default first; the defaultChanged block below will re-apply the new one.
|
|
454
|
+
if (change.current.isEnum && dialect === "postgres" && change.previous.default !== undefined) {
|
|
455
|
+
up.push(...compileAlterColumn(change.tableName, change.columnName, { dropDefault: true }, compileOpts));
|
|
456
|
+
}
|
|
457
|
+
up.push(...compileAlterColumn(change.tableName, change.columnName, { setType: change.current }, compileOpts));
|
|
458
|
+
// Mirror the drop-default in the down migration too
|
|
459
|
+
if (change.previous.isEnum && dialect === "postgres" && change.current.default !== undefined) {
|
|
460
|
+
down.unshift(...compileAlterColumn(change.tableName, change.columnName, { dropDefault: true }, compileOpts));
|
|
461
|
+
}
|
|
462
|
+
down.unshift(...compileAlterColumn(change.tableName, change.columnName, { setType: change.previous }, compileOpts));
|
|
453
463
|
}
|
|
454
464
|
if (nullChanged) {
|
|
455
465
|
if (change.current.notNull) {
|
|
@@ -5,9 +5,14 @@ export interface MigrationLogEntry {
|
|
|
5
5
|
checksum: string;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
|
-
* Calculate SHA256 checksum of migration SQL
|
|
8
|
+
* Calculate SHA256 checksum of migration SQL (v2: normalized, whitespace/comment-insensitive)
|
|
9
9
|
*/
|
|
10
10
|
export declare function calculateChecksum(sql: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Recompute checksum using the same version as an existing stored checksum.
|
|
13
|
+
* v1 (plain hex): raw SQL. v2 (v2:<hex>): normalized SQL.
|
|
14
|
+
*/
|
|
15
|
+
export declare function rehashWithSameVersion(sql: string, existingChecksum: string): string;
|
|
11
16
|
/**
|
|
12
17
|
* Get the path to the migration log file
|
|
13
18
|
*/
|
|
@@ -25,7 +30,8 @@ export declare function writeMigrationLog(outputPath: string, entries: Migration
|
|
|
25
30
|
*/
|
|
26
31
|
export declare function appendToMigrationLog(outputPath: string, entry: MigrationLogEntry): Promise<void>;
|
|
27
32
|
/**
|
|
28
|
-
* Scan migration folders and compute checksums for each
|
|
33
|
+
* Scan migration folders and compute checksums for each.
|
|
34
|
+
* Pass existingEntries to preserve checksum versions for already-tracked migrations.
|
|
29
35
|
*/
|
|
30
|
-
export declare function scanMigrationFolders(outputPath: string): Promise<MigrationLogEntry[]>;
|
|
36
|
+
export declare function scanMigrationFolders(outputPath: string, existingEntries?: Map<string, MigrationLogEntry>): Promise<MigrationLogEntry[]>;
|
|
31
37
|
//# sourceMappingURL=log.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../src/migrations/prisma/log.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../src/migrations/prisma/log.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAcD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAKnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAwBD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAWvF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvG;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAItG;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC/C,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA+B9B"}
|
|
@@ -4,10 +4,27 @@ import * as crypto from "crypto";
|
|
|
4
4
|
const MIGRATION_LOG_HEADER = `# zenstack-kit migration log
|
|
5
5
|
# Format: <migration_name> <checksum>
|
|
6
6
|
`;
|
|
7
|
+
function normalizeSQL(sql) {
|
|
8
|
+
return sql
|
|
9
|
+
.replace(/--[^\n]*/g, "")
|
|
10
|
+
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
11
|
+
.replace(/\s+/g, " ")
|
|
12
|
+
.trim();
|
|
13
|
+
}
|
|
7
14
|
/**
|
|
8
|
-
* Calculate SHA256 checksum of migration SQL
|
|
15
|
+
* Calculate SHA256 checksum of migration SQL (v2: normalized, whitespace/comment-insensitive)
|
|
9
16
|
*/
|
|
10
17
|
export function calculateChecksum(sql) {
|
|
18
|
+
return "v2:" + crypto.createHash("sha256").update(normalizeSQL(sql)).digest("hex");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Recompute checksum using the same version as an existing stored checksum.
|
|
22
|
+
* v1 (plain hex): raw SQL. v2 (v2:<hex>): normalized SQL.
|
|
23
|
+
*/
|
|
24
|
+
export function rehashWithSameVersion(sql, existingChecksum) {
|
|
25
|
+
if (existingChecksum.startsWith("v2:")) {
|
|
26
|
+
return calculateChecksum(sql);
|
|
27
|
+
}
|
|
11
28
|
return crypto.createHash("sha256").update(sql).digest("hex");
|
|
12
29
|
}
|
|
13
30
|
/**
|
|
@@ -69,9 +86,10 @@ export async function appendToMigrationLog(outputPath, entry) {
|
|
|
69
86
|
await writeMigrationLog(outputPath, entries);
|
|
70
87
|
}
|
|
71
88
|
/**
|
|
72
|
-
* Scan migration folders and compute checksums for each
|
|
89
|
+
* Scan migration folders and compute checksums for each.
|
|
90
|
+
* Pass existingEntries to preserve checksum versions for already-tracked migrations.
|
|
73
91
|
*/
|
|
74
|
-
export async function scanMigrationFolders(outputPath) {
|
|
92
|
+
export async function scanMigrationFolders(outputPath, existingEntries) {
|
|
75
93
|
const entries = [];
|
|
76
94
|
try {
|
|
77
95
|
const dirEntries = await fs.readdir(outputPath, { withFileTypes: true });
|
|
@@ -83,7 +101,10 @@ export async function scanMigrationFolders(outputPath) {
|
|
|
83
101
|
const sqlPath = path.join(outputPath, folderName, "migration.sql");
|
|
84
102
|
try {
|
|
85
103
|
const sqlContent = await fs.readFile(sqlPath, "utf-8");
|
|
86
|
-
const
|
|
104
|
+
const existing = existingEntries?.get(folderName);
|
|
105
|
+
const checksum = existing
|
|
106
|
+
? rehashWithSameVersion(sqlContent, existing.checksum)
|
|
107
|
+
: calculateChecksum(sqlContent);
|
|
87
108
|
entries.push({ name: folderName, checksum });
|
|
88
109
|
}
|
|
89
110
|
catch {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { createEmptyMigration, createPrismaMigration, createInitialMigration, hasPrismaSchemaChanges, type PrismaMigrationOptions, type PrismaMigration, type CreateInitialMigrationOptions, type CreateEmptyMigrationOptions, } from "./prisma/create.js";
|
|
2
2
|
export { applyPrismaMigrations, previewPrismaMigrations, type ApplyPrismaMigrationsOptions, type ApplyPrismaMigrationsResult, type PreviewPrismaMigrationsResult, type MigrationCoherenceError, type MigrationCoherenceResult, } from "./prisma/apply.js";
|
|
3
|
-
export { readMigrationLog, writeMigrationLog, appendToMigrationLog, scanMigrationFolders, getMigrationLogPath, calculateChecksum, type MigrationLogEntry, } from "./prisma/log.js";
|
|
3
|
+
export { readMigrationLog, writeMigrationLog, appendToMigrationLog, scanMigrationFolders, getMigrationLogPath, calculateChecksum, rehashWithSameVersion, type MigrationLogEntry, } from "./prisma/log.js";
|
|
4
4
|
export { initializeSnapshot, hasSnapshot, getSnapshotPaths, writeSnapshot, } from "./prisma/snapshot.js";
|
|
5
5
|
export { detectPotentialRenames, type PotentialTableRename, type PotentialColumnRename, type PotentialRenames, } from "./prisma/rename.js";
|
|
6
6
|
//# sourceMappingURL=prisma.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/migrations/prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,GACjC,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/migrations/prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,GACjC,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createEmptyMigration, createPrismaMigration, createInitialMigration, hasPrismaSchemaChanges, } from "./prisma/create.js";
|
|
2
2
|
export { applyPrismaMigrations, previewPrismaMigrations, } from "./prisma/apply.js";
|
|
3
|
-
export { readMigrationLog, writeMigrationLog, appendToMigrationLog, scanMigrationFolders, getMigrationLogPath, calculateChecksum, } from "./prisma/log.js";
|
|
3
|
+
export { readMigrationLog, writeMigrationLog, appendToMigrationLog, scanMigrationFolders, getMigrationLogPath, calculateChecksum, rehashWithSameVersion, } from "./prisma/log.js";
|
|
4
4
|
export { initializeSnapshot, hasSnapshot, getSnapshotPaths, writeSnapshot, } from "./prisma/snapshot.js";
|
|
5
5
|
export { detectPotentialRenames, } from "./prisma/rename.js";
|
package/dist/sql/compiler.d.ts
CHANGED
|
@@ -65,7 +65,7 @@ export declare function compileAddPrimaryKeyConstraint(tableName: string, constr
|
|
|
65
65
|
* Compile ALTER COLUMN statements for type/nullability/default changes
|
|
66
66
|
*/
|
|
67
67
|
export declare function compileAlterColumn(tableName: string, columnName: string, changes: {
|
|
68
|
-
setType?:
|
|
68
|
+
setType?: Pick<SchemaColumn, "type" | "isEnum" | "isArray" | "isAutoincrement">;
|
|
69
69
|
setNotNull?: boolean;
|
|
70
70
|
dropNotNull?: boolean;
|
|
71
71
|
setDefault?: string | number | boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/sql/compiler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAoCnF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAgDR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAwBR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EAAE,EACjB,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAaR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/sql/compiler.ts"],"names":[],"mappings":"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"}
|
package/dist/sql/compiler.js
CHANGED
|
@@ -194,11 +194,21 @@ export function compileAlterColumn(tableName, columnName, changes, options) {
|
|
|
194
194
|
const db = createCompilerDb(options.dialect);
|
|
195
195
|
const statements = [];
|
|
196
196
|
if (changes.setType) {
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
.
|
|
200
|
-
.
|
|
201
|
-
|
|
197
|
+
const col = changes.setType;
|
|
198
|
+
const columnType = col.isEnum
|
|
199
|
+
? mapColumnTypeWithEnum(col, options.dialect)
|
|
200
|
+
: mapColumnType(col.type, options.dialect, { isArray: col.isArray, isAutoincrement: col.isAutoincrement });
|
|
201
|
+
if (col.isEnum && options.dialect === "postgres") {
|
|
202
|
+
// PostgreSQL cannot automatically cast between enum types (or from text to enum).
|
|
203
|
+
// Use a USING clause that casts via text so compatible values survive the migration.
|
|
204
|
+
statements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${columnName}" TYPE ${columnType} USING "${columnName}"::text::${columnType};`);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
statements.push(db.schema
|
|
208
|
+
.alterTable(tableName)
|
|
209
|
+
.alterColumn(columnName, (ac) => ac.setDataType(sql.raw(columnType)))
|
|
210
|
+
.compile().sql + ";");
|
|
211
|
+
}
|
|
202
212
|
}
|
|
203
213
|
if (changes.setNotNull) {
|
|
204
214
|
statements.push(db.schema
|