@metaobjectsdev/codegen-ts 0.9.0 → 0.10.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 (323) hide show
  1. package/README.md +1 -1
  2. package/dist/column-mapper.d.ts.map +1 -1
  3. package/dist/column-mapper.js +24 -8
  4. package/dist/column-mapper.js.map +1 -1
  5. package/dist/constants.d.ts +8 -0
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +16 -0
  8. package/dist/constants.js.map +1 -1
  9. package/dist/docs-paths.d.ts +58 -0
  10. package/dist/docs-paths.d.ts.map +1 -0
  11. package/dist/docs-paths.js +89 -0
  12. package/dist/docs-paths.js.map +1 -0
  13. package/dist/enum-import.d.ts +14 -0
  14. package/dist/enum-import.d.ts.map +1 -0
  15. package/dist/enum-import.js +35 -0
  16. package/dist/enum-import.js.map +1 -0
  17. package/dist/enum-shared.d.ts +32 -0
  18. package/dist/enum-shared.d.ts.map +1 -0
  19. package/dist/enum-shared.js +83 -0
  20. package/dist/enum-shared.js.map +1 -0
  21. package/dist/generator-registry.d.ts +22 -0
  22. package/dist/generator-registry.d.ts.map +1 -0
  23. package/dist/generator-registry.js +161 -0
  24. package/dist/generator-registry.js.map +1 -0
  25. package/dist/generator.d.ts +6 -0
  26. package/dist/generator.d.ts.map +1 -1
  27. package/dist/generator.js.map +1 -1
  28. package/dist/generators/api-doc-render.d.ts +17 -0
  29. package/dist/generators/api-doc-render.d.ts.map +1 -0
  30. package/dist/generators/api-doc-render.js +431 -0
  31. package/dist/generators/api-doc-render.js.map +1 -0
  32. package/dist/generators/api-docs-file.d.ts +21 -0
  33. package/dist/generators/api-docs-file.d.ts.map +1 -0
  34. package/dist/generators/api-docs-file.js +112 -0
  35. package/dist/generators/api-docs-file.js.map +1 -0
  36. package/dist/generators/api-field-shape.d.ts +39 -0
  37. package/dist/generators/api-field-shape.d.ts.map +1 -0
  38. package/dist/generators/api-field-shape.js +92 -0
  39. package/dist/generators/api-field-shape.js.map +1 -0
  40. package/dist/generators/api-label.d.ts +3 -0
  41. package/dist/generators/api-label.d.ts.map +1 -0
  42. package/dist/generators/api-label.js +8 -0
  43. package/dist/generators/api-label.js.map +1 -0
  44. package/dist/generators/api-model.d.ts +122 -0
  45. package/dist/generators/api-model.d.ts.map +1 -0
  46. package/dist/generators/api-model.js +809 -0
  47. package/dist/generators/api-model.js.map +1 -0
  48. package/dist/generators/docs-data-builder.d.ts +26 -4
  49. package/dist/generators/docs-data-builder.d.ts.map +1 -1
  50. package/dist/generators/docs-data-builder.js +436 -164
  51. package/dist/generators/docs-data-builder.js.map +1 -1
  52. package/dist/generators/docs-data.d.ts +136 -27
  53. package/dist/generators/docs-data.d.ts.map +1 -1
  54. package/dist/generators/docs-data.js +1 -1
  55. package/dist/generators/docs-data.js.map +1 -1
  56. package/dist/generators/docs-file.d.ts +19 -0
  57. package/dist/generators/docs-file.d.ts.map +1 -1
  58. package/dist/generators/docs-file.js +154 -27
  59. package/dist/generators/docs-file.js.map +1 -1
  60. package/dist/generators/entity-file.d.ts.map +1 -1
  61. package/dist/generators/entity-file.js +29 -14
  62. package/dist/generators/entity-file.js.map +1 -1
  63. package/dist/generators/extractor-file.d.ts.map +1 -1
  64. package/dist/generators/extractor-file.js +2 -1
  65. package/dist/generators/extractor-file.js.map +1 -1
  66. package/dist/generators/field-anchor.d.ts +7 -0
  67. package/dist/generators/field-anchor.d.ts.map +1 -0
  68. package/dist/generators/field-anchor.js +23 -0
  69. package/dist/generators/field-anchor.js.map +1 -0
  70. package/dist/generators/index.d.ts +8 -1
  71. package/dist/generators/index.d.ts.map +1 -1
  72. package/dist/generators/index.js +6 -0
  73. package/dist/generators/index.js.map +1 -1
  74. package/dist/generators/mermaid-er.d.ts +14 -0
  75. package/dist/generators/mermaid-er.d.ts.map +1 -1
  76. package/dist/generators/mermaid-er.js +14 -0
  77. package/dist/generators/mermaid-er.js.map +1 -1
  78. package/dist/generators/output-parser-file.d.ts.map +1 -1
  79. package/dist/generators/output-parser-file.js +3 -4
  80. package/dist/generators/output-parser-file.js.map +1 -1
  81. package/dist/generators/output-prompt-file.d.ts.map +1 -1
  82. package/dist/generators/output-prompt-file.js +2 -2
  83. package/dist/generators/output-prompt-file.js.map +1 -1
  84. package/dist/generators/prompt-render-file.d.ts.map +1 -1
  85. package/dist/generators/prompt-render-file.js +3 -4
  86. package/dist/generators/prompt-render-file.js.map +1 -1
  87. package/dist/generators/queries-file.d.ts.map +1 -1
  88. package/dist/generators/queries-file.js +8 -3
  89. package/dist/generators/queries-file.js.map +1 -1
  90. package/dist/generators/render-helper-file.d.ts.map +1 -1
  91. package/dist/generators/render-helper-file.js +2 -2
  92. package/dist/generators/render-helper-file.js.map +1 -1
  93. package/dist/generators/routes-file-hono.d.ts.map +1 -1
  94. package/dist/generators/routes-file-hono.js +5 -1
  95. package/dist/generators/routes-file-hono.js.map +1 -1
  96. package/dist/generators/routes-file.d.ts +3 -0
  97. package/dist/generators/routes-file.d.ts.map +1 -1
  98. package/dist/generators/routes-file.js +6 -1
  99. package/dist/generators/routes-file.js.map +1 -1
  100. package/dist/generators/template-doc-builder.d.ts +19 -0
  101. package/dist/generators/template-doc-builder.d.ts.map +1 -0
  102. package/dist/generators/template-doc-builder.js +220 -0
  103. package/dist/generators/template-doc-builder.js.map +1 -0
  104. package/dist/generators/template-doc-data.d.ts +62 -0
  105. package/dist/generators/template-doc-data.d.ts.map +1 -0
  106. package/dist/generators/template-doc-data.js +16 -0
  107. package/dist/generators/template-doc-data.js.map +1 -0
  108. package/dist/generators/template-payload-tree.d.ts +15 -0
  109. package/dist/generators/template-payload-tree.d.ts.map +1 -0
  110. package/dist/generators/template-payload-tree.js +61 -0
  111. package/dist/generators/template-payload-tree.js.map +1 -0
  112. package/dist/generators/template-source-annotate.d.ts +74 -0
  113. package/dist/generators/template-source-annotate.d.ts.map +1 -0
  114. package/dist/generators/template-source-annotate.js +184 -0
  115. package/dist/generators/template-source-annotate.js.map +1 -0
  116. package/dist/generators/template-source-render.d.ts +24 -0
  117. package/dist/generators/template-source-render.d.ts.map +1 -0
  118. package/dist/generators/template-source-render.js +175 -0
  119. package/dist/generators/template-source-render.js.map +1 -0
  120. package/dist/generators/trace-helper-file.d.ts +9 -0
  121. package/dist/generators/trace-helper-file.d.ts.map +1 -0
  122. package/dist/generators/trace-helper-file.js +196 -0
  123. package/dist/generators/trace-helper-file.js.map +1 -0
  124. package/dist/index.d.ts +29 -4
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +28 -2
  127. package/dist/index.js.map +1 -1
  128. package/dist/metaobjects-config.d.ts +75 -2
  129. package/dist/metaobjects-config.d.ts.map +1 -1
  130. package/dist/metaobjects-config.js +43 -0
  131. package/dist/metaobjects-config.js.map +1 -1
  132. package/dist/naming.d.ts +19 -0
  133. package/dist/naming.d.ts.map +1 -1
  134. package/dist/naming.js +41 -0
  135. package/dist/naming.js.map +1 -1
  136. package/dist/payload-codegen.d.ts.map +1 -1
  137. package/dist/payload-codegen.js +12 -4
  138. package/dist/payload-codegen.js.map +1 -1
  139. package/dist/projection/extract-view-spec.d.ts.map +1 -1
  140. package/dist/projection/extract-view-spec.js +51 -25
  141. package/dist/projection/extract-view-spec.js.map +1 -1
  142. package/dist/relation-resolver.d.ts +16 -0
  143. package/dist/relation-resolver.d.ts.map +1 -1
  144. package/dist/relation-resolver.js +82 -1
  145. package/dist/relation-resolver.js.map +1 -1
  146. package/dist/render-context.d.ts +4 -0
  147. package/dist/render-context.d.ts.map +1 -1
  148. package/dist/render-context.js.map +1 -1
  149. package/dist/render-engine/embedded-templates.generated.d.ts +2 -0
  150. package/dist/render-engine/embedded-templates.generated.d.ts.map +1 -0
  151. package/dist/render-engine/embedded-templates.generated.js +15 -0
  152. package/dist/render-engine/embedded-templates.generated.js.map +1 -0
  153. package/dist/render-engine/framework-provider.d.ts.map +1 -1
  154. package/dist/render-engine/framework-provider.js +26 -13
  155. package/dist/render-engine/framework-provider.js.map +1 -1
  156. package/dist/runner.d.ts.map +1 -1
  157. package/dist/runner.js +17 -0
  158. package/dist/runner.js.map +1 -1
  159. package/dist/templates/docs-file.d.ts +2 -6
  160. package/dist/templates/docs-file.d.ts.map +1 -1
  161. package/dist/templates/docs-file.js +2 -5
  162. package/dist/templates/docs-file.js.map +1 -1
  163. package/dist/templates/drizzle-schema.d.ts.map +1 -1
  164. package/dist/templates/drizzle-schema.js +30 -2
  165. package/dist/templates/drizzle-schema.js.map +1 -1
  166. package/dist/templates/entity-constants.d.ts +7 -0
  167. package/dist/templates/entity-constants.d.ts.map +1 -1
  168. package/dist/templates/entity-constants.js +1 -1
  169. package/dist/templates/entity-constants.js.map +1 -1
  170. package/dist/templates/entity-file.d.ts.map +1 -1
  171. package/dist/templates/entity-file.js +16 -5
  172. package/dist/templates/entity-file.js.map +1 -1
  173. package/dist/templates/enums-file.d.ts +11 -0
  174. package/dist/templates/enums-file.d.ts.map +1 -0
  175. package/dist/templates/enums-file.js +44 -0
  176. package/dist/templates/enums-file.js.map +1 -0
  177. package/dist/templates/extract-delegate-emitter.d.ts.map +1 -1
  178. package/dist/templates/extract-delegate-emitter.js +5 -7
  179. package/dist/templates/extract-delegate-emitter.js.map +1 -1
  180. package/dist/templates/extract-schema-emitter.d.ts.map +1 -1
  181. package/dist/templates/extract-schema-emitter.js +5 -1
  182. package/dist/templates/extract-schema-emitter.js.map +1 -1
  183. package/dist/templates/extractor.d.ts.map +1 -1
  184. package/dist/templates/extractor.js +56 -39
  185. package/dist/templates/extractor.js.map +1 -1
  186. package/dist/templates/field-meta.d.ts.map +1 -1
  187. package/dist/templates/field-meta.js +1 -5
  188. package/dist/templates/field-meta.js.map +1 -1
  189. package/dist/templates/filter-allowlist.d.ts +7 -2
  190. package/dist/templates/filter-allowlist.d.ts.map +1 -1
  191. package/dist/templates/filter-allowlist.js +17 -9
  192. package/dist/templates/filter-allowlist.js.map +1 -1
  193. package/dist/templates/filter-type.d.ts +7 -1
  194. package/dist/templates/filter-type.d.ts.map +1 -1
  195. package/dist/templates/filter-type.js +9 -5
  196. package/dist/templates/filter-type.js.map +1 -1
  197. package/dist/templates/find-templates.d.ts +4 -0
  198. package/dist/templates/find-templates.d.ts.map +1 -0
  199. package/dist/templates/find-templates.js +15 -0
  200. package/dist/templates/find-templates.js.map +1 -0
  201. package/dist/templates/fr010-field-mapping.d.ts +2 -0
  202. package/dist/templates/fr010-field-mapping.d.ts.map +1 -1
  203. package/dist/templates/fr010-field-mapping.js +10 -6
  204. package/dist/templates/fr010-field-mapping.js.map +1 -1
  205. package/dist/templates/inferred-types.d.ts +44 -7
  206. package/dist/templates/inferred-types.d.ts.map +1 -1
  207. package/dist/templates/inferred-types.js +107 -16
  208. package/dist/templates/inferred-types.js.map +1 -1
  209. package/dist/templates/mermaid-er.d.ts +35 -2
  210. package/dist/templates/mermaid-er.d.ts.map +1 -1
  211. package/dist/templates/mermaid-er.js +174 -7
  212. package/dist/templates/mermaid-er.js.map +1 -1
  213. package/dist/templates/output-parser.d.ts.map +1 -1
  214. package/dist/templates/output-parser.js +30 -79
  215. package/dist/templates/output-parser.js.map +1 -1
  216. package/dist/templates/output-prompt.d.ts.map +1 -1
  217. package/dist/templates/output-prompt.js +2 -2
  218. package/dist/templates/output-prompt.js.map +1 -1
  219. package/dist/templates/queries-file.d.ts.map +1 -1
  220. package/dist/templates/queries-file.js +112 -4
  221. package/dist/templates/queries-file.js.map +1 -1
  222. package/dist/templates/queries.d.ts +5 -0
  223. package/dist/templates/queries.d.ts.map +1 -1
  224. package/dist/templates/queries.js +7 -7
  225. package/dist/templates/queries.js.map +1 -1
  226. package/dist/templates/recover-schema-emitter.d.ts +8 -0
  227. package/dist/templates/recover-schema-emitter.d.ts.map +1 -0
  228. package/dist/templates/recover-schema-emitter.js +64 -0
  229. package/dist/templates/recover-schema-emitter.js.map +1 -0
  230. package/dist/templates/relations-block.js +10 -0
  231. package/dist/templates/relations-block.js.map +1 -1
  232. package/dist/templates/render-helper.d.ts.map +1 -1
  233. package/dist/templates/render-helper.js +4 -4
  234. package/dist/templates/render-helper.js.map +1 -1
  235. package/dist/templates/routes-file.d.ts.map +1 -1
  236. package/dist/templates/routes-file.js +183 -6
  237. package/dist/templates/routes-file.js.map +1 -1
  238. package/dist/templates/tph-discriminator.d.ts +56 -0
  239. package/dist/templates/tph-discriminator.d.ts.map +1 -0
  240. package/dist/templates/tph-discriminator.js +180 -0
  241. package/dist/templates/tph-discriminator.js.map +1 -0
  242. package/dist/templates/value-object-file.d.ts +2 -1
  243. package/dist/templates/value-object-file.d.ts.map +1 -1
  244. package/dist/templates/value-object-file.js +32 -4
  245. package/dist/templates/value-object-file.js.map +1 -1
  246. package/dist/templates/zod-validators.d.ts +64 -1
  247. package/dist/templates/zod-validators.d.ts.map +1 -1
  248. package/dist/templates/zod-validators.js +181 -8
  249. package/dist/templates/zod-validators.js.map +1 -1
  250. package/package.json +103 -34
  251. package/src/column-mapper.ts +25 -8
  252. package/src/constants.ts +18 -0
  253. package/src/docs-paths.ts +128 -0
  254. package/src/enum-import.ts +43 -0
  255. package/src/enum-shared.ts +95 -0
  256. package/src/generator-registry.ts +204 -0
  257. package/src/generator.ts +6 -0
  258. package/src/generators/api-doc-render.ts +572 -0
  259. package/src/generators/api-docs-file.ts +146 -0
  260. package/src/generators/api-field-shape.ts +114 -0
  261. package/src/generators/api-label.ts +7 -0
  262. package/src/generators/api-model.ts +1067 -0
  263. package/src/generators/docs-data-builder.ts +479 -185
  264. package/src/generators/docs-data.ts +139 -28
  265. package/src/generators/docs-file.ts +205 -39
  266. package/src/generators/entity-file.ts +31 -15
  267. package/src/generators/extractor-file.ts +2 -1
  268. package/src/generators/field-anchor.ts +24 -0
  269. package/src/generators/index.ts +8 -1
  270. package/src/generators/mermaid-er.ts +14 -0
  271. package/src/generators/output-parser-file.ts +3 -4
  272. package/src/generators/output-prompt-file.ts +2 -1
  273. package/src/generators/prompt-render-file.ts +3 -4
  274. package/src/generators/queries-file.ts +9 -3
  275. package/src/generators/render-helper-file.ts +2 -1
  276. package/src/generators/routes-file-hono.ts +5 -1
  277. package/src/generators/routes-file.ts +7 -1
  278. package/src/generators/template-doc-builder.ts +306 -0
  279. package/src/generators/template-doc-data.ts +85 -0
  280. package/src/generators/template-payload-tree.ts +71 -0
  281. package/src/generators/template-source-annotate.ts +290 -0
  282. package/src/generators/template-source-render.ts +203 -0
  283. package/src/generators/trace-helper-file.ts +301 -0
  284. package/src/index.ts +55 -4
  285. package/src/metaobjects-config.ts +117 -2
  286. package/src/naming.ts +48 -0
  287. package/src/payload-codegen.ts +14 -3
  288. package/src/projection/extract-view-spec.ts +49 -30
  289. package/src/relation-resolver.ts +103 -1
  290. package/src/render-context.ts +4 -0
  291. package/src/render-engine/embedded-templates.generated.ts +14 -0
  292. package/src/render-engine/framework-provider.ts +25 -11
  293. package/src/runner.ts +21 -0
  294. package/src/templates/docs-file.ts +2 -9
  295. package/src/templates/drizzle-schema.ts +31 -1
  296. package/src/templates/entity-constants.ts +1 -1
  297. package/src/templates/entity-file.ts +16 -5
  298. package/src/templates/enums-file.ts +50 -0
  299. package/src/templates/extract-delegate-emitter.ts +5 -6
  300. package/src/templates/extractor.ts +68 -38
  301. package/src/templates/field-meta.ts +0 -6
  302. package/src/templates/filter-allowlist.ts +17 -10
  303. package/src/templates/filter-type.ts +8 -6
  304. package/src/templates/find-templates.ts +15 -0
  305. package/src/templates/fr010-field-mapping.ts +10 -8
  306. package/src/templates/inferred-types.ts +108 -18
  307. package/src/templates/mermaid-er.ts +176 -8
  308. package/src/templates/output-parser.ts +30 -79
  309. package/src/templates/output-prompt.ts +2 -1
  310. package/src/templates/queries-file.ts +132 -3
  311. package/src/templates/queries.ts +15 -7
  312. package/src/templates/relations-block.ts +17 -0
  313. package/src/templates/render-helper.ts +4 -3
  314. package/src/templates/routes-file.ts +233 -6
  315. package/src/templates/tph-discriminator.ts +232 -0
  316. package/src/templates/value-object-file.ts +38 -4
  317. package/src/templates/zod-validators.ts +204 -7
  318. package/templates/api/agent-api.md.mustache +30 -0
  319. package/templates/api/entity-api.md.mustache +69 -0
  320. package/templates/api/index.md.mustache +21 -0
  321. package/templates/docs/entity-page.md.mustache +33 -21
  322. package/templates/docs/template-page.md.mustache +56 -0
  323. package/src/templates/extract-schema-emitter.ts +0 -111
