@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
@@ -24,10 +24,10 @@
24
24
  // depend on the cli package; the walk is the same as cli's payload-field-tree).
25
25
  // • PayloadField — the verify() field-tree shape; serialized into the emitted
26
26
  // `verify:` literal so render()'s runtime drift check runs too.
27
- import { TYPE_OBJECT, TYPE_FIELD, TYPE_TEMPLATE, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_OBJECT_REF, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_KIND, TEMPLATE_KIND_EMAIL, TEMPLATE_KIND_DEFAULT, TEMPLATE_ATTR_SUBJECT_REF, TEMPLATE_ATTR_HTML_BODY_REF, TEMPLATE_ATTR_TEXT_BODY_REF, } from "@metaobjectsdev/metadata";
27
+ import { TYPE_OBJECT, TYPE_FIELD, TYPE_TEMPLATE, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_OBJECT_REF, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_KIND, TEMPLATE_KIND_EMAIL, TEMPLATE_KIND_DEFAULT, TEMPLATE_ATTR_SUBJECT_REF, TEMPLATE_ATTR_HTML_BODY_REF, TEMPLATE_ATTR_TEXT_BODY_REF, refMatchesObject, } from "@metaobjectsdev/metadata";
28
28
  import { verify, ERR_REQUIRED_SLOT_UNUSED, } from "@metaobjectsdev/render";
29
29
  function findObject(root, name) {
30
- return root.ownChildren().find((c) => c.type === TYPE_OBJECT && c.name === name);
30
+ return root.ownChildren().find((c) => c.type === TYPE_OBJECT && refMatchesObject(c, name));
31
31
  }
