ddlforge 0.2.1 → 0.5.0
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/src/cli.d.ts +2 -2
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +32 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/reporters/index.d.ts +1 -0
- package/dist/src/reporters/index.d.ts.map +1 -1
- package/dist/src/reporters/index.js +1 -0
- package/dist/src/reporters/index.js.map +1 -1
- package/dist/src/reporters/sarif.d.ts +72 -0
- package/dist/src/reporters/sarif.d.ts.map +1 -0
- package/dist/src/reporters/sarif.js +103 -0
- package/dist/src/reporters/sarif.js.map +1 -0
- package/dist/src/rules/checkConstraintNotValid.d.ts +9 -0
- package/dist/src/rules/checkConstraintNotValid.d.ts.map +1 -0
- package/dist/src/rules/checkConstraintNotValid.js +116 -0
- package/dist/src/rules/checkConstraintNotValid.js.map +1 -0
- package/dist/src/rules/index.d.ts +3 -0
- package/dist/src/rules/index.d.ts.map +1 -1
- package/dist/src/rules/index.js +9 -0
- package/dist/src/rules/index.js.map +1 -1
- package/dist/src/rules/sessionAdvisoryLock.d.ts +9 -0
- package/dist/src/rules/sessionAdvisoryLock.d.ts.map +1 -0
- package/dist/src/rules/sessionAdvisoryLock.js +47 -0
- package/dist/src/rules/sessionAdvisoryLock.js.map +1 -0
- package/dist/src/rules/uniqueConstraintUsingIndex.d.ts +9 -0
- package/dist/src/rules/uniqueConstraintUsingIndex.d.ts.map +1 -0
- package/dist/src/rules/uniqueConstraintUsingIndex.js +145 -0
- package/dist/src/rules/uniqueConstraintUsingIndex.js.map +1 -0
- package/dist/src/wrapper/orchestrator.d.ts +62 -0
- package/dist/src/wrapper/orchestrator.d.ts.map +1 -0
- package/dist/src/wrapper/orchestrator.js +481 -0
- package/dist/src/wrapper/orchestrator.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ddlforge - ORM Migration Supervisor (Wrap orchestrator)
|
|
3
|
+
*
|
|
4
|
+
* Intercepts pending migration files (Prisma / Drizzle / custom),
|
|
5
|
+
* runs pre-flight safety analysis, and delegates execution to the
|
|
6
|
+
* underlying migration command.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import * as crypto from 'node:crypto';
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
import { MigrationAnalyzer } from '../engine/analyzer.js';
|
|
13
|
+
import { formatTerminal } from '../reporters/terminal.js';
|
|
14
|
+
/**
|
|
15
|
+
* Parses arguments for the `wrap` subcommand.
|
|
16
|
+
* argv should be the args after the "wrap" token.
|
|
17
|
+
* E.g. `['--dir=./drizzle', '--', 'npx', 'drizzle-kit', 'migrate']`
|
|
18
|
+
*/
|
|
19
|
+
export function parseWrapArgs(argv) {
|
|
20
|
+
const dashDashIdx = argv.indexOf('--');
|
|
21
|
+
const optArgs = dashDashIdx !== -1 ? argv.slice(0, dashDashIdx) : argv;
|
|
22
|
+
const command = dashDashIdx !== -1 ? argv.slice(dashDashIdx + 1) : [];
|
|
23
|
+
const opts = {
|
|
24
|
+
dir: undefined,
|
|
25
|
+
allowBlockers: false,
|
|
26
|
+
databaseUrl: process.env['DATABASE_URL'] || undefined,
|
|
27
|
+
command,
|
|
28
|
+
help: false,
|
|
29
|
+
};
|
|
30
|
+
let i = 0;
|
|
31
|
+
while (i < optArgs.length) {
|
|
32
|
+
const arg = optArgs[i];
|
|
33
|
+
if (arg === '--help' || arg === '-h') {
|
|
34
|
+
opts.help = true;
|
|
35
|
+
i++;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (arg === '--allow-blockers') {
|
|
39
|
+
opts.allowBlockers = true;
|
|
40
|
+
i++;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (arg === '--dir') {
|
|
44
|
+
i++;
|
|
45
|
+
if (i < optArgs.length) {
|
|
46
|
+
opts.dir = optArgs[i];
|
|
47
|
+
}
|
|
48
|
+
i++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (arg.startsWith('--dir=')) {
|
|
52
|
+
opts.dir = arg.slice('--dir='.length);
|
|
53
|
+
i++;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (arg === '--db' || arg === '--database-url') {
|
|
57
|
+
i++;
|
|
58
|
+
if (i < optArgs.length) {
|
|
59
|
+
opts.databaseUrl = optArgs[i];
|
|
60
|
+
}
|
|
61
|
+
i++;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (arg.startsWith('--db=')) {
|
|
65
|
+
opts.databaseUrl = arg.slice('--db='.length);
|
|
66
|
+
i++;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (arg.startsWith('--database-url=')) {
|
|
70
|
+
opts.databaseUrl = arg.slice('--database-url='.length);
|
|
71
|
+
i++;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// If no '--' was provided, positional arguments might be the command
|
|
75
|
+
if (dashDashIdx === -1 && !arg.startsWith('-')) {
|
|
76
|
+
opts.command.push(...optArgs.slice(i));
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
i++;
|
|
80
|
+
}
|
|
81
|
+
return opts;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Scans directories to detect migration files for Prisma, Drizzle, or generic layouts.
|
|
85
|
+
*/
|
|
86
|
+
export function detectMigrations(dir, cwd = process.cwd()) {
|
|
87
|
+
// If an explicit directory is provided, scan it
|
|
88
|
+
if (dir) {
|
|
89
|
+
const targetDir = path.isAbsolute(dir) ? dir : path.resolve(cwd, dir);
|
|
90
|
+
if (!fs.existsSync(targetDir)) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
const stat = fs.statSync(targetDir);
|
|
94
|
+
if (stat.isFile() && targetDir.endsWith('.sql')) {
|
|
95
|
+
return [{
|
|
96
|
+
name: path.basename(targetDir),
|
|
97
|
+
filePath: targetDir,
|
|
98
|
+
projectType: 'generic',
|
|
99
|
+
}];
|
|
100
|
+
}
|
|
101
|
+
if (!stat.isDirectory()) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
const entries = fs.readdirSync(targetDir, { withFileTypes: true });
|
|
105
|
+
// Check for Prisma-style subdirectories (each containing migration.sql)
|
|
106
|
+
const prismaMigrations = [];
|
|
107
|
+
for (const entry of entries) {
|
|
108
|
+
if (entry.isDirectory()) {
|
|
109
|
+
const migrationSql = path.join(targetDir, entry.name, 'migration.sql');
|
|
110
|
+
if (fs.existsSync(migrationSql) && fs.statSync(migrationSql).isFile()) {
|
|
111
|
+
prismaMigrations.push({
|
|
112
|
+
name: entry.name,
|
|
113
|
+
filePath: migrationSql,
|
|
114
|
+
projectType: 'prisma',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (prismaMigrations.length > 0) {
|
|
120
|
+
return prismaMigrations.sort((a, b) => a.name.localeCompare(b.name));
|
|
121
|
+
}
|
|
122
|
+
// Flat directory: check for *.sql files
|
|
123
|
+
const sqlFiles = [];
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
if (entry.isFile() && entry.name.endsWith('.sql')) {
|
|
126
|
+
sqlFiles.push({
|
|
127
|
+
name: entry.name,
|
|
128
|
+
filePath: path.join(targetDir, entry.name),
|
|
129
|
+
projectType: 'drizzle',
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (sqlFiles.length > 0) {
|
|
134
|
+
return sqlFiles.sort((a, b) => a.name.localeCompare(b.name));
|
|
135
|
+
}
|
|
136
|
+
// Recursive search if not found directly
|
|
137
|
+
const recursiveFiles = [];
|
|
138
|
+
collectSqlRecursive(targetDir, recursiveFiles);
|
|
139
|
+
return recursiveFiles.sort((a, b) => a.name.localeCompare(b.name));
|
|
140
|
+
}
|
|
141
|
+
// Auto-detection when --dir is not provided:
|
|
142
|
+
// 1. Prisma migrations (prisma/migrations/*/migration.sql)
|
|
143
|
+
const prismaDir = path.join(cwd, 'prisma', 'migrations');
|
|
144
|
+
if (fs.existsSync(prismaDir) && fs.statSync(prismaDir).isDirectory()) {
|
|
145
|
+
const entries = fs.readdirSync(prismaDir, { withFileTypes: true });
|
|
146
|
+
const migrations = [];
|
|
147
|
+
for (const entry of entries) {
|
|
148
|
+
if (entry.isDirectory()) {
|
|
149
|
+
const mPath = path.join(prismaDir, entry.name, 'migration.sql');
|
|
150
|
+
if (fs.existsSync(mPath) && fs.statSync(mPath).isFile()) {
|
|
151
|
+
migrations.push({
|
|
152
|
+
name: entry.name,
|
|
153
|
+
filePath: mPath,
|
|
154
|
+
projectType: 'prisma',
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (migrations.length > 0) {
|
|
160
|
+
return migrations.sort((a, b) => a.name.localeCompare(b.name));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// 2. Drizzle migrations (drizzle/*.sql)
|
|
164
|
+
const drizzleDir = path.join(cwd, 'drizzle');
|
|
165
|
+
if (fs.existsSync(drizzleDir) && fs.statSync(drizzleDir).isDirectory()) {
|
|
166
|
+
const entries = fs.readdirSync(drizzleDir, { withFileTypes: true });
|
|
167
|
+
const migrations = [];
|
|
168
|
+
for (const entry of entries) {
|
|
169
|
+
if (entry.isFile() && entry.name.endsWith('.sql')) {
|
|
170
|
+
migrations.push({
|
|
171
|
+
name: entry.name,
|
|
172
|
+
filePath: path.join(drizzleDir, entry.name),
|
|
173
|
+
projectType: 'drizzle',
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (migrations.length > 0) {
|
|
178
|
+
return migrations.sort((a, b) => a.name.localeCompare(b.name));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// 3. Generic migrations (migrations/*.sql or migrations/*/migration.sql)
|
|
182
|
+
const migrationsDir = path.join(cwd, 'migrations');
|
|
183
|
+
if (fs.existsSync(migrationsDir) && fs.statSync(migrationsDir).isDirectory()) {
|
|
184
|
+
const entries = fs.readdirSync(migrationsDir, { withFileTypes: true });
|
|
185
|
+
const prismaStyle = [];
|
|
186
|
+
const flatStyle = [];
|
|
187
|
+
for (const entry of entries) {
|
|
188
|
+
if (entry.isDirectory()) {
|
|
189
|
+
const mPath = path.join(migrationsDir, entry.name, 'migration.sql');
|
|
190
|
+
if (fs.existsSync(mPath) && fs.statSync(mPath).isFile()) {
|
|
191
|
+
prismaStyle.push({
|
|
192
|
+
name: entry.name,
|
|
193
|
+
filePath: mPath,
|
|
194
|
+
projectType: 'prisma',
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else if (entry.isFile() && entry.name.endsWith('.sql')) {
|
|
199
|
+
flatStyle.push({
|
|
200
|
+
name: entry.name,
|
|
201
|
+
filePath: path.join(migrationsDir, entry.name),
|
|
202
|
+
projectType: 'generic',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (prismaStyle.length > 0) {
|
|
207
|
+
return prismaStyle.sort((a, b) => a.name.localeCompare(b.name));
|
|
208
|
+
}
|
|
209
|
+
if (flatStyle.length > 0) {
|
|
210
|
+
return flatStyle.sort((a, b) => a.name.localeCompare(b.name));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
function collectSqlRecursive(dir, accumulator) {
|
|
216
|
+
const IGNORED = new Set(['node_modules', '.git', 'dist', 'build', '.next', '.turbo']);
|
|
217
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
218
|
+
for (const entry of entries) {
|
|
219
|
+
if (entry.isDirectory()) {
|
|
220
|
+
if (!IGNORED.has(entry.name)) {
|
|
221
|
+
collectSqlRecursive(path.join(dir, entry.name), accumulator);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else if (entry.isFile() && entry.name.endsWith('.sql')) {
|
|
225
|
+
accumulator.push({
|
|
226
|
+
name: entry.name,
|
|
227
|
+
filePath: path.join(dir, entry.name),
|
|
228
|
+
projectType: 'generic',
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Connects to PostgreSQL and queries applied migration tables (_prisma_migrations or __drizzle_migrations).
|
|
235
|
+
* Returns the filtered set of pending (unapplied) migrations.
|
|
236
|
+
*/
|
|
237
|
+
export async function filterPendingMigrations(migrations, databaseUrl) {
|
|
238
|
+
if (!databaseUrl || migrations.length === 0) {
|
|
239
|
+
return migrations;
|
|
240
|
+
}
|
|
241
|
+
try {
|
|
242
|
+
const pg = await import('pg');
|
|
243
|
+
const Client = pg.default?.Client ?? pg.Client;
|
|
244
|
+
const client = new Client({ connectionString: databaseUrl, connectionTimeoutMillis: 3000 });
|
|
245
|
+
await client.connect();
|
|
246
|
+
try {
|
|
247
|
+
const applied = new Set();
|
|
248
|
+
// Check _prisma_migrations
|
|
249
|
+
try {
|
|
250
|
+
const res = await client.query('SELECT migration_name FROM _prisma_migrations WHERE rolled_back_at IS NULL');
|
|
251
|
+
for (const row of res.rows) {
|
|
252
|
+
if (row.migration_name)
|
|
253
|
+
applied.add(String(row.migration_name).trim());
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// Table does not exist, ignore
|
|
258
|
+
}
|
|
259
|
+
// Check __drizzle_migrations in public or drizzle schema
|
|
260
|
+
for (const tbl of ['"__drizzle_migrations"', '"drizzle"."__drizzle_migrations"']) {
|
|
261
|
+
try {
|
|
262
|
+
const res = await client.query(`SELECT * FROM ${tbl}`);
|
|
263
|
+
for (const row of res.rows) {
|
|
264
|
+
if (row.created_at != null)
|
|
265
|
+
applied.add(String(row.created_at).trim());
|
|
266
|
+
if (row.hash)
|
|
267
|
+
applied.add(String(row.hash).trim());
|
|
268
|
+
if (row.name)
|
|
269
|
+
applied.add(String(row.name).trim());
|
|
270
|
+
if (row.migration_name)
|
|
271
|
+
applied.add(String(row.migration_name).trim());
|
|
272
|
+
}
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// Table does not exist, ignore
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (applied.size === 0) {
|
|
280
|
+
return migrations;
|
|
281
|
+
}
|
|
282
|
+
return migrations.filter(m => {
|
|
283
|
+
if (applied.has(m.name))
|
|
284
|
+
return false;
|
|
285
|
+
const baseName = path.basename(m.name, '.sql');
|
|
286
|
+
if (applied.has(baseName))
|
|
287
|
+
return false;
|
|
288
|
+
// Check sha256 hash
|
|
289
|
+
try {
|
|
290
|
+
const content = fs.readFileSync(m.filePath, 'utf-8');
|
|
291
|
+
const hash = crypto.createHash('sha256').update(content).digest('hex');
|
|
292
|
+
if (applied.has(hash))
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
catch { }
|
|
296
|
+
// Check timestamp prefix (e.g. 20260916 in 20260916_init)
|
|
297
|
+
const parts = m.name.split('_');
|
|
298
|
+
if (parts.length > 1 && applied.has(parts[0]))
|
|
299
|
+
return false;
|
|
300
|
+
return true;
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
await client.end().catch(() => { });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
309
|
+
console.warn(`[ddlforge wrap] Warning: Could not query database for applied migrations (${msg}). Checking all discovered migrations.`);
|
|
310
|
+
return migrations;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Runs ddlforge rules against candidate migration files.
|
|
315
|
+
*/
|
|
316
|
+
export function runPreflightCheck(migrations) {
|
|
317
|
+
const analyzer = new MigrationAnalyzer();
|
|
318
|
+
const results = [];
|
|
319
|
+
for (const migration of migrations) {
|
|
320
|
+
try {
|
|
321
|
+
const content = fs.readFileSync(migration.filePath, 'utf-8');
|
|
322
|
+
const isPrisma = migration.projectType === 'prisma';
|
|
323
|
+
const res = analyzer.analyze(content, {
|
|
324
|
+
filePath: migration.filePath,
|
|
325
|
+
isPrismaMigration: isPrisma,
|
|
326
|
+
pgVersion: 16,
|
|
327
|
+
});
|
|
328
|
+
results.push(res);
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
332
|
+
console.error(`[ddlforge wrap] Error reading migration ${migration.filePath}: ${msg}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return results;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Spawns the user migration command as a child process with inherited stdio.
|
|
339
|
+
*/
|
|
340
|
+
export function spawnCommand(command, cwd = process.cwd()) {
|
|
341
|
+
return new Promise((resolve) => {
|
|
342
|
+
if (command.length === 0) {
|
|
343
|
+
resolve(0);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const isWindows = process.platform === 'win32';
|
|
347
|
+
const isDirectExecutable = command[0] === 'node' || command[0].endsWith('.exe') || (!isWindows && !command[0].includes(' '));
|
|
348
|
+
let child;
|
|
349
|
+
if (isDirectExecutable) {
|
|
350
|
+
child = spawn(command[0], command.slice(1), {
|
|
351
|
+
stdio: 'inherit',
|
|
352
|
+
shell: false,
|
|
353
|
+
cwd,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
// Use shell for commands like `npx`, `npm`, `drizzle-kit` on Windows.
|
|
358
|
+
// Passing a single string avoids Node 22+ DEP0190 warning.
|
|
359
|
+
const cmdLine = command.join(' ');
|
|
360
|
+
child = spawn(cmdLine, {
|
|
361
|
+
stdio: 'inherit',
|
|
362
|
+
shell: true,
|
|
363
|
+
cwd,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
child.on('close', (code, signal) => {
|
|
367
|
+
if (signal) {
|
|
368
|
+
resolve(1);
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
resolve(code ?? 0);
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
child.on('error', (err) => {
|
|
375
|
+
console.error(`[ddlforge wrap] Failed to execute command "${command.join(' ')}": ${err.message}`);
|
|
376
|
+
resolve(1);
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Main orchestrator workflow for `ddlforge wrap`.
|
|
382
|
+
*/
|
|
383
|
+
export async function orchestrateWrap(options) {
|
|
384
|
+
const cwd = options.cwd ?? process.cwd();
|
|
385
|
+
// 1. Auto-detection & extraction of migration files
|
|
386
|
+
const allMigrations = detectMigrations(options.dir, cwd);
|
|
387
|
+
// 2. Filter pending migrations against DB schema if accessible
|
|
388
|
+
const pending = await filterPendingMigrations(allMigrations, options.databaseUrl);
|
|
389
|
+
// If no migrations are found, proceed directly to running the command
|
|
390
|
+
if (pending.length === 0) {
|
|
391
|
+
console.log('[ddlforge wrap] No pending migrations found to check. Proceeding with command...');
|
|
392
|
+
const exitCode = await spawnCommand(options.command, cwd);
|
|
393
|
+
return {
|
|
394
|
+
success: exitCode === 0,
|
|
395
|
+
exitCode,
|
|
396
|
+
blockersCount: 0,
|
|
397
|
+
warningsCount: 0,
|
|
398
|
+
migrationsCount: 0,
|
|
399
|
+
executedCommand: true,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
// 3. Pre-flight safety check
|
|
403
|
+
const results = runPreflightCheck(pending);
|
|
404
|
+
const blockersCount = results.reduce((sum, r) => sum + r.blockersCount, 0);
|
|
405
|
+
const warningsCount = results.reduce((sum, r) => sum + r.warningsCount, 0);
|
|
406
|
+
if (blockersCount > 0) {
|
|
407
|
+
// Output blocker diagnostics and remediation recipes
|
|
408
|
+
console.log(formatTerminal(results));
|
|
409
|
+
if (!options.allowBlockers) {
|
|
410
|
+
console.error(`\n[ddlforge wrap] Pre-flight safety check failed: ${blockersCount} blocker(s) found. Aborting before running command.`);
|
|
411
|
+
return {
|
|
412
|
+
success: false,
|
|
413
|
+
exitCode: 1,
|
|
414
|
+
blockersCount,
|
|
415
|
+
warningsCount,
|
|
416
|
+
migrationsCount: pending.length,
|
|
417
|
+
executedCommand: false,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
console.warn(`\n[ddlforge wrap] Warning: ${blockersCount} blocker(s) detected, but --allow-blockers is set. Proceeding with command.`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
if (warningsCount > 0) {
|
|
426
|
+
console.log(formatTerminal(results));
|
|
427
|
+
}
|
|
428
|
+
console.log(`[ddlforge wrap] Pre-flight safety check passed (${pending.length} migration(s) verified). Running command...\n`);
|
|
429
|
+
}
|
|
430
|
+
// 4. Execution delegation
|
|
431
|
+
const exitCode = await spawnCommand(options.command, cwd);
|
|
432
|
+
return {
|
|
433
|
+
success: exitCode === 0,
|
|
434
|
+
exitCode,
|
|
435
|
+
blockersCount,
|
|
436
|
+
warningsCount,
|
|
437
|
+
migrationsCount: pending.length,
|
|
438
|
+
executedCommand: true,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
export function printWrapHelp() {
|
|
442
|
+
console.log(`
|
|
443
|
+
ddlforge wrap — Supervise ORM migration deployments with pre-flight safety checks
|
|
444
|
+
|
|
445
|
+
USAGE:
|
|
446
|
+
ddlforge wrap [options] -- <command...>
|
|
447
|
+
|
|
448
|
+
ARGUMENTS:
|
|
449
|
+
<command...> Migration deployment command to run after safety checks
|
|
450
|
+
|
|
451
|
+
FLAGS:
|
|
452
|
+
--dir <path> Migration directory to scan (defaults: auto-detect prisma/migrations, drizzle, or ./migrations)
|
|
453
|
+
--allow-blockers Warn on blockers instead of aborting the command
|
|
454
|
+
--db <url> Database URL for pending migration checks (falls back to DATABASE_URL)
|
|
455
|
+
--help, -h Print this help message and exit
|
|
456
|
+
|
|
457
|
+
EXAMPLES:
|
|
458
|
+
$ ddlforge wrap -- npx prisma migrate deploy
|
|
459
|
+
$ ddlforge wrap --dir=./drizzle -- npx drizzle-kit migrate
|
|
460
|
+
$ ddlforge wrap --allow-blockers -- npm run migrate
|
|
461
|
+
`);
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* CLI entry point for the `wrap` subcommand.
|
|
465
|
+
*/
|
|
466
|
+
export async function runWrap(argv, cwd = process.cwd()) {
|
|
467
|
+
const options = parseWrapArgs(argv);
|
|
468
|
+
if (options.help) {
|
|
469
|
+
printWrapHelp();
|
|
470
|
+
return 0;
|
|
471
|
+
}
|
|
472
|
+
if (options.command.length === 0) {
|
|
473
|
+
console.error('ddlforge wrap: Missing command after "--".');
|
|
474
|
+
console.error('Usage: ddlforge wrap [options] -- <command...>');
|
|
475
|
+
console.error('Example: ddlforge wrap -- npx prisma migrate deploy');
|
|
476
|
+
return 1;
|
|
477
|
+
}
|
|
478
|
+
const result = await orchestrateWrap({ ...options, cwd });
|
|
479
|
+
return result.exitCode;
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/wrapper/orchestrator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ddlforge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"scripts": {
|
|
17
17
|
"build": "tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"",
|
|
18
18
|
"test:build": "tsc -p tsconfig.test.json",
|
|
19
|
-
"test": "npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js",
|
|
19
|
+
"test": "npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js",
|
|
20
20
|
"test:watch": "node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js",
|
|
21
21
|
"prepack": "node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"",
|
|
22
22
|
"prepublishOnly": "npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""
|