@metaobjectsdev/codegen-ts 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/column-mapper.d.ts +12 -6
  2. package/dist/column-mapper.d.ts.map +1 -1
  3. package/dist/column-mapper.js +48 -24
  4. package/dist/column-mapper.js.map +1 -1
  5. package/dist/enum-shared.js +1 -1
  6. package/dist/enum-shared.js.map +1 -1
  7. package/dist/generators/docs-data-builder.js +14 -14
  8. package/dist/generators/docs-data-builder.js.map +1 -1
  9. package/dist/generators/template-payload-tree.js +1 -1
  10. package/dist/generators/template-payload-tree.js.map +1 -1
  11. package/dist/import-path.d.ts +18 -0
  12. package/dist/import-path.d.ts.map +1 -1
  13. package/dist/import-path.js +21 -0
  14. package/dist/import-path.js.map +1 -1
  15. package/dist/metaobjects-config.d.ts +26 -0
  16. package/dist/metaobjects-config.d.ts.map +1 -1
  17. package/dist/metaobjects-config.js +3 -0
  18. package/dist/metaobjects-config.js.map +1 -1
  19. package/dist/naming.d.ts +20 -2
  20. package/dist/naming.d.ts.map +1 -1
  21. package/dist/naming.js +11 -3
  22. package/dist/naming.js.map +1 -1
  23. package/dist/payload-codegen.js +2 -2
  24. package/dist/payload-codegen.js.map +1 -1
  25. package/dist/pk-resolver.d.ts.map +1 -1
  26. package/dist/pk-resolver.js +4 -2
  27. package/dist/pk-resolver.js.map +1 -1
  28. package/dist/projection/extract-view-spec.js +1 -1
  29. package/dist/projection/extract-view-spec.js.map +1 -1
  30. package/dist/render-context.d.ts +21 -2
  31. package/dist/render-context.d.ts.map +1 -1
  32. package/dist/render-context.js +7 -0
  33. package/dist/render-context.js.map +1 -1
  34. package/dist/runner.d.ts.map +1 -1
  35. package/dist/runner.js +3 -0
  36. package/dist/runner.js.map +1 -1
  37. package/dist/templates/drizzle-schema.d.ts.map +1 -1
  38. package/dist/templates/drizzle-schema.js +44 -23
  39. package/dist/templates/drizzle-schema.js.map +1 -1
  40. package/dist/templates/entity-constants.js +2 -2
  41. package/dist/templates/entity-constants.js.map +1 -1
  42. package/dist/templates/entity-file.js +1 -1
  43. package/dist/templates/entity-file.js.map +1 -1
  44. package/dist/templates/extract-delegate-emitter.js +1 -1
  45. package/dist/templates/extract-delegate-emitter.js.map +1 -1
  46. package/dist/templates/extractor.js +2 -2
  47. package/dist/templates/extractor.js.map +1 -1
  48. package/dist/templates/field-meta.js +1 -1
  49. package/dist/templates/field-meta.js.map +1 -1
  50. package/dist/templates/filter-allowlist.js +2 -2
  51. package/dist/templates/filter-allowlist.js.map +1 -1
  52. package/dist/templates/filter-shared.js +2 -2
  53. package/dist/templates/filter-shared.js.map +1 -1
  54. package/dist/templates/filter-type.js +1 -1
  55. package/dist/templates/filter-type.js.map +1 -1
  56. package/dist/templates/fr010-field-mapping.js +6 -6
  57. package/dist/templates/fr010-field-mapping.js.map +1 -1
  58. package/dist/templates/inferred-types.d.ts +1 -1
  59. package/dist/templates/inferred-types.d.ts.map +1 -1
  60. package/dist/templates/inferred-types.js +18 -7
  61. package/dist/templates/inferred-types.js.map +1 -1
  62. package/dist/templates/mermaid-er.js +1 -1
  63. package/dist/templates/mermaid-er.js.map +1 -1
  64. package/dist/templates/output-format-spec-emitter.js +1 -1
  65. package/dist/templates/output-format-spec-emitter.js.map +1 -1
  66. package/dist/templates/output-parser.js +1 -1
  67. package/dist/templates/output-parser.js.map +1 -1
  68. package/dist/templates/queries-file.js +3 -3
  69. package/dist/templates/queries-file.js.map +1 -1
  70. package/dist/templates/queries.d.ts +2 -2
  71. package/dist/templates/queries.d.ts.map +1 -1
  72. package/dist/templates/queries.js +9 -9
  73. package/dist/templates/queries.js.map +1 -1
  74. package/dist/templates/relations-block.d.ts.map +1 -1
  75. package/dist/templates/relations-block.js +3 -4
  76. package/dist/templates/relations-block.js.map +1 -1
  77. package/dist/templates/render-helper.js +1 -1
  78. package/dist/templates/render-helper.js.map +1 -1
  79. package/dist/templates/routes-file-hono.d.ts.map +1 -1
  80. package/dist/templates/routes-file-hono.js +1 -2
  81. package/dist/templates/routes-file-hono.js.map +1 -1
  82. package/dist/templates/routes-file.js +5 -5
  83. package/dist/templates/routes-file.js.map +1 -1
  84. package/dist/templates/value-object-file.js +2 -2
  85. package/dist/templates/value-object-file.js.map +1 -1
  86. package/dist/templates/zod-validators.d.ts +2 -2
  87. package/dist/templates/zod-validators.d.ts.map +1 -1
  88. package/dist/templates/zod-validators.js +29 -22
  89. package/dist/templates/zod-validators.js.map +1 -1
  90. package/package.json +6 -6
  91. package/src/column-mapper.ts +58 -28
  92. package/src/enum-shared.ts +1 -1
  93. package/src/generators/docs-data-builder.ts +14 -14
  94. package/src/generators/template-payload-tree.ts +1 -1
  95. package/src/import-path.ts +28 -0
  96. package/src/metaobjects-config.ts +29 -0
  97. package/src/naming.ts +25 -3
  98. package/src/payload-codegen.ts +2 -2
  99. package/src/pk-resolver.ts +4 -2
  100. package/src/projection/extract-view-spec.ts +1 -1
  101. package/src/render-context.ts +28 -2
  102. package/src/runner.ts +3 -0
  103. package/src/templates/drizzle-schema.ts +51 -29
  104. package/src/templates/entity-constants.ts +2 -2
  105. package/src/templates/entity-file.ts +1 -1
  106. package/src/templates/extract-delegate-emitter.ts +1 -1
  107. package/src/templates/extractor.ts +2 -2
  108. package/src/templates/field-meta.ts +1 -1
  109. package/src/templates/filter-allowlist.ts +2 -2
  110. package/src/templates/filter-shared.ts +2 -2
  111. package/src/templates/filter-type.ts +1 -1
  112. package/src/templates/fr010-field-mapping.ts +6 -6
  113. package/src/templates/inferred-types.ts +18 -7
  114. package/src/templates/mermaid-er.ts +1 -1
  115. package/src/templates/output-format-spec-emitter.ts +1 -1
  116. package/src/templates/output-parser.ts +1 -1
  117. package/src/templates/queries-file.ts +3 -3
  118. package/src/templates/queries.ts +8 -10
  119. package/src/templates/relations-block.ts +3 -4
  120. package/src/templates/render-helper.ts +1 -1
  121. package/src/templates/routes-file-hono.ts +1 -2
  122. package/src/templates/routes-file.ts +5 -5
  123. package/src/templates/value-object-file.ts +2 -2
  124. package/src/templates/zod-validators.ts +29 -22
  125. package/dist/templates/extract-schema-emitter.d.ts +0 -8
  126. package/dist/templates/extract-schema-emitter.d.ts.map +0 -1
  127. package/dist/templates/extract-schema-emitter.js +0 -85
  128. package/dist/templates/extract-schema-emitter.js.map +0 -1
  129. package/dist/templates/recover-schema-emitter.d.ts +0 -8
  130. package/dist/templates/recover-schema-emitter.d.ts.map +0 -1
  131. package/dist/templates/recover-schema-emitter.js +0 -64
  132. package/dist/templates/recover-schema-emitter.js.map +0 -1
