Skip to content

Commit adca13d

Browse files
committed
fix(codegen-ts): resolve effective package in template data dict + scope walks
entity.package is undefined for objects (object fqn() stays bare); read the effective package via effectivePackage(resolutionKey()) so {package} and the per-package grouping reflect the declared file package. Strengthen the data-dict test to assert the real package (the prior assertion was tautological).
1 parent 8fed74d commit adca13d

3 files changed

Lines changed: 16 additions & 5 deletions

File tree

server/typescript/packages/codegen-ts/src/generators/template-generator.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
buildEntityTemplateData,
2323
buildPackageTemplateData,
2424
buildModelTemplateData,
25+
packageOf,
2526
} from "../template-codegen/template-data.js";
2627

2728
/** The three built-in walk scopes (SP-1 §3.1). Same vocabulary as the engine
@@ -87,13 +88,13 @@ function scopeWalk(
8788
if (scope === "perEntity") {
8889
return concrete.map((e) => ({
8990
data: buildEntityTemplateData(e),
90-
outputPath: expandOutputPattern(pattern, { name: e.name, package: e.package ?? "" }),
91+
outputPath: expandOutputPattern(pattern, { name: e.name, package: packageOf(e) }),
9192
}));
9293
}
9394
if (scope === "perPackage") {
9495
const byPkg = new Map<string, MetaObject[]>();
9596
for (const o of concrete) {
96-
const pkg = o.package ?? "";
97+
const pkg = packageOf(o);
9798
let bucket = byPkg.get(pkg);
9899
if (bucket === undefined) { bucket = []; byPkg.set(pkg, bucket); }
99100
bucket.push(o);

server/typescript/packages/codegen-ts/src/template-codegen/template-data.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@
55
// spec (and the conformance corpus).
66
import type { MetaObject, MetaRoot, MetaField } from "@metaobjectsdev/metadata";
77
import { FIELD_ATTR_VALUES, FIELD_SUBTYPE_ENUM } from "@metaobjectsdev/metadata";
8+
import { effectivePackage } from "../docs-paths.js";
9+
10+
/** The effective package of an object — its own package OR the file-default
11+
* folded into `resolutionKey()`. `entity.package` alone is usually undefined
12+
* (object fqn() stays bare), so all package reads go through here. */
13+
export function packageOf(entity: MetaObject): string {
14+
return effectivePackage(entity) ?? "";
15+
}
816

917
export interface FieldTemplateData {
1018
name: string;
@@ -46,7 +54,7 @@ function fieldData(field: MetaField): FieldTemplateData {
4654
export function buildEntityTemplateData(entity: MetaObject): EntityTemplateData {
4755
return {
4856
name: entity.name,
49-
package: entity.package ?? "",
57+
package: packageOf(entity),
5058
fields: entity.fields().map(fieldData),
5159
identities: entity.identities().map((i) => ({ kind: i.subType, fields: [...i.fields] })),
5260
relationships: entity.relationships().map((r) => ({
@@ -68,7 +76,7 @@ export function buildModelTemplateData(root: MetaRoot): ModelTemplateData {
6876
const concrete = root.objects().filter((o) => o.isAbstract !== true);
6977
const byPkg = new Map<string, MetaObject[]>();
7078
for (const o of concrete) {
71-
const pkg = o.package ?? "";
79+
const pkg = packageOf(o);
7280
let bucket = byPkg.get(pkg);
7381
if (bucket === undefined) { bucket = []; byPkg.set(pkg, bucket); }
7482
bucket.push(o);

server/typescript/packages/codegen-ts/test/template-codegen/template-data.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ describe("buildEntityTemplateData", () => {
1717
const entity = root.objects()[0]!;
1818
const data = buildEntityTemplateData(entity);
1919
expect(data.name).toBe(entity.name);
20-
expect(data.package).toBe(entity.package ?? "");
20+
// single-entity.json declares package "demo" on the root; the effective
21+
// package must resolve (entity.package alone is undefined — object fqn stays bare).
22+
expect(data.package).toBe("demo");
2123
expect(Array.isArray(data.fields)).toBe(true);
2224
for (const f of data.fields) {
2325
expect(typeof f.type).toBe("string");

0 commit comments

Comments
 (0)