@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.
@@ -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;AAC3D,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,CAOhF;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CA0CjE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAMzD"}
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
- // SQLite stores literal string defaults with surrounding quotes.
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":"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"}
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;AAOrB,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAmCnG"}
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 'sqlite_%' AND name NOT LIKE '__new_%'
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
- checks: [], // CHECK introspection is out of scope; expected-side derives them
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 'sqlite_%'
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
- if (ix.partial === 1)
84
- continue; // partial indexes deferred to v0.3
85
- const cols = await sql `
86
- SELECT seqno, cid, name FROM pragma_index_info(${ix.name}) ORDER BY seqno
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
- name: ix.name,
90
- columns: cols.rows.map((c) => c.name),
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":"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"}
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
  }
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaobjectsdev/migrate-ts",
3
- "version": "0.15.20",
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.20"
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 for postgres only (SQLite
197
- // evolves checks via table recreate, not ALTER). Gated on `actual.checks`
198
- // being populated by the snapshot offline, or pg_constraint introspection.
199
- if (args.dialect === "postgres") diffTableChecks(expectedTable, actualTable, changes);
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
- if (!columnDefaultsEqual(ec.default, ac.default)) {
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 expectedFk = new Map(expected.foreignKeys.map((f) => [f.name, f]));
325
- const actualFk = new Map(actual.foreignKeys.map((f) => [f.name, f]));
326
- for (const [name, fk] of expectedFk) {
327
- const a = actualFk.get(name);
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 [name, af] of actualFk) {
338
- if (!expectedFk.has(name)) {
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
  }
@@ -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
- const blockedReason = blockedReasonFor(c, allow);
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(c: Change, allow: AllowOptions): string | null {
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
  }