@metaobjectsdev/codegen-ts 0.11.1 → 0.11.5-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/projection/build-projection-views.d.ts +21 -0
- package/dist/projection/build-projection-views.d.ts.map +1 -0
- package/dist/projection/build-projection-views.js +56 -0
- package/dist/projection/build-projection-views.js.map +1 -0
- package/dist/projection/extract-view-spec.d.ts.map +1 -1
- package/dist/projection/extract-view-spec.js +36 -14
- package/dist/projection/extract-view-spec.js.map +1 -1
- package/dist/projection/view-ddl-emit.d.ts +6 -0
- package/dist/projection/view-ddl-emit.d.ts.map +1 -1
- package/dist/projection/view-ddl-emit.js +39 -14
- package/dist/projection/view-ddl-emit.js.map +1 -1
- package/dist/projection/view-spec.d.ts +4 -4
- package/dist/projection/view-spec.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/index.ts +2 -0
- package/src/projection/build-projection-views.ts +88 -0
- package/src/projection/extract-view-spec.ts +41 -18
- package/src/projection/view-ddl-emit.ts +45 -14
- package/src/projection/view-spec.ts +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -49,6 +49,8 @@ export { extractViewSpec } from "./projection/extract-view-spec.js";
|
|
|
49
49
|
export type { ExtractContext } from "./projection/extract-view-spec.js";
|
|
50
50
|
export { emitViewDdl } from "./projection/view-ddl-emit.js";
|
|
51
51
|
export type { EmitOptions as ViewDdlEmitOptions } from "./projection/view-ddl-emit.js";
|
|
52
|
+
export { buildProjectionViews } from "./projection/build-projection-views.js";
|
|
53
|
+
export type { ExpectedView, BuildProjectionViewsOptions } from "./projection/build-projection-views.js";
|
|
52
54
|
export type { JoinNode, JoinTree, SelectColumn, SelectSpec, ViewSpec } from "./projection/view-spec.js";
|
|
53
55
|
export { generatePayloadInterfaces, generatePayloadInterfacesBatch, generateRenderHandle } from "./payload-codegen.js";
|
|
54
56
|
export { templateGenerator, type TemplateGeneratorOpts, type TemplateWalkResult, type TemplateFormat, } from "./generators/template-generator.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -44,6 +44,7 @@ export { renderValueObjectFile } from "./templates/value-object-file.js";
|
|
|
44
44
|
export { renderProjectionDecl } from "./templates/projection-decl.js";
|
|
45
45
|
export { extractViewSpec } from "./projection/extract-view-spec.js";
|
|
46
46
|
export { emitViewDdl } from "./projection/view-ddl-emit.js";
|
|
47
|
+
export { buildProjectionViews } from "./projection/build-projection-views.js";
|
|
47
48
|
// Prompt construction (FR-004): typed payload + render-handle codegen.
|
|
48
49
|
export { generatePayloadInterfaces, generatePayloadInterfacesBatch, generateRenderHandle } from "./payload-codegen.js";
|
|
49
50
|
// Template-driven codegen (rc.12). Factory + framework Provider for adopters
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type MetaData } from "@metaobjectsdev/metadata";
|
|
2
|
+
import type { ColumnNamingStrategy } from "../metaobjects-config.js";
|
|
3
|
+
/** Structurally matches migrate-ts's `ViewDescriptor` (name + body sql + optional schema). */
|
|
4
|
+
export interface ExpectedView {
|
|
5
|
+
name: string;
|
|
6
|
+
schema?: string;
|
|
7
|
+
sql: string;
|
|
8
|
+
/**
|
|
9
|
+
* Physical tables this view reads (base + every joined table). The migrate-ts
|
|
10
|
+
* diff uses this to recreate the view when one of its source tables undergoes a
|
|
11
|
+
* column-altering change — postgres blocks ALTER on a column a view depends on,
|
|
12
|
+
* so the view must be dropped before and recreated after.
|
|
13
|
+
*/
|
|
14
|
+
dependsOn: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface BuildProjectionViewsOptions {
|
|
17
|
+
dialect: "postgres" | "sqlite" | "d1";
|
|
18
|
+
columnNamingStrategy?: ColumnNamingStrategy;
|
|
19
|
+
}
|
|
20
|
+
export declare function buildProjectionViews(root: MetaData, opts: BuildProjectionViewsOptions): ExpectedView[];
|
|
21
|
+
//# sourceMappingURL=build-projection-views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-projection-views.d.ts","sourceRoot":"","sources":["../../src/projection/build-projection-views.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,8FAA8F;AAC9F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC;IACtC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,2BAA2B,GAChC,YAAY,EAAE,CA2BhB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// The single source of expected view descriptors. Walks every projection,
|
|
2
|
+
// extracts its ViewSpec, emits the CREATE VIEW DDL via the one canonical emitter
|
|
3
|
+
// (emitViewDdl), and returns the view BODY keyed by name — the shape migrate-ts's
|
|
4
|
+
// schema-diff/snapshot/drift pipeline expects on the EXPECTED side (it re-wraps the
|
|
5
|
+
// body in CREATE VIEW and the diff comparator strips any leading CREATE VIEW).
|
|
6
|
+
//
|
|
7
|
+
// migrate-ts stays dependency-pure: it never imports codegen-ts. Callers (the CLI,
|
|
8
|
+
// integration tests) compute views here and thread them into buildExpectedSchema /
|
|
9
|
+
// drift / snapshot as the `views` input. This is the ONE place view SQL is produced.
|
|
10
|
+
import { MetaRoot, resolveTableName, resolveTableSchema, } from "@metaobjectsdev/metadata";
|
|
11
|
+
import { isProjection } from "./projection-detector.js";
|
|
12
|
+
import { extractViewSpec } from "./extract-view-spec.js";
|
|
13
|
+
import { emitViewDdl } from "./view-ddl-emit.js";
|
|
14
|
+
export function buildProjectionViews(root, opts) {
|
|
15
|
+
if (!(root instanceof MetaRoot)) {
|
|
16
|
+
throw new Error("buildProjectionViews: root must be a loaded MetaRoot.");
|
|
17
|
+
}
|
|
18
|
+
// D1 is SQLite at the SQL level.
|
|
19
|
+
const dialect = opts.dialect === "d1" ? "sqlite" : opts.dialect;
|
|
20
|
+
const columnNamingStrategy = opts.columnNamingStrategy ?? "snake_case";
|
|
21
|
+
const joinTables = {};
|
|
22
|
+
for (const obj of root.objects())
|
|
23
|
+
joinTables[obj.name] = resolveTableName(obj);
|
|
24
|
+
const out = [];
|
|
25
|
+
for (const projection of root.objects().filter(isProjection)) {
|
|
26
|
+
const spec = extractViewSpec(projection, root, { columnNamingStrategy });
|
|
27
|
+
const baseTableName = joinTables[spec.joinTree.baseEntity];
|
|
28
|
+
if (!baseTableName)
|
|
29
|
+
continue; // unresolved base — skip (loader/codegen surface the error elsewhere)
|
|
30
|
+
const body = emitViewDdl(spec, { dialect, baseTableName, joinTables, bodyOnly: true });
|
|
31
|
+
const schema = resolveTableSchema(projection);
|
|
32
|
+
const dependsOn = collectDependsOn(spec.joinTree, baseTableName, joinTables);
|
|
33
|
+
out.push({
|
|
34
|
+
name: spec.viewName,
|
|
35
|
+
sql: body,
|
|
36
|
+
dependsOn,
|
|
37
|
+
...(schema !== undefined ? { schema } : {}),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
/** The base table plus every joined table, deduped — the physical tables the view reads. */
|
|
43
|
+
function collectDependsOn(joinTree, baseTableName, joinTables) {
|
|
44
|
+
const tables = new Set([baseTableName]);
|
|
45
|
+
const walk = (node) => {
|
|
46
|
+
const t = joinTables[node.targetEntity];
|
|
47
|
+
if (t)
|
|
48
|
+
tables.add(t);
|
|
49
|
+
for (const child of node.children)
|
|
50
|
+
walk(child);
|
|
51
|
+
};
|
|
52
|
+
for (const j of joinTree.joins)
|
|
53
|
+
walk(j);
|
|
54
|
+
return [...tables];
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=build-projection-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-projection-views.js","sourceRoot":"","sources":["../../src/projection/build-projection-views.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-view-spec.d.ts","sourceRoot":"","sources":["../../src/projection/extract-view-spec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extract-view-spec.d.ts","sourceRoot":"","sources":["../../src/projection/extract-view-spec.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAiB,KAAK,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAKpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EACoC,QAAQ,EACvD,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;CACrD;AA6BD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,oBAAoB,GACzC,MAAM,CAER;AAyUD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,cAAc,GAClB,QAAQ,CAcV"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TYPE_FIELD, TYPE_IDENTITY, TYPE_ORIGIN, TYPE_RELATIONSHIP, MetaSource, ORIGIN_SUBTYPE_PASSTHROUGH, ORIGIN_SUBTYPE_AGGREGATE, ORIGIN_PASSTHROUGH_ATTR_FROM, ORIGIN_PASSTHROUGH_ATTR_VIA, ORIGIN_AGGREGATE_ATTR_AGG, ORIGIN_AGGREGATE_ATTR_OF, ORIGIN_AGGREGATE_ATTR_VIA, RELATIONSHIP_ATTR_OBJECT_REF, RELATIONSHIP_ATTR_CARDINALITY, CARDINALITY_ONE, FIELD_ATTR_COLUMN, findReferenceBetween, } from "@metaobjectsdev/metadata";
|
|
1
|
+
import { TYPE_FIELD, TYPE_IDENTITY, TYPE_ORIGIN, TYPE_RELATIONSHIP, MetaSource, ORIGIN_SUBTYPE_PASSTHROUGH, ORIGIN_SUBTYPE_AGGREGATE, ORIGIN_PASSTHROUGH_ATTR_FROM, ORIGIN_PASSTHROUGH_ATTR_VIA, ORIGIN_AGGREGATE_ATTR_AGG, ORIGIN_AGGREGATE_ATTR_OF, ORIGIN_AGGREGATE_ATTR_VIA, RELATIONSHIP_ATTR_OBJECT_REF, RELATIONSHIP_ATTR_CARDINALITY, CARDINALITY_ONE, FIELD_ATTR_COLUMN, findReferenceBetween, stripPackage, } from "@metaobjectsdev/metadata";
|
|
2
2
|
import { MetaObject } from "@metaobjectsdev/metadata";
|
|
3
3
|
import { columnNameFromField, viewNameFromProjection, } from "../naming.js";
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
@@ -89,6 +89,16 @@ function sourceColumnNameFor(entityField, ctx) {
|
|
|
89
89
|
return col;
|
|
90
90
|
return columnNameFromField(entityField.name, ctx.columnNamingStrategy);
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Physical column for a join FK/PK field — resolves @column + naming strategy the
|
|
94
|
+
* same way passthrough columns do (EFFECTIVE fields, so inherited PKs resolve).
|
|
95
|
+
* The JOIN ON clause must use the real column, not a hardcoded snake_case guess,
|
|
96
|
+
* or it breaks under the `literal`/`kebab-case` strategies.
|
|
97
|
+
*/
|
|
98
|
+
function joinColumnFor(entity, fieldName, ctx) {
|
|
99
|
+
const f = entity.fields().find((x) => x.name === fieldName);
|
|
100
|
+
return f ? sourceColumnNameFor(f, ctx) : columnNameFromField(fieldName, ctx.columnNamingStrategy);
|
|
101
|
+
}
|
|
92
102
|
function shortAliasFor(entityName, used) {
|
|
93
103
|
const base = (entityName[0] ?? "x").toLowerCase();
|
|
94
104
|
if (!used.has(base)) {
|
|
@@ -104,7 +114,7 @@ function shortAliasFor(entityName, used) {
|
|
|
104
114
|
used.add(candidate);
|
|
105
115
|
return candidate;
|
|
106
116
|
}
|
|
107
|
-
function buildJoinTree(projection, base, root, usedAliases, baseAlias) {
|
|
117
|
+
function buildJoinTree(projection, base, root, usedAliases, baseAlias, ctx) {
|
|
108
118
|
const allPaths = [];
|
|
109
119
|
for (const field of projection.ownChildren()) {
|
|
110
120
|
if (field.type !== TYPE_FIELD)
|
|
@@ -118,10 +128,13 @@ function buildJoinTree(projection, base, root, usedAliases, baseAlias) {
|
|
|
118
128
|
if (!viaAttr)
|
|
119
129
|
continue;
|
|
120
130
|
const segments = viaAttr.split(".");
|
|
121
|
-
const
|
|
131
|
+
const rawEntity = segments[0];
|
|
122
132
|
const relSegments = segments.slice(1);
|
|
123
|
-
if (!
|
|
133
|
+
if (!rawEntity)
|
|
124
134
|
continue;
|
|
135
|
+
// @via may be package-qualified ("pkg::Entity.rel"); the joinTree + findObject
|
|
136
|
+
// key on bare names (so they line up with bare passthrough @from lookups).
|
|
137
|
+
const entityName = stripPackage(rawEntity);
|
|
125
138
|
let currentObj = root.findObject(entityName);
|
|
126
139
|
if (!currentObj)
|
|
127
140
|
continue;
|
|
@@ -144,14 +157,18 @@ function buildJoinTree(projection, base, root, usedAliases, baseAlias) {
|
|
|
144
157
|
break;
|
|
145
158
|
const resolvedPkField = ref.referenceIdentity.resolvedTargetPkField(root) ?? "id";
|
|
146
159
|
const referenceHolder = ref.holder.name === currentObj.name ? "source" : "target";
|
|
160
|
+
// FK lives on the holder; PK on the entity it references. Resolve both to
|
|
161
|
+
// physical columns now so the ON clause is naming-strategy correct.
|
|
162
|
+
const fkHolder = referenceHolder === "source" ? currentObj : target;
|
|
163
|
+
const pkHolder = referenceHolder === "source" ? target : currentObj;
|
|
147
164
|
path.push({
|
|
148
165
|
entity: currentObj,
|
|
149
166
|
relationship: relName,
|
|
150
167
|
cardinality,
|
|
151
|
-
fkField,
|
|
152
|
-
|
|
168
|
+
fkColumn: joinColumnFor(fkHolder, fkField, ctx),
|
|
169
|
+
pkColumn: joinColumnFor(pkHolder, resolvedPkField, ctx),
|
|
153
170
|
referenceHolder,
|
|
154
|
-
targetEntity: targetName,
|
|
171
|
+
targetEntity: stripPackage(targetName),
|
|
155
172
|
});
|
|
156
173
|
currentObj = target;
|
|
157
174
|
}
|
|
@@ -179,8 +196,8 @@ function buildJoinTree(projection, base, root, usedAliases, baseAlias) {
|
|
|
179
196
|
targetEntity: step.targetEntity,
|
|
180
197
|
alias: shortAliasFor(step.targetEntity, usedAliases),
|
|
181
198
|
cardinality: step.cardinality,
|
|
182
|
-
|
|
183
|
-
|
|
199
|
+
fkColumn: step.fkColumn,
|
|
200
|
+
pkColumn: step.pkColumn,
|
|
184
201
|
referenceHolder: step.referenceHolder,
|
|
185
202
|
children: Array.from(node.children.values()).map(toJoinNode),
|
|
186
203
|
};
|
|
@@ -238,13 +255,18 @@ function buildSelectSpec(projection, base, joinTree, root, ctx) {
|
|
|
238
255
|
const dotIdx = from.indexOf(".");
|
|
239
256
|
if (dotIdx < 1)
|
|
240
257
|
continue;
|
|
241
|
-
|
|
258
|
+
// @from is package-qualified ("pkg::Entity.field"); the joinTree + findObject
|
|
259
|
+
// key on the BARE entity name, so strip the package before resolving.
|
|
260
|
+
const entityName = stripPackage(from.slice(0, dotIdx));
|
|
242
261
|
const fieldName = from.slice(dotIdx + 1);
|
|
243
262
|
const targetEntity = root.findObject(entityName);
|
|
244
263
|
const sourceAlias = findAliasInTree(joinTree, entityName);
|
|
245
264
|
if (!targetEntity || sourceAlias === undefined)
|
|
246
265
|
continue;
|
|
247
|
-
|
|
266
|
+
// EFFECTIVE fields — the source column may be inherited via `extends`
|
|
267
|
+
// (e.g. created_at/updated_at/created_by from an audited base), which
|
|
268
|
+
// ownChildren() would miss.
|
|
269
|
+
const targetField = targetEntity.fields().find((f) => f.name === fieldName);
|
|
248
270
|
if (!targetField)
|
|
249
271
|
continue;
|
|
250
272
|
columns.push({
|
|
@@ -263,13 +285,13 @@ function buildSelectSpec(projection, base, joinTree, root, ctx) {
|
|
|
263
285
|
const dotIdx = of_.indexOf(".");
|
|
264
286
|
if (dotIdx < 1)
|
|
265
287
|
continue;
|
|
266
|
-
const entityName = of_.slice(0, dotIdx);
|
|
288
|
+
const entityName = stripPackage(of_.slice(0, dotIdx));
|
|
267
289
|
const fieldName = of_.slice(dotIdx + 1);
|
|
268
290
|
const targetEntity = root.findObject(entityName);
|
|
269
291
|
const sourceAlias = findAliasInTree(joinTree, entityName);
|
|
270
292
|
if (!targetEntity || sourceAlias === undefined)
|
|
271
293
|
continue;
|
|
272
|
-
const targetField = targetEntity.
|
|
294
|
+
const targetField = targetEntity.fields().find((f) => f.name === fieldName);
|
|
273
295
|
if (!targetField)
|
|
274
296
|
continue;
|
|
275
297
|
columns.push({
|
|
@@ -309,7 +331,7 @@ export function extractViewSpec(projection, root, ctx) {
|
|
|
309
331
|
const base = baseEntityFor(projection, root);
|
|
310
332
|
const usedAliases = new Set();
|
|
311
333
|
const baseAlias = shortAliasFor(base.name, usedAliases);
|
|
312
|
-
const joinTree = buildJoinTree(projection, base, root, usedAliases, baseAlias);
|
|
334
|
+
const joinTree = buildJoinTree(projection, base, root, usedAliases, baseAlias, ctx);
|
|
313
335
|
const selectSpec = buildSelectSpec(projection, base, joinTree, root, ctx);
|
|
314
336
|
const groupBy = buildGroupBy(selectSpec);
|
|
315
337
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-view-spec.js","sourceRoot":"","sources":["../../src/projection/extract-view-spec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract-view-spec.js","sourceRoot":"","sources":["../../src/projection/extract-view-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,12 @@ export interface EmitOptions {
|
|
|
5
5
|
readonly baseTableName: string;
|
|
6
6
|
/** Map from entity name → table name for every entity referenced in joins. */
|
|
7
7
|
readonly joinTables: Readonly<Record<string, string>>;
|
|
8
|
+
/**
|
|
9
|
+
* When true, return only the view BODY (`SELECT … FROM …`, no `CREATE VIEW … AS`
|
|
10
|
+
* wrapper, no trailing `;`). This is what migrate-ts's expected-schema/diff layer
|
|
11
|
+
* consumes (it re-wraps the body); the full statement is for direct application.
|
|
12
|
+
*/
|
|
13
|
+
readonly bodyOnly?: boolean;
|
|
8
14
|
}
|
|
9
15
|
export declare function emitViewDdl(spec: ViewSpec, options: EmitOptions): string;
|
|
10
16
|
//# sourceMappingURL=view-ddl-emit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-ddl-emit.d.ts","sourceRoot":"","sources":["../../src/projection/view-ddl-emit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"view-ddl-emit.d.ts","sourceRoot":"","sources":["../../src/projection/view-ddl-emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAoBzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,QAAQ,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AA4CD,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAoBxE"}
|
|
@@ -1,30 +1,50 @@
|
|
|
1
|
-
|
|
1
|
+
// Quote an identifier only when it isn't a plain lowercase snake identifier —
|
|
2
|
+
// exactly postgres's own rule. This keeps snake_case output unquoted (the common
|
|
3
|
+
// case + every existing fixture) while quoting mixed-case / kebab identifiers
|
|
4
|
+
// (the `literal`/`kebab-case` strategies) so postgres preserves their case
|
|
5
|
+
// instead of folding `programId` → `programid`. Both postgres and sqlite quote
|
|
6
|
+
// with double-quotes, so one helper serves every dialect.
|
|
7
|
+
function quoteIfNeeded(ident) {
|
|
8
|
+
if (/^[a-z_][a-z0-9_]*$/.test(ident))
|
|
9
|
+
return ident;
|
|
10
|
+
return `"${ident.replace(/"/g, '""')}"`;
|
|
11
|
+
}
|
|
12
|
+
/** Quote the column part of an `alias.column` reference, leaving the alias bare. */
|
|
13
|
+
function quoteRef(ref) {
|
|
14
|
+
const dot = ref.indexOf(".");
|
|
15
|
+
if (dot < 0)
|
|
16
|
+
return quoteIfNeeded(ref);
|
|
17
|
+
return ref.slice(0, dot) + "." + quoteIfNeeded(ref.slice(dot + 1));
|
|
18
|
+
}
|
|
2
19
|
function renderColumn(c) {
|
|
20
|
+
const src = `${c.sourceAlias}.${quoteIfNeeded(c.sourceColumn)}`;
|
|
21
|
+
const alias = quoteIfNeeded(c.dbColAlias);
|
|
3
22
|
if (c.kind === "passthrough") {
|
|
4
|
-
return `${
|
|
23
|
+
return `${src} AS ${alias}`;
|
|
5
24
|
}
|
|
6
25
|
// aggregate — use DISTINCT for count() over joined PKs to avoid join inflation.
|
|
7
26
|
if (c.agg === "count") {
|
|
8
|
-
return `COUNT(DISTINCT ${
|
|
27
|
+
return `COUNT(DISTINCT ${src}) AS ${alias}`;
|
|
9
28
|
}
|
|
10
|
-
return `${c.agg.toUpperCase()}(${
|
|
29
|
+
return `${c.agg.toUpperCase()}(${src}) AS ${alias}`;
|
|
11
30
|
}
|
|
12
31
|
function renderJoin(node, parentAlias, options) {
|
|
13
32
|
const table = options.joinTables[node.targetEntity];
|
|
14
33
|
if (!table) {
|
|
15
34
|
throw new Error(`view-ddl-emit: no table name registered for joined entity "${node.targetEntity}".`);
|
|
16
35
|
}
|
|
17
|
-
// JoinNode
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
const
|
|
36
|
+
// JoinNode carries physical column names already resolved by extractViewSpec
|
|
37
|
+
// (naming strategy + @column applied); quote them if the strategy produced a
|
|
38
|
+
// case-sensitive identifier.
|
|
39
|
+
const fkCol = quoteIfNeeded(node.fkColumn);
|
|
40
|
+
const pkCol = quoteIfNeeded(node.pkColumn);
|
|
21
41
|
const childAlias = node.alias;
|
|
22
42
|
// referenceHolder = "source" → FK on parent (source): child.pk = parent.fk (belongs-to)
|
|
23
43
|
// referenceHolder = "target" → FK on child (target): child.fk = parent.pk (has-many)
|
|
24
44
|
const onClause = node.referenceHolder === "source"
|
|
25
45
|
? `${childAlias}.${pkCol} = ${parentAlias}.${fkCol}`
|
|
26
46
|
: `${childAlias}.${fkCol} = ${parentAlias}.${pkCol}`;
|
|
27
|
-
let sql = ` LEFT OUTER JOIN ${table} ${childAlias} ON ${onClause}`;
|
|
47
|
+
let sql = ` LEFT OUTER JOIN ${quoteIfNeeded(table)} ${childAlias} ON ${onClause}`;
|
|
28
48
|
for (const childJoin of node.children) {
|
|
29
49
|
sql += "\n" + renderJoin(childJoin, childAlias, options);
|
|
30
50
|
}
|
|
@@ -34,14 +54,19 @@ export function emitViewDdl(spec, options) {
|
|
|
34
54
|
const cols = spec.selectSpec.columns
|
|
35
55
|
.map((c) => " " + renderColumn(c))
|
|
36
56
|
.join(",\n");
|
|
37
|
-
const fromClause = ` FROM ${options.baseTableName} ${spec.joinTree.baseAlias}`;
|
|
57
|
+
const fromClause = ` FROM ${quoteIfNeeded(options.baseTableName)} ${spec.joinTree.baseAlias}`;
|
|
38
58
|
const joinsClause = spec.joinTree.joins
|
|
39
59
|
.map((j) => renderJoin(j, spec.joinTree.baseAlias, options))
|
|
40
60
|
.join("\n");
|
|
41
|
-
const groupByClause = spec.groupBy.length > 0
|
|
42
|
-
|
|
43
|
-
|
|
61
|
+
const groupByClause = spec.groupBy.length > 0
|
|
62
|
+
? `\n GROUP BY ${spec.groupBy.map(quoteRef).join(", ")}`
|
|
63
|
+
: "";
|
|
64
|
+
const body = ` SELECT
|
|
44
65
|
${cols}
|
|
45
|
-
${fromClause}${joinsClause ? "\n" + joinsClause : ""}${groupByClause}
|
|
66
|
+
${fromClause}${joinsClause ? "\n" + joinsClause : ""}${groupByClause}`;
|
|
67
|
+
if (options.bodyOnly)
|
|
68
|
+
return body;
|
|
69
|
+
return `CREATE VIEW ${quoteIfNeeded(spec.viewName)} AS
|
|
70
|
+
${body};`;
|
|
46
71
|
}
|
|
47
72
|
//# sourceMappingURL=view-ddl-emit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-ddl-emit.js","sourceRoot":"","sources":["../../src/projection/view-ddl-emit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"view-ddl-emit.js","sourceRoot":"","sources":["../../src/projection/view-ddl-emit.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,10 @@ export interface JoinNode {
|
|
|
9
9
|
readonly alias: string;
|
|
10
10
|
/** Cardinality of the relationship being traversed. */
|
|
11
11
|
readonly cardinality: "one" | "many";
|
|
12
|
-
/** FK
|
|
13
|
-
readonly
|
|
14
|
-
/** PK
|
|
15
|
-
readonly
|
|
12
|
+
/** FK physical column (strategy + @column resolved); lives on whichever side `referenceHolder` indicates. */
|
|
13
|
+
readonly fkColumn: string;
|
|
14
|
+
/** PK physical column (strategy + @column resolved) on the side that does NOT hold the FK. */
|
|
15
|
+
readonly pkColumn: string;
|
|
16
16
|
/** Which side of this hop physically holds the FK: the parent (source) or the child (target). */
|
|
17
17
|
readonly referenceHolder: "source" | "target";
|
|
18
18
|
/** Child joins. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-spec.d.ts","sourceRoot":"","sources":["../../src/projection/view-spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,kFAAkF;AAClF,MAAM,WAAW,QAAQ;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IACrC,
|
|
1
|
+
{"version":3,"file":"view-spec.d.ts","sourceRoot":"","sources":["../../src/projection/view-spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,kFAAkF;AAClF,MAAM,WAAW,QAAQ;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IACrC,6GAA6G;IAC7G,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iGAAiG;IACjG,QAAQ,CAAC,eAAe,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9C,mBAAmB;IACnB,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC;CACxC;AAED,4DAA4D;AAC5D,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;CACrC;AAED,qCAAqC;AACrC,MAAM,MAAM,YAAY,GACpB;IACE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEN,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,oFAAoF;AACpF,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,sFAAsF;IACtF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaobjectsdev/codegen-ts",
|
|
3
|
-
"version": "0.11.1",
|
|
3
|
+
"version": "0.11.5-rc.1",
|
|
4
4
|
"description": "TypeScript codegen engine for MetaObjects — emits Drizzle, Zod, and Fastify artifacts.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -111,8 +111,8 @@
|
|
|
111
111
|
"access": "public"
|
|
112
112
|
},
|
|
113
113
|
"dependencies": {
|
|
114
|
-
"@metaobjectsdev/metadata": "0.11.1",
|
|
115
|
-
"@metaobjectsdev/render": "0.11.1",
|
|
114
|
+
"@metaobjectsdev/metadata": "0.11.5-rc.1",
|
|
115
|
+
"@metaobjectsdev/render": "0.11.5-rc.1",
|
|
116
116
|
"@biomejs/js-api": "^0.7.0",
|
|
117
117
|
"@biomejs/wasm-nodejs": "^1.9.4",
|
|
118
118
|
"ts-poet": "^6.10.0"
|
|
@@ -123,9 +123,9 @@
|
|
|
123
123
|
},
|
|
124
124
|
"devDependencies": {
|
|
125
125
|
"@biomejs/biome": "^1.9.0",
|
|
126
|
-
"@metaobjectsdev/codegen-ts-react": "0.11.1",
|
|
127
|
-
"@metaobjectsdev/migrate-ts": "0.11.1",
|
|
128
|
-
"@metaobjectsdev/runtime-ts": "0.11.1",
|
|
126
|
+
"@metaobjectsdev/codegen-ts-react": "0.11.5-rc.1",
|
|
127
|
+
"@metaobjectsdev/migrate-ts": "0.11.5-rc.1",
|
|
128
|
+
"@metaobjectsdev/runtime-ts": "0.11.5-rc.1",
|
|
129
129
|
"bun-types": "latest",
|
|
130
130
|
"drizzle-orm": "^0.36.0",
|
|
131
131
|
"hono": "^4.6.0",
|
package/src/index.ts
CHANGED
|
@@ -98,6 +98,8 @@ export { extractViewSpec } from "./projection/extract-view-spec.js";
|
|
|
98
98
|
export type { ExtractContext } from "./projection/extract-view-spec.js";
|
|
99
99
|
export { emitViewDdl } from "./projection/view-ddl-emit.js";
|
|
100
100
|
export type { EmitOptions as ViewDdlEmitOptions } from "./projection/view-ddl-emit.js";
|
|
101
|
+
export { buildProjectionViews } from "./projection/build-projection-views.js";
|
|
102
|
+
export type { ExpectedView, BuildProjectionViewsOptions } from "./projection/build-projection-views.js";
|
|
101
103
|
export type { JoinNode, JoinTree, SelectColumn, SelectSpec, ViewSpec } from "./projection/view-spec.js";
|
|
102
104
|
// Prompt construction (FR-004): typed payload + render-handle codegen.
|
|
103
105
|
export { generatePayloadInterfaces, generatePayloadInterfacesBatch, generateRenderHandle } from "./payload-codegen.js";
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// The single source of expected view descriptors. Walks every projection,
|
|
2
|
+
// extracts its ViewSpec, emits the CREATE VIEW DDL via the one canonical emitter
|
|
3
|
+
// (emitViewDdl), and returns the view BODY keyed by name — the shape migrate-ts's
|
|
4
|
+
// schema-diff/snapshot/drift pipeline expects on the EXPECTED side (it re-wraps the
|
|
5
|
+
// body in CREATE VIEW and the diff comparator strips any leading CREATE VIEW).
|
|
6
|
+
//
|
|
7
|
+
// migrate-ts stays dependency-pure: it never imports codegen-ts. Callers (the CLI,
|
|
8
|
+
// integration tests) compute views here and thread them into buildExpectedSchema /
|
|
9
|
+
// drift / snapshot as the `views` input. This is the ONE place view SQL is produced.
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
type MetaData,
|
|
13
|
+
MetaRoot,
|
|
14
|
+
resolveTableName,
|
|
15
|
+
resolveTableSchema,
|
|
16
|
+
} from "@metaobjectsdev/metadata";
|
|
17
|
+
import { isProjection } from "./projection-detector.js";
|
|
18
|
+
import { extractViewSpec } from "./extract-view-spec.js";
|
|
19
|
+
import { emitViewDdl } from "./view-ddl-emit.js";
|
|
20
|
+
import type { JoinNode, JoinTree } from "./view-spec.js";
|
|
21
|
+
import type { ColumnNamingStrategy } from "../metaobjects-config.js";
|
|
22
|
+
|
|
23
|
+
/** Structurally matches migrate-ts's `ViewDescriptor` (name + body sql + optional schema). */
|
|
24
|
+
export interface ExpectedView {
|
|
25
|
+
name: string;
|
|
26
|
+
schema?: string;
|
|
27
|
+
sql: string;
|
|
28
|
+
/**
|
|
29
|
+
* Physical tables this view reads (base + every joined table). The migrate-ts
|
|
30
|
+
* diff uses this to recreate the view when one of its source tables undergoes a
|
|
31
|
+
* column-altering change — postgres blocks ALTER on a column a view depends on,
|
|
32
|
+
* so the view must be dropped before and recreated after.
|
|
33
|
+
*/
|
|
34
|
+
dependsOn: string[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface BuildProjectionViewsOptions {
|
|
38
|
+
dialect: "postgres" | "sqlite" | "d1";
|
|
39
|
+
columnNamingStrategy?: ColumnNamingStrategy;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function buildProjectionViews(
|
|
43
|
+
root: MetaData,
|
|
44
|
+
opts: BuildProjectionViewsOptions,
|
|
45
|
+
): ExpectedView[] {
|
|
46
|
+
if (!(root instanceof MetaRoot)) {
|
|
47
|
+
throw new Error("buildProjectionViews: root must be a loaded MetaRoot.");
|
|
48
|
+
}
|
|
49
|
+
// D1 is SQLite at the SQL level.
|
|
50
|
+
const dialect: "postgres" | "sqlite" = opts.dialect === "d1" ? "sqlite" : opts.dialect;
|
|
51
|
+
const columnNamingStrategy = opts.columnNamingStrategy ?? "snake_case";
|
|
52
|
+
|
|
53
|
+
const joinTables: Record<string, string> = {};
|
|
54
|
+
for (const obj of root.objects()) joinTables[obj.name] = resolveTableName(obj);
|
|
55
|
+
|
|
56
|
+
const out: ExpectedView[] = [];
|
|
57
|
+
for (const projection of root.objects().filter(isProjection)) {
|
|
58
|
+
const spec = extractViewSpec(projection, root, { columnNamingStrategy });
|
|
59
|
+
const baseTableName = joinTables[spec.joinTree.baseEntity];
|
|
60
|
+
if (!baseTableName) continue; // unresolved base — skip (loader/codegen surface the error elsewhere)
|
|
61
|
+
const body = emitViewDdl(spec, { dialect, baseTableName, joinTables, bodyOnly: true });
|
|
62
|
+
const schema = resolveTableSchema(projection);
|
|
63
|
+
const dependsOn = collectDependsOn(spec.joinTree, baseTableName, joinTables);
|
|
64
|
+
out.push({
|
|
65
|
+
name: spec.viewName,
|
|
66
|
+
sql: body,
|
|
67
|
+
dependsOn,
|
|
68
|
+
...(schema !== undefined ? { schema } : {}),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** The base table plus every joined table, deduped — the physical tables the view reads. */
|
|
75
|
+
function collectDependsOn(
|
|
76
|
+
joinTree: JoinTree,
|
|
77
|
+
baseTableName: string,
|
|
78
|
+
joinTables: Readonly<Record<string, string>>,
|
|
79
|
+
): string[] {
|
|
80
|
+
const tables = new Set<string>([baseTableName]);
|
|
81
|
+
const walk = (node: JoinNode): void => {
|
|
82
|
+
const t = joinTables[node.targetEntity];
|
|
83
|
+
if (t) tables.add(t);
|
|
84
|
+
for (const child of node.children) walk(child);
|
|
85
|
+
};
|
|
86
|
+
for (const j of joinTree.joins) walk(j);
|
|
87
|
+
return [...tables];
|
|
88
|
+
}
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
CARDINALITY_ONE,
|
|
17
17
|
FIELD_ATTR_COLUMN,
|
|
18
18
|
findReferenceBetween,
|
|
19
|
+
stripPackage,
|
|
19
20
|
type AggregateFunction,
|
|
20
21
|
} from "@metaobjectsdev/metadata";
|
|
21
22
|
import { type MetaData, type MetaRoot, MetaObject } from "@metaobjectsdev/metadata";
|
|
@@ -140,6 +141,17 @@ function sourceColumnNameFor(
|
|
|
140
141
|
return columnNameFromField(entityField.name, ctx.columnNamingStrategy);
|
|
141
142
|
}
|
|
142
143
|
|
|
144
|
+
/**
|
|
145
|
+
* Physical column for a join FK/PK field — resolves @column + naming strategy the
|
|
146
|
+
* same way passthrough columns do (EFFECTIVE fields, so inherited PKs resolve).
|
|
147
|
+
* The JOIN ON clause must use the real column, not a hardcoded snake_case guess,
|
|
148
|
+
* or it breaks under the `literal`/`kebab-case` strategies.
|
|
149
|
+
*/
|
|
150
|
+
function joinColumnFor(entity: MetaObject, fieldName: string, ctx: ExtractContext): string {
|
|
151
|
+
const f = entity.fields().find((x) => x.name === fieldName);
|
|
152
|
+
return f ? sourceColumnNameFor(f, ctx) : columnNameFromField(fieldName, ctx.columnNamingStrategy);
|
|
153
|
+
}
|
|
154
|
+
|
|
143
155
|
function shortAliasFor(entityName: string, used: Set<string>): string {
|
|
144
156
|
const base = (entityName[0] ?? "x").toLowerCase();
|
|
145
157
|
if (!used.has(base)) { used.add(base); return base; }
|
|
@@ -159,8 +171,9 @@ interface PathStep {
|
|
|
159
171
|
entity: MetaData;
|
|
160
172
|
relationship: string;
|
|
161
173
|
cardinality: "one" | "many";
|
|
162
|
-
|
|
163
|
-
|
|
174
|
+
/** Physical column names (strategy + @column resolved), ready for the ON clause. */
|
|
175
|
+
fkColumn: string;
|
|
176
|
+
pkColumn: string;
|
|
164
177
|
referenceHolder: "source" | "target";
|
|
165
178
|
targetEntity: string;
|
|
166
179
|
}
|
|
@@ -178,6 +191,7 @@ function buildJoinTree(
|
|
|
178
191
|
root: MetaRoot,
|
|
179
192
|
usedAliases: Set<string>,
|
|
180
193
|
baseAlias: string,
|
|
194
|
+
ctx: ExtractContext,
|
|
181
195
|
): JoinTree {
|
|
182
196
|
const allPaths: Path[] = [];
|
|
183
197
|
|
|
@@ -191,9 +205,12 @@ function buildJoinTree(
|
|
|
191
205
|
if (!viaAttr) continue;
|
|
192
206
|
|
|
193
207
|
const segments = viaAttr.split(".");
|
|
194
|
-
const
|
|
208
|
+
const rawEntity = segments[0];
|
|
195
209
|
const relSegments = segments.slice(1);
|
|
196
|
-
if (!
|
|
210
|
+
if (!rawEntity) continue;
|
|
211
|
+
// @via may be package-qualified ("pkg::Entity.rel"); the joinTree + findObject
|
|
212
|
+
// key on bare names (so they line up with bare passthrough @from lookups).
|
|
213
|
+
const entityName = stripPackage(rawEntity);
|
|
197
214
|
let currentObj = root.findObject(entityName);
|
|
198
215
|
if (!currentObj) continue;
|
|
199
216
|
|
|
@@ -219,14 +236,19 @@ function buildJoinTree(
|
|
|
219
236
|
const referenceHolder: "source" | "target" =
|
|
220
237
|
ref.holder.name === currentObj.name ? "source" : "target";
|
|
221
238
|
|
|
239
|
+
// FK lives on the holder; PK on the entity it references. Resolve both to
|
|
240
|
+
// physical columns now so the ON clause is naming-strategy correct.
|
|
241
|
+
const fkHolder = referenceHolder === "source" ? currentObj : target;
|
|
242
|
+
const pkHolder = referenceHolder === "source" ? target : currentObj;
|
|
243
|
+
|
|
222
244
|
path.push({
|
|
223
245
|
entity: currentObj,
|
|
224
246
|
relationship: relName,
|
|
225
247
|
cardinality,
|
|
226
|
-
fkField,
|
|
227
|
-
|
|
248
|
+
fkColumn: joinColumnFor(fkHolder, fkField, ctx),
|
|
249
|
+
pkColumn: joinColumnFor(pkHolder, resolvedPkField, ctx),
|
|
228
250
|
referenceHolder,
|
|
229
|
-
targetEntity: targetName,
|
|
251
|
+
targetEntity: stripPackage(targetName),
|
|
230
252
|
});
|
|
231
253
|
currentObj = target;
|
|
232
254
|
}
|
|
@@ -255,8 +277,8 @@ function buildJoinTree(
|
|
|
255
277
|
targetEntity: step.targetEntity,
|
|
256
278
|
alias: shortAliasFor(step.targetEntity, usedAliases),
|
|
257
279
|
cardinality: step.cardinality,
|
|
258
|
-
|
|
259
|
-
|
|
280
|
+
fkColumn: step.fkColumn,
|
|
281
|
+
pkColumn: step.pkColumn,
|
|
260
282
|
referenceHolder: step.referenceHolder,
|
|
261
283
|
children: Array.from(node.children.values()).map(toJoinNode),
|
|
262
284
|
};
|
|
@@ -328,14 +350,17 @@ function buildSelectSpec(
|
|
|
328
350
|
const from = origin.ownAttr(ORIGIN_PASSTHROUGH_ATTR_FROM) as string;
|
|
329
351
|
const dotIdx = from.indexOf(".");
|
|
330
352
|
if (dotIdx < 1) continue;
|
|
331
|
-
|
|
353
|
+
// @from is package-qualified ("pkg::Entity.field"); the joinTree + findObject
|
|
354
|
+
// key on the BARE entity name, so strip the package before resolving.
|
|
355
|
+
const entityName = stripPackage(from.slice(0, dotIdx));
|
|
332
356
|
const fieldName = from.slice(dotIdx + 1);
|
|
333
357
|
const targetEntity = root.findObject(entityName);
|
|
334
358
|
const sourceAlias = findAliasInTree(joinTree, entityName);
|
|
335
359
|
if (!targetEntity || sourceAlias === undefined) continue;
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
)
|
|
360
|
+
// EFFECTIVE fields — the source column may be inherited via `extends`
|
|
361
|
+
// (e.g. created_at/updated_at/created_by from an audited base), which
|
|
362
|
+
// ownChildren() would miss.
|
|
363
|
+
const targetField = targetEntity.fields().find((f) => f.name === fieldName);
|
|
339
364
|
if (!targetField) continue;
|
|
340
365
|
columns.push({
|
|
341
366
|
kind: "passthrough",
|
|
@@ -350,14 +375,12 @@ function buildSelectSpec(
|
|
|
350
375
|
if (!agg || !of_) continue;
|
|
351
376
|
const dotIdx = of_.indexOf(".");
|
|
352
377
|
if (dotIdx < 1) continue;
|
|
353
|
-
const entityName = of_.slice(0, dotIdx);
|
|
378
|
+
const entityName = stripPackage(of_.slice(0, dotIdx));
|
|
354
379
|
const fieldName = of_.slice(dotIdx + 1);
|
|
355
380
|
const targetEntity = root.findObject(entityName);
|
|
356
381
|
const sourceAlias = findAliasInTree(joinTree, entityName);
|
|
357
382
|
if (!targetEntity || sourceAlias === undefined) continue;
|
|
358
|
-
const targetField = targetEntity.
|
|
359
|
-
(c) => c.type === TYPE_FIELD && c.name === fieldName,
|
|
360
|
-
);
|
|
383
|
+
const targetField = targetEntity.fields().find((f) => f.name === fieldName);
|
|
361
384
|
if (!targetField) continue;
|
|
362
385
|
columns.push({
|
|
363
386
|
kind: "aggregate",
|
|
@@ -403,7 +426,7 @@ export function extractViewSpec(
|
|
|
403
426
|
const base = baseEntityFor(projection, root);
|
|
404
427
|
const usedAliases = new Set<string>();
|
|
405
428
|
const baseAlias = shortAliasFor(base.name, usedAliases);
|
|
406
|
-
const joinTree = buildJoinTree(projection, base, root, usedAliases, baseAlias);
|
|
429
|
+
const joinTree = buildJoinTree(projection, base, root, usedAliases, baseAlias, ctx);
|
|
407
430
|
const selectSpec = buildSelectSpec(projection, base, joinTree, root, ctx);
|
|
408
431
|
const groupBy = buildGroupBy(selectSpec);
|
|
409
432
|
|
|
@@ -1,23 +1,48 @@
|
|
|
1
|
-
import { toSnakeCase } from "../naming.js";
|
|
2
1
|
import type { JoinNode, ViewSpec } from "./view-spec.js";
|
|
3
2
|
|
|
3
|
+
// Quote an identifier only when it isn't a plain lowercase snake identifier —
|
|
4
|
+
// exactly postgres's own rule. This keeps snake_case output unquoted (the common
|
|
5
|
+
// case + every existing fixture) while quoting mixed-case / kebab identifiers
|
|
6
|
+
// (the `literal`/`kebab-case` strategies) so postgres preserves their case
|
|
7
|
+
// instead of folding `programId` → `programid`. Both postgres and sqlite quote
|
|
8
|
+
// with double-quotes, so one helper serves every dialect.
|
|
9
|
+
function quoteIfNeeded(ident: string): string {
|
|
10
|
+
if (/^[a-z_][a-z0-9_]*$/.test(ident)) return ident;
|
|
11
|
+
return `"${ident.replace(/"/g, '""')}"`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Quote the column part of an `alias.column` reference, leaving the alias bare. */
|
|
15
|
+
function quoteRef(ref: string): string {
|
|
16
|
+
const dot = ref.indexOf(".");
|
|
17
|
+
if (dot < 0) return quoteIfNeeded(ref);
|
|
18
|
+
return ref.slice(0, dot) + "." + quoteIfNeeded(ref.slice(dot + 1));
|
|
19
|
+
}
|
|
20
|
+
|
|
4
21
|
export interface EmitOptions {
|
|
5
22
|
readonly dialect: "postgres" | "sqlite";
|
|
6
23
|
/** Resolved table name for the JoinTree's base entity. */
|
|
7
24
|
readonly baseTableName: string;
|
|
8
25
|
/** Map from entity name → table name for every entity referenced in joins. */
|
|
9
26
|
readonly joinTables: Readonly<Record<string, string>>;
|
|
27
|
+
/**
|
|
28
|
+
* When true, return only the view BODY (`SELECT … FROM …`, no `CREATE VIEW … AS`
|
|
29
|
+
* wrapper, no trailing `;`). This is what migrate-ts's expected-schema/diff layer
|
|
30
|
+
* consumes (it re-wraps the body); the full statement is for direct application.
|
|
31
|
+
*/
|
|
32
|
+
readonly bodyOnly?: boolean;
|
|
10
33
|
}
|
|
11
34
|
|
|
12
35
|
function renderColumn(c: import("./view-spec.js").SelectColumn): string {
|
|
36
|
+
const src = `${c.sourceAlias}.${quoteIfNeeded(c.sourceColumn)}`;
|
|
37
|
+
const alias = quoteIfNeeded(c.dbColAlias);
|
|
13
38
|
if (c.kind === "passthrough") {
|
|
14
|
-
return `${
|
|
39
|
+
return `${src} AS ${alias}`;
|
|
15
40
|
}
|
|
16
41
|
// aggregate — use DISTINCT for count() over joined PKs to avoid join inflation.
|
|
17
42
|
if (c.agg === "count") {
|
|
18
|
-
return `COUNT(DISTINCT ${
|
|
43
|
+
return `COUNT(DISTINCT ${src}) AS ${alias}`;
|
|
19
44
|
}
|
|
20
|
-
return `${c.agg.toUpperCase()}(${
|
|
45
|
+
return `${c.agg.toUpperCase()}(${src}) AS ${alias}`;
|
|
21
46
|
}
|
|
22
47
|
|
|
23
48
|
function renderJoin(
|
|
@@ -31,17 +56,18 @@ function renderJoin(
|
|
|
31
56
|
`view-ddl-emit: no table name registered for joined entity "${node.targetEntity}".`,
|
|
32
57
|
);
|
|
33
58
|
}
|
|
34
|
-
// JoinNode
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
const
|
|
59
|
+
// JoinNode carries physical column names already resolved by extractViewSpec
|
|
60
|
+
// (naming strategy + @column applied); quote them if the strategy produced a
|
|
61
|
+
// case-sensitive identifier.
|
|
62
|
+
const fkCol = quoteIfNeeded(node.fkColumn);
|
|
63
|
+
const pkCol = quoteIfNeeded(node.pkColumn);
|
|
38
64
|
const childAlias = node.alias;
|
|
39
65
|
// referenceHolder = "source" → FK on parent (source): child.pk = parent.fk (belongs-to)
|
|
40
66
|
// referenceHolder = "target" → FK on child (target): child.fk = parent.pk (has-many)
|
|
41
67
|
const onClause = node.referenceHolder === "source"
|
|
42
68
|
? `${childAlias}.${pkCol} = ${parentAlias}.${fkCol}`
|
|
43
69
|
: `${childAlias}.${fkCol} = ${parentAlias}.${pkCol}`;
|
|
44
|
-
let sql = ` LEFT OUTER JOIN ${table} ${childAlias} ON ${onClause}`;
|
|
70
|
+
let sql = ` LEFT OUTER JOIN ${quoteIfNeeded(table)} ${childAlias} ON ${onClause}`;
|
|
45
71
|
for (const childJoin of node.children) {
|
|
46
72
|
sql += "\n" + renderJoin(childJoin, childAlias, options);
|
|
47
73
|
}
|
|
@@ -52,15 +78,20 @@ export function emitViewDdl(spec: ViewSpec, options: EmitOptions): string {
|
|
|
52
78
|
const cols = spec.selectSpec.columns
|
|
53
79
|
.map((c) => " " + renderColumn(c))
|
|
54
80
|
.join(",\n");
|
|
55
|
-
const fromClause = ` FROM ${options.baseTableName} ${spec.joinTree.baseAlias}`;
|
|
81
|
+
const fromClause = ` FROM ${quoteIfNeeded(options.baseTableName)} ${spec.joinTree.baseAlias}`;
|
|
56
82
|
const joinsClause = spec.joinTree.joins
|
|
57
83
|
.map((j) => renderJoin(j, spec.joinTree.baseAlias, options))
|
|
58
84
|
.join("\n");
|
|
59
85
|
const groupByClause =
|
|
60
|
-
spec.groupBy.length > 0
|
|
86
|
+
spec.groupBy.length > 0
|
|
87
|
+
? `\n GROUP BY ${spec.groupBy.map(quoteRef).join(", ")}`
|
|
88
|
+
: "";
|
|
61
89
|
|
|
62
|
-
|
|
63
|
-
SELECT
|
|
90
|
+
const body = ` SELECT
|
|
64
91
|
${cols}
|
|
65
|
-
${fromClause}${joinsClause ? "\n" + joinsClause : ""}${groupByClause}
|
|
92
|
+
${fromClause}${joinsClause ? "\n" + joinsClause : ""}${groupByClause}`;
|
|
93
|
+
|
|
94
|
+
if (options.bodyOnly) return body;
|
|
95
|
+
return `CREATE VIEW ${quoteIfNeeded(spec.viewName)} AS
|
|
96
|
+
${body};`;
|
|
66
97
|
}
|
|
@@ -10,10 +10,10 @@ export interface JoinNode {
|
|
|
10
10
|
readonly alias: string;
|
|
11
11
|
/** Cardinality of the relationship being traversed. */
|
|
12
12
|
readonly cardinality: "one" | "many";
|
|
13
|
-
/** FK
|
|
14
|
-
readonly
|
|
15
|
-
/** PK
|
|
16
|
-
readonly
|
|
13
|
+
/** FK physical column (strategy + @column resolved); lives on whichever side `referenceHolder` indicates. */
|
|
14
|
+
readonly fkColumn: string;
|
|
15
|
+
/** PK physical column (strategy + @column resolved) on the side that does NOT hold the FK. */
|
|
16
|
+
readonly pkColumn: string;
|
|
17
17
|
/** Which side of this hop physically holds the FK: the parent (source) or the child (target). */
|
|
18
18
|
readonly referenceHolder: "source" | "target";
|
|
19
19
|
/** Child joins. */
|