@metaobjectsdev/migrate-ts 0.15.20 → 0.15.21-rc.1
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/README.md +2 -1
- package/dist/diff/index.js +73 -15
- package/dist/diff/index.js.map +1 -1
- package/dist/diff/status.d.ts.map +1 -1
- package/dist/diff/status.js +30 -3
- package/dist/diff/status.js.map +1 -1
- package/dist/emit/sqlite.d.ts.map +1 -1
- package/dist/emit/sqlite.js +64 -16
- package/dist/emit/sqlite.js.map +1 -1
- package/dist/expected-schema.d.ts.map +1 -1
- package/dist/expected-schema.js +98 -6
- package/dist/expected-schema.js.map +1 -1
- package/dist/introspect/d1.d.ts.map +1 -1
- package/dist/introspect/d1.js +47 -12
- package/dist/introspect/d1.js.map +1 -1
- package/dist/introspect/postgres.d.ts.map +1 -1
- package/dist/introspect/postgres.js +35 -13
- package/dist/introspect/postgres.js.map +1 -1
- package/dist/introspect/sqlite-shared.d.ts +60 -1
- package/dist/introspect/sqlite-shared.d.ts.map +1 -1
- package/dist/introspect/sqlite-shared.js +205 -3
- package/dist/introspect/sqlite-shared.js.map +1 -1
- package/dist/introspect/sqlite.d.ts.map +1 -1
- package/dist/introspect/sqlite.js +27 -13
- package/dist/introspect/sqlite.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/diff/index.ts +83 -14
- package/src/diff/status.ts +34 -3
- package/src/emit/sqlite.ts +63 -16
- package/src/expected-schema.ts +98 -7
- package/src/introspect/d1.ts +57 -11
- package/src/introspect/postgres.ts +35 -13
- package/src/introspect/sqlite-shared.ts +197 -4
- package/src/introspect/sqlite.ts +37 -12
- package/src/types.ts +7 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-shared.d.ts","sourceRoot":"","sources":["../../src/introspect/sqlite-shared.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-shared.d.ts","sourceRoot":"","sources":["../../src/introspect/sqlite-shared.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,eAAO,MAAM,4BAA4B,2CAK/B,CAAC;AAEX,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,GAAG,SAAS,CAuBhF;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CA0CjE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,EAAE,CAgCzF;AA6BD,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,oBAAoB,GAAG,SAAS,CA+B1G;AAED,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,0DAA0D;IAC1D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,wCAAwC;IACxC,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,oBAAoB,EAC3B,UAAU,EAAE,SAAS,oBAAoB,EAAE,EAC3C,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,eAAe,CAkBjB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAMzD"}
|
|
@@ -7,12 +7,26 @@ export const SQLITE_EXPR_DEFAULT_PATTERNS = [
|
|
|
7
7
|
export function parseSqliteDefault(raw) {
|
|
8
8
|
if (raw === null || raw === undefined || raw === "")
|
|
9
9
|
return undefined;
|
|
10
|
+
// A QUOTE-WRAPPED value is a string literal BY CONSTRUCTION — SQLite always quotes a
|
|
11
|
+
// literal string default. This test MUST come before the expr patterns: one of those
|
|
12
|
+
// patterns is a bare /\(.*\)/, so a perfectly ordinary literal containing parentheses
|
|
13
|
+
// (`@default "n/a (unknown)"` → stored as `'n/a (unknown)'`) would otherwise be
|
|
14
|
+
// classified an EXPR with its quotes still attached. It could then never string-equal
|
|
15
|
+
// the expected literal, so the diff would report change-column-default on EVERY run —
|
|
16
|
+
// and on SQLite (no ALTER COLUMN) that recreate-and-copies the whole table, forever,
|
|
17
|
+
// un-gated, with `verify --db` permanently red. Exactly the failure this un-escaping
|
|
18
|
+
// was added to prevent.
|
|
19
|
+
//
|
|
20
|
+
// Then un-double the emitter's `''` escaping (`@default "don't"` → `'don''t'`), or the
|
|
21
|
+
// introspected `don''t` never equals the expected `don't` — same perpetual rebuild.
|
|
22
|
+
const quoted = /^'([\s\S]*)'$/.exec(raw);
|
|
23
|
+
if (quoted !== null) {
|
|
24
|
+
return { kind: "literal", value: quoted[1].replace(/''/g, "'") };
|
|
25
|
+
}
|
|
10
26
|
const isExpr = SQLITE_EXPR_DEFAULT_PATTERNS.some((re) => re.test(raw));
|
|
11
27
|
if (isExpr)
|
|
12
28
|
return { kind: "expr", value: raw };
|
|
13
|
-
|
|
14
|
-
const cleaned = raw.replace(/^'(.*)'$/, "$1");
|
|
15
|
-
return { kind: "literal", value: cleaned };
|
|
29
|
+
return { kind: "literal", value: raw };
|
|
16
30
|
}
|
|
17
31
|
export function sqliteTypeToSqlType(declaredType) {
|
|
18
32
|
const t = declaredType.trim().toUpperCase();
|
|
@@ -61,6 +75,194 @@ export function sqliteTypeToSqlType(declaredType) {
|
|
|
61
75
|
return { kind: "json" };
|
|
62
76
|
return { kind: "text" };
|
|
63
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse NAMED CHECK constraints (`CONSTRAINT <name> CHECK (<expr>)`) out of a
|
|
80
|
+
* table's CREATE TABLE statement (sqlite_master.sql). SQLite exposes no pragma
|
|
81
|
+
* for CHECK constraints, so the stored DDL text is the only catalog.
|
|
82
|
+
*
|
|
83
|
+
* This is what makes CHECK evolution CONVERGE on sqlite: the diff proposes a
|
|
84
|
+
* check change → the emitter recreate-and-copies the table with the new inline
|
|
85
|
+
* CHECK → this reads the very DDL that recreate wrote, so the re-diff is empty.
|
|
86
|
+
* Without it the actual side always reported `checks: []` and every expected
|
|
87
|
+
* check re-surfaced as add-check on every single run.
|
|
88
|
+
*
|
|
89
|
+
* Unnamed checks (`CHECK (…)` with no CONSTRAINT clause — hand-written DDL) are
|
|
90
|
+
* NOT parsed: they have no identity to match on. A modeled check over such a
|
|
91
|
+
* table converges after one recreate (which rewrites it in named form).
|
|
92
|
+
*
|
|
93
|
+
* The expression is scanned with balanced parens and string-literal awareness
|
|
94
|
+
* (an enum member may contain `(`/`)`), and returned verbatim — the diff's
|
|
95
|
+
* checkExprEquals normalizes both sides before comparing.
|
|
96
|
+
*/
|
|
97
|
+
export function parseSqliteChecks(createSql) {
|
|
98
|
+
if (createSql === null || createSql === undefined || createSql === "")
|
|
99
|
+
return [];
|
|
100
|
+
const out = [];
|
|
101
|
+
const re = /\bCONSTRAINT\s+(?:"((?:[^"]|"")+)"|([A-Za-z_][A-Za-z0-9_$]*))\s+CHECK\s*\(/gi;
|
|
102
|
+
let m;
|
|
103
|
+
while ((m = re.exec(createSql)) !== null) {
|
|
104
|
+
const name = m[1] !== undefined ? m[1].replace(/""/g, '"') : m[2];
|
|
105
|
+
const open = re.lastIndex - 1; // position of the "(" the regex just consumed
|
|
106
|
+
let depth = 0;
|
|
107
|
+
let inString = false;
|
|
108
|
+
let close = -1;
|
|
109
|
+
for (let i = open; i < createSql.length; i++) {
|
|
110
|
+
const ch = createSql[i];
|
|
111
|
+
if (inString) {
|
|
112
|
+
if (ch === "'") {
|
|
113
|
+
if (createSql[i + 1] === "'")
|
|
114
|
+
i++; // '' escape inside the literal
|
|
115
|
+
else
|
|
116
|
+
inString = false;
|
|
117
|
+
}
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (ch === "'")
|
|
121
|
+
inString = true;
|
|
122
|
+
else if (ch === "(")
|
|
123
|
+
depth++;
|
|
124
|
+
else if (ch === ")") {
|
|
125
|
+
depth--;
|
|
126
|
+
if (depth === 0) {
|
|
127
|
+
close = i;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (close === -1)
|
|
133
|
+
break; // malformed tail — stop rather than mis-slice
|
|
134
|
+
out.push({ name, expression: createSql.slice(open + 1, close).trim() });
|
|
135
|
+
re.lastIndex = close + 1;
|
|
136
|
+
}
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
/** Skip a single-quoted SQL string starting at `i` (position of the opening
|
|
140
|
+
* quote); returns the position just past the closing quote ('' escapes honored). */
|
|
141
|
+
function skipSingleQuoted(s, i) {
|
|
142
|
+
i++;
|
|
143
|
+
while (i < s.length) {
|
|
144
|
+
if (s[i] === "'") {
|
|
145
|
+
if (s[i + 1] === "'") {
|
|
146
|
+
i += 2;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
return i + 1;
|
|
150
|
+
}
|
|
151
|
+
i++;
|
|
152
|
+
}
|
|
153
|
+
return i;
|
|
154
|
+
}
|
|
155
|
+
/** Skip a double-quoted SQL identifier starting at `i`; "" escapes honored. */
|
|
156
|
+
function skipDoubleQuoted(s, i) {
|
|
157
|
+
i++;
|
|
158
|
+
while (i < s.length) {
|
|
159
|
+
if (s[i] === '"') {
|
|
160
|
+
if (s[i + 1] === '"') {
|
|
161
|
+
i += 2;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
return i + 1;
|
|
165
|
+
}
|
|
166
|
+
i++;
|
|
167
|
+
}
|
|
168
|
+
return i;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Parse a stored `CREATE [UNIQUE] INDEX … ON <table> (<keys>) [WHERE <pred>]`
|
|
172
|
+
* statement (sqlite_master.sql). SQLite has no pragma exposing an index's key
|
|
173
|
+
* EXPRESSIONS or its partial-index predicate — the stored DDL is the only
|
|
174
|
+
* catalog — so this powers reading `@expr` / `@where` indexes back for the diff
|
|
175
|
+
* to converge. Quote-aware: parens inside string literals or quoted identifiers
|
|
176
|
+
* never confuse the balanced scan.
|
|
177
|
+
*/
|
|
178
|
+
export function parseSqliteIndexDef(createSql) {
|
|
179
|
+
if (createSql === null || createSql === undefined || createSql === "")
|
|
180
|
+
return undefined;
|
|
181
|
+
const n = createSql.length;
|
|
182
|
+
// First "(" outside any quoted region = start of the key list.
|
|
183
|
+
let open = -1;
|
|
184
|
+
for (let i = 0; i < n;) {
|
|
185
|
+
const ch = createSql[i];
|
|
186
|
+
if (ch === "'") {
|
|
187
|
+
i = skipSingleQuoted(createSql, i);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (ch === '"') {
|
|
191
|
+
i = skipDoubleQuoted(createSql, i);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (ch === "(") {
|
|
195
|
+
open = i;
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
i++;
|
|
199
|
+
}
|
|
200
|
+
if (open === -1)
|
|
201
|
+
return undefined;
|
|
202
|
+
// Balanced scan (quote-aware) to the matching ")".
|
|
203
|
+
let close = -1;
|
|
204
|
+
for (let i = open, depth = 0; i < n;) {
|
|
205
|
+
const ch = createSql[i];
|
|
206
|
+
if (ch === "'") {
|
|
207
|
+
i = skipSingleQuoted(createSql, i);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (ch === '"') {
|
|
211
|
+
i = skipDoubleQuoted(createSql, i);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (ch === "(")
|
|
215
|
+
depth++;
|
|
216
|
+
else if (ch === ")") {
|
|
217
|
+
depth--;
|
|
218
|
+
if (depth === 0) {
|
|
219
|
+
close = i;
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
i++;
|
|
224
|
+
}
|
|
225
|
+
if (close === -1)
|
|
226
|
+
return undefined;
|
|
227
|
+
const out = { keyList: createSql.slice(open + 1, close).trim() };
|
|
228
|
+
const m = /^\s*WHERE\s+([\s\S]+)$/i.exec(createSql.slice(close + 1));
|
|
229
|
+
if (m)
|
|
230
|
+
out.where = m[1].trim().replace(/;\s*$/, "");
|
|
231
|
+
return out;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Assemble an IndexDescriptor from the SQLite catalog pieces: pragma_index_list
|
|
235
|
+
* (unique/partial), pragma_index_xinfo key columns (names + DESC bits; name null
|
|
236
|
+
* for an expression key), and the stored CREATE INDEX DDL (expression key list +
|
|
237
|
+
* partial predicate — neither is exposed by any pragma).
|
|
238
|
+
*
|
|
239
|
+
* Mirrors the expected side's shape rules: an expression index carries the whole
|
|
240
|
+
* key list in `expr` with `columns: []`; `orders` is attached only when some key
|
|
241
|
+
* is DESC (all-ascending serializes as absent, like buildExpectedSchema).
|
|
242
|
+
*/
|
|
243
|
+
export function buildSqliteIndexDescriptor(entry, keyColumns, createSql) {
|
|
244
|
+
const parsed = parseSqliteIndexDef(createSql);
|
|
245
|
+
const descriptor = {
|
|
246
|
+
name: entry.name,
|
|
247
|
+
columns: [],
|
|
248
|
+
unique: entry.unique,
|
|
249
|
+
};
|
|
250
|
+
if (keyColumns.some((c) => c.name === null)) {
|
|
251
|
+
// Expression key somewhere in the list → the whole key list is the expr
|
|
252
|
+
// (same convention as the Postgres introspector + buildExpectedSchema).
|
|
253
|
+
if (parsed !== undefined)
|
|
254
|
+
descriptor.expr = parsed.keyList;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
descriptor.columns = keyColumns.map((c) => c.name);
|
|
258
|
+
const orders = keyColumns.map((c) => (c.desc ? "desc" : "asc"));
|
|
259
|
+
if (orders.some((o) => o === "desc"))
|
|
260
|
+
descriptor.orders = orders;
|
|
261
|
+
}
|
|
262
|
+
if (entry.partial && parsed?.where !== undefined)
|
|
263
|
+
descriptor.where = parsed.where;
|
|
264
|
+
return descriptor;
|
|
265
|
+
}
|
|
64
266
|
export function sqliteRuleToAction(rule) {
|
|
65
267
|
const r = rule.toUpperCase();
|
|
66
268
|
if (r === "CASCADE")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-shared.js","sourceRoot":"","sources":["../../src/introspect/sqlite-shared.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,sBAAsB;IACtB,iBAAiB;IACjB,iBAAiB;IACjB,QAAQ;CACA,CAAC;AAEX,MAAM,UAAU,kBAAkB,CAAC,GAAkB;IACnD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-shared.js","sourceRoot":"","sources":["../../src/introspect/sqlite-shared.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,sBAAsB;IACtB,iBAAiB;IACjB,iBAAiB;IACjB,QAAQ;CACA,CAAC;AAEX,MAAM,UAAU,kBAAkB,CAAC,GAAkB;IACnD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAEtE,qFAAqF;IACrF,qFAAqF;IACrF,sFAAsF;IACtF,gFAAgF;IAChF,sFAAsF;IACtF,sFAAsF;IACtF,qFAAqF;IACrF,qFAAqF;IACrF,wBAAwB;IACxB,EAAE;IACF,uFAAuF;IACvF,oFAAoF;IACpF,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,YAAoB;IACtD,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE5C,kGAAkG;IAClG,+EAA+E;IAE/E,gBAAgB;IAChB,MAAM,YAAY,GAAG,4CAA4C,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAC3F,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAE9D,mBAAmB;IACnB,MAAM,QAAQ,GAAG,8CAA8C,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,QAAQ,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAChE,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1C,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAE7F,qEAAqE;IACrE,iFAAiF;IACjF,wEAAwE;IACxE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC7F,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAExD,gBAAgB;IAChB,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAEtD,gBAAgB;IAChB,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAEtD,4BAA4B;IAC5B,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAE1D,kCAAkC;IAClC,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAE1C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoC;IACpE,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IACjF,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,8EAA8E,CAAC;IAC1F,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;QACnE,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,8CAA8C;QAC7E,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;oBACf,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;wBAAE,CAAC,EAAE,CAAC,CAAC,+BAA+B;;wBAC7D,QAAQ,GAAG,KAAK,CAAC;gBACxB,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,EAAE,KAAK,GAAG;gBAAE,QAAQ,GAAG,IAAI,CAAC;iBAC3B,IAAI,EAAE,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBACxB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACpB,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAAC,KAAK,GAAG,CAAC,CAAC;oBAAC,MAAM;gBAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,MAAM,CAAC,8CAA8C;QACvE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxE,EAAE,CAAC,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;qFACqF;AACrF,SAAS,gBAAgB,CAAC,CAAS,EAAE,CAAS;IAC5C,CAAC,EAAE,CAAC;IACJ,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAAC,CAAC,IAAI,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,+EAA+E;AAC/E,SAAS,gBAAgB,CAAC,CAAS,EAAE,CAAS;IAC5C,CAAC,EAAE,CAAC;IACJ,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAAC,CAAC,IAAI,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AASD;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAoC;IACtE,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACxF,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAI,CAAC;QACxB,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,CAAC,GAAG,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACjE,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,CAAC,GAAG,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACjE,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,IAAI,GAAG,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;QACpC,CAAC,EAAE,CAAC;IACN,CAAC;IACD,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,mDAAmD;IACnD,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAI,CAAC;QACtC,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,CAAC,GAAG,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACjE,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,CAAC,GAAG,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACjE,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAAC,KAAK,GAAG,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;QACxC,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,GAAG,GAAyB,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACvF,MAAM,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC;QAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,GAAG,CAAC;AACb,CAAC;AAiBD;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAA2B,EAC3B,UAA2C,EAC3C,SAAoC;IAEpC,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAoB;QAClC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;IACF,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5C,wEAAwE;QACxE,wEAAwE;QACxE,IAAI,MAAM,KAAK,SAAS;YAAE,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC;YAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;IACnE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS;QAAE,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAClF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,CAAC,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IACxC,IAAI,CAAC,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IACxC,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/introspect/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/introspect/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,aAAa,CAAC;AAUrB,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CA0CnG"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { sql } from "kysely";
|
|
2
|
-
import { parseSqliteDefault, sqliteTypeToSqlType, sqliteRuleToAction } from "./sqlite-shared.js";
|
|
2
|
+
import { parseSqliteDefault, sqliteTypeToSqlType, sqliteRuleToAction, parseSqliteChecks, buildSqliteIndexDescriptor, } from "./sqlite-shared.js";
|
|
3
3
|
import { MIGRATIONS_TABLE } from "../apply/ledger.js";
|
|
4
4
|
export async function introspectSqlite(db) {
|
|
5
5
|
const k = db;
|
|
6
6
|
const versionRow = await sql `SELECT sqlite_version() AS v`.execute(k);
|
|
7
7
|
const meta = { sqliteVersion: versionRow.rows[0]?.v ?? "0.0.0" };
|
|
8
|
+
// NOTE: "_" is a single-character WILDCARD in SQL LIKE. Unescaped, '__new_%' also
|
|
9
|
+
// matches an ordinary table named "renewals" (verified against real SQLite), silently
|
|
10
|
+
// hiding it from introspection — so the diff re-proposes CREATE TABLE on every run and
|
|
11
|
+
// the next apply dies with "already exists". Escape the underscores.
|
|
8
12
|
const tableNamesRows = await sql `
|
|
9
13
|
SELECT name, sql FROM sqlite_master
|
|
10
|
-
WHERE type='table' AND name NOT LIKE '
|
|
14
|
+
WHERE type='table' AND name NOT LIKE 'sqlite\\_%' ESCAPE '\\'
|
|
15
|
+
AND name NOT LIKE '\\_\\_new\\_%' ESCAPE '\\'
|
|
11
16
|
AND name <> ${MIGRATIONS_TABLE}
|
|
12
17
|
ORDER BY name
|
|
13
18
|
`.execute(k);
|
|
@@ -27,7 +32,9 @@ export async function introspectSqlite(db) {
|
|
|
27
32
|
columns: cols,
|
|
28
33
|
indexes: await readSqliteIndexes(k, t.name),
|
|
29
34
|
foreignKeys: await readSqliteForeignKeys(k, t.name),
|
|
30
|
-
|
|
35
|
+
// Named CHECKs parsed from the stored CREATE TABLE DDL — required for
|
|
36
|
+
// check evolution (enum @values changes) to converge on sqlite.
|
|
37
|
+
checks: parseSqliteChecks(t.sql),
|
|
31
38
|
primaryKey: pk,
|
|
32
39
|
});
|
|
33
40
|
}
|
|
@@ -39,7 +46,7 @@ async function readSqliteViews(k) {
|
|
|
39
46
|
// We carry it through on the descriptor so the diff can detect view-body
|
|
40
47
|
// drift (not just name presence).
|
|
41
48
|
const rows = await sql `
|
|
42
|
-
SELECT name, sql FROM sqlite_master WHERE type='view' AND name NOT LIKE '
|
|
49
|
+
SELECT name, sql FROM sqlite_master WHERE type='view' AND name NOT LIKE 'sqlite\\_%' ESCAPE '\\'
|
|
43
50
|
ORDER BY name
|
|
44
51
|
`.execute(k);
|
|
45
52
|
return rows.rows.map((r) => {
|
|
@@ -76,20 +83,27 @@ async function readSqliteIndexes(k, table) {
|
|
|
76
83
|
const listRows = await sql `
|
|
77
84
|
SELECT * FROM pragma_index_list(${table})
|
|
78
85
|
`.execute(k);
|
|
86
|
+
// Stored CREATE INDEX DDL per index — the ONLY catalog for an index's key
|
|
87
|
+
// EXPRESSIONS and partial-index WHERE predicate (no pragma exposes either).
|
|
88
|
+
// Auto-created indexes (column UNIQUE constraints, origin 'u') have sql NULL,
|
|
89
|
+
// which is fine: they can't be partial or expression-keyed.
|
|
90
|
+
const sqlRows = await sql `
|
|
91
|
+
SELECT name, sql FROM sqlite_master WHERE type='index' AND tbl_name = ${table}
|
|
92
|
+
`.execute(k);
|
|
93
|
+
const ddlByName = new Map(sqlRows.rows.map((r) => [r.name, r.sql]));
|
|
79
94
|
const indexes = [];
|
|
80
95
|
for (const ix of listRows.rows) {
|
|
81
96
|
if (ix.origin === "pk")
|
|
82
97
|
continue; // PK index — excluded (lives in TableDescriptor.primaryKey)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
98
|
+
// pragma_index_xinfo (not index_info): includes the DESC bit and marks key
|
|
99
|
+
// columns (key=1) vs auxiliary rowid columns; an expression key has name
|
|
100
|
+
// NULL. SELECT * avoids "desc"/"key" reserved-keyword issues in libsql.
|
|
101
|
+
const xinfo = await sql `
|
|
102
|
+
SELECT * FROM pragma_index_xinfo(${ix.name}) ORDER BY seqno
|
|
87
103
|
`.execute(k);
|
|
88
|
-
indexes.push({
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
unique: ix.unique === 1,
|
|
92
|
-
});
|
|
104
|
+
indexes.push(buildSqliteIndexDescriptor({ name: ix.name, unique: ix.unique === 1, partial: ix.partial === 1 }, xinfo.rows
|
|
105
|
+
.filter((c) => c.key === 1)
|
|
106
|
+
.map((c) => ({ name: c.name, desc: c.desc === 1 })), ddlByName.get(ix.name) ?? null));
|
|
93
107
|
}
|
|
94
108
|
return indexes;
|
|
95
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/introspect/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAK7B,OAAO,
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/introspect/sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -263,6 +263,13 @@ export interface AllowOptions {
|
|
|
263
263
|
dropIndex?: boolean;
|
|
264
264
|
dropFk?: boolean;
|
|
265
265
|
dropCheck?: boolean;
|
|
266
|
+
/**
|
|
267
|
+
* Gates a REAL view removal (present in the DB, absent from the model) — like
|
|
268
|
+
* every other drop. The internal drop/create recreate pair the diff emits
|
|
269
|
+
* around a column-altering change to a view's source table is NOT gated (the
|
|
270
|
+
* view is re-created in the same migration).
|
|
271
|
+
*/
|
|
272
|
+
dropView?: boolean;
|
|
266
273
|
/** Existing data must satisfy NOT NULL; diff cannot verify this. */
|
|
267
274
|
nullableToNotNull?: boolean;
|
|
268
275
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAO7C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,8EAA8E;IAC9E,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAChC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAMD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACvG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACzF;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACtG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACzH;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACzG;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAC3E,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAC/E,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAC9E,IAAI,CAAC,EAAE,aAAa,CAAC;IAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACnG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACtH;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAC1F;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAC7G;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACnG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAEtH;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACpF;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AAE1F,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mFAAmF;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,wBAAwB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACzC,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CACxC,GACD;IACE,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEN,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAElE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAErF,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iGAAiG;IACjG,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAMD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaobjectsdev/migrate-ts",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.21-rc.1",
|
|
4
4
|
"description": "Schema migration tooling for MetaObjects: diff metadata vs DB and emit SQL for Postgres and SQLite.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@iarna/toml": "^2.2.5",
|
|
48
|
-
"@metaobjectsdev/metadata": "0.15.
|
|
48
|
+
"@metaobjectsdev/metadata": "0.15.21-rc.1"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"kysely": ">=0.27.0"
|
package/src/diff/index.ts
CHANGED
|
@@ -192,11 +192,16 @@ export async function diff(
|
|
|
192
192
|
if (!actualTable) continue;
|
|
193
193
|
diffTableColumns(expectedTable, actualTable, changes);
|
|
194
194
|
diffTableIndexes(expectedTable, actualTable, changes);
|
|
195
|
-
diffTableForeignKeys(expectedTable, actualTable, changes);
|
|
196
|
-
// CHECK constraints on existing tables are evolved
|
|
197
|
-
//
|
|
198
|
-
//
|
|
199
|
-
|
|
195
|
+
diffTableForeignKeys(expectedTable, actualTable, changes, args.dialect);
|
|
196
|
+
// CHECK constraints on existing tables are evolved whenever a dialect is
|
|
197
|
+
// known (postgres: ALTER ADD/DROP CONSTRAINT; sqlite/d1: the emitter routes
|
|
198
|
+
// the check change through recreate-and-copy — checks are create-time-only
|
|
199
|
+
// inline there). Requires `actual.checks` to be populated: pg_constraint
|
|
200
|
+
// introspection, sqlite_master DDL parsing, or the offline snapshot. With
|
|
201
|
+
// no dialect (legacy positional callers) checks stay un-diffed — those
|
|
202
|
+
// callers may hold hand-built snapshots with empty check lists, and
|
|
203
|
+
// diffing them would re-propose every modeled check forever.
|
|
204
|
+
if (args.dialect !== undefined) diffTableChecks(expectedTable, actualTable, changes);
|
|
200
205
|
}
|
|
201
206
|
|
|
202
207
|
// Pass 2b: views. Identity is (schema, name). A name present on both sides
|
|
@@ -265,7 +270,17 @@ function diffTableColumns(
|
|
|
265
270
|
from: ac.nullable, to: ec.nullable, status: ALLOWED,
|
|
266
271
|
});
|
|
267
272
|
}
|
|
268
|
-
|
|
273
|
+
// An `identity: "uuid"` PK's physical DEFAULT is synthesized purely at DDL-emit
|
|
274
|
+
// time (sqlite/d1: `(lower(hex(randomblob(16))))`; postgres: `gen_random_uuid()`)
|
|
275
|
+
// and is deliberately never recorded as a ColumnDefault on the expected side —
|
|
276
|
+
// uuid generation is modeled as `identity`, not `default`. Introspection, however,
|
|
277
|
+
// reads that DEFAULT back off the live table as a real `expr` default, so comparing
|
|
278
|
+
// the two always disagrees — for every uuid-PK table, on every run, with zero
|
|
279
|
+
// metadata changes. On SQLite/D1 the false positive is destructive rather than
|
|
280
|
+
// merely noisy: there is no ALTER COLUMN, so the recreate-and-copy path rebuilds
|
|
281
|
+
// the WHOLE table. Identity-driven values are not ordinary defaults — don't diff
|
|
282
|
+
// them (`increment` gets this implicitly: an AUTOINCREMENT column has no DEFAULT).
|
|
283
|
+
if (ec.identity !== "uuid" && !columnDefaultsEqual(ec.default, ac.default)) {
|
|
269
284
|
const change: Change = {
|
|
270
285
|
kind: "change-column-default", table, ...sx, column: name,
|
|
271
286
|
status: ALLOWED,
|
|
@@ -314,29 +329,83 @@ function diffTableIndexes(
|
|
|
314
329
|
}
|
|
315
330
|
}
|
|
316
331
|
|
|
332
|
+
/**
|
|
333
|
+
* FK identity key. Postgres stores constraint names, so name IS the identity.
|
|
334
|
+
* SQLite does NOT store FK names at all (the emitter writes unnamed FOREIGN KEY
|
|
335
|
+
* clauses; pragma_foreign_key_list has no name column), so introspection can only
|
|
336
|
+
* SYNTHESIZE a name — which diverges from the expected side for any composite FK
|
|
337
|
+
* (`t_a_fk` vs `t_a_b_fk`) and for every `@constraintName` override, producing a
|
|
338
|
+
* phantom drop-fk/add-fk (and thus a recreate-and-copy, or a permanently blocked
|
|
339
|
+
* migrate) on every run. On sqlite/d1 the FK's real identity is its COLUMN SET:
|
|
340
|
+
* key on that and let fkEquals (which never compares names) catch genuine
|
|
341
|
+
* refTable/refColumns/action changes as drop+add.
|
|
342
|
+
*
|
|
343
|
+
* If the same column set carries two FKs (possible in SQL, never produced by
|
|
344
|
+
* buildExpectedSchema), the map would silently collapse them — fall back to
|
|
345
|
+
* name-keying for that table rather than mis-diff.
|
|
346
|
+
*/
|
|
347
|
+
function fkColsKey(f: FkDescriptor): string {
|
|
348
|
+
return f.columns.join("\u001f");
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Decide the FK keying mode for a table, considering BOTH sides at once.
|
|
353
|
+
*
|
|
354
|
+
* Structural (column-set) keying is what makes sqlite/d1 converge — the engine stores no
|
|
355
|
+
* FK names, so introspection synthesizes them and they can never match a composite or
|
|
356
|
+
* `@constraintName`-overridden expected name. But the duplicate-column-set fallback MUST
|
|
357
|
+
* be decided jointly: deciding it per side lets one side key by column set while the
|
|
358
|
+
* other keys by (synthesized, colliding) name, so even the FK that genuinely MATCHES
|
|
359
|
+
* mis-diffs into a phantom add + drops of both actual FKs.
|
|
360
|
+
*/
|
|
361
|
+
function fkKeyingIsStructural(
|
|
362
|
+
expected: readonly FkDescriptor[],
|
|
363
|
+
actual: readonly FkDescriptor[],
|
|
364
|
+
dialect: Dialect | undefined,
|
|
365
|
+
): boolean {
|
|
366
|
+
if (dialect !== "sqlite" && dialect !== "d1") return false;
|
|
367
|
+
const distinct = (fks: readonly FkDescriptor[]): boolean =>
|
|
368
|
+
new Set(fks.map(fkColsKey)).size === fks.length;
|
|
369
|
+
// Either side carrying duplicate column sets → structural keying would drop one; both
|
|
370
|
+
// sides fall back to names together.
|
|
371
|
+
return distinct(expected) && distinct(actual);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function fkMapFor(
|
|
375
|
+
fks: readonly FkDescriptor[],
|
|
376
|
+
structural: boolean,
|
|
377
|
+
): Map<string, FkDescriptor> {
|
|
378
|
+
return new Map(fks.map((f) => [structural ? fkColsKey(f) : f.name, f] as const));
|
|
379
|
+
}
|
|
380
|
+
|
|
317
381
|
function diffTableForeignKeys(
|
|
318
382
|
expected: TableDescriptor,
|
|
319
383
|
actual: TableDescriptor,
|
|
320
384
|
changes: Change[],
|
|
385
|
+
dialect: Dialect | undefined,
|
|
321
386
|
): void {
|
|
322
387
|
const table = expected.name;
|
|
323
388
|
const sx = schemaSpread(expected.schema);
|
|
324
|
-
const
|
|
325
|
-
const
|
|
326
|
-
|
|
327
|
-
|
|
389
|
+
const structuralFk = fkKeyingIsStructural(expected.foreignKeys, actual.foreignKeys, dialect);
|
|
390
|
+
const expectedFk = fkMapFor(expected.foreignKeys, structuralFk);
|
|
391
|
+
const actualFk = fkMapFor(actual.foreignKeys, structuralFk);
|
|
392
|
+
// NOTE: the map key is the FK's identity (name on postgres; column set on
|
|
393
|
+
// sqlite/d1 — see fkMapFor). Change records always carry the DESCRIPTOR's
|
|
394
|
+
// constraint name, never the key.
|
|
395
|
+
for (const [key, fk] of expectedFk) {
|
|
396
|
+
const a = actualFk.get(key);
|
|
328
397
|
if (!a) {
|
|
329
398
|
changes.push({ kind: "add-fk", table, ...sx, fk, status: ALLOWED });
|
|
330
399
|
} else if (!fkEquals(fk, a)) {
|
|
331
400
|
// FK shape changed: drop + add. restore = the ACTUAL shape so the down
|
|
332
401
|
// re-creates the original FK.
|
|
333
|
-
changes.push({ kind: "drop-fk", table, ...sx, fk: name, restore: a, status: ALLOWED });
|
|
402
|
+
changes.push({ kind: "drop-fk", table, ...sx, fk: a.name, restore: a, status: ALLOWED });
|
|
334
403
|
changes.push({ kind: "add-fk", table, ...sx, fk, status: ALLOWED });
|
|
335
404
|
}
|
|
336
405
|
}
|
|
337
|
-
for (const [
|
|
338
|
-
if (!expectedFk.has(
|
|
339
|
-
changes.push({ kind: "drop-fk", table, ...sx, fk: name, restore: af, status: ALLOWED });
|
|
406
|
+
for (const [key, af] of actualFk) {
|
|
407
|
+
if (!expectedFk.has(key)) {
|
|
408
|
+
changes.push({ kind: "drop-fk", table, ...sx, fk: af.name, restore: af, status: ALLOWED });
|
|
340
409
|
}
|
|
341
410
|
}
|
|
342
411
|
}
|
package/src/diff/status.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import type { Change, AllowOptions } from "../types.js";
|
|
2
2
|
import { isWidening } from "../sql-type.js";
|
|
3
|
+
import { DEFAULT_DB_SCHEMA_POSTGRES } from "@metaobjectsdev/metadata";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A view's identity is (schema, name) — NOT the bare name. Keying the recreate-pair
|
|
7
|
+
* exemption on the name alone let a same-named view in a DIFFERENT schema inherit the
|
|
8
|
+
* exemption: an expected `reporting.summary` being rebuilt (create-view) would un-gate a
|
|
9
|
+
* destructive DROP of an unmodeled, hand-written `public.summary`. Normalize the absent
|
|
10
|
+
* schema to the postgres default so expected (often undefined) compares equal to
|
|
11
|
+
* introspected (always populated).
|
|
12
|
+
*/
|
|
13
|
+
function viewIdentity(name: string, schema: string | undefined): string {
|
|
14
|
+
return (schema ?? DEFAULT_DB_SCHEMA_POSTGRES) + "." + name;
|
|
15
|
+
}
|
|
3
16
|
|
|
4
17
|
/**
|
|
5
18
|
* Mutates each Change's `status` field per the rules in spec §6.5.
|
|
@@ -7,8 +20,19 @@ import { isWidening } from "../sql-type.js";
|
|
|
7
20
|
* `allow.*` flag is set.
|
|
8
21
|
*/
|
|
9
22
|
export function applyStatus(changes: Change[], allow: AllowOptions = {}): void {
|
|
23
|
+
// A drop-view paired with a create-view/replace-view for the SAME view in this
|
|
24
|
+
// change list is the diff's internal recreate around a column-altering change
|
|
25
|
+
// (Pass 2c) — the view survives the migration, so it is not a destructive drop
|
|
26
|
+
// and must not require allow.dropView. Only an unpaired drop-view (the view is
|
|
27
|
+
// gone from the model, or was never modeled) is a real removal.
|
|
28
|
+
const recreatedViews = new Set<string>();
|
|
10
29
|
for (const c of changes) {
|
|
11
|
-
|
|
30
|
+
if (c.kind === "create-view" || c.kind === "replace-view") {
|
|
31
|
+
recreatedViews.add(viewIdentity(c.view.name, c.schema));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
for (const c of changes) {
|
|
35
|
+
const blockedReason = blockedReasonFor(c, allow, recreatedViews);
|
|
12
36
|
if (blockedReason !== null) {
|
|
13
37
|
c.status = { state: "blocked", blockedReason };
|
|
14
38
|
} else {
|
|
@@ -17,7 +41,11 @@ export function applyStatus(changes: Change[], allow: AllowOptions = {}): void {
|
|
|
17
41
|
}
|
|
18
42
|
}
|
|
19
43
|
|
|
20
|
-
function blockedReasonFor(
|
|
44
|
+
function blockedReasonFor(
|
|
45
|
+
c: Change,
|
|
46
|
+
allow: AllowOptions,
|
|
47
|
+
recreatedViews: ReadonlySet<string>,
|
|
48
|
+
): string | null {
|
|
21
49
|
switch (c.kind) {
|
|
22
50
|
case "drop-column":
|
|
23
51
|
return allow.dropColumn ? null : "destructive: drop-column not allowed (pass allow.dropColumn)";
|
|
@@ -29,6 +57,10 @@ function blockedReasonFor(c: Change, allow: AllowOptions): string | null {
|
|
|
29
57
|
return allow.dropFk ? null : "destructive: drop-fk not allowed (pass allow.dropFk)";
|
|
30
58
|
case "drop-check":
|
|
31
59
|
return allow.dropCheck ? null : "destructive: drop-check not allowed (pass allow.dropCheck)";
|
|
60
|
+
case "drop-view":
|
|
61
|
+
// Identity, not bare name — see viewIdentity().
|
|
62
|
+
if (recreatedViews.has(viewIdentity(c.view, c.schema))) return null; // recreate pair — view survives
|
|
63
|
+
return allow.dropView ? null : "destructive: drop-view not allowed (pass allow.dropView)";
|
|
32
64
|
|
|
33
65
|
case "change-column-type":
|
|
34
66
|
if (isWidening(c.from, c.to)) return null; // widening always allowed
|
|
@@ -51,7 +83,6 @@ function blockedReasonFor(c: Change, allow: AllowOptions): string | null {
|
|
|
51
83
|
case "add-fk":
|
|
52
84
|
case "add-check":
|
|
53
85
|
case "create-view":
|
|
54
|
-
case "drop-view":
|
|
55
86
|
case "replace-view":
|
|
56
87
|
return null;
|
|
57
88
|
}
|