@schemalens/cli 0.5.0 → 0.6.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/commands/build.js +120 -50
- package/dist/commands/build.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/pg-mem-introspector.d.ts +18 -0
- package/dist/lib/pg-mem-introspector.js +649 -0
- package/dist/lib/pg-mem-introspector.js.map +1 -0
- package/dist/lib/sql-ast-parser.d.ts +28 -0
- package/dist/lib/sql-ast-parser.js +508 -0
- package/dist/lib/sql-ast-parser.js.map +1 -0
- package/package.json +4 -2
|
@@ -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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"}
|