@metaobjectsdev/codegen-ts 0.7.0-rc.9 → 0.8.0-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.
Files changed (108) hide show
  1. package/dist/generator.d.ts +9 -0
  2. package/dist/generator.d.ts.map +1 -1
  3. package/dist/generator.js.map +1 -1
  4. package/dist/generators/docs-data-builder.d.ts +16 -0
  5. package/dist/generators/docs-data-builder.d.ts.map +1 -0
  6. package/dist/generators/docs-data-builder.js +381 -0
  7. package/dist/generators/docs-data-builder.js.map +1 -0
  8. package/dist/generators/docs-data.d.ts +98 -0
  9. package/dist/generators/docs-data.d.ts.map +1 -0
  10. package/dist/generators/docs-data.js +43 -0
  11. package/dist/generators/docs-data.js.map +1 -0
  12. package/dist/generators/docs-file.d.ts +8 -0
  13. package/dist/generators/docs-file.d.ts.map +1 -0
  14. package/dist/generators/docs-file.js +77 -0
  15. package/dist/generators/docs-file.js.map +1 -0
  16. package/dist/generators/entity-file.d.ts.map +1 -1
  17. package/dist/generators/entity-file.js +7 -0
  18. package/dist/generators/entity-file.js.map +1 -1
  19. package/dist/generators/index.d.ts +5 -0
  20. package/dist/generators/index.d.ts.map +1 -1
  21. package/dist/generators/index.js +4 -0
  22. package/dist/generators/index.js.map +1 -1
  23. package/dist/generators/output-prompt-file.d.ts +9 -0
  24. package/dist/generators/output-prompt-file.d.ts.map +1 -0
  25. package/dist/generators/output-prompt-file.js +51 -0
  26. package/dist/generators/output-prompt-file.js.map +1 -0
  27. package/dist/generators/template-generator.d.ts +41 -0
  28. package/dist/generators/template-generator.d.ts.map +1 -0
  29. package/dist/generators/template-generator.js +62 -0
  30. package/dist/generators/template-generator.js.map +1 -0
  31. package/dist/index.d.ts +7 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +8 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/instance-artifacts.d.ts +29 -0
  36. package/dist/instance-artifacts.d.ts.map +1 -0
  37. package/dist/instance-artifacts.js +57 -0
  38. package/dist/instance-artifacts.js.map +1 -0
  39. package/dist/metaobjects-config.d.ts +10 -0
  40. package/dist/metaobjects-config.d.ts.map +1 -1
  41. package/dist/metaobjects-config.js +1 -0
  42. package/dist/metaobjects-config.js.map +1 -1
  43. package/dist/overwrite-policy.d.ts +39 -2
  44. package/dist/overwrite-policy.d.ts.map +1 -1
  45. package/dist/overwrite-policy.js +233 -13
  46. package/dist/overwrite-policy.js.map +1 -1
  47. package/dist/render-context.d.ts +4 -1
  48. package/dist/render-context.d.ts.map +1 -1
  49. package/dist/render-context.js +1 -0
  50. package/dist/render-context.js.map +1 -1
  51. package/dist/render-engine/framework-provider.d.ts +28 -0
  52. package/dist/render-engine/framework-provider.d.ts.map +1 -0
  53. package/dist/render-engine/framework-provider.js +104 -0
  54. package/dist/render-engine/framework-provider.js.map +1 -0
  55. package/dist/runner.d.ts +15 -1
  56. package/dist/runner.d.ts.map +1 -1
  57. package/dist/runner.js +45 -6
  58. package/dist/runner.js.map +1 -1
  59. package/dist/templates/docs-file.d.ts +17 -0
  60. package/dist/templates/docs-file.d.ts.map +1 -0
  61. package/dist/templates/docs-file.js +37 -0
  62. package/dist/templates/docs-file.js.map +1 -0
  63. package/dist/templates/entity-file.d.ts.map +1 -1
  64. package/dist/templates/entity-file.js +12 -0
  65. package/dist/templates/entity-file.js.map +1 -1
  66. package/dist/templates/fr010-field-mapping.d.ts +28 -0
  67. package/dist/templates/fr010-field-mapping.d.ts.map +1 -0
  68. package/dist/templates/fr010-field-mapping.js +170 -0
  69. package/dist/templates/fr010-field-mapping.js.map +1 -0
  70. package/dist/templates/output-format-spec-emitter.d.ts +4 -0
  71. package/dist/templates/output-format-spec-emitter.d.ts.map +1 -0
  72. package/dist/templates/output-format-spec-emitter.js +60 -0
  73. package/dist/templates/output-format-spec-emitter.js.map +1 -0
  74. package/dist/templates/output-parser.d.ts.map +1 -1
  75. package/dist/templates/output-parser.js +69 -4
  76. package/dist/templates/output-parser.js.map +1 -1
  77. package/dist/templates/output-prompt.d.ts +10 -0
  78. package/dist/templates/output-prompt.d.ts.map +1 -0
  79. package/dist/templates/output-prompt.js +75 -0
  80. package/dist/templates/output-prompt.js.map +1 -0
  81. package/dist/templates/recover-schema-emitter.d.ts +8 -0
  82. package/dist/templates/recover-schema-emitter.d.ts.map +1 -0
  83. package/dist/templates/recover-schema-emitter.js +64 -0
  84. package/dist/templates/recover-schema-emitter.js.map +1 -0
  85. package/package.json +5 -5
  86. package/src/generator.ts +9 -0
  87. package/src/generators/docs-data-builder.ts +470 -0
  88. package/src/generators/docs-data.ts +154 -0
  89. package/src/generators/docs-file.ts +87 -0
  90. package/src/generators/entity-file.ts +7 -0
  91. package/src/generators/index.ts +17 -0
  92. package/src/generators/output-prompt-file.ts +66 -0
  93. package/src/generators/template-generator.ts +106 -0
  94. package/src/index.ts +34 -2
  95. package/src/instance-artifacts.ts +61 -0
  96. package/src/metaobjects-config.ts +11 -0
  97. package/src/overwrite-policy.ts +325 -14
  98. package/src/render-context.ts +5 -1
  99. package/src/render-engine/framework-provider.ts +107 -0
  100. package/src/runner.ts +66 -6
  101. package/src/templates/docs-file.ts +51 -0
  102. package/src/templates/entity-file.ts +13 -0
  103. package/src/templates/fr010-field-mapping.ts +191 -0
  104. package/src/templates/output-format-spec-emitter.ts +97 -0
  105. package/src/templates/output-parser.ts +77 -2
  106. package/src/templates/output-prompt.ts +88 -0
  107. package/src/templates/recover-schema-emitter.ts +91 -0
  108. package/templates/docs/entity-page.md.mustache +54 -0