32
32
  function findTemplate(root, name) {
33
33
  return root.ownChildren().find((c) => c.type === TYPE_TEMPLATE && c.name === name);
@@ -133,7 +133,7 @@ export function renderRenderHelper(root, templateName, provider) {
133
133
  : "";
134
134
  return `import { render } from "@metaobjectsdev/render";
135
135
  import type { Provider, EmailDocument } from "@metaobjectsdev/render";
136
- import type { ${payloadRef} } from "./payloads.js";
136
+ import type { ${payloadRef} } from "./${payloadRef}.js";
137
137
 
138
138
  /**
139
139
  * Render the ${templateName} email (subject + html body${typeof textBodyRef === "string" ? " + text body" : ""}) from a
@@ -165,7 +165,7 @@ export function ${fnName}(payload: ${payloadRef}, provider: Provider): EmailDocu
165
165
  const maxCharsArg = maxChars !== undefined && Number.isFinite(maxChars) ? `, maxChars: ${maxChars}` : "";
166
166
  return `import { render } from "@metaobjectsdev/render";
167
167
  import type { Provider } from "@metaobjectsdev/render";
168
- import type { ${payloadRef} } from "./payloads.js";
168
+ import type { ${payloadRef} } from "./${payloadRef}.js";
169
169
 
170
170
  /**
171
171
  * Render the ${templateName} document from a typed ${payloadRef} payload. Wraps the
@@ -1 +1 @@
1
- {"version":3,"file":"render-helper.js","sourceRoot":"","sources":["../../src/templates/render-helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render-helper.js","sourceRoot":"","sources":["../../src/templates/render-helper.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes-file.d.ts","sourceRoot":"","sources":["../../src/templates/routes-file.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAyJ/E"}
1
+ {"version":3,"file":"routes-file.d.ts","sourceRoot":"","sources":["../../src/templates/routes-file.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAK3D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQ1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CA8K/E"}
@@ -14,15 +14,24 @@
14
14
  // The user's Drizzle `db` instance is imported from ctx.dbImport (matching
15
15
  // the existing queries-file template). The entity's Drizzle table const is
16
16
  // imported alongside the Zod schemas + constants from the sibling Entity.ts.
17
- import { code, imp } from "ts-poet";
17
+ import { code, imp, joinCode } from "ts-poet";
18
+ import { TYPE_FIELD, resolveColumnName, } from "@metaobjectsdev/metadata";
18
19
  import {} from "../render-context.js";
19
- import { entityModuleSpecifier, relativeModuleSpecifier } from "../import-path.js";
20
+ import { crossEntitySpecifier, entityModuleSpecifier, relativeModuleSpecifier } from "../import-path.js";
20
21
  import { GENERATED_HEADER } from "../constants.js";
21
- import { variableNameFromEntity } from "../naming.js";
22
+ import { variableNameFromEntity, routesHandlerName } from "../naming.js";
22
23
  import { isProjection } from "../projection/projection-detector.js";
24
+ import { isTphDiscriminatorBase, tphPlan } from "./tph-discriminator.js";
23
25
  export function renderRoutesFile(entity, ctx) {
26
+ // FR-017 Tier 2 — a TPH discriminator base mounts polymorphic list/get at the
27
+ // base path plus a full per-subtype CRUD route set scoped to each
28
+ // discriminator value. (Subtype entities are filtered out of the routes
29
+ // generator entirely — their routes live here.)
30
+ if (isTphDiscriminatorBase(entity, ctx.loadedRoot)) {
31
+ return renderTphRoutesFile(entity, ctx);
32
+ }
24
33
  const entityName = entity.name;
25
- const handlerName = `${entityName.charAt(0).toLowerCase()}${entityName.slice(1)}Routes`;
34
+ const handlerName = routesHandlerName(entityName);
26
35
  // Import the entity's own file. Same target → relative "./Entity"; cross
27
36
  // target → importBase-qualified package path.
28
37
  const entityFileSpec = entityModuleSpecifier(ctx.selfTarget, ctx.entityModuleTarget, entity.package, entityName, ctx.extStyle);
@@ -93,6 +102,16 @@ export async function ${handlerName}(fastify: ${FastifyInstanceSym}) {
93
102
  const tableVar = variableNameFromEntity(entityName);
94
103
  const FastifyInstanceSym = imp("t:FastifyInstance@fastify");
95
104
  const mountCrudRoutesSym = imp("mountCrudRoutes@@metaobjectsdev/runtime-ts/drizzle-fastify");
105
+ // FR-018 M:N traversal: for each many-to-many navigation declared on this
106
+ // entity, emit a mountM2mRoute(...) that traverses the junction. The junction
107
+ // FK columns were derived from the junction's identity.reference children (the
108
+ // SSOT) by the relation-resolver pre-pass; here we resolve them to physical
109
+ // column names for the Drizzle two-stage join.
110
+ const m2mEntries = (ctx.relationMap.get(entityName) ?? []).filter((e) => e.junctionEntity !== undefined);
111
+ // Two fastify-scope variants: under an apiPrefix the mounts live inside the
112
+ // register-block (`instance`); otherwise they bind directly to `fastify`.
113
+ const m2mMountsPrefixed = renderM2mMounts(m2mEntries, entity, ctx, "instance");
114
+ const m2mMountsFlat = renderM2mMounts(m2mEntries, entity, ctx, "fastify");
96
115
  const literalImports = code `
97
116
  import { db } from ${JSON.stringify(dbImportSpec)};
98
117
  import {
@@ -127,7 +146,7 @@ export async function ${handlerName}(fastify: ${FastifyInstanceSym}) {
127
146
  sortAllowlist: ${entityName}SortAllowlist,
128
147
  dialect: ${JSON.stringify(ctx.dialect)},
129
148
  });
130
- }, { prefix: ${JSON.stringify(ctx.apiPrefix)} });
149
+ ${m2mMountsPrefixed} }, { prefix: ${JSON.stringify(ctx.apiPrefix)} });
131
150
  }
132
151
  `
133
152
  : code `
@@ -151,8 +170,166 @@ export async function ${handlerName}(fastify: ${FastifyInstanceSym}) {
151
170
  sortAllowlist: ${entityName}SortAllowlist,
152
171
  dialect: ${JSON.stringify(ctx.dialect)},
153
172
  });
154
- }
173
+ ${m2mMountsFlat}}
155
174
  `;
156
175
  return header + literalImports.toString() + body.toString();
157
176
  }
177
+ /**
178
+ * Render the M:N traversal mounts for an entity as a single Code fragment to
179
+ * interpolate INTO the handler-body code template (so the junction/target table
180
+ * + mountM2mRoute imports hoist with the rest of the body's imports, not inline
181
+ * mid-function). `fastifyVar` is the in-scope Fastify reference (`instance`
182
+ * under an apiPrefix register-block, else `fastify`). Returns "" when the entity
183
+ * has no M:N relationships — CRUD-only output stays byte-identical to before.
184
+ */
185
+ function renderM2mMounts(entries, source, ctx, fastifyVar) {
186
+ if (entries.length === 0)
187
+ return "";
188
+ const mounts = entries.map((e) => renderM2mMount(e, source, ctx, fastifyVar));
189
+ return code `${joinCode(mounts, { on: "\n", trim: false })}
190
+ `;
191
+ }
192
+ /**
193
+ * Render one M:N traversal mount. The junction + target Drizzle table consts are
194
+ * imported from their sibling entity files (imp() lets ts-poet track + emit the
195
+ * import). The source/target FK columns + the target PK are resolved to PHYSICAL
196
+ * column names via resolveColumnName (the runtime two-stage join queries by
197
+ * column). mountM2mRoute appends `/:id/<relationName>` to the source $path.
198
+ */
199
+ function renderM2mMount(entry, source, ctx, fastifyVar) {
200
+ const junctionVarSym = imp(`${variableNameFromEntity(entry.junctionEntity)}@${crossEntitySpecifier(ctx.outputLayout, source.package, ctx.packageOf.get(entry.junctionEntity), entry.junctionEntity, ctx.extStyle)}`);
201
+ const targetVarSym = imp(`${variableNameFromEntity(entry.targetEntity)}@${crossEntitySpecifier(ctx.outputLayout, source.package, ctx.packageOf.get(entry.targetEntity), entry.targetEntity, ctx.extStyle)}`);
202
+ const mountM2mRouteSym = imp("mountM2mRoute@@metaobjectsdev/runtime-ts/drizzle-fastify");
203
+ const junction = ctx.loadedRoot.findObject(entry.junctionEntity);
204
+ const target = ctx.loadedRoot.findObject(entry.targetEntity);
205
+ const sourceColumn = junction
206
+ ? resolveJunctionColumn(junction, entry.sourceJoinField, ctx)
207
+ : entry.sourceJoinField;
208
+ const targetColumn = junction
209
+ ? resolveJunctionColumn(junction, entry.targetJoinField, ctx)
210
+ : entry.targetJoinField;
211
+ const targetPkColumn = target
212
+ ? resolveJunctionColumn(target, ctx.pkMap.get(entry.targetEntity)?.fieldName ?? "id", ctx)
213
+ : "id";
214
+ return code ` ${mountM2mRouteSym}({
215
+ fastify: ${fastifyVar},
216
+ path: ${source.name}.$path,
217
+ relationName: ${JSON.stringify(entry.name)},
218
+ db,
219
+ junctionTable: ${junctionVarSym},
220
+ targetTable: ${targetVarSym},
221
+ sourceColumn: ${JSON.stringify(sourceColumn)},
222
+ targetColumn: ${JSON.stringify(targetColumn)},
223
+ targetPkColumn: ${JSON.stringify(targetPkColumn)},
224
+ symmetric: ${entry.symmetric ? "true" : "false"},
225
+ });`;
226
+ }
227
+ /** Resolve a field's physical column name on an entity (defaults if missing). */
228
+ function resolveJunctionColumn(entity, fieldName, ctx) {
229
+ const field = entity.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
230
+ if (!field)
231
+ return fieldName;
232
+ return resolveColumnName(field, ctx.columnNamingStrategy);
233
+ }
234
+ /**
235
+ * FR-017 Tier 2 — the routes file for a TPH discriminator base.
236
+ *
237
+ * Mounts a polymorphic list/get route set at the base path (`GET /auths`,
238
+ * `GET /auths/:id` — rows carry the discriminator by value), then a full
239
+ * per-subtype CRUD route set at `<basePath>/<discriminatorValue lowercased>`
240
+ * (`/auths/bridge`, ...). The per-subtype create body OMITS the discriminator
241
+ * (the URL names the subtype); the runtime helper injects it. The per-subtype
242
+ * route set is scoped to its discriminator value via the `discriminator` option
243
+ * (cross-subtype get/update/delete 404; update strips the discriminator).
244
+ *
245
+ * Subtype route segment defaults to the lowercased `@discriminatorValue`
246
+ * (`"Bridge"` → `bridge`) — a robust, value-derived path that matches the
247
+ * FR-017 design's `/auths/bridge` examples. Fastify resolves the static
248
+ * `/auths/bridge` ahead of the parametric `/auths/:id`, so the two coexist.
249
+ */
250
+ function renderTphRoutesFile(base, ctx) {
251
+ const baseName = base.name;
252
+ const handlerName = routesHandlerName(baseName);
253
+ // Single source of truth for the discriminator field + subtypes + route segments.
254
+ const plan = tphPlan(base, ctx.loadedRoot);
255
+ const discField = plan.discriminatorField;
256
+ const tableVar = variableNameFromEntity(baseName);
257
+ const baseFileSpec = entityModuleSpecifier(ctx.selfTarget, ctx.entityModuleTarget, base.package, baseName, ctx.extStyle);
258
+ const dbImportSpec = relativeModuleSpecifier(ctx.outputLayout, base.package, ctx.dbImport);
259
+ const FastifyInstanceSym = imp("t:FastifyInstance@fastify");
260
+ const mountCrudRoutesSym = imp("mountCrudRoutes@@metaobjectsdev/runtime-ts/drizzle-fastify");
261
+ const dbSym = imp(`db@${dbImportSpec}`);
262
+ const tableSym = imp(`${tableVar}@${baseFileSpec}`);
263
+ const baseConstSym = imp(`${baseName}@${baseFileSpec}`);
264
+ const baseInsertSym = imp(`${baseName}InsertSchema@${baseFileSpec}`);
265
+ const baseUpdateSym = imp(`${baseName}UpdateSchema@${baseFileSpec}`);
266
+ const baseFilterSym = imp(`${baseName}FilterAllowlist@${baseFileSpec}`);
267
+ const baseSortSym = imp(`${baseName}SortAllowlist@${baseFileSpec}`);
268
+ const fastifyRef = ctx.apiPrefix ? "instance" : "fastify";
269
+ const dialectLit = JSON.stringify(ctx.dialect);
270
+ const polymorphic = code `
271
+ ${mountCrudRoutesSym}({
272
+ fastify: ${fastifyRef},
273
+ path: ${baseConstSym}.$path,
274
+ db: ${dbSym},
275
+ table: ${tableSym},
276
+ insertSchema: ${baseInsertSym},
277
+ updateSchema: ${baseUpdateSym},
278
+ filterAllowlist: ${baseFilterSym},
279
+ sortAllowlist: ${baseSortSym},
280
+ dialect: ${dialectLit},
281
+ expose: ["list", "get"],
282
+ });`;
283
+ const subtypeMounts = plan.subtypes.map(({ entity: sub, value, routeSegment: segment }) => {
284
+ const subFileSpec = entityModuleSpecifier(ctx.selfTarget, ctx.entityModuleTarget, sub.package, sub.name, ctx.extStyle);
285
+ const subInsertSym = imp(`${sub.name}InsertSchema@${subFileSpec}`);
286
+ // FR-017 Tier 3: each subtype carries its OWN filter/sort allowlist
287
+ // (discriminator excluded — it's pinned by this path).
288
+ const subFilterSym = imp(`${sub.name}FilterAllowlist@${subFileSpec}`);
289
+ const subSortSym = imp(`${sub.name}SortAllowlist@${subFileSpec}`);
290
+ return code `
291
+ ${mountCrudRoutesSym}({
292
+ fastify: ${fastifyRef},
293
+ path: ${baseConstSym}.$path + ${JSON.stringify("/" + segment)},
294
+ db: ${dbSym},
295
+ table: ${tableSym},
296
+ insertSchema: ${subInsertSym}.omit({ ${discField}: true }),
297
+ updateSchema: ${subInsertSym}.omit({ ${discField}: true }).partial(),
298
+ filterAllowlist: ${subFilterSym},
299
+ sortAllowlist: ${subSortSym},
300
+ dialect: ${dialectLit},
301
+ discriminator: { column: ${JSON.stringify(discField)}, value: ${JSON.stringify(value)} },
302
+ });`;
303
+ });
304
+ const mounts = joinCode([polymorphic, ...subtypeMounts], { on: "\n" });
305
+ const fn = ctx.apiPrefix
306
+ ? code `
307
+ /**
308
+ * Mount polymorphic + per-subtype REST endpoints for the ${baseName} TPH hierarchy.
309
+ *
310
+ * GET ${baseName}.$path (+ /:id) lists/gets the discriminated union; each
311
+ * /${baseName}.$path/<subtype> path is a full per-subtype CRUD set.
312
+ */
313
+ export async function ${handlerName}(fastify: ${FastifyInstanceSym}) {
314
+ await fastify.register(async (instance) => {
315
+ ${mounts}
316
+ }, { prefix: ${JSON.stringify(ctx.apiPrefix)} });
317
+ }
318
+ `
319
+ : code `
320
+ /**
321
+ * Mount polymorphic + per-subtype REST endpoints for the ${baseName} TPH hierarchy.
322
+ *
323
+ * GET ${baseName}.$path (+ /:id) lists/gets the discriminated union; each
324
+ * /${baseName}.$path/<subtype> path is a full per-subtype CRUD set.
325
+ */
326
+ export async function ${handlerName}(fastify: ${FastifyInstanceSym}) {
327
+ ${mounts}
328
+ }
329
+ `;
330
+ const header = `// ${GENERATED_HEADER} — DO NOT EDIT.\n` +
331
+ `// Source metadata: ${baseName} (${base.fqn()}) — TPH discriminator base\n` +
332
+ `// Customize via ${baseName}.extra.ts in this directory (e.g., auth, additional handlers).\n`;
333
+ return header + fn.toString();
334
+ }
158
335
  //# sourceMappingURL=routes-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes-file.js","sourceRoot":"","sources":["../../src/templates/routes-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes-file.js","sourceRoot":"","sources":["../../src/templates/routes-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { type Code } from "ts-poet";
2
+ import { type MetaObject, type MetaField, type MetaRoot } from "@metaobjectsdev/metadata";
3
+ /** One concrete subtype in a {@link TphPlan}. */
4
+ export interface TphSubtypePlan {
5
+ /** The concrete subtype entity. */
6
+ entity: MetaObject;
7
+ /** Its `@discriminatorValue`. */
8
+ value: string;
9
+ /** The per-subtype REST route segment (e.g. `"bridge"`). The ONE place this
10
+ * rule is derived — see {@link tphRouteSegment}. */
11
+ routeSegment: string;
12
+ }
13
+ /**
14
+ * The single source of truth for a TPH base's polymorphic shape: the
15
+ * discriminator field name, the concrete subtypes (stable name-sorted order),
16
+ * each subtype's `@discriminatorValue`, and its per-subtype route segment.
17
+ *
18
+ * Every generator in the stack (entity, queries, routes, hooks, grid, forms)
19
+ * derives its TPH behavior from this one model rather than re-walking the root
20
+ * and re-deriving the segment / write-shape independently — so the route-segment
21
+ * rule and subtype set can never drift between, say, the generated routes and
22
+ * the generated hooks that call them.
23
+ */
24
+ export interface TphPlan {
25
+ base: MetaObject;
26
+ discriminatorField: string;
27
+ subtypes: TphSubtypePlan[];
28
+ }
29
+ /** The per-subtype REST route segment for a discriminator value. The ONE place
30
+ * this rule lives: `routesFile` and the TanStack hooks both read it through the
31
+ * plan, so generated hooks can't call a URL the generated routes don't serve. */
32
+ export declare function tphRouteSegment(discriminatorValue: string): string;
33
+ /** The {@link TphPlan} for a discriminator base, or `null` when `base` is not a
34
+ * discriminator base (no `@discriminator`, or no concrete subtypes). */
35
+ export declare function tphPlan(base: MetaObject, root: MetaRoot): TphPlan | null;
36
+ /** True when this entity is a TPH discriminator base — it carries
37
+ * `@discriminator` AND at least one concrete subtype declares
38
+ * `@discriminatorValue` extending it. This is the predicate the generator
39
+ * stack uses to switch into single-table-inheritance emission. */
40
+ export declare function isTphDiscriminatorBase(obj: MetaObject, root: MetaRoot): boolean;
41
+ /** The concrete subtypes bound to this discriminator base, in stable
42
+ * (name-sorted) order. Returns `[]` when `base` is not a discriminator base. */
43
+ export declare function tphConcreteSubtypes(base: MetaObject, root: MetaRoot): MetaObject[];
44
+ /**
45
+ * The subtype-only fields that must be folded into the base's single TPH table.
46
+ * For each concrete subtype, every effective field NOT already on the base is
47
+ * collected (effective, so fields declared on abstract intermediate levels of a
48
+ * multi-level hierarchy are captured too). Deduplicated by field name across
49
+ * subtypes — two subtypes sharing a column name contribute one column. The
50
+ * caller emits each as a nullable column (rows of other subtypes store NULL).
51
+ */
52
+ export declare function collectTphSubtypeFields(base: MetaObject, root: MetaRoot): MetaField[];
53
+ /** Render the TPH union + guards + dispatcher block, or null when the entity
54
+ * is not a discriminator-bearing base with at least one concrete subtype. */
55
+ export declare function renderTphDiscriminatorUnion(base: MetaObject, root: MetaRoot): Code | null;
56
+ //# sourceMappingURL=tph-discriminator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tph-discriminator.d.ts","sourceRoot":"","sources":["../../src/templates/tph-discriminator.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAuB,KAAK,IAAI,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,EAId,MAAM,0BAA0B,CAAC;AAOlC,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd;yDACqD;IACrD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAOD;;kFAEkF;AAClF,wBAAgB,eAAe,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;yEACyE;AACzE,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAqBxE;AAED;;;mEAGmE;AACnE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE/E;AAED;iFACiF;AACjF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,EAAE,CAElF;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,CAgBrF;AAED;8EAC8E;AAC9E,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,QAAQ,GACb,IAAI,GAAG,IAAI,CA0Db"}
@@ -0,0 +1,180 @@
1
+ // FR-017 Tier 1 — TS discriminated-union + type guards + dispatcher emission.
2
+ //
3
+ // For an entity that carries `@discriminator`, this template emits:
4
+ // 1. `export type <Base> = <Sub1> | <Sub2> | ...` — discriminated union of
5
+ // every concrete subtype declaring @discriminatorValue against this base.
6
+ // 2. `export function is<Sub>(value: <Base>): value is <Sub>` — one type
7
+ // guard per subtype, checking the discriminator field's value.
8
+ // 3. `export function parse<Base>(row: unknown): <Base>` — runtime dispatcher
9
+ // that reads the discriminator off the raw row and parses with the
10
+ // matching subtype's Zod schema.
11
+ //
12
+ // When the entity does NOT carry @discriminator, returns null. When the entity
13
+ // carries @discriminator but has no concrete subtypes yet (refactor-in-progress
14
+ // shape — covered by FR-014 fixture `tph-discriminator-string-no-subtypes`),
15
+ // returns null too: there are no subtype names to union.
16
+ import { code, joinCode, imp } from "ts-poet";
17
+ import { OBJECT_ATTR_DISCRIMINATOR, OBJECT_ATTR_DISCRIMINATOR_VALUE, OBJECT_SUBTYPE_ENTITY, } from "@metaobjectsdev/metadata";
18
+ // Memoized per base instance — the plan is pure over the (immutable, fully
19
+ // resolved) post-load model, and a base belongs to exactly one root, so caching
20
+ // by the base node identity is safe and erases the repeated root walks.
21
+ const _tphPlanCache = new WeakMap();
22
+ /** The per-subtype REST route segment for a discriminator value. The ONE place
23
+ * this rule lives: `routesFile` and the TanStack hooks both read it through the
24
+ * plan, so generated hooks can't call a URL the generated routes don't serve. */
25
+ export function tphRouteSegment(discriminatorValue) {
26
+ return discriminatorValue.toLowerCase();
27
+ }
28
+ /** The {@link TphPlan} for a discriminator base, or `null` when `base` is not a
29
+ * discriminator base (no `@discriminator`, or no concrete subtypes). */
30
+ export function tphPlan(base, root) {
31
+ const cached = _tphPlanCache.get(base);
32
+ if (cached !== undefined)
33
+ return cached;
34
+ const discriminatorField = base.ownAttr(OBJECT_ATTR_DISCRIMINATOR);
35
+ let plan = null;
36
+ if (typeof discriminatorField === "string" && discriminatorField !== "") {
37
+ const bindings = collectConcreteSubtypes(base, root);
38
+ if (bindings.length > 0) {
39
+ plan = {
40
+ base,
41
+ discriminatorField,
42
+ subtypes: bindings.map((b) => ({
43
+ entity: b.subtype,
44
+ value: b.value,
45
+ routeSegment: tphRouteSegment(b.value),
46
+ })),
47
+ };
48
+ }
49
+ }
50
+ _tphPlanCache.set(base, plan);
51
+ return plan;
52
+ }
53
+ /** True when this entity is a TPH discriminator base — it carries
54
+ * `@discriminator` AND at least one concrete subtype declares
55
+ * `@discriminatorValue` extending it. This is the predicate the generator
56
+ * stack uses to switch into single-table-inheritance emission. */
57
+ export function isTphDiscriminatorBase(obj, root) {
58
+ return tphPlan(obj, root) !== null;
59
+ }
60
+ /** The concrete subtypes bound to this discriminator base, in stable
61
+ * (name-sorted) order. Returns `[]` when `base` is not a discriminator base. */
62
+ export function tphConcreteSubtypes(base, root) {
63
+ return tphPlan(base, root)?.subtypes.map((s) => s.entity) ?? [];
64
+ }
65
+ /**
66
+ * The subtype-only fields that must be folded into the base's single TPH table.
67
+ * For each concrete subtype, every effective field NOT already on the base is
68
+ * collected (effective, so fields declared on abstract intermediate levels of a
69
+ * multi-level hierarchy are captured too). Deduplicated by field name across
70
+ * subtypes — two subtypes sharing a column name contribute one column. The
71
+ * caller emits each as a nullable column (rows of other subtypes store NULL).
72
+ */
73
+ export function collectTphSubtypeFields(base, root) {
74
+ const discFieldName = base.ownAttr(OBJECT_ATTR_DISCRIMINATOR);
75
+ if (typeof discFieldName !== "string" || discFieldName === "")
76
+ return [];
77
+ const baseFieldNames = new Set(base.fields().map((f) => f.name));
78
+ const seen = new Set();
79
+ const out = [];
80
+ for (const { subtype } of collectConcreteSubtypes(base, root)) {
81
+ for (const f of subtype.fields()) {
82
+ if (baseFieldNames.has(f.name))
83
+ continue; // base column — already emitted
84
+ if (seen.has(f.name))
85
+ continue; // shared subtype column — emit once
86
+ seen.add(f.name);
87
+ out.push(f);
88
+ }
89
+ }
90
+ return out;
91
+ }
92
+ /** Render the TPH union + guards + dispatcher block, or null when the entity
93
+ * is not a discriminator-bearing base with at least one concrete subtype. */
94
+ export function renderTphDiscriminatorUnion(base, root) {
95
+ const discFieldName = base.ownAttr(OBJECT_ATTR_DISCRIMINATOR);
96
+ if (typeof discFieldName !== "string" || discFieldName === "")
97
+ return null;
98
+ const subtypes = collectConcreteSubtypes(base, root);
99
+ if (subtypes.length === 0)
100
+ return null;
101
+ const baseName = base.name;
102
+ // 1. Union type alias. Subtype names are imported lazily via ts-poet `imp()`
103
+ // so they resolve cross-module without manual import wiring.
104
+ const unionMembers = subtypes.map((b) => {
105
+ const sub = imp(`t:${b.subtype.name}@./${b.subtype.name}.js`);
106
+ return code `${sub}`;
107
+ });
108
+ const unionType = code `export type ${baseName} = ${joinCode(unionMembers, { on: " | " })};`;
109
+ // 2. Type guards.
110
+ const guards = subtypes.map((b) => {
111
+ const sub = imp(`t:${b.subtype.name}@./${b.subtype.name}.js`);
112
+ return code `
113
+ /** True when value is a ${b.subtype.name} (discriminated by ${discFieldName} === "${b.value}"). */
114
+ export function is${b.subtype.name}(value: ${baseName}): value is ${sub} {
115
+ return value.${discFieldName} === "${b.value}";
116
+ }`;
117
+ });
118
+ // 3. Dispatcher. The head-read uses z.object so the discriminator is read
119
+ // without committing the row to any subtype yet.
120
+ const z = imp("z@zod");
121
+ const enumLiterals = subtypes.map((b) => JSON.stringify(b.value)).join(", ");
122
+ const caseBranches = subtypes.map((b) => {
123
+ const schema = imp(`${b.subtype.name}Schema@./${b.subtype.name}.js`);
124
+ return code ` case ${JSON.stringify(b.value)}: return ${schema}.parse(row);`;
125
+ });
126
+ const dispatcher = code `
127
+ /**
128
+ * Parse a row from the ${baseName} table, dispatching by the
129
+ * \`${discFieldName}\` discriminator value to the matching subtype's
130
+ * Zod schema. Throws on unknown discriminator values.
131
+ */
132
+ export function parse${baseName}(row: unknown): ${baseName} {
133
+ const head = ${z}.object({ ${discFieldName}: ${z}.enum([${enumLiterals}]) }).parse(row);
134
+ switch (head.${discFieldName}) {
135
+ ${joinCode(caseBranches, { on: "\n" })}
136
+ }
137
+ }
138
+ `;
139
+ return code `
140
+ ${unionType}
141
+
142
+ ${joinCode(guards, { on: "\n" })}
143
+
144
+ ${dispatcher}
145
+ `;
146
+ }
147
+ /** Walk every top-level object.entity in the root and return the concrete
148
+ * subtypes whose @discriminatorValue is bound to this base via extends.
149
+ * Abstract intermediates are skipped (they don't have polymorphic instances). */
150
+ function collectConcreteSubtypes(base, root) {
151
+ const bindings = [];
152
+ for (const obj of root.objects()) {
153
+ if (obj.subType !== OBJECT_SUBTYPE_ENTITY)
154
+ continue;
155
+ if (obj.isAbstract === true)
156
+ continue;
157
+ if (obj === base)
158
+ continue;
159
+ const value = obj.ownAttr(OBJECT_ATTR_DISCRIMINATOR_VALUE);
160
+ if (typeof value !== "string" || value === "")
161
+ continue;
162
+ // Walk this entity's extends chain looking for `base`.
163
+ let cursor = obj.superResolved;
164
+ let found = false;
165
+ while (cursor !== undefined) {
166
+ if (cursor === base) {
167
+ found = true;
168
+ break;
169
+ }
170
+ cursor = cursor.superResolved;
171
+ }
172
+ if (!found)
173
+ continue;
174
+ bindings.push({ subtype: obj, value });
175
+ }
176
+ // Stable order by subtype name so emission is deterministic.
177
+ bindings.sort((a, b) => a.subtype.name.localeCompare(b.subtype.name));
178
+ return bindings;
179
+ }
180
+ //# sourceMappingURL=tph-discriminator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tph-discriminator.js","sourceRoot":"","sources":["../../src/templates/tph-discriminator.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import type { MetaObject } from "@metaobjectsdev/metadata";
2
- export declare function renderValueObjectFile(obj: MetaObject): string;
2
+ import type { RenderContext } from "../render-context.js";
3
+ export declare function renderValueObjectFile(obj: MetaObject, apiPrefix?: string, ctx?: RenderContext): string;
3
4
  //# sourceMappingURL=value-object-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"value-object-file.d.ts","sourceRoot":"","sources":["../../src/templates/value-object-file.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAK3D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAa7D"}
1
+ {"version":3,"file":"value-object-file.d.ts","sourceRoot":"","sources":["../../src/templates/value-object-file.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAa1D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,SAAK,EAAE,GAAG,CAAC,EAAE,aAAa,GAAG,MAAM,CAsClG"}
@@ -9,14 +9,42 @@
9
9
  // handled by the projection path before this one is reached).
10
10
  import { joinCode } from "ts-poet";
11
11
  import { renderValueObjectInterface, renderEnumTypeAliases } from "./inferred-types.js";
12
- import { renderInsertSchemaOnly } from "./zod-validators.js";
12
+ import { renderInsertSchemaOnly, isTphSubtype, renderTphSubtypeReadSchema, tphDiscriminatorPin, } from "./zod-validators.js";
13
+ import { renderEntityConstants } from "./entity-constants.js";
14
+ import { renderFilterAllowlist, renderSortAllowlist } from "./filter-allowlist.js";
15
+ import { renderFilterType } from "./filter-type.js";
13
16
  import { GENERATED_HEADER } from "../constants.js";
14
- export function renderValueObjectFile(obj) {
15
- const enumAliases = renderEnumTypeAliases(obj);
17
+ export function renderValueObjectFile(obj, apiPrefix = "", ctx) {
18
+ const enumAliases = renderEnumTypeAliases(obj, ctx);
19
+ // FR-017 Tier 2: a TPH subtype lands here (it inherits the base's source.rdb
20
+ // but declares none of its own). In addition to the insert schema it emits a
21
+ // full read schema `<Sub>Schema` so parse<Base>(row) can dispatch to it.
22
+ const tphSubtype = isTphSubtype(obj);
23
+ const tphReadSchema = tphSubtype ? renderTphSubtypeReadSchema(obj) : null;
24
+ // FR-017 Tier 3: a TPH subtype also emits its field-metadata constants object
25
+ // (the `<Sub>` const), so the React form generator can render per-field
26
+ // labels / rules / inputs the same way it does for ordinary entities.
27
+ const tphConstants = tphSubtype ? renderEntityConstants(obj, apiPrefix) : null;
28
+ // FR-017 Tier 3: per-subtype filter + sort allowlists, excluding the
29
+ // discriminator (it's pinned by the per-subtype route path, so a client must
30
+ // not filter on it). Included fields are the subtype's own + inherited base
31
+ // filterable fields. Drives the per-subtype REST routes' filter layer.
32
+ const discField = tphSubtype ? tphDiscriminatorPin(obj)?.fieldName : undefined;
33
+ const tphFilterAllowlist = tphSubtype ? renderFilterAllowlist(obj, discField) : null;
34
+ const tphSortAllowlist = tphSubtype ? renderSortAllowlist(obj, discField) : null;
35
+ // FR-017 Tier 3: the per-subtype CLIENT filter type, discriminator-excluded —
36
+ // kept in lockstep with the per-subtype allowlist above so a typed
37
+ // `<Sub>Filter` can't express a filter the server allowlist would 400.
38
+ const tphFilterType = tphSubtype ? renderFilterType(obj, discField) : null;
16
39
  const sections = [
17
- renderValueObjectInterface(obj),
40
+ renderValueObjectInterface(obj, ctx),
18
41
  ...(enumAliases !== null ? [enumAliases] : []),
42
+ ...(tphReadSchema !== null ? [tphReadSchema] : []),
19
43
  renderInsertSchemaOnly(obj),
44
+ ...(tphConstants !== null ? [tphConstants] : []),
45
+ ...(tphFilterAllowlist !== null ? [tphFilterAllowlist] : []),
46
+ ...(tphSortAllowlist !== null ? [tphSortAllowlist] : []),
47
+ ...(tphFilterType !== null ? [tphFilterType] : []),
20
48
  ];
21
49
  const body = joinCode(sections, { on: "\n" }).toString();
22
50
  const header = `// ${GENERATED_HEADER} — DO NOT EDIT.\n` +