@@ -1,85 +0,0 @@
1
- // server/typescript/packages/codegen-ts/src/templates/extract-schema-emitter.ts
2
- //
3
- // Turns a payload value-object into TS source fragments for the FR-010 extract codegen:
4
- // • schemaLiteral — a `extractSchema(Format.JSON, "root", [ … ])` baked descriptor
5
- // built from FieldSpec factories (scalar / enumField).
6
- // • mirrorInterface — an all-nullable mirror interface `<Payload>Extracted` (each
7
- // component `T | null`); extract returns this nullable twin rather
8
- // than the strict payload (same reasoning as the Java/C#/Kotlin ports).
9
- // • mirrorInitializer — `{ prop: asString(d, "prop"), … }` building the mirror from the
10
- // forgiving outcome map `d`.
11
- //
12
- // Mirrors the C# ExtractSchemaEmitter (adapted to TS syntax + the `| null` nullable mirror).
13
- // Bounded scope: scalar / enum / scalar-array. Nested object + array-of-enum deferred.
14
- import { FIELD_SUBTYPE_ENUM, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_ENUM_ALIAS, } from "@metaobjectsdev/metadata";
15
- import { fields, isRequired, isArray, xmlText, scalarKind, mirrorType, extractMapCall, enumValues, coerceDefault, defaultValue, resolveNormalize, jsonStringLiteral, stringArrayLiteral, propertiesMapLiteral, } from "./fr010-field-mapping.js";
16
- import { NORMALIZE_DEFAULT } from "@metaobjectsdev/metadata";
17
- /** Emit `extractSchema(Format.X, "rootName", [ … ])`. */
18
- export function schemaLiteral(vo, format, rootName) {
19
- const formatEnum = format.toLowerCase() === "xml" ? "Format.XML" : "Format.JSON";
20
- const specs = fields(vo).map((f) => fieldSpecLiteral(f, vo));
21
- return `extractSchema(${formatEnum}, ${jsonStringLiteral(rootName)}, [${specs.join(", ")}])`;
22
- }
23
- function fieldSpecLiteral(field, owner) {
24
- const name = jsonStringLiteral(field.name);
25
- const required = isRequired(field);
26
- if (field.subType === FIELD_SUBTYPE_ENUM) {
27
- const valuesLit = stringArrayLiteral(enumValues(field));
28
- const aliasLit = propertiesMapLiteral(field.ownAttr(FIELD_ATTR_ENUM_ALIAS));
29
- // FR-011: extended enumField signature is (name, required, values, aliases,
30
- // coerceDefault?, normalize="strip", defaultValue?). Resolve the three new args
31
- // (field → object → "strip" for normalize) and emit only what's needed: keep the
32
- // back-compat 4-arg form when nothing is set, else emit the positional tail up to
33
- // the last meaningful arg.
34
- const cd = coerceDefault(field);
35
- const dv = defaultValue(field);
36
- const normalize = resolveNormalize(field, owner);
37
- // enumField() sets array:false; enum-array is a bounded deferral (parity with Java/C#).
38
- if (cd == null && dv == null && normalize === NORMALIZE_DEFAULT) {
39
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit})`;
40
- }
41
- const cdLit = cd == null ? "null" : jsonStringLiteral(cd);
42
- const normLit = jsonStringLiteral(normalize);
43
- if (dv == null) {
44
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit}, ${cdLit}, ${normLit})`;
45
- }
46
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit}, ${cdLit}, ${normLit}, ${jsonStringLiteral(dv)})`;
47
- }
48
- if (field.subType === FIELD_SUBTYPE_OBJECT) {
49
- // FR-010: nested extract deferred — treat as an opaque required/optional string slot.
50
- return `scalar(${name}, FieldKind.STRING, ${required}) /* FR-010: nested extract deferred */`;
51
- }
52
- const kind = scalarKind(field.subType) ?? "STRING";
53
- // Scalar-array: the scalar() factory only builds singular specs (array:false), so emit a
54
- // FieldSpec object literal with array:true. Tier-2 win over the Roslyn proof: the emitted
55
- // extract() actually populates the array at runtime (ExtractMap.asStringList).
56
- if (isArray(field)) {
57
- return (`{ name: ${name}, kind: FieldKind.${kind}, required: ${required}, array: true, ` +
58
- `enumValues: null, enumAlias: null, min: null, max: null, nested: null }`);
59
- }
60
- // @xmlText: a scalar field marked to receive its element's XML text content.
61
- if (xmlText(field)) {
62
- return `textContentField(${name}, FieldKind.${kind}, ${required})`;
63
- }
64
- return `scalar(${name}, FieldKind.${kind}, ${required})`;
65
- }
66
- /** Emit the all-nullable mirror interface declaration. */
67
- export function mirrorInterface(vo, interfaceName) {
68
- const base = interfaceName.endsWith("Extracted")
69
- ? interfaceName.slice(0, -"Extracted".length)
70
- : interfaceName;
71
- const lines = [];
72
- lines.push(`/** Best-effort extracted twin of \`${base}\` — every field nullable (null where lost/malformed). */`);
73
- lines.push(`export interface ${interfaceName} {`);
74
- for (const f of fields(vo)) {
75
- lines.push(` ${f.name}: ${mirrorType(f)};`);
76
- }
77
- lines.push("}");
78
- return lines.join("\n");
79
- }
80
- /** Emit `{ prop: asString(d, "prop"), … }` building the mirror from the forgiving map `d`. */
81
- export function mirrorInitializer(vo) {
82
- const assigns = fields(vo).map((f) => `${f.name}: ${extractMapCall(f)}`);
83
- return `{ ${assigns.join(", ")} }`;
84
- }
85
- //# sourceMappingURL=extract-schema-emitter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-schema-emitter.js","sourceRoot":"","sources":["../../src/templates/extract-schema-emitter.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import { type MetaData } from "@metaobjectsdev/metadata";
2
- /** Emit `recoverSchema(Format.X, "rootName", [ … ])`. */
3
- export declare function schemaLiteral(vo: MetaData, format: string, rootName: string): string;
4
- /** Emit the all-nullable mirror interface declaration. */
5
- export declare function mirrorInterface(vo: MetaData, interfaceName: string): string;
6
- /** Emit `{ prop: asString(d, "prop"), … }` building the mirror from the forgiving map `d`. */
7
- export declare function mirrorInitializer(vo: MetaData): string;
8
- //# sourceMappingURL=recover-schema-emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recover-schema-emitter.d.ts","sourceRoot":"","sources":["../../src/templates/recover-schema-emitter.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,0BAA0B,CAAC;AAclC,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIpF;AA+BD,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAc3E;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAGtD"}
@@ -1,64 +0,0 @@
1
- // server/typescript/packages/codegen-ts/src/templates/recover-schema-emitter.ts
2
- //
3
- // Turns a payload value-object into TS source fragments for the FR-010 recover codegen:
4
- // • schemaLiteral — a `recoverSchema(Format.JSON, "root", [ … ])` baked descriptor
5
- // built from FieldSpec factories (scalar / enumField).
6
- // • mirrorInterface — an all-nullable mirror interface `<Payload>Recovered` (each
7
- // component `T | null`); recover returns this nullable twin rather
8
- // than the strict payload (same reasoning as the Java/C#/Kotlin ports).
9
- // • mirrorInitializer — `{ prop: asString(d, "prop"), … }` building the mirror from the
10
- // forgiving outcome map `d`.
11
- //
12
- // Mirrors the C# RecoverSchemaEmitter (adapted to TS syntax + the `| null` nullable mirror).
13
- // Bounded scope: scalar / enum / scalar-array. Nested object + array-of-enum deferred.
14
- import { FIELD_SUBTYPE_ENUM, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_ENUM_ALIAS, } from "@metaobjectsdev/metadata";
15
- import { fields, isRequired, isArray, scalarKind, mirrorType, recoverMapCall, enumValues, jsonStringLiteral, stringArrayLiteral, propertiesMapLiteral, } from "./fr010-field-mapping.js";
16
- /** Emit `recoverSchema(Format.X, "rootName", [ … ])`. */
17
- export function schemaLiteral(vo, format, rootName) {
18
- const formatEnum = format.toLowerCase() === "xml" ? "Format.XML" : "Format.JSON";
19
- const specs = fields(vo).map(fieldSpecLiteral);
20
- return `recoverSchema(${formatEnum}, ${jsonStringLiteral(rootName)}, [${specs.join(", ")}])`;
21
- }
22
- function fieldSpecLiteral(field) {
23
- const name = jsonStringLiteral(field.name);
24
- const required = isRequired(field);
25
- if (field.subType === FIELD_SUBTYPE_ENUM) {
26
- const valuesLit = stringArrayLiteral(enumValues(field));
27
- const aliasLit = propertiesMapLiteral(field.ownAttr(FIELD_ATTR_ENUM_ALIAS));
28
- // enumField() sets array:false; enum-array is a bounded deferral (parity with Java/C#).
29
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit})`;
30
- }
31
- if (field.subType === FIELD_SUBTYPE_OBJECT) {
32
- // FR-010: nested recover deferred — treat as an opaque required/optional string slot.
33
- return `scalar(${name}, FieldKind.STRING, ${required}) /* FR-010: nested recover deferred */`;
34
- }
35
- const kind = scalarKind(field.subType) ?? "STRING";
36
- // Scalar-array: the scalar() factory only builds singular specs (array:false), so emit a
37
- // FieldSpec object literal with array:true. Tier-2 win over the Roslyn proof: the emitted
38
- // recover() actually populates the array at runtime (RecoverMap.asStringList).
39
- if (isArray(field)) {
40
- return (`{ name: ${name}, kind: FieldKind.${kind}, required: ${required}, array: true, ` +
41
- `enumValues: null, enumAlias: null, min: null, max: null, nested: null }`);
42
- }
43
- return `scalar(${name}, FieldKind.${kind}, ${required})`;
44
- }
45
- /** Emit the all-nullable mirror interface declaration. */
46
- export function mirrorInterface(vo, interfaceName) {
47
- const base = interfaceName.endsWith("Recovered")
48
- ? interfaceName.slice(0, -"Recovered".length)
49
- : interfaceName;
50
- const lines = [];
51
- lines.push(`/** Best-effort recovered twin of \`${base}\` — every field nullable (null where lost/malformed). */`);
52
- lines.push(`export interface ${interfaceName} {`);
53
- for (const f of fields(vo)) {
54
- lines.push(` ${f.name}: ${mirrorType(f)};`);
55
- }
56
- lines.push("}");
57
- return lines.join("\n");
58
- }
59
- /** Emit `{ prop: asString(d, "prop"), … }` building the mirror from the forgiving map `d`. */
60
- export function mirrorInitializer(vo) {
61
- const assigns = fields(vo).map((f) => `${f.name}: ${recoverMapCall(f)}`);
62
- return `{ ${assigns.join(", ")} }`;
63
- }
64
- //# sourceMappingURL=recover-schema-emitter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recover-schema-emitter.js","sourceRoot":"","sources":["../../src/templates/recover-schema-emitter.ts"],"names":[],"mappings":"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"}