zenstack-kit 0.1.18 → 0.1.21
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 +3 -13
- package/dist/migrations/prisma/diff.d.ts.map +1 -1
- package/dist/migrations/prisma/diff.js +10 -4
- 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/schema/snapshot.d.ts +3 -0
- package/dist/schema/snapshot.d.ts.map +1 -1
- package/dist/schema/snapshot.js +22 -3
- package/dist/sql/compiler.d.ts +3 -1
- package/dist/sql/compiler.d.ts.map +1 -1
- package/dist/sql/compiler.js +26 -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,5 +1,5 @@
|
|
|
1
1
|
import type { KyselyDialect } from "../../sql/kysely-adapter.js";
|
|
2
|
-
import type { SchemaSnapshot, SchemaTable, SchemaColumn, SchemaEnum } from "../../schema/snapshot.js";
|
|
2
|
+
import type { SchemaSnapshot, SchemaTable, SchemaColumn, SchemaEnum, SchemaForeignKey } from "../../schema/snapshot.js";
|
|
3
3
|
export declare function diffSchemas(previous: SchemaSnapshot | null, current: SchemaSnapshot): {
|
|
4
4
|
addedModels: SchemaTable[];
|
|
5
5
|
removedModels: SchemaTable[];
|
|
@@ -47,21 +47,11 @@ export declare function diffSchemas(previous: SchemaSnapshot | null, current: Sc
|
|
|
47
47
|
}[];
|
|
48
48
|
addedForeignKeys: {
|
|
49
49
|
tableName: string;
|
|
50
|
-
foreignKey:
|
|
51
|
-
name: string;
|
|
52
|
-
columns: string[];
|
|
53
|
-
referencedTable: string;
|
|
54
|
-
referencedColumns: string[];
|
|
55
|
-
};
|
|
50
|
+
foreignKey: SchemaForeignKey;
|
|
56
51
|
}[];
|
|
57
52
|
removedForeignKeys: {
|
|
58
53
|
tableName: string;
|
|
59
|
-
foreignKey:
|
|
60
|
-
name: string;
|
|
61
|
-
columns: string[];
|
|
62
|
-
referencedTable: string;
|
|
63
|
-
referencedColumns: string[];
|
|
64
|
-
};
|
|
54
|
+
foreignKey: SchemaForeignKey;
|
|
65
55
|
}[];
|
|
66
56
|
primaryKeyChanges: {
|
|
67
57
|
tableName: string;
|
|
@@ -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;
|
|
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,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAkKxH,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;;;mBAED,MAAM;oBAAc,gBAAgB;;;mBAClC,MAAM;oBAAc,gBAAgB;;;mBAEpE,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,CAyQlC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { compileCreateTable, compileDropTable, compileAddColumn, compileDropColumn, compileRenameTable, compileRenameColumn, compileCreateIndex, compileDropIndex, compileAddUniqueConstraint, compileDropConstraint, compileAddForeignKeyConstraint, compileAddPrimaryKeyConstraint, compileAlterColumn, compileCreateEnum, compileDropEnum, compileAddEnumValue, } from "../../sql/compiler.js";
|
|
1
|
+
import { compileCreateTable, compileDropTable, compileAddColumn, compileDropColumn, compileRenameTable, compileRenameColumn, compileCreateIndex, compileDropIndex, compileAddUniqueConstraint, compileDropConstraint, compileAddForeignKeyConstraint, compileAddPrimaryKeyConstraint, compileAlterColumn, compileCreateEnum, compileDropEnum, compileAddEnumValue, toKyselyReferentialAction, } from "../../sql/compiler.js";
|
|
2
2
|
function diffTableChanges(previousModel, currentModel, tableName) {
|
|
3
3
|
const addedFields = [];
|
|
4
4
|
const removedFields = [];
|
|
@@ -64,7 +64,13 @@ function diffTableChanges(previousModel, currentModel, tableName) {
|
|
|
64
64
|
const prevFks = new Map(previousModel.foreignKeys.map((f) => [f.name, f]));
|
|
65
65
|
const currFks = new Map(currentModel.foreignKeys.map((f) => [f.name, f]));
|
|
66
66
|
for (const [name, fk] of currFks.entries()) {
|
|
67
|
-
|
|
67
|
+
const prev = prevFks.get(name);
|
|
68
|
+
if (!prev) {
|
|
69
|
+
addedForeignKeys.push({ tableName, foreignKey: fk });
|
|
70
|
+
}
|
|
71
|
+
else if (prev.onDelete !== fk.onDelete || prev.onUpdate !== fk.onUpdate) {
|
|
72
|
+
// Cascade rule changed: drop old FK and recreate with new rules
|
|
73
|
+
removedForeignKeys.push({ tableName, foreignKey: prev });
|
|
68
74
|
addedForeignKeys.push({ tableName, foreignKey: fk });
|
|
69
75
|
}
|
|
70
76
|
}
|
|
@@ -420,7 +426,7 @@ export function buildSqlStatements(diff, dialect) {
|
|
|
420
426
|
// Drop foreign keys first (before dropping columns)
|
|
421
427
|
for (const { tableName, foreignKey } of diff.removedForeignKeys) {
|
|
422
428
|
up.push(compileDropConstraint(tableName, foreignKey.name, compileOpts));
|
|
423
|
-
down.unshift(compileAddForeignKeyConstraint(tableName, foreignKey.name, foreignKey.columns, foreignKey.referencedTable, foreignKey.referencedColumns, compileOpts));
|
|
429
|
+
down.unshift(compileAddForeignKeyConstraint(tableName, foreignKey.name, foreignKey.columns, foreignKey.referencedTable, foreignKey.referencedColumns, compileOpts, foreignKey.onDelete ? toKyselyReferentialAction(foreignKey.onDelete) : undefined, foreignKey.onUpdate ? toKyselyReferentialAction(foreignKey.onUpdate) : undefined));
|
|
424
430
|
}
|
|
425
431
|
// Drop unique constraints
|
|
426
432
|
for (const { tableName, constraint } of diff.removedUniqueConstraints) {
|
|
@@ -505,7 +511,7 @@ export function buildSqlStatements(diff, dialect) {
|
|
|
505
511
|
}
|
|
506
512
|
// Add foreign keys
|
|
507
513
|
for (const { tableName, foreignKey } of diff.addedForeignKeys) {
|
|
508
|
-
up.push(compileAddForeignKeyConstraint(tableName, foreignKey.name, foreignKey.columns, foreignKey.referencedTable, foreignKey.referencedColumns, compileOpts));
|
|
514
|
+
up.push(compileAddForeignKeyConstraint(tableName, foreignKey.name, foreignKey.columns, foreignKey.referencedTable, foreignKey.referencedColumns, compileOpts, foreignKey.onDelete ? toKyselyReferentialAction(foreignKey.onDelete) : undefined, foreignKey.onUpdate ? toKyselyReferentialAction(foreignKey.onUpdate) : undefined));
|
|
509
515
|
down.unshift(compileDropConstraint(tableName, foreignKey.name, compileOpts));
|
|
510
516
|
}
|
|
511
517
|
// Drop enums LAST (after tables that use them are dropped)
|
|
@@ -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";
|
|
@@ -21,11 +21,14 @@ export interface SchemaIndex {
|
|
|
21
21
|
name: string;
|
|
22
22
|
columns: string[];
|
|
23
23
|
}
|
|
24
|
+
export type ReferentialAction = "Cascade" | "Restrict" | "SetNull" | "SetDefault" | "NoAction";
|
|
24
25
|
export interface SchemaForeignKey {
|
|
25
26
|
name: string;
|
|
26
27
|
columns: string[];
|
|
27
28
|
referencedTable: string;
|
|
28
29
|
referencedColumns: string[];
|
|
30
|
+
onDelete?: ReferentialAction;
|
|
31
|
+
onUpdate?: ReferentialAction;
|
|
29
32
|
}
|
|
30
33
|
export interface SchemaTable {
|
|
31
34
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/schema/snapshot.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/schema/snapshot.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;AAE/F,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;CACxB;AAiXD,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAkBxF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB,CAMzE"}
|
package/dist/schema/snapshot.js
CHANGED
|
@@ -142,6 +142,18 @@ function getFieldType(field) {
|
|
|
142
142
|
}
|
|
143
143
|
return { type: field.type.type ?? "String", isRelation: false, isEnum: false };
|
|
144
144
|
}
|
|
145
|
+
function getAttributeRefArg(attr, name) {
|
|
146
|
+
if (!attr)
|
|
147
|
+
return undefined;
|
|
148
|
+
const arg = attr.args.find((item) => item.$resolvedParam?.name === name);
|
|
149
|
+
if (!arg?.value)
|
|
150
|
+
return undefined;
|
|
151
|
+
// Enum reference: e.g. Cascade, SetNull
|
|
152
|
+
if (arg.value.$type === "ReferenceExpr") {
|
|
153
|
+
return arg.value.target.$refText;
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
145
157
|
function getRelationFieldNames(field) {
|
|
146
158
|
const relationAttr = getAttribute(field, "@relation");
|
|
147
159
|
if (!relationAttr)
|
|
@@ -151,7 +163,9 @@ function getRelationFieldNames(field) {
|
|
|
151
163
|
if (!fields || !references)
|
|
152
164
|
return null;
|
|
153
165
|
const mapName = getAttributeStringArg(relationAttr, ["map", "name"]);
|
|
154
|
-
|
|
166
|
+
const onDelete = getAttributeRefArg(relationAttr, "onDelete");
|
|
167
|
+
const onUpdate = getAttributeRefArg(relationAttr, "onUpdate");
|
|
168
|
+
return { fields, references, mapName, onDelete, onUpdate };
|
|
155
169
|
}
|
|
156
170
|
function buildFieldNameMap(model) {
|
|
157
171
|
const map = new Map();
|
|
@@ -263,12 +277,17 @@ function parseModel(model) {
|
|
|
263
277
|
const referencedFieldMap = buildFieldNameMap(refModel);
|
|
264
278
|
const referencedColumnNames = relation.references.map((name) => referencedFieldMap.get(name) ?? name);
|
|
265
279
|
const columnNames = relation.fields.map((name) => fieldNameMap.get(name) ?? name);
|
|
266
|
-
|
|
280
|
+
const fk = {
|
|
267
281
|
name: buildForeignKeyName(tableName, columnNames, referencedTable, referencedColumnNames, relation.mapName),
|
|
268
282
|
columns: columnNames,
|
|
269
283
|
referencedTable,
|
|
270
284
|
referencedColumns: referencedColumnNames,
|
|
271
|
-
}
|
|
285
|
+
};
|
|
286
|
+
if (relation.onDelete)
|
|
287
|
+
fk.onDelete = relation.onDelete;
|
|
288
|
+
if (relation.onUpdate)
|
|
289
|
+
fk.onUpdate = relation.onUpdate;
|
|
290
|
+
foreignKeys.push(fk);
|
|
272
291
|
}
|
|
273
292
|
const sortedColumns = columns.sort((a, b) => a.name.localeCompare(b.name));
|
|
274
293
|
return {
|
package/dist/sql/compiler.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export interface SqlMigration {
|
|
|
13
13
|
export interface CompileSqlOptions {
|
|
14
14
|
dialect: KyselyDialect;
|
|
15
15
|
}
|
|
16
|
+
/** Map ZenStack PascalCase referential action to Kysely's lowercase format */
|
|
17
|
+
export declare function toKyselyReferentialAction(action: string): string;
|
|
16
18
|
/**
|
|
17
19
|
* Compile a CREATE TABLE statement to SQL
|
|
18
20
|
*/
|
|
@@ -56,7 +58,7 @@ export declare function compileDropConstraint(tableName: string, constraintName:
|
|
|
56
58
|
/**
|
|
57
59
|
* Compile an ADD FOREIGN KEY CONSTRAINT statement to SQL
|
|
58
60
|
*/
|
|
59
|
-
export declare function compileAddForeignKeyConstraint(tableName: string, constraintName: string, columns: string[], referencedTable: string, referencedColumns: string[], options: CompileSqlOptions): string;
|
|
61
|
+
export declare function compileAddForeignKeyConstraint(tableName: string, constraintName: string, columns: string[], referencedTable: string, referencedColumns: string[], options: CompileSqlOptions, onDelete?: string, onUpdate?: string): string;
|
|
60
62
|
/**
|
|
61
63
|
* Compile an ADD PRIMARY KEY CONSTRAINT statement to SQL
|
|
62
64
|
*/
|
|
@@ -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,
|
|
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
|
@@ -40,6 +40,17 @@ function createCompilerDb(dialect) {
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
+
/** Map ZenStack PascalCase referential action to Kysely's lowercase format */
|
|
44
|
+
export function toKyselyReferentialAction(action) {
|
|
45
|
+
const map = {
|
|
46
|
+
Cascade: "cascade",
|
|
47
|
+
Restrict: "restrict",
|
|
48
|
+
SetNull: "set null",
|
|
49
|
+
SetDefault: "set default",
|
|
50
|
+
NoAction: "no action",
|
|
51
|
+
};
|
|
52
|
+
return map[action] ?? action.toLowerCase();
|
|
53
|
+
}
|
|
43
54
|
/**
|
|
44
55
|
* Compile a CREATE TABLE statement to SQL
|
|
45
56
|
*/
|
|
@@ -75,7 +86,13 @@ export function compileCreateTable(model, options) {
|
|
|
75
86
|
}
|
|
76
87
|
// Add foreign key constraints
|
|
77
88
|
for (const fk of model.foreignKeys) {
|
|
78
|
-
builder = builder.addForeignKeyConstraint(fk.name, fk.columns, fk.referencedTable, fk.referencedColumns)
|
|
89
|
+
builder = builder.addForeignKeyConstraint(fk.name, fk.columns, fk.referencedTable, fk.referencedColumns, (cb) => {
|
|
90
|
+
if (fk.onDelete)
|
|
91
|
+
cb = cb.onDelete(toKyselyReferentialAction(fk.onDelete));
|
|
92
|
+
if (fk.onUpdate)
|
|
93
|
+
cb = cb.onUpdate(toKyselyReferentialAction(fk.onUpdate));
|
|
94
|
+
return cb;
|
|
95
|
+
});
|
|
79
96
|
}
|
|
80
97
|
return builder.compile().sql + ";";
|
|
81
98
|
}
|
|
@@ -170,12 +187,16 @@ export function compileDropConstraint(tableName, constraintName, options) {
|
|
|
170
187
|
/**
|
|
171
188
|
* Compile an ADD FOREIGN KEY CONSTRAINT statement to SQL
|
|
172
189
|
*/
|
|
173
|
-
export function compileAddForeignKeyConstraint(tableName, constraintName, columns, referencedTable, referencedColumns, options) {
|
|
190
|
+
export function compileAddForeignKeyConstraint(tableName, constraintName, columns, referencedTable, referencedColumns, options, onDelete, onUpdate) {
|
|
174
191
|
const db = createCompilerDb(options.dialect);
|
|
175
|
-
|
|
192
|
+
let builder = db.schema
|
|
176
193
|
.alterTable(tableName)
|
|
177
|
-
.addForeignKeyConstraint(constraintName, columns, referencedTable, referencedColumns)
|
|
178
|
-
|
|
194
|
+
.addForeignKeyConstraint(constraintName, columns, referencedTable, referencedColumns);
|
|
195
|
+
if (onDelete)
|
|
196
|
+
builder = builder.onDelete(onDelete);
|
|
197
|
+
if (onUpdate)
|
|
198
|
+
builder = builder.onUpdate(onUpdate);
|
|
199
|
+
return builder.compile().sql + ";";
|
|
179
200
|
}
|
|
180
201
|
/**
|
|
181
202
|
* Compile an ADD PRIMARY KEY CONSTRAINT statement to SQL
|