@schemalens/cli 0.5.0 → 0.7.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.
@@ -0,0 +1,649 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.introspectFromMigrations = introspectFromMigrations;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const pg_mem_1 = require("pg-mem");
42
+ /**
43
+ * Statements that pg-mem cannot execute. We strip these from migrations
44
+ * before applying so the rest of the DDL still runs.
45
+ */
46
+ const UNSUPPORTED_STATEMENT_PATTERNS = [
47
+ { pattern: /^\s*CREATE\s+(OR\s+REPLACE\s+)?FUNCTION\b/i, label: 'CREATE FUNCTION' },
48
+ { pattern: /^\s*CREATE\s+(OR\s+REPLACE\s+)?PROCEDURE\b/i, label: 'CREATE PROCEDURE' },
49
+ { pattern: /^\s*CREATE\s+(CONSTRAINT\s+)?TRIGGER\b/i, label: 'CREATE TRIGGER' },
50
+ { pattern: /^\s*CREATE\s+POLICY\b/i, label: 'CREATE POLICY' },
51
+ { pattern: /^\s*ALTER\s+POLICY\b/i, label: 'ALTER POLICY' },
52
+ { pattern: /^\s*DROP\s+POLICY\b/i, label: 'DROP POLICY' },
53
+ { pattern: /^\s*CREATE\s+EXTENSION\b/i, label: 'CREATE EXTENSION' },
54
+ { pattern: /^\s*DROP\s+EXTENSION\b/i, label: 'DROP EXTENSION' },
55
+ { pattern: /^\s*COMMENT\s+ON\b/i, label: 'COMMENT ON' },
56
+ { pattern: /^\s*GRANT\b/i, label: 'GRANT' },
57
+ { pattern: /^\s*REVOKE\b/i, label: 'REVOKE' },
58
+ { pattern: /^\s*ALTER\s+TABLE\s+\S+\s+ENABLE\s+ROW\s+LEVEL\s+SECURITY/i, label: 'ENABLE ROW LEVEL SECURITY' },
59
+ { pattern: /^\s*ALTER\s+TABLE\s+\S+\s+DISABLE\s+ROW\s+LEVEL\s+SECURITY/i, label: 'DISABLE ROW LEVEL SECURITY' },
60
+ { pattern: /^\s*SET\s+/i, label: 'SET' },
61
+ { pattern: /^\s*DO\s+\$\$/i, label: 'DO $$' },
62
+ { pattern: /^\s*ALTER\s+DEFAULT\s+PRIVILEGES/i, label: 'ALTER DEFAULT PRIVILEGES' },
63
+ { pattern: /^\s*CREATE\s+(OR\s+REPLACE\s+)?VIEW\b/i, label: 'CREATE VIEW' },
64
+ { pattern: /^\s*CREATE\s+(OR\s+REPLACE\s+)?MATERIALIZED\s+VIEW\b/i, label: 'CREATE MATERIALIZED VIEW' },
65
+ ];
66
+ /**
67
+ * Splits a SQL string into individual statements, respecting:
68
+ * - dollar-quoted strings ($$...$$, $tag$...$tag$)
69
+ * - single-quoted strings
70
+ * - line comments (-- ...)
71
+ * - block comments
72
+ */
73
+ function splitStatements(sql) {
74
+ const statements = [];
75
+ let current = '';
76
+ let i = 0;
77
+ let inSingleQuote = false;
78
+ let inLineComment = false;
79
+ let inBlockComment = false;
80
+ let dollarTag = null;
81
+ while (i < sql.length) {
82
+ const ch = sql[i];
83
+ const next = sql[i + 1];
84
+ if (inLineComment) {
85
+ current += ch;
86
+ if (ch === '\n')
87
+ inLineComment = false;
88
+ i++;
89
+ continue;
90
+ }
91
+ if (inBlockComment) {
92
+ current += ch;
93
+ if (ch === '*' && next === '/') {
94
+ current += next;
95
+ i += 2;
96
+ inBlockComment = false;
97
+ continue;
98
+ }
99
+ i++;
100
+ continue;
101
+ }
102
+ if (dollarTag !== null) {
103
+ current += ch;
104
+ if (ch === '$') {
105
+ const candidate = sql.slice(i, i + dollarTag.length);
106
+ if (candidate === dollarTag) {
107
+ current += sql.slice(i + 1, i + dollarTag.length);
108
+ i += dollarTag.length;
109
+ dollarTag = null;
110
+ continue;
111
+ }
112
+ }
113
+ i++;
114
+ continue;
115
+ }
116
+ if (inSingleQuote) {
117
+ current += ch;
118
+ if (ch === "'" && next === "'") {
119
+ current += next;
120
+ i += 2;
121
+ continue;
122
+ }
123
+ if (ch === "'")
124
+ inSingleQuote = false;
125
+ i++;
126
+ continue;
127
+ }
128
+ // Not inside any string/comment context
129
+ if (ch === '-' && next === '-') {
130
+ inLineComment = true;
131
+ current += ch;
132
+ i++;
133
+ continue;
134
+ }
135
+ if (ch === '/' && next === '*') {
136
+ inBlockComment = true;
137
+ current += ch;
138
+ i++;
139
+ continue;
140
+ }
141
+ if (ch === "'") {
142
+ inSingleQuote = true;
143
+ current += ch;
144
+ i++;
145
+ continue;
146
+ }
147
+ if (ch === '$') {
148
+ // Look for a dollar-quote tag: $$ or $tag$
149
+ const match = sql.slice(i).match(/^\$([A-Za-z_][A-Za-z0-9_]*)?\$/);
150
+ if (match) {
151
+ dollarTag = match[0];
152
+ current += dollarTag;
153
+ i += dollarTag.length;
154
+ continue;
155
+ }
156
+ }
157
+ if (ch === ';') {
158
+ if (current.trim().length > 0)
159
+ statements.push(current.trim());
160
+ current = '';
161
+ i++;
162
+ continue;
163
+ }
164
+ current += ch;
165
+ i++;
166
+ }
167
+ if (current.trim().length > 0)
168
+ statements.push(current.trim());
169
+ return statements;
170
+ }
171
+ function classifyStatement(stmt) {
172
+ for (const { pattern, label } of UNSUPPORTED_STATEMENT_PATTERNS) {
173
+ if (pattern.test(stmt))
174
+ return { supported: false, label };
175
+ }
176
+ return { supported: true };
177
+ }
178
+ function scanForeignKeys(sql) {
179
+ const results = [];
180
+ const stripped = sql
181
+ .replace(/--[^\n]*/g, '')
182
+ .replace(/\/\*[\s\S]*?\*\//g, '');
183
+ // CREATE TABLE blocks
184
+ const tableRegex = /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?(?:"?(\w+)"?\.)?"?(\w+)"?\s*\(([\s\S]*?)\)\s*(?:;|$)/gi;
185
+ let tableMatch;
186
+ while ((tableMatch = tableRegex.exec(stripped)) !== null) {
187
+ scanFkInTableBody(tableMatch[2], tableMatch[3], results);
188
+ }
189
+ // ALTER TABLE ... ADD [CONSTRAINT ...] FOREIGN KEY
190
+ const alterRegex = /ALTER\s+TABLE\s+(?:ONLY\s+)?(?:"?(\w+)"?\.)?"?(\w+)"?\s+ADD\s+(?:CONSTRAINT\s+"?\w+"?\s+)?FOREIGN\s+KEY\s*\(([^)]+)\)\s*REFERENCES\s+(?:"?(\w+)"?\.)?"?(\w+)"?(?:\s*\(([^)]+)\))?/gi;
191
+ let alterMatch;
192
+ while ((alterMatch = alterRegex.exec(stripped)) !== null) {
193
+ const localCols = alterMatch[3].split(',').map(s => cleanIdent(s));
194
+ const refCols = alterMatch[6] ? alterMatch[6].split(',').map(s => cleanIdent(s)) : ['id'];
195
+ results.push({
196
+ table: alterMatch[2],
197
+ columns: localCols,
198
+ refSchema: alterMatch[4] ?? 'public',
199
+ refTable: alterMatch[5],
200
+ refColumns: refCols,
201
+ });
202
+ }
203
+ return results;
204
+ }
205
+ function scanFkInTableBody(tableName, body, out) {
206
+ const items = splitTopLevelCommas(body);
207
+ for (const item of items) {
208
+ const trimmed = item.trim();
209
+ // Table-level: FOREIGN KEY (cols) REFERENCES tbl(refcols)
210
+ const tableFk = trimmed.match(/^(?:CONSTRAINT\s+"?\w+"?\s+)?FOREIGN\s+KEY\s*\(([^)]+)\)\s*REFERENCES\s+(?:"?(\w+)"?\.)?"?(\w+)"?(?:\s*\(([^)]+)\))?/i);
211
+ if (tableFk) {
212
+ const localCols = tableFk[1].split(',').map(s => cleanIdent(s));
213
+ const refCols = tableFk[4] ? tableFk[4].split(',').map(s => cleanIdent(s)) : ['id'];
214
+ out.push({
215
+ table: tableName,
216
+ columns: localCols,
217
+ refSchema: tableFk[2] ?? 'public',
218
+ refTable: tableFk[3],
219
+ refColumns: refCols,
220
+ });
221
+ continue;
222
+ }
223
+ // Column-inline: `colname TYPE ... REFERENCES tbl(col)`
224
+ const inlineFk = trimmed.match(/^"?(\w+)"?\s+[\s\S]*?\bREFERENCES\s+(?:"?(\w+)"?\.)?"?(\w+)"?(?:\s*\(([^)]+)\))?/i);
225
+ if (inlineFk) {
226
+ const refCol = inlineFk[4] ? cleanIdent(inlineFk[4]) : 'id';
227
+ out.push({
228
+ table: tableName,
229
+ columns: [inlineFk[1]],
230
+ refSchema: inlineFk[2] ?? 'public',
231
+ refTable: inlineFk[3],
232
+ refColumns: [refCol],
233
+ });
234
+ }
235
+ }
236
+ }
237
+ function splitTopLevelCommas(s) {
238
+ const out = [];
239
+ let depth = 0;
240
+ let current = '';
241
+ let inQuote = false;
242
+ for (const ch of s) {
243
+ if (ch === "'" && depth === 0)
244
+ inQuote = !inQuote;
245
+ if (!inQuote) {
246
+ if (ch === '(')
247
+ depth++;
248
+ else if (ch === ')')
249
+ depth--;
250
+ else if (ch === ',' && depth === 0) {
251
+ out.push(current);
252
+ current = '';
253
+ continue;
254
+ }
255
+ }
256
+ current += ch;
257
+ }
258
+ if (current.trim().length > 0)
259
+ out.push(current);
260
+ return out;
261
+ }
262
+ function cleanIdent(s) {
263
+ return s.trim().replace(/^"|"$/g, '');
264
+ }
265
+ function isForeignKeyWrapper(cst) {
266
+ return cst.inner !== undefined &&
267
+ cst.inner.foreignTable !== undefined;
268
+ }
269
+ function isIndexConstraint(cst) {
270
+ return cst.index !== undefined;
271
+ }
272
+ function stringifyDefault(d) {
273
+ if (!d)
274
+ return null;
275
+ const v = d.val;
276
+ if (v === undefined || v === null)
277
+ return null;
278
+ if (typeof v === 'string')
279
+ return `'${v.replace(/'/g, "''")}'`;
280
+ if (typeof v === 'number' || typeof v === 'bigint')
281
+ return String(v);
282
+ if (typeof v === 'boolean')
283
+ return v ? 'true' : 'false';
284
+ if (v instanceof Date)
285
+ return `CURRENT_TIMESTAMP`;
286
+ return null;
287
+ }
288
+ function synthesizeIndexDefinition(name, schema, table, cols, unique) {
289
+ const uniquePart = unique ? 'UNIQUE ' : '';
290
+ return `CREATE ${uniquePart}INDEX ${name} ON ${schema}.${table} (${cols.join(', ')})`;
291
+ }
292
+ function synthesizeConstraintDef(type, columns, ref) {
293
+ const cols = columns.join(', ');
294
+ switch (type) {
295
+ case 'PRIMARY KEY':
296
+ return `PRIMARY KEY (${cols})`;
297
+ case 'UNIQUE':
298
+ return `UNIQUE (${cols})`;
299
+ case 'FOREIGN KEY':
300
+ if (ref)
301
+ return `FOREIGN KEY (${cols}) REFERENCES ${ref.schema}.${ref.table}(${ref.column})`;
302
+ return `FOREIGN KEY (${cols})`;
303
+ case 'CHECK':
304
+ return `CHECK (...)`;
305
+ default:
306
+ return type;
307
+ }
308
+ }
309
+ function buildSnapshotFromPgMem(db, fkInfos) {
310
+ const tables = [];
311
+ const indexes = [];
312
+ const enums = [];
313
+ // Lookup FK by `${table}:${sortedColumns}`
314
+ const fkLookup = new Map();
315
+ for (const fk of fkInfos) {
316
+ fkLookup.set(`${fk.table}:${[...fk.columns].sort().join(',')}`, fk);
317
+ }
318
+ const STUB_SCHEMAS = new Set(['auth', 'storage', 'extensions']);
319
+ for (const t of db.public.listTables()) {
320
+ const table = db.public.getTable(t.name);
321
+ const schema = table.ownerSchema?.name ?? 'public';
322
+ if (STUB_SCHEMAS.has(schema))
323
+ continue;
324
+ const tableInfo = {
325
+ schema,
326
+ name: table.name,
327
+ columns: [],
328
+ constraints: [],
329
+ };
330
+ // PK columns
331
+ const pkCols = new Set();
332
+ if (table.hasPrimary?.expressions) {
333
+ for (const e of table.hasPrimary.expressions) {
334
+ if (e.id)
335
+ pkCols.add(e.id);
336
+ }
337
+ }
338
+ // Columns
339
+ for (const [colName, col] of table.columnMgr.map) {
340
+ const typeName = col.expression?.type?.primary ?? col.expression?.type?.name ?? 'text';
341
+ const isPk = pkCols.has(colName);
342
+ tableInfo.columns.push({
343
+ name: colName,
344
+ type: typeName,
345
+ nullable: !col.notNull && !isPk,
346
+ default: stringifyDefault(col.default),
347
+ isPrimaryKey: isPk,
348
+ isForeignKey: false,
349
+ references: null,
350
+ });
351
+ }
352
+ // PK constraint
353
+ if (pkCols.size > 0) {
354
+ const pkName = table.hasPrimary?.name ?? `${table.name}_pkey`;
355
+ const pkColArr = [...pkCols];
356
+ tableInfo.constraints.push({
357
+ name: pkName,
358
+ type: 'PRIMARY KEY',
359
+ columns: pkColArr,
360
+ definition: synthesizeConstraintDef('PRIMARY KEY', pkColArr),
361
+ });
362
+ }
363
+ // Track FK column refs to stamp onto columns later
364
+ const fkColRefs = new Map();
365
+ for (const [, cst] of table.constraintsByName) {
366
+ if (isForeignKeyWrapper(cst)) {
367
+ const fkName = cst.inner.name;
368
+ const localTable = cst.inner.table.name;
369
+ const foreignTable = cst.inner.foreignTable.name;
370
+ // Match FK by pg-mem's auto-generated name pattern `{table}_{col}_fk`
371
+ let matched;
372
+ const nameMatch = fkName.match(new RegExp(`^${localTable}_(.+)_fk$`));
373
+ if (nameMatch) {
374
+ matched = fkLookup.get(`${localTable}:${nameMatch[1]}`);
375
+ }
376
+ // Fallback: any FK from this table to the same foreign table
377
+ if (!matched) {
378
+ matched = fkInfos.find(fk => fk.table === localTable && fk.refTable === foreignTable);
379
+ }
380
+ if (matched) {
381
+ for (let i = 0; i < matched.columns.length; i++) {
382
+ const localCol = matched.columns[i];
383
+ const refCol = matched.refColumns[i] ?? matched.refColumns[0] ?? 'id';
384
+ fkColRefs.set(localCol, {
385
+ schema: matched.refSchema,
386
+ table: matched.refTable,
387
+ column: refCol,
388
+ });
389
+ }
390
+ tableInfo.constraints.push({
391
+ name: fkName,
392
+ type: 'FOREIGN KEY',
393
+ columns: matched.columns,
394
+ definition: synthesizeConstraintDef('FOREIGN KEY', matched.columns, {
395
+ schema: matched.refSchema,
396
+ table: matched.refTable,
397
+ column: matched.refColumns[0] ?? 'id',
398
+ }),
399
+ });
400
+ }
401
+ else {
402
+ tableInfo.constraints.push({
403
+ name: fkName,
404
+ type: 'FOREIGN KEY',
405
+ columns: [],
406
+ definition: `FOREIGN KEY REFERENCES ${foreignTable}`,
407
+ });
408
+ }
409
+ }
410
+ else if (isIndexConstraint(cst)) {
411
+ const idx = cst.index;
412
+ const cols = idx.expressions?.map(e => e.id).filter((x) => !!x) ?? [];
413
+ const isPrimary = table.hasPrimary === idx;
414
+ const isUnique = !!idx.unique;
415
+ indexes.push({
416
+ schema,
417
+ table: table.name,
418
+ name: idx.name,
419
+ definition: synthesizeIndexDefinition(idx.name, schema, table.name, cols, isUnique),
420
+ isUnique,
421
+ isPrimary,
422
+ });
423
+ // UNIQUE constraint (but not the PK, which was already added)
424
+ if (isUnique && !isPrimary) {
425
+ tableInfo.constraints.push({
426
+ name: idx.name,
427
+ type: 'UNIQUE',
428
+ columns: cols,
429
+ definition: synthesizeConstraintDef('UNIQUE', cols),
430
+ });
431
+ }
432
+ }
433
+ }
434
+ // Stamp FK info onto columns
435
+ for (const col of tableInfo.columns) {
436
+ const ref = fkColRefs.get(col.name);
437
+ if (ref) {
438
+ col.isForeignKey = true;
439
+ col.references = ref;
440
+ }
441
+ }
442
+ tables.push(tableInfo);
443
+ }
444
+ // Enums
445
+ const publicSchema = db.getSchema('public');
446
+ const relsByName = publicSchema.relsByNameCas;
447
+ if (relsByName) {
448
+ for (const [, rel] of relsByName) {
449
+ if (rel.constructor?.name === 'CustomEnumType') {
450
+ const enumName = rel._name;
451
+ const values = rel.values;
452
+ if (enumName && Array.isArray(values)) {
453
+ enums.push({
454
+ schema: 'public',
455
+ name: enumName,
456
+ values: [...values],
457
+ });
458
+ }
459
+ }
460
+ }
461
+ }
462
+ return {
463
+ tables,
464
+ views: [],
465
+ functions: [],
466
+ triggers: [],
467
+ policies: [],
468
+ indexes,
469
+ enums,
470
+ extensions: [],
471
+ dependencies: [],
472
+ };
473
+ }
474
+ /**
475
+ * Registers common PostgreSQL and Supabase shims so that migrations using
476
+ * built-in functions and well-known stub schemas (e.g. `auth.users`) can be
477
+ * applied in-memory without errors.
478
+ */
479
+ function installCompatibilityShims(db) {
480
+ // UUID generator stubs
481
+ const uuidImpl = () => '00000000-0000-0000-0000-000000000000';
482
+ try {
483
+ db.public.registerFunction({
484
+ name: 'uuid_generate_v4',
485
+ args: [],
486
+ returns: pg_mem_1.DataType.uuid,
487
+ implementation: uuidImpl,
488
+ impure: true,
489
+ });
490
+ }
491
+ catch { /* already registered */ }
492
+ try {
493
+ db.public.registerFunction({
494
+ name: 'gen_random_uuid',
495
+ args: [],
496
+ returns: pg_mem_1.DataType.uuid,
497
+ implementation: uuidImpl,
498
+ impure: true,
499
+ });
500
+ }
501
+ catch { /* already registered */ }
502
+ // Supabase `auth` schema stubs
503
+ let authSchema;
504
+ try {
505
+ authSchema = db.createSchema('auth');
506
+ }
507
+ catch {
508
+ try {
509
+ authSchema = db.getSchema('auth');
510
+ }
511
+ catch {
512
+ authSchema = null;
513
+ }
514
+ }
515
+ if (authSchema) {
516
+ try {
517
+ authSchema.registerFunction({
518
+ name: 'uid',
519
+ args: [],
520
+ returns: pg_mem_1.DataType.uuid,
521
+ implementation: () => null,
522
+ impure: true,
523
+ });
524
+ }
525
+ catch { /* ignore */ }
526
+ try {
527
+ authSchema.registerFunction({
528
+ name: 'role',
529
+ args: [],
530
+ returns: pg_mem_1.DataType.text,
531
+ implementation: () => 'authenticated',
532
+ impure: true,
533
+ });
534
+ }
535
+ catch { /* ignore */ }
536
+ try {
537
+ authSchema.registerFunction({
538
+ name: 'jwt',
539
+ args: [],
540
+ returns: pg_mem_1.DataType.jsonb,
541
+ implementation: () => ({}),
542
+ impure: true,
543
+ });
544
+ }
545
+ catch { /* ignore */ }
546
+ // Stub auth.users table (referenced by FKs in many Supabase migrations)
547
+ try {
548
+ db.public.none(`CREATE TABLE auth.users (id uuid PRIMARY KEY, email text, raw_user_meta_data jsonb)`);
549
+ }
550
+ catch { /* already exists */ }
551
+ }
552
+ // Supabase `storage` schema stub
553
+ try {
554
+ const storageSchema = db.createSchema('storage');
555
+ try {
556
+ db.public.none(`CREATE TABLE storage.buckets (id text PRIMARY KEY, name text)`);
557
+ db.public.none(`CREATE TABLE storage.objects (id uuid PRIMARY KEY, bucket_id text, name text)`);
558
+ }
559
+ catch { /* ignore */ }
560
+ void storageSchema;
561
+ }
562
+ catch { /* already exists */ }
563
+ // Extensions schema (referenced by `extensions.uuid_generate_v4()` etc.)
564
+ try {
565
+ const extSchema = db.createSchema('extensions');
566
+ try {
567
+ extSchema.registerFunction({
568
+ name: 'uuid_generate_v4',
569
+ args: [],
570
+ returns: pg_mem_1.DataType.uuid,
571
+ implementation: uuidImpl,
572
+ impure: true,
573
+ });
574
+ }
575
+ catch { /* ignore */ }
576
+ }
577
+ catch { /* already exists */ }
578
+ }
579
+ /**
580
+ * Apply the given migrations to an in-memory pg-mem database and return a
581
+ * SchemaSnapshot built from the resulting state.
582
+ *
583
+ * Unsupported statements (CREATE FUNCTION, CREATE TRIGGER, CREATE POLICY,
584
+ * CREATE EXTENSION, GRANT, COMMENT, etc.) are skipped with warnings.
585
+ */
586
+ async function introspectFromMigrations(migrations) {
587
+ const db = (0, pg_mem_1.newDb)({ autoCreateForeignKeyIndices: true });
588
+ installCompatibilityShims(db);
589
+ const warnings = [];
590
+ let skippedStatements = 0;
591
+ // Scan all migrations for FK info up front (pg-mem doesn't expose FK columns)
592
+ const fkInfos = [];
593
+ for (const { sql } of migrations) {
594
+ fkInfos.push(...scanForeignKeys(sql));
595
+ }
596
+ for (const { filename, sql } of migrations) {
597
+ const statements = splitStatements(sql);
598
+ let appliedInFile = 0;
599
+ let skippedInFile = 0;
600
+ const skippedLabels = new Set();
601
+ for (const stmt of statements) {
602
+ const classification = classifyStatement(stmt);
603
+ if (!classification.supported) {
604
+ skippedInFile++;
605
+ skippedStatements++;
606
+ if (classification.label)
607
+ skippedLabels.add(classification.label);
608
+ continue;
609
+ }
610
+ try {
611
+ db.public.none(stmt);
612
+ appliedInFile++;
613
+ }
614
+ catch (err) {
615
+ const msg = err.message;
616
+ // Tolerate statements that pg-mem can't parse — record and continue
617
+ skippedInFile++;
618
+ skippedStatements++;
619
+ warnings.push(`${filename}: skipped statement (${msg.split('\n')[0].slice(0, 120)})`);
620
+ }
621
+ }
622
+ if (skippedInFile > 0) {
623
+ const labelStr = skippedLabels.size > 0
624
+ ? ` [${Array.from(skippedLabels).join(', ')}]`
625
+ : '';
626
+ console.warn(chalk_1.default.yellow(` ! ${filename}: applied ${appliedInFile}, skipped ${skippedInFile}${labelStr}`));
627
+ }
628
+ }
629
+ const snapshot = buildSnapshotFromPgMem(db, fkInfos);
630
+ // Parse migrations via pgsql-parser to extract objects pg-mem can't execute
631
+ // (functions, triggers, policies, views, extensions). This replays all
632
+ // CREATE/DROP/RENAME operations in order to arrive at the final state.
633
+ try {
634
+ const { parseMigrationsForMeta } = await Promise.resolve().then(() => __importStar(require('./sql-ast-parser')));
635
+ const { objects, warnings: parseWarnings } = await parseMigrationsForMeta(migrations);
636
+ snapshot.functions = objects.functions;
637
+ snapshot.triggers = objects.triggers;
638
+ snapshot.policies = objects.policies;
639
+ snapshot.views = objects.views;
640
+ snapshot.extensions = objects.extensions;
641
+ warnings.push(...parseWarnings);
642
+ }
643
+ catch (err) {
644
+ warnings.push(`AST parser unavailable (${err.message.split('\n')[0]}) — ` +
645
+ `functions/triggers/policies/views/extensions will be empty`);
646
+ }
647
+ return { snapshot, warnings, skippedStatements };
648
+ }
649
+ //# sourceMappingURL=pg-mem-introspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-mem-introspector.js","sourceRoot":"","sources":["../../src/lib/pg-mem-introspector.ts"],"names":[],"mappings":"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"}