@metaobjectsdev/migrate-ts 0.6.0 → 0.7.0-rc.2
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 +4 -2
- package/dist/diff/index.d.ts.map +1 -1
- package/dist/diff/index.js +23 -0
- package/dist/diff/index.js.map +1 -1
- package/dist/emit/index.d.ts.map +1 -1
- package/dist/emit/index.js +7 -3
- package/dist/emit/index.js.map +1 -1
- package/dist/emit/postgres.d.ts.map +1 -1
- package/dist/emit/postgres.js +22 -11
- package/dist/emit/postgres.js.map +1 -1
- package/dist/expected-schema.d.ts +7 -1
- package/dist/expected-schema.d.ts.map +1 -1
- package/dist/expected-schema.js +35 -30
- package/dist/expected-schema.js.map +1 -1
- package/dist/expected-views.d.ts +5 -0
- package/dist/expected-views.d.ts.map +1 -0
- package/dist/expected-views.js +147 -0
- package/dist/expected-views.js.map +1 -0
- package/dist/introspect/d1.d.ts.map +1 -1
- package/dist/introspect/d1.js +16 -4
- package/dist/introspect/d1.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/diff/index.ts +29 -0
- package/src/emit/index.ts +9 -5
- package/src/emit/postgres.ts +25 -12
- package/src/expected-schema.ts +48 -27
- package/src/expected-views.ts +175 -0
- package/src/introspect/d1.ts +14 -4
- package/src/types.ts +11 -4
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// expected-views.ts — derive ViewDescriptor[] from projection metadata.
|
|
2
|
+
//
|
|
3
|
+
// Ports the shape of csharp/MetaObjects.Codegen/Schema/PostgresSchema.cs's
|
|
4
|
+
// CreateView. v1 supports:
|
|
5
|
+
//
|
|
6
|
+
// * passthrough origin (no @via) → plain column from the single base entity
|
|
7
|
+
// * aggregate origin (@agg/@of/@via) → correlated subquery over a to-many
|
|
8
|
+
//
|
|
9
|
+
// Deferred to v2 (returns a "-- TODO" view that the runner skips applying):
|
|
10
|
+
//
|
|
11
|
+
// * passthrough origin WITH @via → to-one correlated subquery
|
|
12
|
+
// * collection origin → json_agg over a to-many
|
|
13
|
+
// * multi-base projections → blocked
|
|
14
|
+
//
|
|
15
|
+
// Identifiers are quoted throughout so mixed-case column names (e.g.
|
|
16
|
+
// "programId") survive PG's case-folding pass.
|
|
17
|
+
import { MetaPassthroughOrigin, MetaAggregateOrigin, MetaCollectionOrigin, MetaSource, SOURCE_ROLE_PRIMARY, TYPE_OBJECT, TYPE_ORIGIN, resolveColumnName, resolveTableName, stripPackage, } from "@metaobjectsdev/metadata";
|
|
18
|
+
export function buildExpectedViews(root, strategy) {
|
|
19
|
+
const out = [];
|
|
20
|
+
for (const child of root.ownChildren()) {
|
|
21
|
+
if (child.type !== TYPE_OBJECT)
|
|
22
|
+
continue;
|
|
23
|
+
const proj = child;
|
|
24
|
+
if (proj.isAbstract)
|
|
25
|
+
continue;
|
|
26
|
+
if (!isReadOnlyProjection(proj))
|
|
27
|
+
continue;
|
|
28
|
+
const view = buildView(proj, root, strategy);
|
|
29
|
+
if (view !== null)
|
|
30
|
+
out.push(view);
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
function isReadOnlyProjection(entity) {
|
|
35
|
+
const sources = entity.ownChildren().filter((c) => c instanceof MetaSource);
|
|
36
|
+
if (sources.length === 0)
|
|
37
|
+
return false;
|
|
38
|
+
const hasReadOnly = sources.some((s) => s.isReadOnly());
|
|
39
|
+
const hasWritable = sources.some((s) => !s.isReadOnly());
|
|
40
|
+
return hasReadOnly && !hasWritable;
|
|
41
|
+
}
|
|
42
|
+
function buildView(projection, root, strategy) {
|
|
43
|
+
const primarySource = projection.ownChildren().find((c) => c instanceof MetaSource && c.role === SOURCE_ROLE_PRIMARY);
|
|
44
|
+
if (primarySource?.tableName === undefined)
|
|
45
|
+
return null;
|
|
46
|
+
const viewName = primarySource.tableName;
|
|
47
|
+
const cols = [];
|
|
48
|
+
let baseEntity;
|
|
49
|
+
let blocked;
|
|
50
|
+
const T = "t"; // target alias in correlated subqueries
|
|
51
|
+
const baseTable = () => {
|
|
52
|
+
if (baseEntity === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
const found = root.findObject(baseEntity);
|
|
55
|
+
return found ? resolveTableName(found) : baseEntity;
|
|
56
|
+
};
|
|
57
|
+
for (const f of projection.fields()) {
|
|
58
|
+
const origin = f.ownChildren().find((c) => c.type === TYPE_ORIGIN);
|
|
59
|
+
const fieldCol = resolveColumnName(f, strategy);
|
|
60
|
+
if (origin instanceof MetaPassthroughOrigin && origin.via === undefined &&
|
|
61
|
+
origin.from !== undefined && origin.from.includes(".")) {
|
|
62
|
+
const [ent, field] = splitDot(origin.from);
|
|
63
|
+
const bare = stripPackage(ent);
|
|
64
|
+
baseEntity ??= bare;
|
|
65
|
+
if (bare !== baseEntity) {
|
|
66
|
+
blocked = "passthrough from multiple base entities";
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
const srcEntity = root.findObject(baseEntity);
|
|
70
|
+
const srcCol = resolveColumnByName(srcEntity, field, strategy);
|
|
71
|
+
cols.push(` "${srcCol}" AS "${fieldCol}"`);
|
|
72
|
+
}
|
|
73
|
+
else if (origin instanceof MetaAggregateOrigin && origin.agg !== undefined &&
|
|
74
|
+
origin.of !== undefined && origin.via !== undefined &&
|
|
75
|
+
origin.of.includes(".") && origin.via.includes(".")) {
|
|
76
|
+
const [baseEnt, relName] = splitDot(origin.via);
|
|
77
|
+
const bareBase = stripPackage(baseEnt);
|
|
78
|
+
baseEntity ??= bareBase;
|
|
79
|
+
if (bareBase !== baseEntity) {
|
|
80
|
+
blocked = "aggregate over a different base entity";
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
const fk = resolveToManyFk(root, baseEntity, relName, strategy);
|
|
84
|
+
if (fk === null) {
|
|
85
|
+
blocked = `unresolved to-many FK for @via "${origin.via}" (target needs an identity.reference back to ${baseEntity})`;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
const ofCol = resolveColumnByName(fk.target, splitDot(origin.of)[1], strategy);
|
|
89
|
+
cols.push(` (SELECT ${origin.agg}(${T}."${ofCol}") ` +
|
|
90
|
+
`FROM "${fk.targetTable}" ${T} ` +
|
|
91
|
+
`WHERE ${T}."${fk.fkCol}" = "${baseTable()}"."${fk.parentCol}") AS "${fieldCol}"`);
|
|
92
|
+
}
|
|
93
|
+
else if (origin instanceof MetaPassthroughOrigin || origin instanceof MetaCollectionOrigin) {
|
|
94
|
+
blocked = `field "${f.name}" uses an origin shape not yet supported by TS migrate-ts (passthrough-via / collection — deferred)`;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
blocked = `field "${f.name}" has no resolvable origin`;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (blocked !== undefined || baseEntity === undefined || cols.length === 0) {
|
|
103
|
+
// Caller decides what to do with a null result. For v1 the runner just
|
|
104
|
+
// omits it from expected.views — diff sees no expected view, no
|
|
105
|
+
// create-view change, and an actual leftover view (if any) gets dropped.
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
const sql = `SELECT\n${cols.join(",\n")}\nFROM "${baseTable()}"`;
|
|
109
|
+
const view = { name: viewName, sql };
|
|
110
|
+
return view;
|
|
111
|
+
}
|
|
112
|
+
function splitDot(s) {
|
|
113
|
+
const i = s.indexOf(".");
|
|
114
|
+
return [s.slice(0, i), s.slice(i + 1)];
|
|
115
|
+
}
|
|
116
|
+
function resolveColumnByName(owner, fieldName, strategy) {
|
|
117
|
+
if (owner === undefined)
|
|
118
|
+
return fieldName;
|
|
119
|
+
const field = owner.fields().find((f) => f.name === fieldName);
|
|
120
|
+
return field ? resolveColumnName(field, strategy) : fieldName;
|
|
121
|
+
}
|
|
122
|
+
function resolveToManyFk(root, baseEntityName, relName, strategy) {
|
|
123
|
+
const baseObj = root.findObject(baseEntityName);
|
|
124
|
+
if (baseObj === undefined)
|
|
125
|
+
return null;
|
|
126
|
+
const rel = baseObj.relationships().find((r) => r.name === relName);
|
|
127
|
+
if (rel === undefined || rel.objectRef === undefined)
|
|
128
|
+
return null;
|
|
129
|
+
const target = root.findObject(stripPackage(rel.objectRef));
|
|
130
|
+
if (target === undefined)
|
|
131
|
+
return null;
|
|
132
|
+
const fkRef = target.referenceIdentities().find((r) => r.targetEntity !== undefined && stripPackage(r.targetEntity) === baseEntityName);
|
|
133
|
+
if (fkRef === undefined)
|
|
134
|
+
return null;
|
|
135
|
+
const fkFields = fkRef.fields;
|
|
136
|
+
if (fkFields.length === 0)
|
|
137
|
+
return null;
|
|
138
|
+
const fkCol = resolveColumnByName(target, fkFields[0], strategy);
|
|
139
|
+
const parentFieldName = fkRef.targetFields.length > 0
|
|
140
|
+
? fkRef.targetFields[0]
|
|
141
|
+
: baseObj.primaryIdentity()?.fields[0];
|
|
142
|
+
if (parentFieldName === undefined)
|
|
143
|
+
return null;
|
|
144
|
+
const parentCol = resolveColumnByName(baseObj, parentFieldName, strategy);
|
|
145
|
+
return { target, targetTable: resolveTableName(target), fkCol, parentCol };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=expected-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expected-views.js","sourceRoot":"","sources":["../src/expected-views.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1.d.ts","sourceRoot":"","sources":["../../src/introspect/d1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,aAAa,CAAC;AAGrB;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAKxD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"d1.d.ts","sourceRoot":"","sources":["../../src/introspect/d1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,aAAa,CAAC;AAGrB;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAKxD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAkDrF"}
|
package/dist/introspect/d1.js
CHANGED
|
@@ -4,10 +4,22 @@ export async function introspectD1(opts) {
|
|
|
4
4
|
const stdout = await opts.runner(sql);
|
|
5
5
|
return parseEnvelope(stdout);
|
|
6
6
|
};
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
// sqlite_version() is blocked by workerd's local D1 sandbox, so we fall back
|
|
8
|
+
// to a known-good static version (Cloudflare D1 ships a recent SQLite). Remote
|
|
9
|
+
// wrangler executions answer the function, so we try once and only fall back
|
|
10
|
+
// on failure. Keep this string ≥ any version-gated downstream feature checks
|
|
11
|
+
// (see emit/sqlite.ts → parseVersion).
|
|
12
|
+
let sqliteVersion = "3.44.0";
|
|
13
|
+
try {
|
|
14
|
+
const versionRows = await exec("SELECT sqlite_version() AS v");
|
|
15
|
+
const v = versionRows[0]?.v;
|
|
16
|
+
if (v !== undefined && v !== null)
|
|
17
|
+
sqliteVersion = String(v);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Fall through to the static default — workerd local sandbox path.
|
|
21
|
+
}
|
|
22
|
+
const meta = { sqliteVersion };
|
|
11
23
|
const tableRows = await exec("SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '__new_%' ORDER BY name");
|
|
12
24
|
const tables = [];
|
|
13
25
|
for (const t of tableRows) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1.js","sourceRoot":"","sources":["../../src/introspect/d1.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAyBjG,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,IAAI,GAAS,KAAK,EAAE,GAAW,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,8BAA8B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"d1.js","sourceRoot":"","sources":["../../src/introspect/d1.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAyBjG,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,IAAI,GAAS,KAAK,EAAE,GAAW,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,6EAA6E;IAC7E,+EAA+E;IAC/E,6EAA6E;IAC7E,6EAA6E;IAC7E,uCAAuC;IACvC,IAAI,aAAa,GAAG,QAAQ,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;IACD,MAAM,IAAI,GAAiB,EAAE,aAAa,EAAE,CAAC;IAE7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAC1B,+HAA+H,CAChI,CAAC;IAEF,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACtC,6EAA6E;QAC7E,mFAAmF;QACnF,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC3E,IAAI,gBAAgB,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,IAAI,KAAK;gBAAE,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC1C,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;YACtC,WAAW,EAAE,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;YAC9C,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yCAA0C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,yEAAyE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACnH,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,iEAAiE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,GAAG,GAAG,QAAoE,CAAC;IACjF,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,KAAK,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,OAAoC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAU,EAAE,KAAa;IACpD,OAAO,IAAI,CAAC,mCAAmC,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,cAAc,CAAC,IAA+B;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpB,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5C,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;SACxD,CAAC;QACF,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACpF,IAAI,GAAG;YAAE,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC;QAC3B,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,IAA+B;IACxD,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAU,EAAE,KAAa;IAClD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,mCAAmC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClF,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI;YAAE,SAAS;QACzC,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAS;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kDAAkD,WAAW,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACjH,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAU,EAAE,KAAa;IACtD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,yCAAyC,WAAW,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACzG,MAAM,IAAI,GAAG,IAAI,GAAG,EAA4G,CAAC;IACjI,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBACzB,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACjD,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aAClD,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QACjD,MAAM,EAAE,GAAiB;YACvB,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK;YACvC,OAAO,EAAE,CAAC,CAAC,IAAI;YACf,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,UAAU,EAAE,CAAC,CAAC,OAAO;SACtB,CAAC;QACF,IAAI,CAAC,CAAC,QAAQ,KAAK,WAAW;YAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QACzD,IAAI,CAAC,CAAC,QAAQ,KAAK,WAAW;YAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QACzD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAU;IACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CACrB,6FAA6F,CAC9F,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AACzC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -68,6 +68,14 @@ export interface ViewDescriptor {
|
|
|
68
68
|
name: string;
|
|
69
69
|
/** Same semantics as TableDescriptor.schema. */
|
|
70
70
|
schema?: string;
|
|
71
|
+
/**
|
|
72
|
+
* View body: everything between `CREATE VIEW <name> AS` and the trailing `;`
|
|
73
|
+
* (the SELECT clause through the FROM/WHERE/GROUP-BY tail). Populated by
|
|
74
|
+
* `buildExpectedSchema` from projection metadata; omitted by introspect
|
|
75
|
+
* (body-level comparison isn't implemented yet — diff matches by name only,
|
|
76
|
+
* so a body change does NOT trigger replace-view today).
|
|
77
|
+
*/
|
|
78
|
+
sql?: string;
|
|
71
79
|
}
|
|
72
80
|
/**
|
|
73
81
|
* Every variant with a `table: string` (or `table: TableDescriptor`) field also
|
|
@@ -166,14 +174,17 @@ export type Change = {
|
|
|
166
174
|
} | {
|
|
167
175
|
kind: "create-view";
|
|
168
176
|
view: ViewDescriptor;
|
|
177
|
+
schema?: string;
|
|
169
178
|
status: ChangeStatus;
|
|
170
179
|
} | {
|
|
171
180
|
kind: "drop-view";
|
|
172
181
|
view: string;
|
|
182
|
+
schema?: string;
|
|
173
183
|
status: ChangeStatus;
|
|
174
184
|
} | {
|
|
175
185
|
kind: "replace-view";
|
|
176
186
|
view: ViewDescriptor;
|
|
187
|
+
schema?: string;
|
|
177
188
|
status: ChangeStatus;
|
|
178
189
|
};
|
|
179
190
|
export type ChangeKind = Change["kind"];
|
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,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;CACjB;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;
|
|
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.7.0-rc.2",
|
|
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",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@iarna/toml": "^2.2.5",
|
|
37
|
-
"@metaobjectsdev/metadata": "0.
|
|
37
|
+
"@metaobjectsdev/metadata": "0.7.0-rc.2"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"kysely": ">=0.27.0"
|
package/src/diff/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
SchemaSnapshot, TableDescriptor, ColumnDescriptor, IndexDescriptor, FkDescriptor,
|
|
3
|
+
ViewDescriptor,
|
|
3
4
|
Change, ChangeStatus, DiffResult, AllowOptions, AmbiguousCallback,
|
|
4
5
|
} from "../types.js";
|
|
5
6
|
import type { SqlType } from "../sql-type.js";
|
|
@@ -150,6 +151,13 @@ export async function diff(
|
|
|
150
151
|
diffTableForeignKeys(expectedTable, actualTable, changes);
|
|
151
152
|
}
|
|
152
153
|
|
|
154
|
+
// Pass 2b: views. Identity is (schema, name). Body comparison isn't
|
|
155
|
+
// implemented — introspect doesn't read view bodies today, so a name match
|
|
156
|
+
// is no-change regardless of how the user's projection metadata has evolved.
|
|
157
|
+
// Users who change a view body without renaming need to manually drop+recreate
|
|
158
|
+
// or do a full bootstrap until replace-view-from-body-diff lands.
|
|
159
|
+
diffViews(args.expected.views, args.actual.views, changes);
|
|
160
|
+
|
|
153
161
|
// Pass 3: detect table renames BEFORE column renames — so a renamed table's
|
|
154
162
|
// columns are not scanned as orphaned drop/add pairs.
|
|
155
163
|
await detectTableRenames(changes, args.onAmbiguous);
|
|
@@ -273,6 +281,27 @@ function diffTableForeignKeys(
|
|
|
273
281
|
}
|
|
274
282
|
}
|
|
275
283
|
|
|
284
|
+
function viewIdentity(v: { name: string; schema?: string }): string {
|
|
285
|
+
return (v.schema ?? DEFAULT_DB_SCHEMA_POSTGRES) + "." + v.name;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function diffViews(
|
|
289
|
+
expected: ViewDescriptor[], actual: ViewDescriptor[], changes: Change[],
|
|
290
|
+
): void {
|
|
291
|
+
const exp = new Map(expected.map((v) => [viewIdentity(v), v] as const));
|
|
292
|
+
const act = new Map(actual.map((v) => [viewIdentity(v), v] as const));
|
|
293
|
+
for (const [id, v] of exp) {
|
|
294
|
+
if (!act.has(id)) {
|
|
295
|
+
changes.push({ kind: "create-view", view: v, ...schemaSpread(v.schema), status: ALLOWED });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
for (const [id, v] of act) {
|
|
299
|
+
if (!exp.has(id)) {
|
|
300
|
+
changes.push({ kind: "drop-view", view: v.name, ...schemaSpread(v.schema), status: ALLOWED });
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
276
305
|
function columnDefaultsEqual(a: ColumnDescriptor["default"], b: ColumnDescriptor["default"]): boolean {
|
|
277
306
|
if (a === undefined && b === undefined) return true;
|
|
278
307
|
if (a === undefined || b === undefined) return false;
|
package/src/emit/index.ts
CHANGED
|
@@ -25,11 +25,15 @@ export function emit(changes: Change[], opts: EmitOptions): EmitResult {
|
|
|
25
25
|
const blocked = changes.filter((c) => c.status.state === "blocked");
|
|
26
26
|
if (blocked.length > 0) throw new BlockedChangesError(blocked);
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
// Views are postgres-only for now (sqlite/d1 DDL renderers don't handle them).
|
|
29
|
+
if (opts.dialect !== "postgres") {
|
|
30
|
+
const viewChanges = changes.filter((c) => VIEW_KINDS.has(c.kind));
|
|
31
|
+
if (viewChanges.length > 0) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`view migration not implemented for dialect "${opts.dialect}" ` +
|
|
34
|
+
`(${viewChanges.length} view-targeting change(s); postgres-only today)`,
|
|
35
|
+
);
|
|
36
|
+
}
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
switch (opts.dialect) {
|
package/src/emit/postgres.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
Change, EmitResult, ColumnDescriptor, IndexDescriptor, FkDescriptor,
|
|
3
|
-
TableDescriptor, ColumnDefault, FkAction,
|
|
3
|
+
TableDescriptor, ViewDescriptor, ColumnDefault, FkAction,
|
|
4
4
|
} from "../types.js";
|
|
5
5
|
import type { SqlType } from "../sql-type.js";
|
|
6
6
|
import { DEFAULT_DB_SCHEMA_POSTGRES } from "@metaobjectsdev/metadata";
|
|
7
7
|
|
|
8
|
+
// Stages run low → high. drop-view + drop-fk run BEFORE drop-table so a view
|
|
9
|
+
// that depends on a soon-to-be-dropped table is removed first. create-view
|
|
10
|
+
// runs AFTER add-fk so the view can reference the new schema in full.
|
|
8
11
|
const STAGE_ORDER: Record<Change["kind"], number> = {
|
|
12
|
+
"drop-view": 0,
|
|
9
13
|
"create-table": 1,
|
|
10
14
|
"add-column": 2, "drop-column": 2,
|
|
11
15
|
"change-column-type": 2, "change-column-nullable": 2, "change-column-default": 2,
|
|
@@ -13,8 +17,7 @@ const STAGE_ORDER: Record<Change["kind"], number> = {
|
|
|
13
17
|
"add-index": 4, "drop-index": 4,
|
|
14
18
|
"add-fk": 5, "drop-fk": 5,
|
|
15
19
|
"drop-table": 6,
|
|
16
|
-
|
|
17
|
-
"create-view": 99, "drop-view": 99, "replace-view": 99,
|
|
20
|
+
"create-view": 7, "replace-view": 7,
|
|
18
21
|
};
|
|
19
22
|
|
|
20
23
|
export function renderPostgres(changes: Change[]): EmitResult {
|
|
@@ -58,11 +61,9 @@ function renderUp(c: Change): string {
|
|
|
58
61
|
case "drop-index": return `DROP INDEX ${quoteIndexQualified(c.index, c.schema)};`;
|
|
59
62
|
case "add-fk": return renderAddFk(c.table, c.schema, c.fk);
|
|
60
63
|
case "drop-fk": return `ALTER TABLE ${quoteQualified(c.table, c.schema)} DROP CONSTRAINT ${quote(c.fk)};`;
|
|
61
|
-
case "create-view":
|
|
62
|
-
case "drop-view":
|
|
63
|
-
case "replace-view":
|
|
64
|
-
// emit() filters these; defensive throw if reached.
|
|
65
|
-
throw new Error(`unexpected view-kind in renderPostgres: ${c.kind}`);
|
|
64
|
+
case "create-view": return renderCreateView(c.view, c.schema, /* orReplace */ false);
|
|
65
|
+
case "drop-view": return `DROP VIEW ${quoteQualifiedView(c.view, c.schema)};`;
|
|
66
|
+
case "replace-view": return renderCreateView(c.view, c.schema, /* orReplace */ true);
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
|
|
@@ -87,10 +88,9 @@ function renderDown(c: Change): string {
|
|
|
87
88
|
case "drop-index": return `-- WARNING: down migration cannot restore the original index definition`;
|
|
88
89
|
case "add-fk": return `ALTER TABLE ${quoteQualified(c.table, c.schema)} DROP CONSTRAINT ${quote(c.fk.name)};`;
|
|
89
90
|
case "drop-fk": return `-- WARNING: down migration cannot restore the original FK definition`;
|
|
90
|
-
case "create-view":
|
|
91
|
-
case "drop-view":
|
|
92
|
-
case "replace-view":
|
|
93
|
-
throw new Error(`unexpected view-kind in renderPostgres: ${c.kind}`);
|
|
91
|
+
case "create-view": return `DROP VIEW ${quoteQualifiedView(c.view.name, c.schema)};`;
|
|
92
|
+
case "drop-view": return `-- WARNING: down migration cannot restore the original view definition`;
|
|
93
|
+
case "replace-view": return `-- WARNING: down migration cannot restore the original view definition`;
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
@@ -219,3 +219,16 @@ function quoteIndexQualified(index: string, schema: string | undefined): string
|
|
|
219
219
|
if (!schema || schema === DEFAULT_DB_SCHEMA_POSTGRES) return quote(index);
|
|
220
220
|
return quote(schema) + "." + quote(index);
|
|
221
221
|
}
|
|
222
|
+
|
|
223
|
+
/** Same shape as quoteQualified, just for view identifiers (kept separate for readability). */
|
|
224
|
+
function quoteQualifiedView(view: string, schema: string | undefined): string {
|
|
225
|
+
return quoteQualified(view, schema);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function renderCreateView(v: ViewDescriptor, schema: string | undefined, orReplace: boolean): string {
|
|
229
|
+
if (v.sql === undefined || v.sql.trim().length === 0) {
|
|
230
|
+
throw new Error(`view "${v.name}" has no sql body — buildExpectedSchema must populate it before emit`);
|
|
231
|
+
}
|
|
232
|
+
const prefix = orReplace ? "CREATE OR REPLACE VIEW" : "CREATE VIEW";
|
|
233
|
+
return `${prefix} ${quoteQualifiedView(v.name, schema)} AS\n${v.sql};`;
|
|
234
|
+
}
|