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.
Files changed (37) hide show
  1. package/dist/src/cli.d.ts +2 -2
  2. package/dist/src/cli.d.ts.map +1 -1
  3. package/dist/src/cli.js +32 -4
  4. package/dist/src/cli.js.map +1 -1
  5. package/dist/src/index.d.ts +1 -0
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/index.js +2 -0
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/reporters/index.d.ts +1 -0
  10. package/dist/src/reporters/index.d.ts.map +1 -1
  11. package/dist/src/reporters/index.js +1 -0
  12. package/dist/src/reporters/index.js.map +1 -1
  13. package/dist/src/reporters/sarif.d.ts +72 -0
  14. package/dist/src/reporters/sarif.d.ts.map +1 -0
  15. package/dist/src/reporters/sarif.js +103 -0
  16. package/dist/src/reporters/sarif.js.map +1 -0
  17. package/dist/src/rules/checkConstraintNotValid.d.ts +9 -0
  18. package/dist/src/rules/checkConstraintNotValid.d.ts.map +1 -0
  19. package/dist/src/rules/checkConstraintNotValid.js +116 -0
  20. package/dist/src/rules/checkConstraintNotValid.js.map +1 -0
  21. package/dist/src/rules/index.d.ts +3 -0
  22. package/dist/src/rules/index.d.ts.map +1 -1
  23. package/dist/src/rules/index.js +9 -0
  24. package/dist/src/rules/index.js.map +1 -1
  25. package/dist/src/rules/sessionAdvisoryLock.d.ts +9 -0
  26. package/dist/src/rules/sessionAdvisoryLock.d.ts.map +1 -0
  27. package/dist/src/rules/sessionAdvisoryLock.js +47 -0
  28. package/dist/src/rules/sessionAdvisoryLock.js.map +1 -0
  29. package/dist/src/rules/uniqueConstraintUsingIndex.d.ts +9 -0
  30. package/dist/src/rules/uniqueConstraintUsingIndex.d.ts.map +1 -0
  31. package/dist/src/rules/uniqueConstraintUsingIndex.js +145 -0
  32. package/dist/src/rules/uniqueConstraintUsingIndex.js.map +1 -0
  33. package/dist/src/wrapper/orchestrator.d.ts +62 -0
  34. package/dist/src/wrapper/orchestrator.d.ts.map +1 -0
  35. package/dist/src/wrapper/orchestrator.js +481 -0
  36. package/dist/src/wrapper/orchestrator.js.map +1 -0
  37. 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.2.1",
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{}\""