@metaobjectsdev/migrate-ts 0.10.0 → 0.11.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/diff/index.d.ts +16 -0
- package/dist/diff/index.d.ts.map +1 -1
- package/dist/diff/index.js +44 -5
- package/dist/diff/index.js.map +1 -1
- package/dist/emit/postgres.js +13 -1
- package/dist/emit/postgres.js.map +1 -1
- package/dist/expected-schema.d.ts.map +1 -1
- package/dist/expected-schema.js +136 -7
- package/dist/expected-schema.js.map +1 -1
- package/dist/introspect/postgres.d.ts +10 -3
- package/dist/introspect/postgres.d.ts.map +1 -1
- package/dist/introspect/postgres.js +89 -12
- package/dist/introspect/postgres.js.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/diff/index.ts +63 -5
- package/src/emit/postgres.ts +13 -1
- package/src/expected-schema.ts +148 -6
- package/src/introspect/postgres.ts +113 -16
- package/src/types.ts +25 -0
|
@@ -110,24 +110,35 @@ export function pgTypeToSqlType(dataType, maxLength) {
|
|
|
110
110
|
* Returns undefined if the default is absent or empty.
|
|
111
111
|
*
|
|
112
112
|
* Classification rules:
|
|
113
|
-
* - Expressions: now(), CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME,
|
|
114
|
-
* nextval(...),
|
|
115
|
-
*
|
|
113
|
+
* - Expressions: now(), CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME, and any
|
|
114
|
+
* bare function-call (e.g. nextval(...), gen_random_uuid(), uuid_generate_v4()),
|
|
115
|
+
* plus any value that starts with a non-quote character and contains a `::` cast
|
|
116
|
+
* (i.e. bare identifier with cast, like `NULL::text`).
|
|
116
117
|
* - Literals: `'value'` (optionally followed by `::type` cast, which PG
|
|
117
118
|
* commonly appends for clarity). The cast is stripped; the value is unquoted.
|
|
118
119
|
*
|
|
119
120
|
* PG stores literal booleans as `'true'::boolean`, integers as `'42'::integer`,
|
|
120
121
|
* strings as `'hello'::text` — all are literals after stripping the cast.
|
|
122
|
+
*
|
|
123
|
+
* The bare function-call rule keeps this in lockstep with the metadata-side
|
|
124
|
+
* default classifier (expected-schema's EXPR_DEFAULT_PATTERNS, which treats any
|
|
125
|
+
* `()` default as an expression): without it, a `gen_random_uuid()` column default
|
|
126
|
+
* round-trips as a literal here but an expression there, producing a spurious
|
|
127
|
+
* column diff on every uuid-PK table.
|
|
121
128
|
*/
|
|
122
129
|
export function parsePgDefault(raw) {
|
|
123
130
|
if (raw === undefined || raw === null || raw === "")
|
|
124
131
|
return undefined;
|
|
125
|
-
// Function-call or keyword expressions
|
|
132
|
+
// Function-call or keyword expressions. The leading-identifier-then-"(" rule
|
|
133
|
+
// matches any bare function call (gen_random_uuid(), uuid_generate_v4(), …)
|
|
134
|
+
// while never matching a quoted literal (those start with a single quote and are
|
|
135
|
+
// handled below).
|
|
126
136
|
if (/^now\(\)$/i.test(raw) ||
|
|
127
137
|
/^current_timestamp\b/i.test(raw) ||
|
|
128
138
|
/^current_date\b/i.test(raw) ||
|
|
129
139
|
/^current_time\b/i.test(raw) ||
|
|
130
|
-
/^nextval\(/i.test(raw)
|
|
140
|
+
/^nextval\(/i.test(raw) ||
|
|
141
|
+
/^[a-zA-Z_][\w.]*\s*\(/.test(raw)) {
|
|
131
142
|
return { kind: "expr", value: raw };
|
|
132
143
|
}
|
|
133
144
|
// If it starts with a single-quote, it's a quoted literal (possibly with
|
|
@@ -243,6 +254,10 @@ async function readPgIndexes(k, schema, table) {
|
|
|
243
254
|
// pg-mem gap: array_position() is not implemented, so this query throws on
|
|
244
255
|
// pg-mem. We catch and return [] so non-index tests still pass against pg-mem.
|
|
245
256
|
// Real PG (Postgres 16) handles this correctly.
|
|
257
|
+
// One row per index KEY, in key order, carrying: the column name (NULL for an
|
|
258
|
+
// expression key — attnum 0), the DESC bit from `indoption`, and the partial-index
|
|
259
|
+
// predicate (`indpred`, constant per index). unnest WITH ORDINALITY over indkey +
|
|
260
|
+
// indoption keeps the key order and pairs each key with its option flags.
|
|
246
261
|
let rows;
|
|
247
262
|
try {
|
|
248
263
|
rows = await sql `
|
|
@@ -250,33 +265,95 @@ async function readPgIndexes(k, schema, table) {
|
|
|
250
265
|
ix.indisunique AS is_unique,
|
|
251
266
|
ix.indisprimary AS is_primary,
|
|
252
267
|
a.attname AS column_name,
|
|
253
|
-
|
|
268
|
+
k.ord AS ordinal,
|
|
269
|
+
(COALESCE(opt.option, 0) & 1) = 1 AS is_desc,
|
|
270
|
+
pg_get_expr(ix.indpred, ix.indrelid) AS predicate,
|
|
271
|
+
am.amname AS access_method,
|
|
272
|
+
pg_get_indexdef(ix.indexrelid) AS indexdef
|
|
254
273
|
FROM pg_index ix
|
|
255
274
|
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
256
275
|
JOIN pg_class t ON t.oid = ix.indrelid
|
|
257
276
|
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
258
|
-
JOIN
|
|
277
|
+
JOIN pg_am am ON am.oid = i.relam
|
|
278
|
+
CROSS JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, ord)
|
|
279
|
+
LEFT JOIN LATERAL unnest(ix.indoption) WITH ORDINALITY AS opt(option, oord)
|
|
280
|
+
ON opt.oord = k.ord
|
|
281
|
+
LEFT JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = k.attnum
|
|
259
282
|
WHERE n.nspname = ${schema}
|
|
260
283
|
AND t.relname = ${table}
|
|
261
|
-
ORDER BY i.relname,
|
|
284
|
+
ORDER BY i.relname, k.ord
|
|
262
285
|
`.execute(k);
|
|
263
286
|
}
|
|
264
287
|
catch {
|
|
265
|
-
// pg-mem:
|
|
288
|
+
// pg-mem: unnest WITH ORDINALITY / pg_get_expr unsupported — return empty list.
|
|
266
289
|
return [];
|
|
267
290
|
}
|
|
268
291
|
const byName = new Map();
|
|
269
292
|
for (const r of rows.rows) {
|
|
270
293
|
let entry = byName.get(r.index_name);
|
|
271
294
|
if (!entry) {
|
|
272
|
-
entry = {
|
|
295
|
+
entry = {
|
|
296
|
+
isUnique: r.is_unique,
|
|
297
|
+
isPrimary: r.is_primary,
|
|
298
|
+
cols: [],
|
|
299
|
+
orders: [],
|
|
300
|
+
predicate: r.predicate,
|
|
301
|
+
hasExpressionKey: false,
|
|
302
|
+
accessMethod: r.access_method,
|
|
303
|
+
indexdef: r.indexdef,
|
|
304
|
+
};
|
|
273
305
|
byName.set(r.index_name, entry);
|
|
274
306
|
}
|
|
275
|
-
|
|
307
|
+
if (r.column_name === null) {
|
|
308
|
+
// Expression key (attnum 0) — captured from the index def below.
|
|
309
|
+
entry.hasExpressionKey = true;
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
entry.cols.push(r.column_name);
|
|
313
|
+
entry.orders.push(r.is_desc ? "desc" : "asc");
|
|
314
|
+
}
|
|
276
315
|
}
|
|
277
316
|
return Array.from(byName.entries())
|
|
278
317
|
.filter(([, v]) => !v.isPrimary) // PK index excluded — PK lives in TableDescriptor.primaryKey
|
|
279
|
-
.map(([name, v]) =>
|
|
318
|
+
.map(([name, v]) => {
|
|
319
|
+
const using = v.accessMethod !== "btree" ? v.accessMethod : undefined;
|
|
320
|
+
if (v.hasExpressionKey) {
|
|
321
|
+
// Functional/expression index: lift the raw key expression out of the
|
|
322
|
+
// index def (between `USING <am> (` and its matching `)`, before WHERE).
|
|
323
|
+
const ix = { name, columns: [], unique: v.isUnique, expr: indexDefKeyExpr(v.indexdef) };
|
|
324
|
+
if (using)
|
|
325
|
+
ix.using = using;
|
|
326
|
+
if (v.predicate !== null)
|
|
327
|
+
ix.where = v.predicate;
|
|
328
|
+
return ix;
|
|
329
|
+
}
|
|
330
|
+
const ix = { name, columns: v.cols, unique: v.isUnique };
|
|
331
|
+
if (using)
|
|
332
|
+
ix.using = using;
|
|
333
|
+
if (v.orders.some((o) => o === "desc"))
|
|
334
|
+
ix.orders = v.orders;
|
|
335
|
+
if (v.predicate !== null)
|
|
336
|
+
ix.where = v.predicate;
|
|
337
|
+
return ix;
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
/** Extract the raw key-expression text from a pg index def — the balanced `(...)`
|
|
341
|
+
* after `USING <method> `, stripped of a trailing partial-index `WHERE`. */
|
|
342
|
+
function indexDefKeyExpr(indexdef) {
|
|
343
|
+
const open = indexdef.indexOf("(", indexdef.indexOf(" USING "));
|
|
344
|
+
if (open === -1)
|
|
345
|
+
return indexdef;
|
|
346
|
+
let depth = 0;
|
|
347
|
+
for (let i = open; i < indexdef.length; i++) {
|
|
348
|
+
if (indexdef[i] === "(")
|
|
349
|
+
depth++;
|
|
350
|
+
else if (indexdef[i] === ")") {
|
|
351
|
+
depth--;
|
|
352
|
+
if (depth === 0)
|
|
353
|
+
return indexdef.slice(open + 1, i).trim();
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return indexdef.slice(open + 1).trim();
|
|
280
357
|
}
|
|
281
358
|
async function readPgForeignKeys(k, schema, table) {
|
|
282
359
|
// pg-mem gap: information_schema.referential_constraints is not supported —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/introspect/postgres.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/introspect/postgres.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -55,6 +55,31 @@ export interface IndexDescriptor {
|
|
|
55
55
|
name: string;
|
|
56
56
|
columns: string[];
|
|
57
57
|
unique: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Per-column sort direction, positional to `columns`. Omitted (or "asc") = the
|
|
60
|
+
* default ascending order, which Postgres does not render in an index def. A
|
|
61
|
+
* "desc" entry emits `<col> DESC` and is compared against the introspected
|
|
62
|
+
* `pg_index.indoption` DESC bit. Absent ⇒ all-ascending.
|
|
63
|
+
*/
|
|
64
|
+
orders?: ("asc" | "desc")[];
|
|
65
|
+
/**
|
|
66
|
+
* Partial-index predicate (raw SQL, e.g. `delivered_at IS NULL`). Emitted as a
|
|
67
|
+
* trailing `WHERE (<predicate>)`; compared against the introspected
|
|
68
|
+
* `pg_get_expr(indpred, …)` after expression normalization. Absent ⇒ full index.
|
|
69
|
+
*/
|
|
70
|
+
where?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Raw key EXPRESSION for a functional/expression index (e.g. `lower((email)::text)`).
|
|
73
|
+
* When present, the index key is this expression and `columns` is empty —
|
|
74
|
+
* emitted as `(<expr>)` and compared against the introspected `pg_get_indexdef`
|
|
75
|
+
* key after normalization.
|
|
76
|
+
*/
|
|
77
|
+
expr?: string;
|
|
78
|
+
/**
|
|
79
|
+
* Index access method (`gin`, `gist`, `hash`, …). Absent / `btree` is the
|
|
80
|
+
* default and not rendered. Emitted as `USING <method>` before the key list.
|
|
81
|
+
*/
|
|
82
|
+
using?: string;
|
|
58
83
|
}
|
|
59
84
|
export interface CheckDescriptor {
|
|
60
85
|
/** Constraint name, e.g. `<table>_<column>_chk`. Diff/identity key. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
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.
|
|
3
|
+
"version": "0.11.0",
|
|
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.
|
|
48
|
+
"@metaobjectsdev/metadata": "0.11.0"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"kysely": ">=0.27.0"
|
package/src/diff/index.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { sqlTypeEquals } from "../sql-type.js";
|
|
|
8
8
|
import { applyStatus } from "./status.js";
|
|
9
9
|
import { detectColumnRenames, detectTableRenames } from "./rename-heuristic.js";
|
|
10
10
|
import { viewSqlEquals } from "../view-sql-compare.js";
|
|
11
|
-
import { checkExprEquals } from "../check-expr-compare.js";
|
|
11
|
+
import { checkExprEquals, normalizeCheckExpr } from "../check-expr-compare.js";
|
|
12
12
|
import { DEFAULT_DB_SCHEMA_POSTGRES } from "@metaobjectsdev/metadata";
|
|
13
13
|
|
|
14
14
|
export interface DiffArgs {
|
|
@@ -27,6 +27,22 @@ export interface DiffArgs {
|
|
|
27
27
|
* the default. Pass additional patterns to extend.
|
|
28
28
|
*/
|
|
29
29
|
ignoreTables?: string[];
|
|
30
|
+
/**
|
|
31
|
+
* Restrict the diff to a set of DB schemas. A table whose schema is not in this
|
|
32
|
+
* set is excluded from BOTH sides — neither created/altered nor dropped.
|
|
33
|
+
*
|
|
34
|
+
* When omitted, the scope is **auto-derived from the schemas the expected
|
|
35
|
+
* (metadata) side declares**: the model manages only the schemas it actually
|
|
36
|
+
* mentions, so a table living in a schema the model never declares belongs to
|
|
37
|
+
* another owner (e.g. a downstream app's schema sharing the same database) and is
|
|
38
|
+
* left untouched. This makes per-owner drift gates clean without manual config —
|
|
39
|
+
* a model that declares only `public` ignores a co-located downstream-app schema,
|
|
40
|
+
* and vice versa. Pass an explicit set to override; pass nothing for the smart default.
|
|
41
|
+
*
|
|
42
|
+
* Auto-scoping is skipped when the expected side declares no tables at all
|
|
43
|
+
* (nothing to manage → prior whole-DB behavior is preserved).
|
|
44
|
+
*/
|
|
45
|
+
scopeSchemas?: string[];
|
|
30
46
|
/** Dialect; CHECK-constraint evolution on existing tables is emitted for postgres only. */
|
|
31
47
|
dialect?: Dialect;
|
|
32
48
|
}
|
|
@@ -101,16 +117,34 @@ export async function diff(
|
|
|
101
117
|
const changes: Change[] = [];
|
|
102
118
|
|
|
103
119
|
const ignorePatterns = args.ignoreTables ?? DEFAULT_IGNORE_TABLES;
|
|
120
|
+
|
|
121
|
+
// Schema scope (see DiffArgs.scopeSchemas): an explicit set, else the schemas the
|
|
122
|
+
// expected/metadata side declares (the smart default — the model owns only the
|
|
123
|
+
// schemas it mentions), else null = no scoping (empty model → prior whole-DB
|
|
124
|
+
// behavior). A table outside the scope is excluded from both sides, so a
|
|
125
|
+
// co-located schema owned by another app is neither dropped nor reported.
|
|
126
|
+
const declaredSchemas = new Set(
|
|
127
|
+
args.expected.tables.map((t) => t.schema ?? DEFAULT_DB_SCHEMA_POSTGRES),
|
|
128
|
+
);
|
|
129
|
+
const scopeSchemas: Set<string> | null =
|
|
130
|
+
args.scopeSchemas !== undefined
|
|
131
|
+
? new Set(args.scopeSchemas)
|
|
132
|
+
: declaredSchemas.size > 0
|
|
133
|
+
? declaredSchemas
|
|
134
|
+
: null;
|
|
135
|
+
const inScope = (schema: string | undefined): boolean =>
|
|
136
|
+
scopeSchemas === null || scopeSchemas.has(schema ?? DEFAULT_DB_SCHEMA_POSTGRES);
|
|
137
|
+
|
|
104
138
|
// Key tables on (schema, name) identity — same table name in different schemas
|
|
105
139
|
// are distinct entities. tableIdentity normalizes undefined → "public".
|
|
106
140
|
const expectedTables = new Map(
|
|
107
141
|
args.expected.tables
|
|
108
|
-
.filter((t) => !shouldIgnoreTable(t.name, ignorePatterns))
|
|
142
|
+
.filter((t) => !shouldIgnoreTable(t.name, ignorePatterns) && inScope(t.schema))
|
|
109
143
|
.map((t) => [tableIdentity(t), t] as const),
|
|
110
144
|
);
|
|
111
145
|
const actualTables = new Map(
|
|
112
146
|
args.actual.tables
|
|
113
|
-
.filter((t) => !shouldIgnoreTable(t.name, ignorePatterns))
|
|
147
|
+
.filter((t) => !shouldIgnoreTable(t.name, ignorePatterns) && inScope(t.schema))
|
|
114
148
|
.map((t) => [tableIdentity(t), t] as const),
|
|
115
149
|
);
|
|
116
150
|
|
|
@@ -168,7 +202,11 @@ export async function diff(
|
|
|
168
202
|
// Pass 2b: views. Identity is (schema, name). A name present on both sides
|
|
169
203
|
// with a divergent body (whitespace-/wrapper-normalized) emits replace-view;
|
|
170
204
|
// introspect now reads the actual body so view-body drift is visible.
|
|
171
|
-
diffViews(
|
|
205
|
+
diffViews(
|
|
206
|
+
args.expected.views.filter((v) => inScope(v.schema)),
|
|
207
|
+
args.actual.views.filter((v) => inScope(v.schema)),
|
|
208
|
+
changes,
|
|
209
|
+
);
|
|
172
210
|
|
|
173
211
|
// Pass 3: detect table renames BEFORE column renames — so a renamed table's
|
|
174
212
|
// columns are not scanned as orphaned drop/add pairs.
|
|
@@ -354,8 +392,28 @@ function columnDefaultsEqual(a: ColumnDescriptor["default"], b: ColumnDescriptor
|
|
|
354
392
|
|
|
355
393
|
function indexEquals(a: IndexDescriptor, b: IndexDescriptor): boolean {
|
|
356
394
|
if (a.unique !== b.unique) return false;
|
|
395
|
+
// Access method: absent = "btree" (the default).
|
|
396
|
+
if ((a.using ?? "btree") !== (b.using ?? "btree")) return false;
|
|
397
|
+
// Expression-key index: compare the normalized key expression (same canonicalizer
|
|
398
|
+
// as predicates). Both-absent = plain index; one-absent = different.
|
|
399
|
+
if ((a.expr === undefined) !== (b.expr === undefined)) return false;
|
|
400
|
+
if (a.expr !== undefined && b.expr !== undefined) {
|
|
401
|
+
if (normalizeCheckExpr(a.expr) !== normalizeCheckExpr(b.expr)) return false;
|
|
402
|
+
}
|
|
357
403
|
if (a.columns.length !== b.columns.length) return false;
|
|
358
|
-
|
|
404
|
+
if (!a.columns.every((c, i) => c === b.columns[i])) return false;
|
|
405
|
+
// Per-column ordering: an absent `orders` means all-ascending, so compare against
|
|
406
|
+
// a normalized array (default "asc") rather than requiring both to be present.
|
|
407
|
+
const orderAt = (ix: IndexDescriptor, i: number): "asc" | "desc" => ix.orders?.[i] ?? "asc";
|
|
408
|
+
if (a.columns.some((_, i) => orderAt(a, i) !== orderAt(b, i))) return false;
|
|
409
|
+
// Partial-index predicate: normalize (reuse the CHECK-expr canonicalizer — same PG
|
|
410
|
+
// rewrites: casts, parens, whitespace) so an authored predicate compares equal to
|
|
411
|
+
// the introspected `pg_get_expr` form. Both-absent = equal; one-absent = different.
|
|
412
|
+
if ((a.where === undefined) !== (b.where === undefined)) return false;
|
|
413
|
+
if (a.where !== undefined && b.where !== undefined) {
|
|
414
|
+
if (normalizeCheckExpr(a.where) !== normalizeCheckExpr(b.where)) return false;
|
|
415
|
+
}
|
|
416
|
+
return true;
|
|
359
417
|
}
|
|
360
418
|
|
|
361
419
|
function fkEquals(a: FkDescriptor, b: FkDescriptor): boolean {
|
package/src/emit/postgres.ts
CHANGED
|
@@ -213,9 +213,21 @@ function renderDefault(d: ColumnDefault): string {
|
|
|
213
213
|
|
|
214
214
|
function renderCreateIndex(table: string, schema: string | undefined, ix: IndexDescriptor): string {
|
|
215
215
|
const u = ix.unique ? "UNIQUE " : "";
|
|
216
|
+
// Key list: a raw expression (functional/expression index) takes precedence over
|
|
217
|
+
// the per-column list. The expression is emitted verbatim (already valid SQL).
|
|
218
|
+
const keys = ix.expr
|
|
219
|
+
? ix.expr
|
|
220
|
+
: ix.columns
|
|
221
|
+
.map((c, i) => (ix.orders?.[i] === "desc" ? `${quote(c)} DESC` : quote(c)))
|
|
222
|
+
.join(", ");
|
|
223
|
+
// Access method: btree is the default and intentionally not rendered (matches PG's
|
|
224
|
+
// canonical def); anything else (gin/gist/hash/…) is emitted as `USING <method>`.
|
|
225
|
+
const using = ix.using && ix.using !== "btree" ? ` USING ${ix.using}` : "";
|
|
226
|
+
// Partial-index predicate, when present.
|
|
227
|
+
const where = ix.where ? ` WHERE (${ix.where})` : "";
|
|
216
228
|
// Index name itself is unqualified in CREATE INDEX (Postgres places the index
|
|
217
229
|
// in the same schema as the table being indexed). Only the ON clause needs qualification.
|
|
218
|
-
return `CREATE ${u}INDEX ${quote(ix.name)} ON ${quoteQualified(table, schema)} (${
|
|
230
|
+
return `CREATE ${u}INDEX ${quote(ix.name)} ON ${quoteQualified(table, schema)}${using} (${keys})${where};`;
|
|
219
231
|
}
|
|
220
232
|
|
|
221
233
|
function renderAddFk(table: string, schema: string | undefined, fk: FkDescriptor): string {
|
package/src/expected-schema.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { ColumnNamingStrategy, MetaData, MetaObject, MetaRoot, MetaValidator } from "@metaobjectsdev/metadata";
|
|
2
2
|
import {
|
|
3
3
|
VALIDATOR_SUBTYPE_NUMERIC, VALIDATOR_SUBTYPE_LENGTH, VALIDATOR_SUBTYPE_REGEX,
|
|
4
|
+
VALIDATOR_SUBTYPE_COMPARISON, VALIDATOR_SUBTYPE_REQUIRED_WHEN,
|
|
5
|
+
VALIDATOR_SUBTYPE_PRESENT_IFF, VALIDATOR_SUBTYPE_AT_LEAST_ONE,
|
|
4
6
|
VALIDATOR_ATTR_PATTERN,
|
|
7
|
+
VALIDATOR_ATTR_LEFT, VALIDATOR_ATTR_OP, VALIDATOR_ATTR_RIGHT,
|
|
8
|
+
VALIDATOR_ATTR_FIELD, VALIDATOR_ATTR_WHEN, VALIDATOR_ATTR_EQUALS, VALIDATOR_ATTR_FIELDS,
|
|
5
9
|
TYPE_OBJECT,
|
|
6
10
|
TYPE_FIELD,
|
|
7
11
|
OBJECT_ATTR_DISCRIMINATOR,
|
|
@@ -9,6 +13,11 @@ import {
|
|
|
9
13
|
MetaSource,
|
|
10
14
|
IDENTITY_ATTR_GENERATION,
|
|
11
15
|
IDENTITY_ATTR_UNIQUE,
|
|
16
|
+
IDENTITY_ATTR_ORDERS,
|
|
17
|
+
IDENTITY_ATTR_WHERE,
|
|
18
|
+
IDENTITY_ATTR_EXPR,
|
|
19
|
+
IDENTITY_ATTR_USING,
|
|
20
|
+
IDENTITY_ATTR_CONSTRAINT_NAME,
|
|
12
21
|
FIELD_ATTR_DEFAULT,
|
|
13
22
|
FIELD_ATTR_MAX_LENGTH,
|
|
14
23
|
FIELD_ATTR_PRECISION,
|
|
@@ -106,7 +115,14 @@ export function buildExpectedSchema(
|
|
|
106
115
|
entities.push({ entity: child as MetaObject, tableName: resolveTableName(child) });
|
|
107
116
|
}
|
|
108
117
|
const entityToTable = new Map(entities.map((e) => [e.entity.name, e.tableName]));
|
|
109
|
-
|
|
118
|
+
// A reference's targetEntity is package-qualified by the loader (e.g.
|
|
119
|
+
// "acme::a::Foo"), but entityToTable is keyed by the bare entity name ("Foo").
|
|
120
|
+
// Fall back to the bare suffix so cross-package FK targets resolve.
|
|
121
|
+
const resolveTargetTable = (entityName: string) =>
|
|
122
|
+
entityToTable.get(entityName) ??
|
|
123
|
+
(entityName.includes("::")
|
|
124
|
+
? entityToTable.get(entityName.slice(entityName.lastIndexOf("::") + 2))
|
|
125
|
+
: undefined);
|
|
110
126
|
|
|
111
127
|
// Pass 2: build full descriptors with FK resolution.
|
|
112
128
|
// Schema is resolved here (not stored in Pass 1) to avoid exactOptionalPropertyTypes
|
|
@@ -319,18 +335,42 @@ function buildSecondaryIndexes(
|
|
|
319
335
|
// Drizzle emits the index using the identity's @name attr directly (no table
|
|
320
336
|
// prefix), so the expected name must match.
|
|
321
337
|
for (const identity of entity.secondaryIdentities()) {
|
|
338
|
+
const exprRaw = identity.ownAttr(IDENTITY_ATTR_EXPR);
|
|
339
|
+
const expr = typeof exprRaw === "string" && exprRaw.trim().length > 0 ? exprRaw.trim() : undefined;
|
|
322
340
|
const fieldNames = readIdentityFields(identity);
|
|
323
|
-
|
|
341
|
+
// An expression index keys off @expr (not @fields); a plain index needs @fields.
|
|
342
|
+
if (fieldNames.length === 0 && expr === undefined) continue;
|
|
324
343
|
const cols = fieldNames.map((jsName) => {
|
|
325
344
|
const field = findField(entity, jsName);
|
|
326
345
|
return field ? resolveColumnName(field, strategy) : applyColumnNamingStrategy(jsName, strategy);
|
|
327
346
|
});
|
|
328
347
|
const uniqueAttr = identity.ownAttr(IDENTITY_ATTR_UNIQUE);
|
|
329
|
-
|
|
348
|
+
const index: IndexDescriptor = {
|
|
330
349
|
name: identity.name,
|
|
331
|
-
columns: cols,
|
|
350
|
+
columns: expr ? [] : cols,
|
|
332
351
|
unique: uniqueAttr !== false,
|
|
333
|
-
}
|
|
352
|
+
};
|
|
353
|
+
if (expr) index.expr = expr;
|
|
354
|
+
const usingRaw = identity.ownAttr(IDENTITY_ATTR_USING);
|
|
355
|
+
if (typeof usingRaw === "string" && usingRaw.trim().length > 0 && usingRaw.trim() !== "btree") {
|
|
356
|
+
index.using = usingRaw.trim();
|
|
357
|
+
}
|
|
358
|
+
// @orders — per-field sort direction (positional to @fields). Only attach when
|
|
359
|
+
// at least one field is descending (an all-ascending array is the default and
|
|
360
|
+
// must serialize identically to "no orders" for diff stability).
|
|
361
|
+
const ordersRaw = identity.ownAttr(IDENTITY_ATTR_ORDERS);
|
|
362
|
+
if (Array.isArray(ordersRaw)) {
|
|
363
|
+
const orders = cols.map((_, i) => (ordersRaw[i] === "desc" ? "desc" : "asc")) as (
|
|
364
|
+
"asc" | "desc"
|
|
365
|
+
)[];
|
|
366
|
+
if (orders.some((o) => o === "desc")) index.orders = orders;
|
|
367
|
+
}
|
|
368
|
+
// @where — partial-index predicate.
|
|
369
|
+
const whereRaw = identity.ownAttr(IDENTITY_ATTR_WHERE);
|
|
370
|
+
if (typeof whereRaw === "string" && whereRaw.trim().length > 0) {
|
|
371
|
+
index.where = whereRaw.trim();
|
|
372
|
+
}
|
|
373
|
+
indexes.push(index);
|
|
334
374
|
}
|
|
335
375
|
return indexes;
|
|
336
376
|
}
|
|
@@ -420,9 +460,105 @@ function buildChecks(
|
|
|
420
460
|
if (check) checks.push(check);
|
|
421
461
|
}
|
|
422
462
|
}
|
|
463
|
+
// Entity-scoped cross-field validators (comparison / requiredWhen / presentIff / atLeastOne).
|
|
464
|
+
for (const v of entity.validators()) {
|
|
465
|
+
const check = crossFieldCheck(v, entity, tableName, strategy, dialect);
|
|
466
|
+
if (check) checks.push(check);
|
|
467
|
+
}
|
|
423
468
|
return checks;
|
|
424
469
|
}
|
|
425
470
|
|
|
471
|
+
const COMPARISON_SQL_OP: Record<string, string> = {
|
|
472
|
+
gt: ">", gte: ">=", lt: "<", lte: "<=", ne: "<>", eq: "=",
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
/** Resolve a by-name field reference to its physical column (quoted) + the MetaField, or null. */
|
|
476
|
+
function resolveRef(
|
|
477
|
+
entity: MetaObject, name: unknown, strategy: ColumnNamingStrategy,
|
|
478
|
+
): { qcol: string; field: ReturnType<MetaObject["fields"]>[number] } | null {
|
|
479
|
+
if (typeof name !== "string" || name.length === 0) return null;
|
|
480
|
+
const field = entity.fields().find((f) => f.name === name);
|
|
481
|
+
if (!field) return null;
|
|
482
|
+
return { qcol: quoteCheckCol(resolveColumnName(field, strategy)), field };
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Render an @equals gating value as a SQL literal, typed by the gating field's
|
|
487
|
+
* subtype: boolean → TRUE/FALSE (1/0 on sqlite/d1), numeric → bare number,
|
|
488
|
+
* everything else → quoted string.
|
|
489
|
+
*/
|
|
490
|
+
function renderEquals(
|
|
491
|
+
raw: unknown, whenField: ReturnType<MetaObject["fields"]>[number], dialect: Dialect | undefined,
|
|
492
|
+
): string {
|
|
493
|
+
const s = String(raw);
|
|
494
|
+
if (whenField.subType === FIELD_SUBTYPE_BOOLEAN) {
|
|
495
|
+
const truthy = s === "true" || s === "1" || s === "TRUE";
|
|
496
|
+
if (dialect === "sqlite" || dialect === "d1") return truthy ? "1" : "0";
|
|
497
|
+
return truthy ? "TRUE" : "FALSE";
|
|
498
|
+
}
|
|
499
|
+
const numeric = whenField.subType === FIELD_SUBTYPE_INT || whenField.subType === FIELD_SUBTYPE_LONG
|
|
500
|
+
|| whenField.subType === FIELD_SUBTYPE_DOUBLE || whenField.subType === FIELD_SUBTYPE_FLOAT
|
|
501
|
+
|| whenField.subType === FIELD_SUBTYPE_DECIMAL || whenField.subType === FIELD_SUBTYPE_CURRENCY;
|
|
502
|
+
if (numeric && /^-?\d+(\.\d+)?$/.test(s)) return s;
|
|
503
|
+
return `'${s.replace(/'/g, "''")}'`;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Derive a CHECK from an entity-scoped cross-field validator. Every reference is
|
|
508
|
+
* resolved to its physical column by name; nothing raw is read from metadata.
|
|
509
|
+
* Returns null (skips the check) if any referenced field is missing.
|
|
510
|
+
*/
|
|
511
|
+
function crossFieldCheck(
|
|
512
|
+
v: MetaValidator, entity: MetaObject, tableName: string,
|
|
513
|
+
strategy: ColumnNamingStrategy, dialect: Dialect | undefined,
|
|
514
|
+
): CheckDescriptor | null {
|
|
515
|
+
switch (v.subType) {
|
|
516
|
+
case VALIDATOR_SUBTYPE_COMPARISON: {
|
|
517
|
+
const left = resolveRef(entity, v.ownAttr(VALIDATOR_ATTR_LEFT), strategy);
|
|
518
|
+
const right = resolveRef(entity, v.ownAttr(VALIDATOR_ATTR_RIGHT), strategy);
|
|
519
|
+
const op = COMPARISON_SQL_OP[String(v.ownAttr(VALIDATOR_ATTR_OP))];
|
|
520
|
+
if (!left || !right || !op) return null;
|
|
521
|
+
const lc = resolveColumnName(left.field, strategy);
|
|
522
|
+
return { name: `${tableName}_${lc}_cmp_chk`, expression: `${left.qcol} ${op} ${right.qcol}` };
|
|
523
|
+
}
|
|
524
|
+
case VALIDATOR_SUBTYPE_REQUIRED_WHEN: {
|
|
525
|
+
const target = resolveRef(entity, v.ownAttr(VALIDATOR_ATTR_FIELD), strategy);
|
|
526
|
+
const when = resolveRef(entity, v.ownAttr(VALIDATOR_ATTR_WHEN), strategy);
|
|
527
|
+
if (!target || !when) return null;
|
|
528
|
+
const lit = renderEquals(v.ownAttr(VALIDATOR_ATTR_EQUALS), when.field, dialect);
|
|
529
|
+
const fc = resolveColumnName(target.field, strategy);
|
|
530
|
+
return {
|
|
531
|
+
name: `${tableName}_${fc}_reqwhen_chk`,
|
|
532
|
+
expression: `(${when.qcol} IS DISTINCT FROM ${lit}) OR (${target.qcol} IS NOT NULL)`,
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
case VALIDATOR_SUBTYPE_PRESENT_IFF: {
|
|
536
|
+
const target = resolveRef(entity, v.ownAttr(VALIDATOR_ATTR_FIELD), strategy);
|
|
537
|
+
const when = resolveRef(entity, v.ownAttr(VALIDATOR_ATTR_WHEN), strategy);
|
|
538
|
+
if (!target || !when) return null;
|
|
539
|
+
const lit = renderEquals(v.ownAttr(VALIDATOR_ATTR_EQUALS), when.field, dialect);
|
|
540
|
+
const fc = resolveColumnName(target.field, strategy);
|
|
541
|
+
return {
|
|
542
|
+
name: `${tableName}_${fc}_presentiff_chk`,
|
|
543
|
+
expression: `(${target.qcol} IS NOT NULL) = (${when.qcol} IS NOT DISTINCT FROM ${lit})`,
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
case VALIDATOR_SUBTYPE_AT_LEAST_ONE: {
|
|
547
|
+
const raw = v.ownAttr(VALIDATOR_ATTR_FIELDS);
|
|
548
|
+
const names = Array.isArray(raw) ? raw : (typeof raw === "string" ? [raw] : []);
|
|
549
|
+
const refs = names.map((n) => resolveRef(entity, n, strategy));
|
|
550
|
+
if (refs.length === 0 || refs.some((r) => r === null)) return null;
|
|
551
|
+
const firstCol = resolveColumnName(refs[0]!.field, strategy);
|
|
552
|
+
return {
|
|
553
|
+
name: `${tableName}_${firstCol}_atleastone_chk`,
|
|
554
|
+
expression: refs.map((r) => `${r!.qcol} IS NOT NULL`).join(" OR "),
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
default:
|
|
558
|
+
return null;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
426
562
|
function buildForeignKeys(
|
|
427
563
|
entity: MetaObject,
|
|
428
564
|
tableName: string,
|
|
@@ -456,7 +592,13 @@ function buildForeignKeys(
|
|
|
456
592
|
: [applyColumnNamingStrategy(refChild.resolvedTargetPkField(root) ?? "id", strategy)];
|
|
457
593
|
|
|
458
594
|
const { onDelete, onUpdate } = resolveReferentialActions(entity, refChild);
|
|
459
|
-
|
|
595
|
+
// An explicit @constraintName adopts an existing FK name (e.g. a database
|
|
596
|
+
// created by another toolchain); absent → the auto-derived default.
|
|
597
|
+
const constraintNameOverride = refChild.ownAttr(IDENTITY_ATTR_CONSTRAINT_NAME);
|
|
598
|
+
const constraintName =
|
|
599
|
+
typeof constraintNameOverride === "string" && constraintNameOverride.length > 0
|
|
600
|
+
? constraintNameOverride
|
|
601
|
+
: `${tableName}_${fkCols[0]}_fk`;
|
|
460
602
|
|
|
461
603
|
// Guard: ON DELETE SET NULL requires nullable FK columns.
|
|
462
604
|
validateSetNullNullability(entity, refChild, onDelete, constraintName);
|