@@ -2,14 +2,13 @@
2
2
  //
3
3
  // Per-template renderer for template.output codegen. Walks the @payloadRef's
4
4
  // value-object into a Zod schema and emits a dual-API parser (parse + safeParse)
5
- // alongside the schema. The emitted file is self-contained: it derives a
6
- // local data type via `z.infer<typeof Schema>` and exports it as
7
- // `<TemplateName>Data`. Consumers wiring `promptRender()` get a structurally
8
- // identical payload-VO interface in `prompts.ts`; either type can be used
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, TEMPLATE_ATTR_FORMAT, } from "@metaobjectsdev/metadata";
11
- import { schemaLiteral, mirrorInitializer, } from "./extract-schema-emitter.js";
12
- import { extractMapHelpersUsed } from "./fr010-field-mapping.js";
5
+ // alongside the schema, plus (for json/xml outputs) a single tolerant
6
+ // loader-delegating `extractLenient<Name>WithLoader(root, text)` that delegates to
7
+ // the metadata-driven runtime extract. The emitted file derives a local data type
8
+ // via `z.infer<typeof Schema>` and exports it as `<TemplateName>Data`. Consumers
9
+ // wiring `promptRender()` get a structurally identical payload-VO interface in
10
+ // `prompts.ts`; either type can be used interchangeably with parse results.
11
+ import { TYPE_OBJECT, TYPE_FIELD, TYPE_TEMPLATE, TEMPLATE_SUBTYPE_OUTPUT, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_OBJECT_REF, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_FORMAT, refMatchesObject, } from "@metaobjectsdev/metadata";
13
12
  import { nestedMirrorInterfaces, nestedMappers, rootMapperName, delegateHelpers, usedHelpers, hasNested, } from "./extract-delegate-emitter.js";
