@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 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";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAErF,YAAY,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC9P,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,YAAY,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,EACZ,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEvL,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1G,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACxM,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGlG,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAClJ,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAOlF,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,YAAY,EAAE,WAAW,IAAI,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACvF,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAExG,OAAO,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAKvH,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,0BAA0B,EAC1B,eAAe,GAChB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,eAAe,EACf,SAAS,EACT,aAAa,GACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAErF,YAAY,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC9P,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,YAAY,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,EACZ,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEvL,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1G,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACxM,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGlG,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAClJ,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAOlF,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,YAAY,EAAE,WAAW,IAAI,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,YAAY,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AACxG,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAExG,OAAO,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAKvH,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,0BAA0B,EAC1B,eAAe,GAChB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,eAAe,EACf,SAAS,EACT,aAAa,GACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC"}
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":"AAoBA,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;AAmTD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,cAAc,GAClB,QAAQ,CAcV"}
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 entityName = segments[0];
131
+ const rawEntity = segments[0];
122
132
  const relSegments = segments.slice(1);
123
- if (!entityName)
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
- pkField: resolvedPkField,
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
- fkField: step.fkField,
183
- pkField: step.pkField,
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
- const entityName = from.slice(0, dotIdx);
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
- const targetField = targetEntity.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
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.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
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":"AACA,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEzD,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;CACvD;AAyCD,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAexE"}
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
- import { toSnakeCase } from "../naming.js";
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 `${c.sourceAlias}.${c.sourceColumn} AS ${c.dbColAlias}`;
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 ${c.sourceAlias}.${c.sourceColumn}) AS ${c.dbColAlias}`;
27
+ return `COUNT(DISTINCT ${src}) AS ${alias}`;
9
28
  }
10
- return `${c.agg.toUpperCase()}(${c.sourceAlias}.${c.sourceColumn}) AS ${c.dbColAlias}`;
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 stores raw camelCase field names from metadata (e.g. "programId").
18
- // Emit always applies snake_case view DDL is SQL-side and always snake_case.
19
- const fkCol = toSnakeCase(node.fkField);
20
- const pkCol = toSnakeCase(node.pkField);
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 ? `\n GROUP BY ${spec.groupBy.join(", ")}` : "";
42
- return `CREATE VIEW ${spec.viewName} AS
43
- SELECT
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":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAW3C,SAAS,YAAY,CAAC,CAAwC;IAC5D,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACjE,CAAC;IACD,gFAAgF;IAChF,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,kBAAkB,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,UAAU,CACjB,IAAc,EACd,WAAmB,EACnB,OAAoB;IAEpB,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,8DAA8D,IAAI,CAAC,YAAY,IAAI,CACpF,CAAC;IACJ,CAAC;IACD,8EAA8E;IAC9E,+EAA+E;IAC/E,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;IAC9B,yFAAyF;IACzF,uFAAuF;IACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,KAAK,QAAQ;QAChD,CAAC,CAAC,GAAG,UAAU,IAAI,KAAK,MAAM,WAAW,IAAI,KAAK,EAAE;QACpD,CAAC,CAAC,GAAG,UAAU,IAAI,KAAK,MAAM,WAAW,IAAI,KAAK,EAAE,CAAC;IACvD,IAAI,GAAG,GAAG,qBAAqB,KAAK,IAAI,UAAU,OAAO,QAAQ,EAAE,CAAC;IACpE,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtC,GAAG,IAAI,IAAI,GAAG,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc,EAAE,OAAoB;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;SACpC,IAAI,CAAC,KAAK,CAAC,CAAC;IACf,MAAM,UAAU,GAAG,UAAU,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;IAChF,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK;SACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;SAC3D,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,aAAa,GACjB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3E,OAAO,eAAe,IAAI,CAAC,QAAQ;;EAEnC,IAAI;EACJ,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,GAAG,CAAC;AACxE,CAAC"}
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 field name (lives on whichever side `referenceHolder` indicates). */
13
- readonly fkField: string;
14
- /** PK field name on the side that does NOT hold the FK. */
15
- readonly pkField: string;
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,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,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"}
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
- fkField: string;
163
- pkField: string;
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 entityName = segments[0];
208
+ const rawEntity = segments[0];
195
209
  const relSegments = segments.slice(1);
196
- if (!entityName) continue;
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
- pkField: resolvedPkField,
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
- fkField: step.fkField,
259
- pkField: step.pkField,
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
- const entityName = from.slice(0, dotIdx);
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
- const targetField = targetEntity.ownChildren().find(
337
- (c) => c.type === TYPE_FIELD && c.name === fieldName,
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.ownChildren().find(
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 `${c.sourceAlias}.${c.sourceColumn} AS ${c.dbColAlias}`;
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 ${c.sourceAlias}.${c.sourceColumn}) AS ${c.dbColAlias}`;
43
+ return `COUNT(DISTINCT ${src}) AS ${alias}`;
19
44
  }
20
- return `${c.agg.toUpperCase()}(${c.sourceAlias}.${c.sourceColumn}) AS ${c.dbColAlias}`;
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 stores raw camelCase field names from metadata (e.g. "programId").
35
- // Emit always applies snake_case view DDL is SQL-side and always snake_case.
36
- const fkCol = toSnakeCase(node.fkField);
37
- const pkCol = toSnakeCase(node.pkField);
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 ? `\n GROUP BY ${spec.groupBy.join(", ")}` : "";
86
+ spec.groupBy.length > 0
87
+ ? `\n GROUP BY ${spec.groupBy.map(quoteRef).join(", ")}`
88
+ : "";
61
89
 
62
- return `CREATE VIEW ${spec.viewName} AS
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 field name (lives on whichever side `referenceHolder` indicates). */
14
- readonly fkField: string;
15
- /** PK field name on the side that does NOT hold the FK. */
16
- readonly pkField: string;
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. */