package/dist/runner.js CHANGED
@@ -1,16 +1,35 @@
1
- import { join } from "node:path";
1
+ import { join, relative, resolve, isAbsolute } from "node:path";
2
+ import { tmpdir } from "node:os";
2
3
  import { MetaRoot } from "@metaobjectsdev/metadata";
3
4
  import { normalizeConfig, DEFAULT_TARGET_NAME } from "./metaobjects-config.js";
4
5
  import { buildPkMap } from "./pk-resolver.js";
5
6
  import { buildRelationMap } from "./relation-resolver.js";
6
7
  import { makeRenderContext } from "./render-context.js";
7
- import { decideAndWrite } from "./overwrite-policy.js";
8
+ import { decideAndWrite, } from "./overwrite-policy.js";
8
9
  /** JS-identifier-shape only. Prevents filesystem traversal when metadata comes
9
10
  * from untrusted sources (e.g. MCP). Mirrors the guard in legacy generate.ts. */
10
11
  const VALID_ENTITY_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
11
12
  export async function runGen(opts) {
12
13
  const warnings = [];
13
14
  const strategy = opts.mergeStrategy ?? "overwrite";
15
+ const baseline = opts.baseline ?? "default";
16
+ // When projectRoot is not supplied we DON'T fall back to process.cwd() —
17
+ // that would leak .gen-state/ into whatever directory happens to be cwd
18
+ // (e.g. the package dir during a unit-test run). Instead, fall back to a
19
+ // process-isolated tmpdir, which gives the new-write semantics every call
20
+ // (the snapshot exists only for the current process). The CLI's
21
+ // `genCommand` always passes a real projectRoot, so this fallback only
22
+ // affects programmatic callers (tests, library embedding).
23
+ const projectRoot = opts.projectRoot !== undefined
24
+ ? (isAbsolute(opts.projectRoot) ? opts.projectRoot : resolve(opts.projectRoot))
25
+ : undefined;
26
+ const genStateDir = opts.genStateDir !== undefined
27
+ ? (isAbsolute(opts.genStateDir)
28
+ ? opts.genStateDir
29
+ : resolve(projectRoot ?? process.cwd(), opts.genStateDir))
30
+ : (projectRoot !== undefined
31
+ ? join(projectRoot, ".metaobjects", ".gen-state")
32
+ : join(tmpdir(), `meta-gen-state-${process.pid}`));
14
33
  // loadMemory now returns MetaRoot; guard here also covers callers that pass a
15
34
  // plain MetaData (e.g. test helpers that build trees programmatically).
16
35
  if (!(opts.metadata instanceof MetaRoot)) {
@@ -28,7 +47,7 @@ export async function runGen(opts) {
28
47
  ? "no object children match the provided entityFilter"
29
48
  : "root has no object children";
30
49
  warnings.push(`No entities to generate — ${reason}.`);
31
- return { files: [], warnings };
50
+ return { files: [], warnings, conflicts: [] };
32
51
  }
33
52
  const safeEntities = [];
34
53
  for (const entity of filtered) {
@@ -39,7 +58,7 @@ export async function runGen(opts) {
39
58
  safeEntities.push(entity);
40
59
  }
41
60
  if (safeEntities.length === 0) {
42
- return { files: [], warnings };
61
+ return { files: [], warnings, conflicts: [] };
43
62
  }
44
63
  // 2. Resolve targets + entity-module target.
45
64
  const config = normalizeConfig(opts.config);
@@ -80,6 +99,7 @@ export async function runGen(opts) {
80
99
  extStyle: config.extStyle,
81
100
  columnNamingStrategy: config.columnNamingStrategy,
82
101
  apiPrefix: config.apiPrefix,
102
+ emitAbstractShapes: config.emitAbstractShapes,
83
103
  outputLayout: selfTarget.outputLayout,
84
104
  pkMap,
85
105
  relationMap,
@@ -99,6 +119,7 @@ export async function runGen(opts) {
99
119
  outputLayout: selfTarget.outputLayout,
100
120
  },
101
121
  renderContext,
122
+ ...(projectRoot !== undefined && { projectRoot }),
102
123
  warn: (msg) => warnings.push(`[${generator.name}] ${msg}`),
103
124
  };
104
125
  let files;
@@ -122,14 +143,32 @@ export async function runGen(opts) {
122
143
  }
123
144
  // 5. Write phase.
124
145
  const writes = [];
146
+ const conflicts = [];
125
147
  for (const file of emitted) {
126
- const result = decideAndWrite(file.fullPath, file.content, strategy);
148
+ // Key the snapshot by project-relative path so multi-target projects keep
149
+ // distinct entries (e.g. `database/Post.ts` vs `web/Post.queries.ts`).
150
+ // Without an explicit projectRoot we let decideAndWrite derive a stable
151
+ // hash-of-path key — fine for ephemeral test runs.
152
+ const policyOpts = {
153
+ strategy,
154
+ genStateDir,
155
+ baseline,
156
+ };
157
+ if (projectRoot !== undefined) {
158
+ policyOpts.outputRelPath = relative(projectRoot, file.fullPath);
159
+ }
160
+ const result = decideAndWrite(file.fullPath, file.content, policyOpts);
127
161
  writes.push(result);
162
+ if (result.status === "conflict") {
163
+ conflicts.push(result);
164
+ warnings.push(`Merge conflict in ${file.fullPath}: resolve diff3 markers and re-run ` +
165
+ `'meta gen' to advance the canonical state.`);
166
+ }
128
167
  if (result.status === "refused") {
129
168
  warnings.push(`Refused to overwrite ${file.fullPath}: file exists without @generated header. ` +
130
169
  `Move to a different outDir, delete the file, or add the header to opt in.`);
131
170
  }
132
171
  }
133
- return { files: writes, warnings };
172
+ return { files: writes, warnings, conflicts };
134
173
  }
135
174
  //# sourceMappingURL=runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAwC,MAAM,uBAAuB,CAAC;AAE7F;kFACkF;AAClF,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AAgBrD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAgB;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,IAAI,WAAW,CAAC;IAEnD,8EAA8E;IAC9E,wEAAwE;IACxE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,YAAY,QAAQ,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;IAE3B,+CAA+C;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACvC,MAAM,QAAQ,GAAG,YAAY;QAC3B,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC,UAAU,CAAC;IACf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY;YAC9B,CAAC,CAAC,oDAAoD;YACtD,CAAC,CAAC,6BAA6B,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,MAAM,GAAG,CAAC,CAAC;QACtD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,YAAY,GAAiB,EAAE,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CACX,qCAAqC,MAAM,CAAC,IAAI,4CAA4C,CAC7F,CAAC;YACF,SAAS;QACX,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,6CAA6C;IAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,MAAM,QAAQ,GAAG,CAAC,CAAY,EAAkB,EAAE;QAChD,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,mBAAmB,CAAC;QAC7C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CACb,cAAc,CAAC,CAAC,IAAI,gCAAgC,IAAI,KAAK;gBAC7D,kBAAkB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACrD,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,2CAA2C;IAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU;QAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACrE,MAAM,kBAAkB,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAE,CAAC;IAE3F,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,mBAAmB,CAAC,KAAK,kBAAkB,CAAC,IAAI,CACrE,CAAC;IACF,IAAI,gBAAgB,IAAI,kBAAkB,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CACb,WAAW,kBAAkB,CAAC,IAAI,wCAAwC;YAC1E,oEAAoE;YACpE,kCAAkC,CACnC,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAC/C,CAAC;IAEF,kFAAkF;IAClF,MAAM,OAAO,GAAiE,EAAE,CAAC;IACjF,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,aAAa,GAAG,iBAAiB,CAAC;YACtC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;YACjD,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,KAAK;YACL,WAAW;YACX,SAAS;YACT,UAAU;YACV,kBAAkB;SACnB,CAAC,CAAC;QACH,MAAM,GAAG,GAAe;YACtB,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;YAC7C,MAAM,EAAE;gBACN,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,YAAY,EAAE,UAAU,CAAC,YAAY;aACtC;YACD,aAAa;YACb,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;SAC3D,CAAC;QAEF,IAAI,KAAoB,CAAC;QACzB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YACrE,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,2BAA2B,QAAQ,oBAAoB;oBACvD,IAAI,SAAS,CAAC,WAAW,UAAU,SAAS,CAAC,IAAI,KAAK;oBACtD,+CAA+C,CAChD,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CACX,wBAAwB,IAAI,CAAC,QAAQ,2CAA2C;gBAChF,2EAA2E,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { MetaObject, MetaRoot } from "@metaobjectsdev/metadata";
2
+ import type { Dialect } from "../column-mapper.js";
3
+ import type { ColumnNamingStrategy } from "../metaobjects-config.js";
4
+ export interface DocsRenderOpts {
5
+ dialect: Dialect;
6
+ columnNamingStrategy?: ColumnNamingStrategy;
7
+ loadedRoot: MetaRoot;
8
+ /** Names of generators present in the pipeline — drives the "Generated code"
9
+ * section. Always includes "entity-file" implicitly. Recognized names:
10
+ * "queries-file", "routes-file", "routes-file-hono". */
11
+ generatorNames?: ReadonlySet<string>;
12
+ }
13
+ /** Backward-compatible entry point: builds the EntityDocData payload and
14
+ * renders it via the framework template. Byte-identical to the hand-coded
15
+ * rc.11 output (gated by `docs-file-conformance.test.ts`). */
16
+ export declare function renderDocsFile(entity: MetaObject, opts: DocsRenderOpts): string;
17
+ //# sourceMappingURL=docs-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-file.d.ts","sourceRoot":"","sources":["../../src/templates/docs-file.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAKrE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,UAAU,EAAE,QAAQ,CAAC;IACrB;;6DAEyD;IACzD,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACtC;AAED;;+DAE+D;AAC/D,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAiB/E"}
@@ -0,0 +1,37 @@
1
+ // Backward-compatible facade over the rc.12+ template-driven docsFile()
2
+ // implementation. The Markdown structure now lives in
3
+ // `templates/docs/entity-page.md.mustache`; this module preserves the
4
+ // `renderDocsFile()` + `DocsRenderOpts` exports so the per-section unit
5
+ // tests in `test/templates/docs-file.test.ts` keep working without
6
+ // modification.
7
+ //
8
+ // Adopters writing custom docs templates should import the public surface
9
+ // from `@metaobjectsdev/codegen-ts/generators` instead:
10
+ // - `buildEntityDocData(entity, opts)` for the typed data dict
11
+ // - `templateGenerator({ template: "docs/entity-page.md", ... })` for the
12
+ // standard end-to-end generator
13
+ import { render } from "@metaobjectsdev/render";
14
+ import { buildEntityDocData } from "../generators/docs-data-builder.js";
15
+ import { frameworkTemplatesProvider } from "../render-engine/framework-provider.js";
16
+ /** Backward-compatible entry point: builds the EntityDocData payload and
17
+ * renders it via the framework template. Byte-identical to the hand-coded
18
+ * rc.11 output (gated by `docs-file-conformance.test.ts`). */
19
+ export function renderDocsFile(entity, opts) {
20
+ const data = buildEntityDocData(entity, {
21
+ dialect: opts.dialect,
22
+ ...(opts.columnNamingStrategy !== undefined
23
+ ? { columnNamingStrategy: opts.columnNamingStrategy }
24
+ : {}),
25
+ loadedRoot: opts.loadedRoot,
26
+ ...(opts.generatorNames !== undefined
27
+ ? { generatorNames: opts.generatorNames }
28
+ : {}),
29
+ });
30
+ return render({
31
+ ref: "docs/entity-page.md",
32
+ payload: data,
33
+ provider: frameworkTemplatesProvider,
34
+ format: "markdown",
35
+ });
36
+ }
37
+ //# sourceMappingURL=docs-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-file.js","sourceRoot":"","sources":["../../src/templates/docs-file.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,sDAAsD;AACtD,sEAAsE;AACtE,wEAAwE;AACxE,mEAAmE;AACnE,gBAAgB;AAChB,EAAE;AACF,0EAA0E;AAC1E,wDAAwD;AACxD,iEAAiE;AACjE,4EAA4E;AAC5E,oCAAoC;AAKpC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AAYpF;;+DAE+D;AAC/D,MAAM,UAAU,cAAc,CAAC,MAAkB,EAAE,IAAoB;IACrE,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE;QACtC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,oBAAoB,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE;YACrD,CAAC,CAAC,EAAE,CAAC;QACP,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS;YACnC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;YACzC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;QACZ,GAAG,EAAE,qBAAqB;QAC1B,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,0BAA0B;QACpC,MAAM,EAAE,UAAU;KACnB,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"entity-file.d.ts","sourceRoot":"","sources":["../../src/templates/entity-file.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAa1D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,aAAa,EAClB,IAAI,CAAC,EAAE,oBAAoB,GAC1B,MAAM,CA2CR"}
1
+ {"version":3,"file":"entity-file.d.ts","sourceRoot":"","sources":["../../src/templates/entity-file.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAc1D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,aAAa,EAClB,IAAI,CAAC,EAAE,oBAAoB,GAC1B,MAAM,CAuDR"}
@@ -17,8 +17,20 @@ import { isProjection } from "../projection/projection-detector.js";
17
17
  import { renderProjectionDecl } from "./projection-decl.js";
18
18
  import { hasWritableRdbSource } from "../source-detect.js";
19
19
  import { renderValueObjectFile } from "./value-object-file.js";
20
+ import { isAbstract } from "../instance-artifacts.js";
20
21
  export function renderEntityFile(entity, ctx, opts) {
21
22
  const allowlists = opts?.allowlists ?? true;
23
+ // --- Abstract path (shape only) ---
24
+ // An abstract entity contributes shape via inheritance only — it must NEVER
25
+ // produce a Drizzle table / migration footprint / filter allowlist, even when
26
+ // it carries a source.rdb child. This is the cross-port invariant (abstract →
27
+ // no instance/write artifacts, including CREATE TABLE). It still emits its
28
+ // value-object shape (interface + Zod) so subclasses/consumers can reference
29
+ // it. The entity-file generator suppresses this entirely when
30
+ // emitAbstractShapes is off; here we only guarantee "shape, never table".
31
+ if (isAbstract(entity)) {
32
+ return renderValueObjectFile(entity);
33
+ }
22
34
  // --- Projection path (read-only: view-backed entity with no table source) ---
23
35
  // Projections intentionally get the z.enum() validator but NOT a named enum
24
36
  // type alias — emitting aliases here is a deliberate v1 scope decision.
@@ -1 +1 @@
1
- {"version":3,"file":"entity-file.js","sourceRoot":"","sources":["../../src/templates/entity-file.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,0EAA0E;AAC1E,EAAE;AACF,YAAY;AACZ,oHAAoH;AACpH,mHAAmH;AACnH,4DAA4D;AAE5D,OAAO,EAAE,QAAQ,EAAa,MAAM,SAAS,CAAC;AAG9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAiB/D,MAAM,UAAU,gBAAgB,CAC9B,MAAkB,EAClB,GAAkB,EAClB,IAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,IAAI,CAAC;IAE5C,+EAA+E;IAC/E,4EAA4E;IAC5E,wEAAwE;IACxE,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE;YAClD,oBAAoB,EAAE,GAAG,CAAC,oBAAoB;YAC9C,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,4EAA4E;IAC5E,uEAAuE;IACvE,0DAA0D;IAC1D,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,8CAA8C;IAC9C,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAW;QACvB,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC;QAChC,mBAAmB,CAAC,MAAM,CAAC;QAC3B,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,mBAAmB,CAAC,MAAM,CAAC;QAC3B,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC;QAC5C,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,gBAAgB,CAAC,MAAM,CAAC;KACzB,CAAC;IAEF,+EAA+E;IAC/E,4EAA4E;IAC5E,0EAA0E;IAC1E,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzD,MAAM,MAAM,GACV,MAAM,gBAAgB,mBAAmB;QACzC,uBAAuB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK;QACxD,oBAAoB,MAAM,CAAC,IAAI,gCAAgC,CAAC;IAClE,OAAO,MAAM,GAAG,IAAI,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"entity-file.js","sourceRoot":"","sources":["../../src/templates/entity-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type MetaData } from "@metaobjectsdev/metadata";
2
+ /** The render-engine FieldKind member name for a scalar field subtype, or null if non-scalar. */
3
+ export declare function scalarKind(subType: string): string | null;
4
+ /** The field children of a payload value-object, in declaration order. */
5
+ export declare function fields(vo: MetaData): MetaData[];
6
+ /** isArray is a native (reserved) property on MetaData, not an attr. */
7
+ export declare function isArray(field: MetaData): boolean;
8
+ /** True iff the field's @required is explicitly true (or the string "true"). */
9
+ export declare function isRequired(field: MetaData): boolean;
10
+ /** The string members of an enum field's @values attr (empty when absent). */
11
+ export declare function enumValues(field: MetaData): string[];
12
+ /** The nullable TS type for a field in the recover mirror interface. */
13
+ export declare function mirrorType(field: MetaData): string;
14
+ /** The RecoverMap.as* helper name + call that reads this field from the forgiving map `d`. */
15
+ export declare function recoverMapCall(field: MetaData): string;
16
+ /** Distinct RecoverMap helper names used across a value-object's fields (for the import). */
17
+ export declare function recoverMapHelpersUsed(vo: MetaData): string[];
18
+ /** A TS double-quoted string literal for `value`, with the load-bearing chars escaped. */
19
+ export declare function jsonStringLiteral(value: string): string;
20
+ /** A TS array literal `["a", "b"]` for the given members. */
21
+ export declare function stringArrayLiteral(values: readonly string[]): string;
22
+ /**
23
+ * A TS object literal `{ "k": "v", … }` for a properties-shaped attr (e.g. @enumAlias /
24
+ * @enumDoc), or "null" when absent/empty. Null values are dropped; keys are sorted
25
+ * ordinally for deterministic output (matches the canonical-serializer properties sort).
26
+ */
27
+ export declare function propertiesMapLiteral(attr: unknown): string;
28
+ //# sourceMappingURL=fr010-field-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fr010-field-mapping.d.ts","sourceRoot":"","sources":["../../src/templates/fr010-field-mapping.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,KAAK,QAAQ,EAoBd,MAAM,0BAA0B,CAAC;AAElC,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBzD;AAED,0EAA0E;AAC1E,wBAAgB,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAE/C;AAED,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAEhD;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAInD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,EAAE,CAIpD;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAgBlD;AAyBD,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAItD;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,EAAE,CAO5D;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAwBvD;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAS1D"}
@@ -0,0 +1,170 @@
1
+ // server/typescript/packages/codegen-ts/src/templates/fr010-field-mapping.ts
2
+ //
3
+ // Shared field-kind mapping for the FR-010 codegen emitters (recover-schema-emitter +
4
+ // output-format-spec-emitter). Maps a metadata field subtype onto the render engine's
5
+ // FieldKind member, the idiomatic nullable TS type used by the recover mirror interface,
6
+ // and the RecoverMap accessor that reads it from the forgiving outcome map.
7
+ //
8
+ // Mirrors the C# Fr010FieldMapping (adapted to TS syntax + the `| null` nullable mirror).
9
+ // Bounded scope (parity with Java/Kotlin/C#): scalar / enum / scalar-array. Nested object +
10
+ // array-of-enum are deferred.
11
+ import { TYPE_FIELD, FIELD_SUBTYPE_STRING, FIELD_SUBTYPE_CLASS, FIELD_SUBTYPE_DATE, FIELD_SUBTYPE_TIME, FIELD_SUBTYPE_TIMESTAMP, FIELD_SUBTYPE_INT, FIELD_SUBTYPE_SHORT, FIELD_SUBTYPE_BYTE, FIELD_SUBTYPE_LONG, FIELD_SUBTYPE_CURRENCY, FIELD_SUBTYPE_DOUBLE, FIELD_SUBTYPE_FLOAT, FIELD_SUBTYPE_DECIMAL, FIELD_SUBTYPE_BOOLEAN, FIELD_SUBTYPE_ENUM, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_REQUIRED, FIELD_ATTR_VALUES, } from "@metaobjectsdev/metadata";
12
+ /** The render-engine FieldKind member name for a scalar field subtype, or null if non-scalar. */
13
+ export function scalarKind(subType) {
14
+ switch (subType) {
15
+ case FIELD_SUBTYPE_STRING:
16
+ case FIELD_SUBTYPE_CLASS:
17
+ case FIELD_SUBTYPE_DATE:
18
+ case FIELD_SUBTYPE_TIME:
19
+ case FIELD_SUBTYPE_TIMESTAMP:
20
+ return "STRING";
21
+ case FIELD_SUBTYPE_INT:
22
+ case FIELD_SUBTYPE_SHORT:
23
+ case FIELD_SUBTYPE_BYTE:
24
+ return "INT";
25
+ case FIELD_SUBTYPE_LONG:
26
+ case FIELD_SUBTYPE_CURRENCY:
27
+ return "LONG";
28
+ case FIELD_SUBTYPE_DOUBLE:
29
+ case FIELD_SUBTYPE_FLOAT:
30
+ case FIELD_SUBTYPE_DECIMAL:
31
+ return "DOUBLE";
32
+ case FIELD_SUBTYPE_BOOLEAN:
33
+ return "BOOLEAN";
34
+ default:
35
+ return null;
36
+ }
37
+ }
38
+ /** The field children of a payload value-object, in declaration order. */
39
+ export function fields(vo) {
40
+ return vo.children().filter((c) => c.type === TYPE_FIELD);
41
+ }
42
+ /** isArray is a native (reserved) property on MetaData, not an attr. */
43
+ export function isArray(field) {
44
+ return field.isArray === true;
45
+ }
46
+ /** True iff the field's @required is explicitly true (or the string "true"). */
47
+ export function isRequired(field) {
48
+ const v = field.ownAttr(FIELD_ATTR_REQUIRED);
49
+ if (v === true)
50
+ return true;
51
+ return typeof v === "string" && v.toLowerCase() === "true";
52
+ }
53
+ /** The string members of an enum field's @values attr (empty when absent). */
54
+ export function enumValues(field) {
55
+ const v = field.ownAttr(FIELD_ATTR_VALUES);
56
+ if (Array.isArray(v))
57
+ return v.map((e) => String(e));
58
+ return [];
59
+ }
60
+ /** The nullable TS type for a field in the recover mirror interface. */
61
+ export function mirrorType(field) {
62
+ // Matches asStringList's `(string | null)[] | null` return — a recovered array
63
+ // can contain null elements where individual items were lost.
64
+ if (isArray(field))
65
+ return "(string | null)[] | null";
66
+ if (field.subType === FIELD_SUBTYPE_OBJECT)
67
+ return "unknown"; // nested deferred
68
+ if (field.subType === FIELD_SUBTYPE_ENUM)
69
+ return "string | null"; // enum is string-backed
70
+ switch (scalarKind(field.subType)) {
71
+ case "INT":
72
+ case "LONG":
73
+ case "DOUBLE":
74
+ return "number | null";
75
+ case "BOOLEAN":
76
+ return "boolean | null";
77
+ default:
78
+ return "string | null";
79
+ }
80
+ }
81
+ /**
82
+ * The RecoverMap.as* helper name that reads this field from the forgiving map, or null
83
+ * for a nested object (which emits a null literal, not a helper call). Single source of
84
+ * truth for the per-field dispatch — both recoverMapCall and recoverMapHelpersUsed use it.
85
+ */
86
+ function recoverMapHelper(field) {
87
+ if (isArray(field))
88
+ return "asStringList";
89
+ if (field.subType === FIELD_SUBTYPE_OBJECT)
90
+ return null; // null literal, no helper
91
+ if (field.subType === FIELD_SUBTYPE_ENUM)
92
+ return "asString";
93
+ switch (scalarKind(field.subType)) {
94
+ case "INT":
95
+ return "asInt";
96
+ case "LONG":
97
+ return "asLong";
98
+ case "DOUBLE":
99
+ return "asDouble";
100
+ case "BOOLEAN":
101
+ return "asBool";
102
+ default:
103
+ return "asString";
104
+ }
105
+ }
106
+ /** The RecoverMap.as* helper name + call that reads this field from the forgiving map `d`. */
107
+ export function recoverMapCall(field) {
108
+ const helper = recoverMapHelper(field);
109
+ if (helper === null)
110
+ return "null /* FR-010: nested recover deferred */";
111
+ return `${helper}(d, ${jsonStringLiteral(field.name)})`;
112
+ }
113
+ /** Distinct RecoverMap helper names used across a value-object's fields (for the import). */
114
+ export function recoverMapHelpersUsed(vo) {
115
+ const used = new Set();
116
+ for (const f of fields(vo)) {
117
+ const helper = recoverMapHelper(f);
118
+ if (helper !== null)
119
+ used.add(helper);
120
+ }
121
+ return [...used].sort();
122
+ }
123
+ /** A TS double-quoted string literal for `value`, with the load-bearing chars escaped. */
124
+ export function jsonStringLiteral(value) {
125
+ let out = '"';
126
+ for (const ch of value) {
127
+ switch (ch) {
128
+ case "\\":
129
+ out += "\\\\";
130
+ break;
131
+ case '"':
132
+ out += '\\"';
133
+ break;
134
+ case "\t":
135
+ out += "\\t";
136
+ break;
137
+ case "\n":
138
+ out += "\\n";
139
+ break;
140
+ case "\r":
141
+ out += "\\r";
142
+ break;
143
+ default:
144
+ out += ch;
145
+ }
146
+ }
147
+ return out + '"';
148
+ }
149
+ /** A TS array literal `["a", "b"]` for the given members. */
150
+ export function stringArrayLiteral(values) {
151
+ return "[" + values.map((v) => jsonStringLiteral(v)).join(", ") + "]";
152
+ }
153
+ /**
154
+ * A TS object literal `{ "k": "v", … }` for a properties-shaped attr (e.g. @enumAlias /
155
+ * @enumDoc), or "null" when absent/empty. Null values are dropped; keys are sorted
156
+ * ordinally for deterministic output (matches the canonical-serializer properties sort).
157
+ */
158
+ export function propertiesMapLiteral(attr) {
159
+ if (attr == null || typeof attr !== "object" || Array.isArray(attr))
160
+ return "null";
161
+ const d = attr;
162
+ const entries = Object.keys(d)
163
+ .filter((k) => d[k] != null)
164
+ .sort()
165
+ .map((k) => `${jsonStringLiteral(k)}: ${jsonStringLiteral(String(d[k]))}`);
166
+ if (entries.length === 0)
167
+ return "null";
168
+ return "{ " + entries.join(", ") + " }";
169
+ }
170
+ //# sourceMappingURL=fr010-field-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fr010-field-mapping.js","sourceRoot":"","sources":["../../src/templates/fr010-field-mapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type MetaData } from "@metaobjectsdev/metadata";
2
+ /** Emit `{ format, rootName, style, fields: [ … ] } satisfies OutputFormatSpec`. */
3
+ export declare function specLiteral(vo: MetaData, template: MetaData, rootName: string): string;
4
+ //# sourceMappingURL=output-format-spec-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-format-spec-emitter.d.ts","sourceRoot":"","sources":["../../src/templates/output-format-spec-emitter.ts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,QAAQ,EAUd,MAAM,0BAA0B,CAAC;AAYlC,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQtF"}
@@ -0,0 +1,60 @@
1
+ // server/typescript/packages/codegen-ts/src/templates/output-format-spec-emitter.ts
2
+ //
3
+ // Turns a payload value-object + its template.output node into a TS source literal for an
4
+ // OutputFormatSpec — the artifact-1 prompt descriptor used by the FR-010 output-prompt codegen.
5
+ //
6
+ // Emits an `{ format, rootName, style, fields: [ … ] } satisfies OutputFormatSpec` literal.
7
+ // Mirrors the C# OutputFormatSpecEmitter (adapted to TS syntax). Field-kind mapping is shared
8
+ // via fr010-field-mapping. Bounded scope: scalar / enum. Nested object → FieldKind.OBJECT placeholder.
9
+ import { FIELD_SUBTYPE_ENUM, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_EXAMPLE, FIELD_ATTR_INSTRUCTION, FIELD_ATTR_ENUM_DOC, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_PROMPT_STYLE, PROMPT_STYLE_INLINE, PROMPT_STYLE_EXAMPLE_ONLY, } from "@metaobjectsdev/metadata";
10
+ import { fields, isRequired, isArray, scalarKind, enumValues, jsonStringLiteral, stringArrayLiteral, propertiesMapLiteral, } from "./fr010-field-mapping.js";
11
+ /** Emit `{ format, rootName, style, fields: [ … ] } satisfies OutputFormatSpec`. */
12
+ export function specLiteral(vo, template, rootName) {
13
+ const formatEnum = resolveFormat(template);
14
+ const styleEnum = resolvePromptStyle(template);
15
+ const fieldLits = fields(vo).map(promptFieldLiteral);
16
+ return (`{ format: ${formatEnum}, rootName: ${jsonStringLiteral(rootName)}, ` +
17
+ `style: ${styleEnum}, fields: [${fieldLits.join(", ")}] } satisfies OutputFormatSpec`);
18
+ }
19
+ function resolveFormat(template) {
20
+ const f = template.ownAttr(TEMPLATE_ATTR_FORMAT);
21
+ return typeof f === "string" && f.toLowerCase() === "xml" ? "Format.XML" : "Format.JSON";
22
+ }
23
+ function resolvePromptStyle(template) {
24
+ switch (template.ownAttr(TEMPLATE_ATTR_PROMPT_STYLE)) {
25
+ case PROMPT_STYLE_INLINE:
26
+ return "PromptStyle.INLINE";
27
+ case PROMPT_STYLE_EXAMPLE_ONLY:
28
+ return "PromptStyle.EXAMPLE_ONLY";
29
+ default:
30
+ return "PromptStyle.GUIDE";
31
+ }
32
+ }
33
+ /** A PromptField object literal. Field order matches the PromptField interface. */
34
+ function promptFieldLiteral(field) {
35
+ const name = jsonStringLiteral(field.name);
36
+ const required = isRequired(field);
37
+ const array = isArray(field);
38
+ if (field.subType === FIELD_SUBTYPE_OBJECT) {
39
+ return (`{ name: ${name}, kind: FieldKind.OBJECT, required: ${required}, array: ${array}, ` +
40
+ `enumValues: null, enumDoc: null, example: null, instruction: null, nested: null }` +
41
+ ` /* FR-010: nested prompt deferred */`);
42
+ }
43
+ const example = optStringAttr(field, FIELD_ATTR_EXAMPLE);
44
+ const instruction = optStringAttr(field, FIELD_ATTR_INSTRUCTION);
45
+ if (field.subType === FIELD_SUBTYPE_ENUM) {
46
+ const valuesLit = stringArrayLiteral(enumValues(field));
47
+ const enumDocLit = propertiesMapLiteral(field.ownAttr(FIELD_ATTR_ENUM_DOC));
48
+ return (`{ name: ${name}, kind: FieldKind.ENUM, required: ${required}, array: ${array}, ` +
49
+ `enumValues: ${valuesLit}, enumDoc: ${enumDocLit}, example: ${example}, ` +
50
+ `instruction: ${instruction}, nested: null }`);
51
+ }
52
+ const kind = scalarKind(field.subType) ?? "STRING";
53
+ return (`{ name: ${name}, kind: FieldKind.${kind}, required: ${required}, array: ${array}, ` +
54
+ `enumValues: null, enumDoc: null, example: ${example}, instruction: ${instruction}, nested: null }`);
55
+ }
56
+ function optStringAttr(field, attrName) {
57
+ const v = field.ownAttr(attrName);
58
+ return typeof v === "string" ? jsonStringLiteral(v) : "null";
59
+ }
60
+ //# sourceMappingURL=output-format-spec-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-format-spec-emitter.js","sourceRoot":"","sources":["../../src/templates/output-format-spec-emitter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"output-parser.d.ts","sourceRoot":"","sources":["../../src/templates/output-parser.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,QAAQ,EAQd,MAAM,0BAA0B,CAAC;AAyDlC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CA6D/E"}
1
+ {"version":3,"file":"output-parser.d.ts","sourceRoot":"","sources":["../../src/templates/output-parser.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,QAAQ,EASd,MAAM,0BAA0B,CAAC;AA+DlC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAiI/E"}
@@ -7,7 +7,9 @@
7
7
  // `<TemplateName>Data`. Consumers wiring `promptRender()` get a structurally
8
8
  // identical payload-VO interface in `prompts.ts`; either type can be used
9
9
  // interchangeably with parse results.
10
- import { TYPE_OBJECT, TYPE_FIELD, TYPE_TEMPLATE, TEMPLATE_SUBTYPE_OUTPUT, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_OBJECT_REF, TEMPLATE_ATTR_PAYLOAD_REF, } from "@metaobjectsdev/metadata";
10
+ import { TYPE_OBJECT, TYPE_FIELD, TYPE_TEMPLATE, TEMPLATE_SUBTYPE_OUTPUT, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_OBJECT_REF, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_FORMAT, } from "@metaobjectsdev/metadata";
11
+ import { schemaLiteral, mirrorInterface, mirrorInitializer, } from "./recover-schema-emitter.js";
12
+ import { recoverMapHelpersUsed } from "./fr010-field-mapping.js";
11
13
  const SCALAR_ZOD = {
12
14
  string: "z.string()",
13
15
  class: "z.string()",
@@ -88,9 +90,13 @@ export function renderOutputParser(root, templateName) {
88
90
  const errorName = `${templateName}ValidationError`;
89
91
  const parseName = `parse${templateName}`;
90
92
  const safeParseName = `safeParse${templateName}`;
91
- return `import { z } from "zod";
92
-
93
- const ${schemaName} = ${schema};
93
+ // FR-010: emit the tolerant recover() API alongside the strict Zod parser when the
94
+ // template targets json/xml. The @payloadRef already resolved to a value-object above,
95
+ // so a RecoverSchema can always be baked. text-format outputs get no recover.
96
+ const format = tmpl.ownAttr(TEMPLATE_ATTR_FORMAT) ?? "text";
97
+ const lc = format.toLowerCase();
98
+ const emitRecover = lc === "json" || lc === "xml";
99
+ const strictBody = `const ${schemaName} = ${schema};
94
100
 
95
101
  export type ${dataName} = z.infer<typeof ${schemaName}>;
96
102
  export type ${errorName} = z.ZodError;
@@ -125,5 +131,64 @@ export function ${safeParseName}(
125
131
  : { success: false, error: result.error };
126
132
  }
127
133
  `;
134
+ if (!emitRecover) {
135
+ return `import { z } from "zod";\n\n${strictBody}`;
136
+ }
137
+ // ---- FR-010 tolerant recover block (json/xml only) ----
138
+ const recoveredName = `${templateName}Recovered`;
139
+ const recoverFnName = `recover${templateName}`;
140
+ const tryRecoverName = `tryRecover${templateName}`;
141
+ const schemaConstName = `${templateName}RecoverSchema`;
142
+ const schemaLit = schemaLiteral(vo, format, payloadRef);
143
+ const mirrorDecl = mirrorInterface(vo, recoveredName);
144
+ const initializer = mirrorInitializer(vo);
145
+ const mapHelpers = recoverMapHelpersUsed(vo);
146
+ // Render-package imports the recover block needs. Only pull in the names the emitted
147
+ // source actually references, so the file has no unused imports (tsc noUnusedLocals-safe).
148
+ const renderImports = ["recover", "recoverSchema", "Format"];
149
+ if (schemaLit.includes("scalar("))
150
+ renderImports.push("scalar");
151
+ if (schemaLit.includes("enumField("))
152
+ renderImports.push("enumField");
153
+ if (schemaLit.includes("FieldKind."))
154
+ renderImports.push("FieldKind");
155
+ renderImports.push("type RecoverSchema", "type RecoverOptions", "type RecoveryResult");
156
+ renderImports.push(...mapHelpers);
157
+ const recoverBody = `/** Baked recover descriptor for the ${templateName} output. */
158
+ const ${schemaConstName}: RecoverSchema = ${schemaLit};
159
+
160
+ ${mirrorDecl}
161
+
162
+ /**
163
+ * Tolerant best-effort recovery of a dirty LLM response; never throws. Returns a
164
+ * nullable mirror (\`${recoveredName}\`) with fields null where lost/malformed,
165
+ * plus the per-field recovery report.
166
+ */
167
+ export function ${recoverFnName}(
168
+ text: string,
169
+ opts?: RecoverOptions,
170
+ ): RecoveryResult<${recoveredName}> {
171
+ const outcome = recover(text, ${schemaConstName}, opts);
172
+ const d = outcome.data;
173
+ const data: ${recoveredName} = ${initializer};
174
+ return { data, report: outcome.report };
175
+ }
176
+
177
+ /**
178
+ * Recovery as a bool gate: \`true\` when the response was non-empty and no required
179
+ * field was lost. On success, \`result\` carries the recovered mirror + report.
180
+ */
181
+ export function ${tryRecoverName}(
182
+ text: string,
183
+ ): { ok: boolean; result: RecoveryResult<${recoveredName}> } {
184
+ const result = ${recoverFnName}(text);
185
+ const ok = !result.report.isEmpty() && !result.report.hasLostRequired();
186
+ return { ok, result };
187
+ }
188
+ `;
189
+ return (`import { z } from "zod";\n` +
190
+ `import {\n ${renderImports.join(",\n ")},\n} from "@metaobjectsdev/render";\n\n` +
191
+ `${strictBody}\n` +
192
+ `${recoverBody}`);
128
193
  }
129
194
  //# sourceMappingURL=output-parser.js.map