14
13
  const SCALAR_ZOD = {
15
14
  string: "z.string()",
@@ -23,7 +22,9 @@ const SCALAR_ZOD = {
23
22
  boolean: "z.boolean()",
24
23
  };
25
24
  function findObject(root, name) {
26
- return root.ownChildren().find((c) => c.type === TYPE_OBJECT && c.name === name);
25
+ // FR-032 @payloadRef is FQN after the desugar/sweep; match on the effective
26
+ // FQN resolution key (with bare back-compat).
27
+ return root.ownChildren().find((c) => c.type === TYPE_OBJECT && refMatchesObject(c, name));
27
28
  }
28
29
  function findTemplate(root, name) {
29
30
  return root.ownChildren().find((c) => c.type === TYPE_TEMPLATE && c.name === name);
@@ -137,95 +138,49 @@ export function ${safeParseName}(
137
138
  }
138
139
  // ---- FR-010 tolerant extract block (json/xml only) ----
139
140
  const extractedName = `${templateName}Extracted`;
140
- const extractLenientFnName = `extractLenient${templateName}`;
141
- const tryExtractLenientName = `tryExtractLenient${templateName}`;
142
141
  const extractLenientWithName = `extractLenient${templateName}WithLoader`;
143
- const schemaConstName = `${templateName}ExtractSchema`;
144
142
  const payloadFqnConst = `${templateName.toUpperCase()}_PAYLOAD_NAME`;
145
143
  const formatEnum = format.toLowerCase() === "xml" ? "Format.XML" : "Format.JSON";
146
- const schemaLit = schemaLiteral(vo, format, payloadRef);
147
- const initializer = mirrorInitializer(vo);
148
- const mapHelpers = extractMapHelpersUsed(vo);
149
- // The nullable mirror is shared by BOTH extract paths. Use the nested-aware emitter so the
150
- // payload mirror's nested-object / array-of-object components are typed (not `unknown`), and
151
- // so a mirror interface is emitted for every reachable nested value-object. The payload mirror
152
- // keeps the canonical `<Template>Extracted` name (instead of `<PayloadVO>Extracted`) so the
153
- // existing self-contained extract<Name>() initializer continues to satisfy it.
144
+ // The nullable mirror is the return shape of the delegating extract. Use the nested-aware
145
+ // emitter so the payload mirror's nested-object / array-of-object components are typed (not
146
+ // `unknown`), and so a mirror interface is emitted for every reachable nested value-object.
147
+ // The payload mirror keeps the canonical `<Template>Extracted` name.
154
148
  const mirrorDecls = nestedMirrorInterfaces(vo, root, extractedName);
155
- const payloadHasNested = hasNested(vo, root);
156
- // Render-package imports the extract block needs. Only pull in the names the emitted
157
- // source actually references, so the file has no unused imports (tsc noUnusedLocals-safe).
158
- const renderImports = ["extract", "extractSchema", "Format"];
159
- if (schemaLit.includes("scalar("))
160
- renderImports.push("scalar");
161
- if (schemaLit.includes("enumField("))
162
- renderImports.push("enumField");
163
- if (schemaLit.includes("FieldKind."))
164
- renderImports.push("FieldKind");
165
- renderImports.push("type ExtractSchema", "type ExtractOptions", "type ExtractionResult");
166
- renderImports.push(...mapHelpers);
167
- const selfContained = `/** Baked extract descriptor for the ${templateName} output. */
168
- const ${schemaConstName}: ExtractSchema = ${schemaLit};
169
-
170
- ${mirrorDecls}
171
-
172
- /**
173
- * Self-contained tolerant best-effort extraction of a dirty LLM response; never throws.
174
- * Returns a nullable mirror (\`${extractedName}\`) with fields null where lost/malformed,
175
- * plus the per-field extraction report. Does NOT populate nested-object / array-of-object
176
- * components (those stay null — the historical FR-010 gap). For full nested extraction, use
177
- * \`${extractLenientWithName}(root, text)\`, which delegates to the runtime extract.
178
- */
179
- export function ${extractLenientFnName}(
180
- text: string,
181
- opts?: ExtractOptions,
182
- ): ExtractionResult<${extractedName}> {
183
- const outcome = extract(text, ${schemaConstName}, opts);
184
- const d = outcome.data;
185
- const data: ${extractedName} = ${initializer};
186
- return { data, report: outcome.report };
187
- }
188
-
189
- /**
190
- * Extraction as a bool gate: \`true\` when the response was non-empty and no required
191
- * field was lost. On success, \`result\` carries the extracted mirror + report.
192
- */
193
- export function ${tryExtractLenientName}(
194
- text: string,
195
- ): { ok: boolean; result: ExtractionResult<${extractedName}> } {
196
- const result = ${extractLenientFnName}(text);
197
- const ok = !result.report.isEmpty() && !result.report.hasLostRequired();
198
- return { ok, result };
199
- }
200
- `;
201
- // ---- Runtime-delegating extract (closes the nested gap) ----
149
+ // Render-package imports the (single, loader-delegating) extract block needs. Kept minimal so
150
+ // the file has no unused imports (tsc noUnusedLocals-safe).
151
+ const renderImports = ["Format", "type ExtractOptions", "type ExtractionResult"];
152
+ // ---- Runtime-delegating extract (the single metadata-driven extract path) ----
202
153
  // Resolves this payload's MetaObject from a loaded MetaRoot by its baked simple name and
203
154
  // delegates to extractObject() in @metaobjectsdev/runtime-ts, which assembles the FULL nested
204
- // object graph reflection-free. The assembled ValueObject graph is then mapped into the typed
205
- // nullable mirror graph by the generated from<VO>Extracted mappers. Codegen-wrapping-runtime
206
- // (a generated DAO calling the dynamic-metadata runtime) — mirrors the Java/Kotlin pilots.
155
+ // object graph reflection-free by reading the live metadata directly. The assembled ValueObject
156
+ // graph is then mapped into the typed nullable mirror graph by the generated from<VO>Extracted
157
+ // mappers. Codegen-wrapping-runtime (a generated DAO calling the dynamic-metadata runtime).
207
158
  //
208
159
  // The baked PAYLOAD_NAME is the resolved payload VO's SIMPLE name (root.findObject matches on
209
160
  // the object's `name`, not its FQN). The root mapper is named for the TEMPLATE (so it returns
210
161
  // the canonically-named `<Template>Extracted` mirror); nested mappers use their VO names.
211
162
  const payloadName = vo.name;
212
163
  const rootMapper = rootMapperName(templateName);
164
+ void hasNested;
213
165
  const delegating = `
214
166
  /** Payload value-object name this parser extracts — resolved against a loaded MetaRoot at runtime. */
215
167
  export const ${payloadFqnConst} = ${JSON.stringify(payloadName)};
216
168
 
169
+ ${mirrorDecls}
170
+
217
171
  ${nestedMappers(vo, root, rootMapper, extractedName)}
218
172
 
219
173
  ${delegateHelpers(usedHelpers(vo, root))}
220
174
 
221
175
  /**
222
- * Runtime-delegating tolerant extraction; never throws. Unlike \`${extractLenientFnName}(text)\`, this FULLY
223
- * populates nested-object and array-of-object components by delegating to the metadata-driven
224
- * runtime \`extractObject\` (which assembles the whole graph reflection-free via the Phase A object
225
- * model), then maps the assembled graph into the typed \`${extractedName}\` mirror.
176
+ * Runtime-delegating tolerant best-effort extraction; never throws. FULLY populates
177
+ * nested-object and array-of-object components by delegating to the metadata-driven runtime
178
+ * \`extractObject\` (which assembles the whole graph reflection-free via the Phase A object
179
+ * model, reading the live metadata directly), then maps the assembled graph into the typed
180
+ * \`${extractedName}\` mirror.
226
181
  *
227
182
  * @param root a loaded MetaRoot (e.g. \`(await new MetaDataLoader().load(...)).root\`) that declares
228
- * the \`${payloadRef}\` value-object.
183
+ * the \`${payloadName}\` value-object.
229
184
  */
230
185
  export function ${extractLenientWithName}(
231
186
  root: MetaRoot,
@@ -241,9 +196,6 @@ export function ${extractLenientWithName}(
241
196
  }
242
197
  `;
243
198
  // The delegating overload needs runtime-ts (extractObject) + the MetaRoot type from metadata.
244
- // It is always emitted (the gap-closing path), regardless of whether THIS payload has nested
245
- // fields — a flat payload still benefits from the loader-driven path and keeps the API uniform.
246
- void payloadHasNested;
247
199
  const metadataImport = `import type { MetaRoot } from "@metaobjectsdev/metadata";\n`;
248
200
  const runtimeImport = `import { extractObject } from "@metaobjectsdev/runtime-ts";\n`;
249
201
  return (`import { z } from "zod";\n` +
@@ -252,7 +204,6 @@ export function ${extractLenientWithName}(
252
204
  runtimeImport +
253
205
  `\n` +
254
206
  `${strictBody}\n` +
255
- `${selfContained}\n` +
256
207
  `${delegating}`);
257
208
  }
258
209
  //# sourceMappingURL=output-parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"output-parser.js","sourceRoot":"","sources":["../../src/templates/output-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output-parser.js","sourceRoot":"","sources":["../../src/templates/output-parser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"output-prompt.d.ts","sourceRoot":"","sources":["../../src/templates/output-prompt.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,QAAQ,EAMd,MAAM,0BAA0B,CAAC;AAWlC,iGAAiG;AACjG,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAG9D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CA8C/E"}
1
+ {"version":3,"file":"output-prompt.d.ts","sourceRoot":"","sources":["../../src/templates/output-prompt.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,QAAQ,EAOd,MAAM,0BAA0B,CAAC;AAWlC,iGAAiG;AACjG,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAG9D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CA8C/E"}
@@ -9,10 +9,10 @@
9
9
  //
10
10
  // Mirrors the C# OutputPromptGenerator + OutputFormatSpecEmitter (split into a
11
11
  // generator factory + this pure renderer, matching the TS output-parser shape).
12
- import { TYPE_OBJECT, TYPE_TEMPLATE, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_FORMAT, } from "@metaobjectsdev/metadata";
12
+ import { TYPE_OBJECT, TYPE_TEMPLATE, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_FORMAT, refMatchesObject, } from "@metaobjectsdev/metadata";
13
13
  import { specLiteral } from "./output-format-spec-emitter.js";
14
14
  function findObject(root, name) {
15
- return root.ownChildren().find((c) => c.type === TYPE_OBJECT && c.name === name);
15
+ return root.ownChildren().find((c) => c.type === TYPE_OBJECT && refMatchesObject(c, name));
16
16
  }
17
17
  function findTemplate(root, name) {
18
18
  return root.ownChildren().find((c) => c.type === TYPE_TEMPLATE && c.name === name);
@@ -1 +1 @@
1
- {"version":3,"file":"output-prompt.js","sourceRoot":"","sources":["../../src/templates/output-prompt.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,kFAAkF;AAClF,mFAAmF;AACnF,mFAAmF;AACnF,2EAA2E;AAC3E,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAEhF,OAAO,EAEL,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,SAAS,UAAU,CAAC,IAAc,EAAE,IAAY;IAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,IAAY;IAChD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrF,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,sBAAsB,CAAC,IAAc;IACnD,MAAM,CAAC,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAwB,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/F,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAc,EAAE,YAAoB;IACrE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,8BAA8B,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,uBAAuB,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,4CAA4C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,gDAAgD,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC3D,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,uBAAuB,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,kBAAkB,UAAU,8BAA8B,CAAC,CAAC;IACvG,CAAC;IAED,uEAAuE;IACvE,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,GAAG,YAAY,YAAY,CAAC;IAC7C,MAAM,MAAM,GAAG,SAAS,YAAY,QAAQ,CAAC;IAE7C,OAAO;;;;;;;;;QASD,QAAQ,wBAAwB,IAAI;;;oDAGQ,YAAY;;;;;kBAK9C,MAAM;8BACM,QAAQ;;CAErC,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"output-prompt.js","sourceRoot":"","sources":["../../src/templates/output-prompt.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,kFAAkF;AAClF,mFAAmF;AACnF,mFAAmF;AACnF,2EAA2E;AAC3E,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAEhF,OAAO,EAEL,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,SAAS,UAAU,CAAC,IAAc,EAAE,IAAY;IAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,IAAY;IAChD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrF,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,sBAAsB,CAAC,IAAc;IACnD,MAAM,CAAC,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAwB,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/F,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAc,EAAE,YAAoB;IACrE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,8BAA8B,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,uBAAuB,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,4CAA4C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,gDAAgD,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC3D,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,uBAAuB,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,kBAAkB,UAAU,8BAA8B,CAAC,CAAC;IACvG,CAAC;IAED,uEAAuE;IACvE,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,GAAG,YAAY,YAAY,CAAC;IAC7C,MAAM,MAAM,GAAG,SAAS,YAAY,QAAQ,CAAC;IAE7C,OAAO;;;;;;;;;QASD,QAAQ,wBAAwB,IAAI;;;oDAGQ,YAAY;;;;;kBAK9C,MAAM;8BACM,QAAQ;;CAErC,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"queries-file.d.ts","sourceRoot":"","sources":["../../src/templates/queries-file.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAY1D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAoD7E"}
1
+ {"version":3,"file":"queries-file.d.ts","sourceRoot":"","sources":["../../src/templates/queries-file.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,UAAU,EAGX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAc1D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CA4D7E"}
@@ -1,13 +1,21 @@
1
1
  // Queries file composer — composes all CRUD function renderers (from queries.ts) into
2
2
  // a complete <Entity>.queries.ts file with @generated header and correct imports.
3
- import { code, joinCode } from "ts-poet";
4
- import { MetaObject } from "@metaobjectsdev/metadata";
3
+ import { code, joinCode, imp } from "ts-poet";
4
+ import { MetaObject, OBJECT_ATTR_DISCRIMINATOR, OBJECT_ATTR_DISCRIMINATOR_VALUE, } from "@metaobjectsdev/metadata";
5
5
  import {} from "../render-context.js";
6
6
  import { entityModuleSpecifier } from "../import-path.js";
7
- import { renderFindByIdFn, renderListFn, renderCreateFn, renderUpdateFn, renderDeleteByIdFn, } from "./queries.js";
8
- import { variableNameFromEntity } from "../naming.js";
7
+ import { renderFindByIdFn, renderListFn, renderCreateFn, renderUpdateFn, renderDeleteByIdFn, getPkInfo, } from "./queries.js";
8
+ import { variableNameFromEntity, pluralize } from "../naming.js";
9
9
  import { GENERATED_HEADER } from "../constants.js";
10
+ import { isTphDiscriminatorBase, tphConcreteSubtypes } from "./tph-discriminator.js";
10
11
  export function renderQueriesFile(obj, ctx) {
12
+ // FR-017 Tier 2 — a TPH discriminator base gets a polymorphic queries file:
13
+ // base reads dispatch through parse<Base>, and per-subtype CRUD targets the
14
+ // single base table scoped to the discriminator value. (Subtype entities are
15
+ // filtered out of the queries generator entirely — their CRUD lives here.)
16
+ if (isTphDiscriminatorBase(obj, ctx.loadedRoot)) {
17
+ return renderTphQueriesFile(obj, ctx);
18
+ }
11
19
  const entityName = obj.name;
12
20
  // Import the entity's own file. Same target → relative "./Entity"; cross
13
21
  // target → importBase-qualified package path.
@@ -47,4 +55,104 @@ import { ${varName}, type ${entityName}, ${entityName}InsertSchema } from ${JSON
47
55
  `// Customize via ${entityName}.extra.ts in this directory (additional queries, custom logic).\n`;
48
56
  return header + body;
49
57
  }
58
+ /**
59
+ * FR-017 Tier 2 — the polymorphic + per-subtype queries file for a TPH base.
60
+ *
61
+ * Base reads (`find<Base>ById`, `list<BasePlural>`) project every row through
62
+ * `parse<Base>` so they return the discriminated union. There is intentionally
63
+ * NO `create<Base>` / `update<Base>` — you cannot instantiate an abstract base.
64
+ *
65
+ * Each concrete subtype gets list / findById (filtered to the discriminator
66
+ * value, parsed with `<Sub>Schema`) plus create / updateById / deleteById, all
67
+ * against the single base table. Creates inject the discriminator value;
68
+ * updates strip it (a row's subtype is immutable).
69
+ */
70
+ function renderTphQueriesFile(base, ctx) {
71
+ const baseName = base.name;
72
+ const tableVar = variableNameFromEntity(baseName);
73
+ const discField = base.ownAttr(OBJECT_ATTR_DISCRIMINATOR);
74
+ const { fieldName: pkField, tsType: pkType } = getPkInfo(base, ctx);
75
+ const baseFileSpec = entityModuleSpecifier(ctx.selfTarget, ctx.entityModuleTarget, base.package, baseName, ctx.extStyle);
76
+ const tableSym = imp(`${tableVar}@${baseFileSpec}`);
77
+ const baseTypeSym = imp(`t:${baseName}@${baseFileSpec}`);
78
+ const parseSym = imp(`parse${baseName}@${baseFileSpec}`);
79
+ const eqSym = imp("eq@drizzle-orm");
80
+ const andSym = imp("and@drizzle-orm");
81
+ const dbTypeImport = ctx.dialect === "postgres"
82
+ ? `import type { NodePgDatabase } from "drizzle-orm/node-postgres";`
83
+ : `import type { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core";`;
84
+ const dbTypeAlias = ctx.dialect === "postgres"
85
+ ? `type Db = NodePgDatabase<Record<string, never>>;`
86
+ : `type Db = BaseSQLiteDatabase<"async", Record<string, never>>;`;
87
+ // --- Polymorphic base reads ---
88
+ const polymorphic = code `
89
+ export async function find${baseName}ById(db: Db, ${pkField}: ${pkType}): Promise<${baseTypeSym} | null> {
90
+ const [row] = await db.select().from(${tableSym}).where(${eqSym}(${tableSym}.${pkField}, ${pkField})).limit(1);
91
+ return row ? ${parseSym}(row) : null;
92
+ }
93
+
94
+ export async function list${pluralize(baseName)}(db: Db, opts?: { limit?: number; offset?: number }): Promise<${baseTypeSym}[]> {
95
+ let q = db.select().from(${tableSym}).$dynamic();
96
+ if (opts?.limit !== undefined) q = q.limit(opts.limit);
97
+ if (opts?.offset !== undefined) q = q.offset(opts.offset);
98
+ const rows = await q;
99
+ return rows.map((r) => ${parseSym}(r));
100
+ }
101
+ `;
102
+ // --- Per-subtype CRUD against the single base table ---
103
+ const subtypeSections = [];
104
+ for (const sub of tphConcreteSubtypes(base, ctx.loadedRoot)) {
105
+ const value = sub.ownAttr(OBJECT_ATTR_DISCRIMINATOR_VALUE);
106
+ const valueLit = JSON.stringify(value);
107
+ const subFileSpec = entityModuleSpecifier(ctx.selfTarget, ctx.entityModuleTarget, sub.package, sub.name, ctx.extStyle);
108
+ const subTypeSym = imp(`t:${sub.name}@${subFileSpec}`);
109
+ const subSchemaSym = imp(`${sub.name}Schema@${subFileSpec}`);
110
+ const subInsertSym = imp(`${sub.name}InsertSchema@${subFileSpec}`);
111
+ subtypeSections.push(code `
112
+ export async function list${pluralize(sub.name)}(db: Db, opts?: { limit?: number; offset?: number }): Promise<${subTypeSym}[]> {
113
+ let q = db.select().from(${tableSym}).where(${eqSym}(${tableSym}.${discField}, ${valueLit})).$dynamic();
114
+ if (opts?.limit !== undefined) q = q.limit(opts.limit);
115
+ if (opts?.offset !== undefined) q = q.offset(opts.offset);
116
+ const rows = await q;
117
+ return rows.map((r) => ${subSchemaSym}.parse(r));
118
+ }
119
+
120
+ export async function find${sub.name}ById(db: Db, ${pkField}: ${pkType}): Promise<${subTypeSym} | null> {
121
+ const [row] = await db.select().from(${tableSym})
122
+ .where(${andSym}(${eqSym}(${tableSym}.${pkField}, ${pkField}), ${eqSym}(${tableSym}.${discField}, ${valueLit}))).limit(1);
123
+ return row ? ${subSchemaSym}.parse(row) : null;
124
+ }
125
+
126
+ export async function create${sub.name}(db: Db, data: unknown): Promise<${subTypeSym}> {
127
+ const validated = ${subInsertSym}.parse(data);
128
+ const [row] = await db.insert(${tableSym}).values({ ...validated, ${discField}: ${valueLit} }).returning();
129
+ return ${subSchemaSym}.parse(row!);
130
+ }
131
+
132
+ export async function update${sub.name}ById(db: Db, ${pkField}: ${pkType}, data: unknown): Promise<${subTypeSym} | null> {
133
+ const validated = ${subInsertSym}.partial().parse(data) as Record<string, unknown>;
134
+ // The discriminator is immutable — a ${sub.name} can never become another subtype.
135
+ const { [${JSON.stringify(discField)}]: _disc, ...safe } = validated;
136
+ const [row] = await db.update(${tableSym}).set(safe)
137
+ .where(${andSym}(${eqSym}(${tableSym}.${pkField}, ${pkField}), ${eqSym}(${tableSym}.${discField}, ${valueLit}))).returning();
138
+ return row ? ${subSchemaSym}.parse(row) : null;
139
+ }
140
+
141
+ export async function delete${sub.name}ById(db: Db, ${pkField}: ${pkType}): Promise<boolean> {
142
+ const deleted = await db.delete(${tableSym})
143
+ .where(${andSym}(${eqSym}(${tableSym}.${pkField}, ${pkField}), ${eqSym}(${tableSym}.${discField}, ${valueLit}))).returning();
144
+ return deleted.length > 0;
145
+ }
146
+ `);
147
+ }
148
+ const literalImports = code `
149
+ ${dbTypeImport}
150
+ ${dbTypeAlias}
151
+ `;
152
+ const body = joinCode([literalImports, polymorphic, ...subtypeSections], { on: "\n" }).toString();
153
+ const header = `// ${GENERATED_HEADER} — DO NOT EDIT.\n` +
154
+ `// Source metadata: ${baseName} (${base.fqn()}) — TPH discriminator base\n` +
155
+ `// Customize via ${baseName}.extra.ts in this directory (additional queries, custom logic).\n`;
156
+ return header + body;
157
+ }
50
158
  //# sourceMappingURL=queries-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queries-file.js","sourceRoot":"","sources":["../../src/templates/queries-file.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,kFAAkF;AAElF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAa,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAsB,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,iBAAiB,CAAC,GAAe,EAAE,GAAkB;IACnE,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;IAC5B,yEAAyE;IACzE,8CAA8C;IAC9C,MAAM,cAAc,GAAG,qBAAqB,CAC1C,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,kBAAkB,EACtB,GAAG,CAAC,OAAO,EACX,UAAU,EACV,GAAG,CAAC,QAAQ,CACb,CAAC;IACF,MAAM,OAAO,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAEnD,6EAA6E;IAC7E,wEAAwE;IACxE,6EAA6E;IAC7E,6EAA6E;IAC7E,MAAM,YAAY,GAChB,GAAG,CAAC,OAAO,KAAK,UAAU;QACxB,CAAC,CAAC,kEAAkE;QACpE,CAAC,CAAC,oEAAoE,CAAC;IAC3E,MAAM,WAAW,GACf,GAAG,CAAC,OAAO,KAAK,UAAU;QACxB,CAAC,CAAC,kDAAkD;QACpD,CAAC,CAAC,+DAA+D,CAAC;IAEtE,6EAA6E;IAC7E,oEAAoE;IACpE,MAAM,cAAc,GAAG,IAAI,CAAA;EAC3B,YAAY;EACZ,WAAW;;WAEF,OAAO,UAAU,UAAU,KAAK,UAAU,uBAAuB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;CACzG,CAAC;IAEA,MAAM,QAAQ,GAAW;QACvB,cAAc;QACd,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC;QAC1B,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;QACtB,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC;QACxB,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC;QACxB,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;KAC7B,CAAC;IAEF,4EAA4E;IAC5E,kCAAkC;IAClC,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,UAAU,KAAK,GAAG,CAAC,GAAG,EAAE,KAAK;QACpD,oBAAoB,UAAU,mEAAmE,CAAC;IACpG,OAAO,MAAM,GAAG,IAAI,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"queries-file.js","sourceRoot":"","sources":["../../src/templates/queries-file.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,kFAAkF;AAElF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAa,MAAM,SAAS,CAAC;AACzD,OAAO,EACL,UAAU,EACV,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAsB,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAErF,MAAM,UAAU,iBAAiB,CAAC,GAAe,EAAE,GAAkB;IACnE,4EAA4E;IAC5E,4EAA4E;IAC5E,6EAA6E;IAC7E,2EAA2E;IAC3E,IAAI,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,OAAO,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;IAC5B,yEAAyE;IACzE,8CAA8C;IAC9C,MAAM,cAAc,GAAG,qBAAqB,CAC1C,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,kBAAkB,EACtB,GAAG,CAAC,OAAO,EACX,UAAU,EACV,GAAG,CAAC,QAAQ,CACb,CAAC;IACF,MAAM,OAAO,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAEnD,6EAA6E;IAC7E,wEAAwE;IACxE,6EAA6E;IAC7E,6EAA6E;IAC7E,MAAM,YAAY,GAChB,GAAG,CAAC,OAAO,KAAK,UAAU;QACxB,CAAC,CAAC,kEAAkE;QACpE,CAAC,CAAC,oEAAoE,CAAC;IAC3E,MAAM,WAAW,GACf,GAAG,CAAC,OAAO,KAAK,UAAU;QACxB,CAAC,CAAC,kDAAkD;QACpD,CAAC,CAAC,+DAA+D,CAAC;IAEtE,6EAA6E;IAC7E,oEAAoE;IACpE,MAAM,cAAc,GAAG,IAAI,CAAA;EAC3B,YAAY;EACZ,WAAW;;WAEF,OAAO,UAAU,UAAU,KAAK,UAAU,uBAAuB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;CACzG,CAAC;IAEA,MAAM,QAAQ,GAAW;QACvB,cAAc;QACd,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC;QAC1B,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;QACtB,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC;QACxB,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC;QACxB,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;KAC7B,CAAC;IAEF,4EAA4E;IAC5E,kCAAkC;IAClC,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,UAAU,KAAK,GAAG,CAAC,GAAG,EAAE,KAAK;QACpD,oBAAoB,UAAU,mEAAmE,CAAC;IACpG,OAAO,MAAM,GAAG,IAAI,CAAC;AACvB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,oBAAoB,CAAC,IAAgB,EAAE,GAAkB;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAW,CAAC;IACpE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEpE,MAAM,YAAY,GAAG,qBAAqB,CACxC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAC7E,CAAC;IACF,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,QAAQ,IAAI,YAAY,EAAE,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,QAAQ,IAAI,YAAY,EAAE,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,QAAQ,IAAI,YAAY,EAAE,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAEtC,MAAM,YAAY,GAChB,GAAG,CAAC,OAAO,KAAK,UAAU;QACxB,CAAC,CAAC,kEAAkE;QACpE,CAAC,CAAC,oEAAoE,CAAC;IAC3E,MAAM,WAAW,GACf,GAAG,CAAC,OAAO,KAAK,UAAU;QACxB,CAAC,CAAC,kDAAkD;QACpD,CAAC,CAAC,+DAA+D,CAAC;IAEtE,iCAAiC;IACjC,MAAM,WAAW,GAAG,IAAI,CAAA;4BACE,QAAQ,gBAAgB,OAAO,KAAK,MAAM,cAAc,WAAW;yCACtD,QAAQ,WAAW,KAAK,IAAI,QAAQ,IAAI,OAAO,KAAK,OAAO;iBACnF,QAAQ;;;4BAGG,SAAS,CAAC,QAAQ,CAAC,iEAAiE,WAAW;6BAC9F,QAAQ;;;;2BAIV,QAAQ;;CAElC,CAAC;IAEA,yDAAyD;IACzD,MAAM,eAAe,GAAW,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,+BAA+B,CAAW,CAAC;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,qBAAqB,CACvC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAC5E,CAAC;QACF,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU,WAAW,EAAE,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,gBAAgB,WAAW,EAAE,CAAC,CAAC;QAEnE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAA;4BACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,iEAAiE,UAAU;6BAC7F,QAAQ,WAAW,KAAK,IAAI,QAAQ,IAAI,SAAS,KAAK,QAAQ;;;;2BAIhE,YAAY;;;4BAGX,GAAG,CAAC,IAAI,gBAAgB,OAAO,KAAK,MAAM,cAAc,UAAU;yCACrD,QAAQ;aACpC,MAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI,QAAQ,IAAI,SAAS,KAAK,QAAQ;iBAC/F,YAAY;;;8BAGC,GAAG,CAAC,IAAI,oCAAoC,UAAU;sBAC9D,YAAY;kCACA,QAAQ,4BAA4B,SAAS,KAAK,QAAQ;WACjF,YAAY;;;8BAGO,GAAG,CAAC,IAAI,gBAAgB,OAAO,KAAK,MAAM,6BAA6B,UAAU;sBACzF,YAAY;0CACQ,GAAG,CAAC,IAAI;aACrC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;kCACJ,QAAQ;aAC7B,MAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI,QAAQ,IAAI,SAAS,KAAK,QAAQ;iBAC/F,YAAY;;;8BAGC,GAAG,CAAC,IAAI,gBAAgB,OAAO,KAAK,MAAM;oCACpC,QAAQ;aAC/B,MAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI,QAAQ,IAAI,SAAS,KAAK,QAAQ;;;CAG/G,CAAC,CAAC;IACD,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAA;EAC3B,YAAY;EACZ,WAAW;CACZ,CAAC;IAEA,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,cAAc,EAAE,WAAW,EAAE,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClG,MAAM,MAAM,GACV,MAAM,gBAAgB,mBAAmB;QACzC,uBAAuB,QAAQ,KAAK,IAAI,CAAC,GAAG,EAAE,8BAA8B;QAC5E,oBAAoB,QAAQ,mEAAmE,CAAC;IAClG,OAAO,MAAM,GAAG,IAAI,CAAC;AACvB,CAAC"}
@@ -1,6 +1,11 @@
1
1
  import { type Code } from "ts-poet";
2
2
  import type { MetaObject } from "@metaobjectsdev/metadata";
3
3
  import type { RenderContext } from "../render-context.js";
4
+ /** Get the PK field name and its TS type for a given entity. */
5
+ export declare function getPkInfo(entity: MetaObject, ctx: RenderContext): {
6
+ fieldName: string;
7
+ tsType: string;
8
+ };
4
9
  export declare function renderFindByIdFn(entity: MetaObject, ctx: RenderContext): Code;
5
10
  export declare function renderListFn(entity: MetaObject, _ctx: RenderContext): Code;
6
11
  export declare function renderCreateFn(entity: MetaObject, _ctx: RenderContext): Code;
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/templates/queries.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAqB1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAc7E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAe1E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAc5E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAgB3E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAe/E"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/templates/queries.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAW1D,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAevG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAc7E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAe1E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAc5E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAgB3E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAe/E"}
@@ -2,9 +2,9 @@
2
2
  // Each returns a ts-poet Code block; composed into a file by queries-file.ts.
3
3
  import { code, imp } from "ts-poet";
4
4
  import { IDENTITY_ATTR_FIELDS } from "@metaobjectsdev/metadata";
5
- import { variableNameFromEntity, pluralize } from "../naming.js";
5
+ import { variableNameFromEntity, pluralize, findByIdFnName, listFnName, createFnName, updateFnName, deleteByIdFnName, } from "../naming.js";
6
6
  /** Get the PK field name and its TS type for a given entity. */
7
- function getPkInfo(entity, ctx) {
7
+ export function getPkInfo(entity, ctx) {
8
8
  // Use primaryIdentity() to find the primary identity (may be inherited from extends:/super:).
9
9
  const primary = entity.primaryIdentity();
10
10
  const rawFields = primary?.ownAttr(IDENTITY_ATTR_FIELDS);
@@ -24,7 +24,7 @@ export function renderFindByIdFn(entity, ctx) {
24
24
  const entityName = entity.name;
25
25
  const singularVar = entityName.charAt(0).toLowerCase() + entityName.slice(1);
26
26
  const { fieldName: pkField, tsType: pkType } = getPkInfo(entity, ctx);
27
- const fnName = `find${entityName}ById`;
27
+ const fnName = findByIdFnName(entityName);
28
28
  const eqSym = imp("eq@drizzle-orm");
29
29
  return code `
30
30
  export async function ${fnName}(db: Db, ${pkField}: ${pkType}): Promise<${entityName} | null> {
@@ -38,7 +38,7 @@ export function renderListFn(entity, _ctx) {
38
38
  const entityName = entity.name;
39
39
  // Pluralize the PascalCase entity name, preserving capitalization
40
40
  // (e.g., "Category" -> "Categories", not "Categorys").
41
- const fnName = `list${pluralize(entityName)}`;
41
+ const fnName = listFnName(entityName);
42
42
  return code `
43
43
  export async function ${fnName}(db: Db, opts?: { limit?: number; offset?: number }): Promise<${entityName}[]> {
44
44
  let q = db.select().from(${varName}).$dynamic();
@@ -52,7 +52,7 @@ export function renderCreateFn(entity, _ctx) {
52
52
  const varName = variableNameFromEntity(entity.name);
53
53
  const entityName = entity.name;
54
54
  const singularVar = entityName.charAt(0).toLowerCase() + entityName.slice(1);
55
- const fnName = `create${entityName}`;
55
+ const fnName = createFnName(entityName);
56
56
  const schemaName = `${entityName}InsertSchema`;
57
57
  return code `
58
58
  export async function ${fnName}(db: Db, data: unknown): Promise<${entityName}> {
@@ -67,7 +67,7 @@ export function renderUpdateFn(entity, ctx) {
67
67
  const entityName = entity.name;
68
68
  const singularVar = entityName.charAt(0).toLowerCase() + entityName.slice(1);
69
69
  const { fieldName: pkField, tsType: pkType } = getPkInfo(entity, ctx);
70
- const fnName = `update${entityName}`;
70
+ const fnName = updateFnName(entityName);
71
71
  const schemaName = `${entityName}InsertSchema`;
72
72
  const eqSym = imp("eq@drizzle-orm");
73
73
  return code `
@@ -82,7 +82,7 @@ export function renderDeleteByIdFn(entity, ctx) {
82
82
  const varName = variableNameFromEntity(entity.name);
83
83
  const entityName = entity.name;
84
84
  const { fieldName: pkField, tsType: pkType } = getPkInfo(entity, ctx);
85
- const fnName = `delete${entityName}ById`;
85
+ const fnName = deleteByIdFnName(entityName);
86
86
  const eqSym = imp("eq@drizzle-orm");
87
87
  return code `
88
88
  export async function ${fnName}(db: Db, ${pkField}: ${pkType}): Promise<boolean> {
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/templates/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/templates/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,64 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recover-schema-emitter.js","sourceRoot":"","sources":["../../src/templates/recover-schema-emitter.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,16 @@ ${joinCode(lines, { on: ",\n", trim: false })}
32
32
  `;
33
33
  }
34
34
  function renderRelationEntry(entry, ctx, thisVarName, thisEntityPackage) {
35
+ // FR-018 M:N: the source navigates through the junction table, so the Drizzle
36
+ // many() targets the JUNCTION, not the target entity (the relational query API
37
+ // then hops junction → target via the junction's one() sides). The
38
+ // mountM2mRoute the routes generator emits performs the flattened two-stage
39
+ // traversal for the REST contract.
40
+ if (entry.cardinality === CARDINALITY_MANY && entry.junctionEntity !== undefined) {
41
+ const junctionSpec = crossEntitySpecifier(ctx.outputLayout, thisEntityPackage, ctx.packageOf.get(entry.junctionEntity), entry.junctionEntity, ctx.extStyle);
42
+ const junctionVarSym = imp(`${variableNameFromEntity(entry.junctionEntity)}@${junctionSpec}`);
43
+ return code ` ${entry.name}: many(${junctionVarSym})`;
44
+ }
35
45
  // Use imp() for cross-entity references so ts-poet tracks and emits the import.
36
46
  const targetSpec = crossEntitySpecifier(ctx.outputLayout, thisEntityPackage, ctx.packageOf.get(entry.targetEntity), entry.targetEntity, ctx.extStyle);
37
47
  const targetVarSym = imp(`${variableNameFromEntity(entry.targetEntity)}@${targetSpec}`);
@@ -1 +1 @@
1
- {"version":3,"file":"relations-block.js","sourceRoot":"","sources":["../../src/templates/relations-block.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"relations-block.js","sourceRoot":"","sources":["../../src/templates/relations-block.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-helper.d.ts","sourceRoot":"","sources":["../../src/templates/render-helper.ts"],"names":[],"mappings":"AA2BA,OAAO,EACL,KAAK,QAAQ,EAiBd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,QAAQ,EAGd,MAAM,wBAAwB,CAAC;AA2EhC;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAsGR"}
1
+ {"version":3,"file":"render-helper.d.ts","sourceRoot":"","sources":["../../src/templates/render-helper.ts"],"names":[],"mappings":"AA2BA,OAAO,EACL,KAAK,QAAQ,EAkBd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,QAAQ,EAGd,MAAM,wBAAwB,CAAC;AA2EhC;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAsGR"}