@metaobjectsdev/codegen-ts 0.9.0 → 0.11.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/README.md +1 -1
  2. package/dist/column-mapper.d.ts +12 -6
  3. package/dist/column-mapper.d.ts.map +1 -1
  4. package/dist/column-mapper.js +68 -28
  5. package/dist/column-mapper.js.map +1 -1
  6. package/dist/constants.d.ts +8 -0
  7. package/dist/constants.d.ts.map +1 -1
  8. package/dist/constants.js +16 -0
  9. package/dist/constants.js.map +1 -1
  10. package/dist/docs-paths.d.ts +58 -0
  11. package/dist/docs-paths.d.ts.map +1 -0
  12. package/dist/docs-paths.js +89 -0
  13. package/dist/docs-paths.js.map +1 -0
  14. package/dist/enum-import.d.ts +14 -0
  15. package/dist/enum-import.d.ts.map +1 -0
  16. package/dist/enum-import.js +35 -0
  17. package/dist/enum-import.js.map +1 -0
  18. package/dist/enum-shared.d.ts +32 -0
  19. package/dist/enum-shared.d.ts.map +1 -0
  20. package/dist/enum-shared.js +83 -0
  21. package/dist/enum-shared.js.map +1 -0
  22. package/dist/generator-registry.d.ts +22 -0
  23. package/dist/generator-registry.d.ts.map +1 -0
  24. package/dist/generator-registry.js +161 -0
  25. package/dist/generator-registry.js.map +1 -0
  26. package/dist/generator.d.ts +6 -0
  27. package/dist/generator.d.ts.map +1 -1
  28. package/dist/generator.js.map +1 -1
  29. package/dist/generators/api-doc-render.d.ts +17 -0
  30. package/dist/generators/api-doc-render.d.ts.map +1 -0
  31. package/dist/generators/api-doc-render.js +431 -0
  32. package/dist/generators/api-doc-render.js.map +1 -0
  33. package/dist/generators/api-docs-file.d.ts +21 -0
  34. package/dist/generators/api-docs-file.d.ts.map +1 -0
  35. package/dist/generators/api-docs-file.js +112 -0
  36. package/dist/generators/api-docs-file.js.map +1 -0
  37. package/dist/generators/api-field-shape.d.ts +39 -0
  38. package/dist/generators/api-field-shape.d.ts.map +1 -0
  39. package/dist/generators/api-field-shape.js +92 -0
  40. package/dist/generators/api-field-shape.js.map +1 -0
  41. package/dist/generators/api-label.d.ts +3 -0
  42. package/dist/generators/api-label.d.ts.map +1 -0
  43. package/dist/generators/api-label.js +8 -0
  44. package/dist/generators/api-label.js.map +1 -0
  45. package/dist/generators/api-model.d.ts +122 -0
  46. package/dist/generators/api-model.d.ts.map +1 -0
  47. package/dist/generators/api-model.js +809 -0
  48. package/dist/generators/api-model.js.map +1 -0
  49. package/dist/generators/docs-data-builder.d.ts +26 -4
  50. package/dist/generators/docs-data-builder.d.ts.map +1 -1
  51. package/dist/generators/docs-data-builder.js +439 -167
  52. package/dist/generators/docs-data-builder.js.map +1 -1
  53. package/dist/generators/docs-data.d.ts +136 -27
  54. package/dist/generators/docs-data.d.ts.map +1 -1
  55. package/dist/generators/docs-data.js +1 -1
  56. package/dist/generators/docs-data.js.map +1 -1
  57. package/dist/generators/docs-file.d.ts +19 -0
  58. package/dist/generators/docs-file.d.ts.map +1 -1
  59. package/dist/generators/docs-file.js +154 -27
  60. package/dist/generators/docs-file.js.map +1 -1
  61. package/dist/generators/entity-file.d.ts.map +1 -1
  62. package/dist/generators/entity-file.js +29 -14
  63. package/dist/generators/entity-file.js.map +1 -1
  64. package/dist/generators/extractor-file.d.ts.map +1 -1
  65. package/dist/generators/extractor-file.js +2 -1
  66. package/dist/generators/extractor-file.js.map +1 -1
  67. package/dist/generators/field-anchor.d.ts +7 -0
  68. package/dist/generators/field-anchor.d.ts.map +1 -0
  69. package/dist/generators/field-anchor.js +23 -0
  70. package/dist/generators/field-anchor.js.map +1 -0
  71. package/dist/generators/index.d.ts +8 -1
  72. package/dist/generators/index.d.ts.map +1 -1
  73. package/dist/generators/index.js +6 -0
  74. package/dist/generators/index.js.map +1 -1
  75. package/dist/generators/mermaid-er.d.ts +14 -0
  76. package/dist/generators/mermaid-er.d.ts.map +1 -1
  77. package/dist/generators/mermaid-er.js +14 -0
  78. package/dist/generators/mermaid-er.js.map +1 -1
  79. package/dist/generators/output-parser-file.d.ts.map +1 -1
  80. package/dist/generators/output-parser-file.js +3 -4
  81. package/dist/generators/output-parser-file.js.map +1 -1
  82. package/dist/generators/output-prompt-file.d.ts.map +1 -1
  83. package/dist/generators/output-prompt-file.js +2 -2
  84. package/dist/generators/output-prompt-file.js.map +1 -1
  85. package/dist/generators/prompt-render-file.d.ts.map +1 -1
  86. package/dist/generators/prompt-render-file.js +3 -4
  87. package/dist/generators/prompt-render-file.js.map +1 -1
  88. package/dist/generators/queries-file.d.ts.map +1 -1
  89. package/dist/generators/queries-file.js +8 -3
  90. package/dist/generators/queries-file.js.map +1 -1
  91. package/dist/generators/render-helper-file.d.ts.map +1 -1
  92. package/dist/generators/render-helper-file.js +2 -2
  93. package/dist/generators/render-helper-file.js.map +1 -1
  94. package/dist/generators/routes-file-hono.d.ts.map +1 -1
  95. package/dist/generators/routes-file-hono.js +5 -1
  96. package/dist/generators/routes-file-hono.js.map +1 -1
  97. package/dist/generators/routes-file.d.ts +3 -0
  98. package/dist/generators/routes-file.d.ts.map +1 -1
  99. package/dist/generators/routes-file.js +6 -1
  100. package/dist/generators/routes-file.js.map +1 -1
  101. package/dist/generators/template-doc-builder.d.ts +19 -0
  102. package/dist/generators/template-doc-builder.d.ts.map +1 -0
  103. package/dist/generators/template-doc-builder.js +220 -0
  104. package/dist/generators/template-doc-builder.js.map +1 -0
  105. package/dist/generators/template-doc-data.d.ts +62 -0
  106. package/dist/generators/template-doc-data.d.ts.map +1 -0
  107. package/dist/generators/template-doc-data.js +16 -0
  108. package/dist/generators/template-doc-data.js.map +1 -0
  109. package/dist/generators/template-payload-tree.d.ts +15 -0
  110. package/dist/generators/template-payload-tree.d.ts.map +1 -0
  111. package/dist/generators/template-payload-tree.js +61 -0
  112. package/dist/generators/template-payload-tree.js.map +1 -0
  113. package/dist/generators/template-source-annotate.d.ts +74 -0
  114. package/dist/generators/template-source-annotate.d.ts.map +1 -0
  115. package/dist/generators/template-source-annotate.js +184 -0
  116. package/dist/generators/template-source-annotate.js.map +1 -0
  117. package/dist/generators/template-source-render.d.ts +24 -0
  118. package/dist/generators/template-source-render.d.ts.map +1 -0
  119. package/dist/generators/template-source-render.js +175 -0
  120. package/dist/generators/template-source-render.js.map +1 -0
  121. package/dist/generators/trace-helper-file.d.ts +9 -0
  122. package/dist/generators/trace-helper-file.d.ts.map +1 -0
  123. package/dist/generators/trace-helper-file.js +196 -0
  124. package/dist/generators/trace-helper-file.js.map +1 -0
  125. package/dist/import-path.d.ts +18 -0
  126. package/dist/import-path.d.ts.map +1 -1
  127. package/dist/import-path.js +21 -0
  128. package/dist/import-path.js.map +1 -1
  129. package/dist/index.d.ts +29 -4
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +28 -2
  132. package/dist/index.js.map +1 -1
  133. package/dist/metaobjects-config.d.ts +101 -2
  134. package/dist/metaobjects-config.d.ts.map +1 -1
  135. package/dist/metaobjects-config.js +46 -0
  136. package/dist/metaobjects-config.js.map +1 -1
  137. package/dist/naming.d.ts +39 -2
  138. package/dist/naming.d.ts.map +1 -1
  139. package/dist/naming.js +52 -3
  140. package/dist/naming.js.map +1 -1
  141. package/dist/payload-codegen.d.ts.map +1 -1
  142. package/dist/payload-codegen.js +14 -6
  143. package/dist/payload-codegen.js.map +1 -1
  144. package/dist/pk-resolver.d.ts.map +1 -1
  145. package/dist/pk-resolver.js +4 -2
  146. package/dist/pk-resolver.js.map +1 -1
  147. package/dist/projection/extract-view-spec.d.ts.map +1 -1
  148. package/dist/projection/extract-view-spec.js +52 -26
  149. package/dist/projection/extract-view-spec.js.map +1 -1
  150. package/dist/relation-resolver.d.ts +16 -0
  151. package/dist/relation-resolver.d.ts.map +1 -1
  152. package/dist/relation-resolver.js +82 -1
  153. package/dist/relation-resolver.js.map +1 -1
  154. package/dist/render-context.d.ts +25 -2
  155. package/dist/render-context.d.ts.map +1 -1
  156. package/dist/render-context.js +7 -0
  157. package/dist/render-context.js.map +1 -1
  158. package/dist/render-engine/embedded-templates.generated.d.ts +2 -0
  159. package/dist/render-engine/embedded-templates.generated.d.ts.map +1 -0
  160. package/dist/render-engine/embedded-templates.generated.js +15 -0
  161. package/dist/render-engine/embedded-templates.generated.js.map +1 -0
  162. package/dist/render-engine/framework-provider.d.ts.map +1 -1
  163. package/dist/render-engine/framework-provider.js +26 -13
  164. package/dist/render-engine/framework-provider.js.map +1 -1
  165. package/dist/runner.d.ts.map +1 -1
  166. package/dist/runner.js +20 -0
  167. package/dist/runner.js.map +1 -1
  168. package/dist/templates/docs-file.d.ts +2 -6
  169. package/dist/templates/docs-file.d.ts.map +1 -1
  170. package/dist/templates/docs-file.js +2 -5
  171. package/dist/templates/docs-file.js.map +1 -1
  172. package/dist/templates/drizzle-schema.d.ts.map +1 -1
  173. package/dist/templates/drizzle-schema.js +72 -23
  174. package/dist/templates/drizzle-schema.js.map +1 -1
  175. package/dist/templates/entity-constants.d.ts +7 -0
  176. package/dist/templates/entity-constants.d.ts.map +1 -1
  177. package/dist/templates/entity-constants.js +3 -3
  178. package/dist/templates/entity-constants.js.map +1 -1
  179. package/dist/templates/entity-file.d.ts.map +1 -1
  180. package/dist/templates/entity-file.js +16 -5
  181. package/dist/templates/entity-file.js.map +1 -1
  182. package/dist/templates/enums-file.d.ts +11 -0
  183. package/dist/templates/enums-file.d.ts.map +1 -0
  184. package/dist/templates/enums-file.js +44 -0
  185. package/dist/templates/enums-file.js.map +1 -0
  186. package/dist/templates/extract-delegate-emitter.d.ts.map +1 -1
  187. package/dist/templates/extract-delegate-emitter.js +6 -8
  188. package/dist/templates/extract-delegate-emitter.js.map +1 -1
  189. package/dist/templates/extractor.d.ts.map +1 -1
  190. package/dist/templates/extractor.js +58 -41
  191. package/dist/templates/extractor.js.map +1 -1
  192. package/dist/templates/field-meta.d.ts.map +1 -1
  193. package/dist/templates/field-meta.js +2 -6
  194. package/dist/templates/field-meta.js.map +1 -1
  195. package/dist/templates/filter-allowlist.d.ts +7 -2
  196. package/dist/templates/filter-allowlist.d.ts.map +1 -1
  197. package/dist/templates/filter-allowlist.js +18 -10
  198. package/dist/templates/filter-allowlist.js.map +1 -1
  199. package/dist/templates/filter-shared.js +2 -2
  200. package/dist/templates/filter-shared.js.map +1 -1
  201. package/dist/templates/filter-type.d.ts +7 -1
  202. package/dist/templates/filter-type.d.ts.map +1 -1
  203. package/dist/templates/filter-type.js +10 -6
  204. package/dist/templates/filter-type.js.map +1 -1
  205. package/dist/templates/find-templates.d.ts +4 -0
  206. package/dist/templates/find-templates.d.ts.map +1 -0
  207. package/dist/templates/find-templates.js +15 -0
  208. package/dist/templates/find-templates.js.map +1 -0
  209. package/dist/templates/fr010-field-mapping.d.ts +2 -0
  210. package/dist/templates/fr010-field-mapping.d.ts.map +1 -1
  211. package/dist/templates/fr010-field-mapping.js +15 -11
  212. package/dist/templates/fr010-field-mapping.js.map +1 -1
  213. package/dist/templates/inferred-types.d.ts +44 -7
  214. package/dist/templates/inferred-types.d.ts.map +1 -1
  215. package/dist/templates/inferred-types.js +121 -19
  216. package/dist/templates/inferred-types.js.map +1 -1
  217. package/dist/templates/mermaid-er.d.ts +35 -2
  218. package/dist/templates/mermaid-er.d.ts.map +1 -1
  219. package/dist/templates/mermaid-er.js +174 -7
  220. package/dist/templates/mermaid-er.js.map +1 -1
  221. package/dist/templates/output-format-spec-emitter.js +1 -1
  222. package/dist/templates/output-format-spec-emitter.js.map +1 -1
  223. package/dist/templates/output-parser.d.ts.map +1 -1
  224. package/dist/templates/output-parser.js +31 -80
  225. package/dist/templates/output-parser.js.map +1 -1
  226. package/dist/templates/output-prompt.d.ts.map +1 -1
  227. package/dist/templates/output-prompt.js +2 -2
  228. package/dist/templates/output-prompt.js.map +1 -1
  229. package/dist/templates/queries-file.d.ts.map +1 -1
  230. package/dist/templates/queries-file.js +113 -5
  231. package/dist/templates/queries-file.js.map +1 -1
  232. package/dist/templates/queries.d.ts +7 -2
  233. package/dist/templates/queries.d.ts.map +1 -1
  234. package/dist/templates/queries.js +15 -15
  235. package/dist/templates/queries.js.map +1 -1
  236. package/dist/templates/relations-block.d.ts.map +1 -1
  237. package/dist/templates/relations-block.js +12 -3
  238. package/dist/templates/relations-block.js.map +1 -1
  239. package/dist/templates/render-helper.d.ts.map +1 -1
  240. package/dist/templates/render-helper.js +5 -5
  241. package/dist/templates/render-helper.js.map +1 -1
  242. package/dist/templates/routes-file-hono.d.ts.map +1 -1
  243. package/dist/templates/routes-file-hono.js +1 -2
  244. package/dist/templates/routes-file-hono.js.map +1 -1
  245. package/dist/templates/routes-file.d.ts.map +1 -1
  246. package/dist/templates/routes-file.js +184 -7
  247. package/dist/templates/routes-file.js.map +1 -1
  248. package/dist/templates/tph-discriminator.d.ts +56 -0
  249. package/dist/templates/tph-discriminator.d.ts.map +1 -0
  250. package/dist/templates/tph-discriminator.js +180 -0
  251. package/dist/templates/tph-discriminator.js.map +1 -0
  252. package/dist/templates/value-object-file.d.ts +2 -1
  253. package/dist/templates/value-object-file.d.ts.map +1 -1
  254. package/dist/templates/value-object-file.js +33 -5
  255. package/dist/templates/value-object-file.js.map +1 -1
  256. package/dist/templates/zod-validators.d.ts +65 -2
  257. package/dist/templates/zod-validators.d.ts.map +1 -1
  258. package/dist/templates/zod-validators.js +202 -22
  259. package/dist/templates/zod-validators.js.map +1 -1
  260. package/package.json +103 -34
  261. package/src/column-mapper.ts +79 -32
  262. package/src/constants.ts +18 -0
  263. package/src/docs-paths.ts +128 -0
  264. package/src/enum-import.ts +43 -0
  265. package/src/enum-shared.ts +95 -0
  266. package/src/generator-registry.ts +204 -0
  267. package/src/generator.ts +6 -0
  268. package/src/generators/api-doc-render.ts +572 -0
  269. package/src/generators/api-docs-file.ts +146 -0
  270. package/src/generators/api-field-shape.ts +114 -0
  271. package/src/generators/api-label.ts +7 -0
  272. package/src/generators/api-model.ts +1067 -0
  273. package/src/generators/docs-data-builder.ts +483 -189
  274. package/src/generators/docs-data.ts +139 -28
  275. package/src/generators/docs-file.ts +205 -39
  276. package/src/generators/entity-file.ts +31 -15
  277. package/src/generators/extractor-file.ts +2 -1
  278. package/src/generators/field-anchor.ts +24 -0
  279. package/src/generators/index.ts +8 -1
  280. package/src/generators/mermaid-er.ts +14 -0
  281. package/src/generators/output-parser-file.ts +3 -4
  282. package/src/generators/output-prompt-file.ts +2 -1
  283. package/src/generators/prompt-render-file.ts +3 -4
  284. package/src/generators/queries-file.ts +9 -3
  285. package/src/generators/render-helper-file.ts +2 -1
  286. package/src/generators/routes-file-hono.ts +5 -1
  287. package/src/generators/routes-file.ts +7 -1
  288. package/src/generators/template-doc-builder.ts +306 -0
  289. package/src/generators/template-doc-data.ts +85 -0
  290. package/src/generators/template-payload-tree.ts +71 -0
  291. package/src/generators/template-source-annotate.ts +290 -0
  292. package/src/generators/template-source-render.ts +203 -0
  293. package/src/generators/trace-helper-file.ts +301 -0
  294. package/src/import-path.ts +28 -0
  295. package/src/index.ts +55 -4
  296. package/src/metaobjects-config.ts +146 -2
  297. package/src/naming.ts +73 -3
  298. package/src/payload-codegen.ts +16 -5
  299. package/src/pk-resolver.ts +4 -2
  300. package/src/projection/extract-view-spec.ts +50 -31
  301. package/src/relation-resolver.ts +103 -1
  302. package/src/render-context.ts +32 -2
  303. package/src/render-engine/embedded-templates.generated.ts +14 -0
  304. package/src/render-engine/framework-provider.ts +25 -11
  305. package/src/runner.ts +24 -0
  306. package/src/templates/docs-file.ts +2 -9
  307. package/src/templates/drizzle-schema.ts +80 -28
  308. package/src/templates/entity-constants.ts +3 -3
  309. package/src/templates/entity-file.ts +16 -5
  310. package/src/templates/enums-file.ts +50 -0
  311. package/src/templates/extract-delegate-emitter.ts +6 -7
  312. package/src/templates/extractor.ts +70 -40
  313. package/src/templates/field-meta.ts +1 -7
  314. package/src/templates/filter-allowlist.ts +18 -11
  315. package/src/templates/filter-shared.ts +2 -2
  316. package/src/templates/filter-type.ts +9 -7
  317. package/src/templates/find-templates.ts +15 -0
  318. package/src/templates/fr010-field-mapping.ts +15 -13
  319. package/src/templates/inferred-types.ts +122 -21
  320. package/src/templates/mermaid-er.ts +176 -8
  321. package/src/templates/output-format-spec-emitter.ts +1 -1
  322. package/src/templates/output-parser.ts +31 -80
  323. package/src/templates/output-prompt.ts +2 -1
  324. package/src/templates/queries-file.ts +133 -4
  325. package/src/templates/queries.ts +21 -15
  326. package/src/templates/relations-block.ts +19 -3
  327. package/src/templates/render-helper.ts +5 -4
  328. package/src/templates/routes-file-hono.ts +1 -2
  329. package/src/templates/routes-file.ts +234 -7
  330. package/src/templates/tph-discriminator.ts +232 -0
  331. package/src/templates/value-object-file.ts +39 -5
  332. package/src/templates/zod-validators.ts +225 -21
  333. package/templates/api/agent-api.md.mustache +30 -0
  334. package/templates/api/entity-api.md.mustache +69 -0
  335. package/templates/api/index.md.mustache +21 -0
  336. package/templates/docs/entity-page.md.mustache +33 -21
  337. package/templates/docs/template-page.md.mustache +56 -0
  338. package/dist/templates/extract-schema-emitter.d.ts +0 -8
  339. package/dist/templates/extract-schema-emitter.d.ts.map +0 -1
  340. package/dist/templates/extract-schema-emitter.js +0 -81
  341. package/dist/templates/extract-schema-emitter.js.map +0 -1
  342. package/src/templates/extract-schema-emitter.ts +0 -111
@@ -0,0 +1,69 @@
1
+ {{{generatedMarker}}}
2
+
3
+ # {{node}} API
4
+ {{#modelPageHref}}
5
+
6
+ **Model / metadata:** [{{node}}]({{modelPageHref}})
7
+ {{/modelPageHref}}
8
+
9
+ > Import paths are relative to your generated-output directory.
10
+ {{#hasSetup}}
11
+
12
+ ## Setup
13
+
14
+ Obtain the runtime handles the calls below need:
15
+ {{#setup}}
16
+
17
+ - `{{handle}}` — {{{note}}}
18
+
19
+ ```ts
20
+ {{{snippet}}}
21
+ ```
22
+ {{/setup}}
23
+ {{/hasSetup}}
24
+ {{#unitExample}}
25
+
26
+ ## Example
27
+
28
+ ```ts
29
+ {{{unitExample}}}
30
+ ```
31
+ {{/unitExample}}
32
+ {{#sections}}
33
+
34
+ ## {{heading}}
35
+ {{#symbols}}
36
+
37
+ ### `{{signature}}`
38
+
39
+ {{usage}}
40
+
41
+ ```ts
42
+ {{importLine}}
43
+ ```
44
+ {{#hasFields}}
45
+
46
+ {{fieldsCaption}}:
47
+
48
+ | Field | Type | Required | Notes |
49
+ |---|---|---|---|
50
+ {{#fieldRows}}
51
+ | `{{field}}` | `{{{type}}}` | {{required}} | {{notes}} |
52
+ {{/fieldRows}}
53
+ {{/hasFields}}
54
+ {{#mountNote}}
55
+
56
+ Mount: {{{mountNote}}}
57
+ {{/mountNote}}
58
+ {{#throws}}
59
+
60
+ Throws: {{throws}}
61
+ {{/throws}}
62
+ {{#example}}
63
+
64
+ ```ts
65
+ {{{example}}}
66
+ ```
67
+ {{/example}}
68
+ {{/symbols}}
69
+ {{/sections}}
@@ -0,0 +1,21 @@
1
+ {{{generatedMarker}}}
2
+
3
+ # {{title}}
4
+
5
+ {{intro}}
6
+ {{#hasEntities}}
7
+
8
+ ## Entities
9
+
10
+ {{#entities}}
11
+ - [{{node}}]({{href}}) — {{summary}} ({{symbolCount}} symbol{{^one}}s{{/one}})
12
+ {{/entities}}
13
+ {{/hasEntities}}
14
+ {{#hasTemplates}}
15
+
16
+ ## Templates
17
+
18
+ {{#templates}}
19
+ - [{{node}}]({{href}}) — {{summary}} ({{symbolCount}} symbol{{^one}}s{{/one}})
20
+ {{/templates}}
21
+ {{/hasTemplates}}
@@ -1,21 +1,20 @@
1
1
  {{{generatedMarker}}}
2
2
 
3
3
  # {{entity.name}}
4
+ {{#summaryLead}}
5
+
6
+ {{{.}}}
7
+ {{/summaryLead}}
4
8
  {{#descriptionQuote}}
5
9
 
6
10
  {{{.}}}
7
11
  {{/descriptionQuote}}
12
+ {{#apiRefs.0}}
8
13
 
9
- {{{preambleHeader}}}
10
- {{#hasStorage}}
11
-
12
- ## Storage
14
+ **API reference:** {{/apiRefs.0}}{{#apiRefs}}[{{label}}]({{href}}){{^last}} · {{/last}}{{/apiRefs}}{{#apiRefs.0}}
15
+ {{/apiRefs.0}}
13
16
 
14
- {{{storage.tableHeader}}}
15
- {{#storage.rows}}
16
- {{{rowLine}}}
17
- {{/storage.rows}}
18
- {{/hasStorage}}
17
+ {{{preambleHeader}}}
19
18
  {{#hasIdentities}}
20
19
 
21
20
  ## Identity
@@ -24,6 +23,31 @@
24
23
  - {{{bullet}}}
25
24
  {{/identities}}
26
25
  {{/hasIdentities}}
26
+ {{#hasNeighborhoodEr}}
27
+
28
+ ## In context
29
+
30
+ {{{neighborhoodErBlock}}}
31
+ {{/hasNeighborhoodEr}}
32
+ {{#fields.hasFields}}
33
+
34
+ ## Fields
35
+
36
+ | Field | Type | Required | Column | Rules |
37
+ |---|---|---|---|---|
38
+ {{#fields.rows}}
39
+ | {{{fieldCell}}} | {{{typeCell}}} | {{requiredCell}} | {{{storageCell}}} | {{{rulesCell}}} |
40
+ {{/fields.rows}}
41
+ {{/fields.hasFields}}
42
+ {{#fieldDetails.hasDetails}}
43
+
44
+ ## Field details
45
+
46
+ {{#fieldDetails.rows}}
47
+ {{{block}}}
48
+
49
+ {{/fieldDetails.rows}}
50
+ {{/fieldDetails.hasDetails}}
27
51
  {{#hasRelationships}}
28
52
 
29
53
  ## Relationships
@@ -32,12 +56,6 @@
32
56
  - {{{bullet}}}
33
57
  {{/relationships}}
34
58
  {{/hasRelationships}}
35
-
36
- ## Validation
37
-
38
- - `{{validation.insertSchema}}` (Zod) — for creating new {{validation.lower}}s.
39
- - `{{validation.updateSchema}}` (Zod) — for partial updates.
40
- - See `{{validation.entityFile}}` for the exported schemas.
41
59
  {{#hasUsedBy}}
42
60
 
43
61
  ## Used by
@@ -46,9 +64,3 @@
46
64
  - {{{bullet}}}
47
65
  {{/usedBy}}
48
66
  {{/hasUsedBy}}
49
-
50
- ## Generated code
51
-
52
- {{#generated}}
53
- - `{{filename}}` — {{{description}}}
54
- {{/generated}}
@@ -0,0 +1,56 @@
1
+ {{{generatedMarker}}}
2
+
3
+ # {{name}}
4
+ {{#descriptionQuote}}
5
+
6
+ {{{.}}}
7
+ {{/descriptionQuote}}
8
+
9
+ **Kind:** {{kind}}
10
+
11
+ ## Output
12
+ {{^isEmail}}
13
+
14
+ - Format: `{{format}}`
15
+ {{/isEmail}}
16
+ {{#isEmail}}
17
+
18
+ Multipart email — rendered as the following parts:
19
+
20
+ | Part | Source | Format | Escaping |
21
+ |---|---|---|---|
22
+ {{#parts}}
23
+ | {{label}} | `{{ref}}` | `{{format}}` | {{#escaped}}escaped{{/escaped}}{{^escaped}}raw{{/escaped}} |
24
+ {{/parts}}
25
+ {{/isEmail}}
26
+
27
+ ## Input
28
+
29
+ - Payload: [`{{payload.name}}`]({{payload.link}})
30
+ {{#hasRequiredTags}}
31
+ - Required fields:{{#requiredTags}} `{{.}}`{{/requiredTags}}
32
+ {{/hasRequiredTags}}
33
+
34
+ ## Render contract
35
+
36
+ - Every field referenced by the template is validated against the payload at generation time; an unknown field fails generation.
37
+ {{#maxChars}}
38
+ - Maximum length: {{.}} characters (rendering longer output fails).
39
+ {{/maxChars}}
40
+ {{#hasRequiredTags}}
41
+ - Required tags must be present:{{#requiredTags}} `{{.}}`{{/requiredTags}}
42
+ {{/hasRequiredTags}}
43
+
44
+ ## Source
45
+
46
+ {{#sourceRefs}}
47
+ - `{{.}}`
48
+ {{/sourceRefs}}
49
+ {{#templateSourceSection}}
50
+
51
+ {{{.}}}
52
+ {{/templateSourceSection}}
53
+
54
+ ## Capability
55
+
56
+ {{capability}}
@@ -1,8 +0,0 @@
1
- import { type MetaData } from "@metaobjectsdev/metadata";
2
- /** Emit `extractSchema(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=extract-schema-emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-schema-emitter.d.ts","sourceRoot":"","sources":["../../src/templates/extract-schema-emitter.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,0BAA0B,CAAC;AAkBlC,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIpF;AA+CD,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAc3E;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAGtD"}
@@ -1,81 +0,0 @@
1
- // server/typescript/packages/codegen-ts/src/templates/extract-schema-emitter.ts
2
- //
3
- // Turns a payload value-object into TS source fragments for the FR-010 extract codegen:
4
- // • schemaLiteral — a `extractSchema(Format.JSON, "root", [ … ])` baked descriptor
5
- // built from FieldSpec factories (scalar / enumField).
6
- // • mirrorInterface — an all-nullable mirror interface `<Payload>Extracted` (each
7
- // component `T | null`); extract returns this nullable twin rather
8
- // than the strict payload (same reasoning as the Java/C#/Kotlin ports).
9
- // • mirrorInitializer — `{ prop: asString(d, "prop"), … }` building the mirror from the
10
- // forgiving outcome map `d`.
11
- //
12
- // Mirrors the C# ExtractSchemaEmitter (adapted to TS syntax + the `| null` nullable mirror).
13
- // Bounded scope: scalar / enum / scalar-array. Nested object + array-of-enum deferred.
14
- import { FIELD_SUBTYPE_ENUM, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_ENUM_ALIAS, } from "@metaobjectsdev/metadata";
15
- import { fields, isRequired, isArray, scalarKind, mirrorType, extractMapCall, enumValues, coerceDefault, defaultValue, resolveNormalize, jsonStringLiteral, stringArrayLiteral, propertiesMapLiteral, } from "./fr010-field-mapping.js";
16
- import { NORMALIZE_DEFAULT } from "@metaobjectsdev/metadata";
17
- /** Emit `extractSchema(Format.X, "rootName", [ … ])`. */
18
- export function schemaLiteral(vo, format, rootName) {
19
- const formatEnum = format.toLowerCase() === "xml" ? "Format.XML" : "Format.JSON";
20
- const specs = fields(vo).map((f) => fieldSpecLiteral(f, vo));
21
- return `extractSchema(${formatEnum}, ${jsonStringLiteral(rootName)}, [${specs.join(", ")}])`;
22
- }
23
- function fieldSpecLiteral(field, owner) {
24
- const name = jsonStringLiteral(field.name);
25
- const required = isRequired(field);
26
- if (field.subType === FIELD_SUBTYPE_ENUM) {
27
- const valuesLit = stringArrayLiteral(enumValues(field));
28
- const aliasLit = propertiesMapLiteral(field.ownAttr(FIELD_ATTR_ENUM_ALIAS));
29
- // FR-011: extended enumField signature is (name, required, values, aliases,
30
- // coerceDefault?, normalize="strip", defaultValue?). Resolve the three new args
31
- // (field → object → "strip" for normalize) and emit only what's needed: keep the
32
- // back-compat 4-arg form when nothing is set, else emit the positional tail up to
33
- // the last meaningful arg.
34
- const cd = coerceDefault(field);
35
- const dv = defaultValue(field);
36
- const normalize = resolveNormalize(field, owner);
37
- // enumField() sets array:false; enum-array is a bounded deferral (parity with Java/C#).
38
- if (cd == null && dv == null && normalize === NORMALIZE_DEFAULT) {
39
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit})`;
40
- }
41
- const cdLit = cd == null ? "null" : jsonStringLiteral(cd);
42
- const normLit = jsonStringLiteral(normalize);
43
- if (dv == null) {
44
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit}, ${cdLit}, ${normLit})`;
45
- }
46
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit}, ${cdLit}, ${normLit}, ${jsonStringLiteral(dv)})`;
47
- }
48
- if (field.subType === FIELD_SUBTYPE_OBJECT) {
49
- // FR-010: nested extract deferred — treat as an opaque required/optional string slot.
50
- return `scalar(${name}, FieldKind.STRING, ${required}) /* FR-010: nested extract deferred */`;
51
- }
52
- const kind = scalarKind(field.subType) ?? "STRING";
53
- // Scalar-array: the scalar() factory only builds singular specs (array:false), so emit a
54
- // FieldSpec object literal with array:true. Tier-2 win over the Roslyn proof: the emitted
55
- // extract() actually populates the array at runtime (ExtractMap.asStringList).
56
- if (isArray(field)) {
57
- return (`{ name: ${name}, kind: FieldKind.${kind}, required: ${required}, array: true, ` +
58
- `enumValues: null, enumAlias: null, min: null, max: null, nested: null }`);
59
- }
60
- return `scalar(${name}, FieldKind.${kind}, ${required})`;
61
- }
62
- /** Emit the all-nullable mirror interface declaration. */
63
- export function mirrorInterface(vo, interfaceName) {
64
- const base = interfaceName.endsWith("Extracted")
65
- ? interfaceName.slice(0, -"Extracted".length)
66
- : interfaceName;
67
- const lines = [];
68
- lines.push(`/** Best-effort extracted twin of \`${base}\` — every field nullable (null where lost/malformed). */`);
69
- lines.push(`export interface ${interfaceName} {`);
70
- for (const f of fields(vo)) {
71
- lines.push(` ${f.name}: ${mirrorType(f)};`);
72
- }
73
- lines.push("}");
74
- return lines.join("\n");
75
- }
76
- /** Emit `{ prop: asString(d, "prop"), … }` building the mirror from the forgiving map `d`. */
77
- export function mirrorInitializer(vo) {
78
- const assigns = fields(vo).map((f) => `${f.name}: ${extractMapCall(f)}`);
79
- return `{ ${assigns.join(", ")} }`;
80
- }
81
- //# sourceMappingURL=extract-schema-emitter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-schema-emitter.js","sourceRoot":"","sources":["../../src/templates/extract-schema-emitter.ts"],"names":[],"mappings":"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"}
@@ -1,111 +0,0 @@
1
- // server/typescript/packages/codegen-ts/src/templates/extract-schema-emitter.ts
2
- //
3
- // Turns a payload value-object into TS source fragments for the FR-010 extract codegen:
4
- // • schemaLiteral — a `extractSchema(Format.JSON, "root", [ … ])` baked descriptor
5
- // built from FieldSpec factories (scalar / enumField).
6
- // • mirrorInterface — an all-nullable mirror interface `<Payload>Extracted` (each
7
- // component `T | null`); extract returns this nullable twin rather
8
- // than the strict payload (same reasoning as the Java/C#/Kotlin ports).
9
- // • mirrorInitializer — `{ prop: asString(d, "prop"), … }` building the mirror from the
10
- // forgiving outcome map `d`.
11
- //
12
- // Mirrors the C# ExtractSchemaEmitter (adapted to TS syntax + the `| null` nullable mirror).
13
- // Bounded scope: scalar / enum / scalar-array. Nested object + array-of-enum deferred.
14
-
15
- import {
16
- type MetaData,
17
- FIELD_SUBTYPE_ENUM,
18
- FIELD_SUBTYPE_OBJECT,
19
- FIELD_ATTR_ENUM_ALIAS,
20
- } from "@metaobjectsdev/metadata";
21
- import {
22
- fields,
23
- isRequired,
24
- isArray,
25
- scalarKind,
26
- mirrorType,
27
- extractMapCall,
28
- enumValues,
29
- coerceDefault,
30
- defaultValue,
31
- resolveNormalize,
32
- jsonStringLiteral,
33
- stringArrayLiteral,
34
- propertiesMapLiteral,
35
- } from "./fr010-field-mapping.js";
36
- import { NORMALIZE_DEFAULT } from "@metaobjectsdev/metadata";
37
-
38
- /** Emit `extractSchema(Format.X, "rootName", [ … ])`. */
39
- export function schemaLiteral(vo: MetaData, format: string, rootName: string): string {
40
- const formatEnum = format.toLowerCase() === "xml" ? "Format.XML" : "Format.JSON";
41
- const specs = fields(vo).map((f) => fieldSpecLiteral(f, vo));
42
- return `extractSchema(${formatEnum}, ${jsonStringLiteral(rootName)}, [${specs.join(", ")}])`;
43
- }
44
-
45
- function fieldSpecLiteral(field: MetaData, owner: MetaData): string {
46
- const name = jsonStringLiteral(field.name);
47
- const required = isRequired(field);
48
-
49
- if (field.subType === FIELD_SUBTYPE_ENUM) {
50
- const valuesLit = stringArrayLiteral(enumValues(field));
51
- const aliasLit = propertiesMapLiteral(field.ownAttr(FIELD_ATTR_ENUM_ALIAS));
52
- // FR-011: extended enumField signature is (name, required, values, aliases,
53
- // coerceDefault?, normalize="strip", defaultValue?). Resolve the three new args
54
- // (field → object → "strip" for normalize) and emit only what's needed: keep the
55
- // back-compat 4-arg form when nothing is set, else emit the positional tail up to
56
- // the last meaningful arg.
57
- const cd = coerceDefault(field);
58
- const dv = defaultValue(field);
59
- const normalize = resolveNormalize(field, owner);
60
- // enumField() sets array:false; enum-array is a bounded deferral (parity with Java/C#).
61
- if (cd == null && dv == null && normalize === NORMALIZE_DEFAULT) {
62
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit})`;
63
- }
64
- const cdLit = cd == null ? "null" : jsonStringLiteral(cd);
65
- const normLit = jsonStringLiteral(normalize);
66
- if (dv == null) {
67
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit}, ${cdLit}, ${normLit})`;
68
- }
69
- return `enumField(${name}, ${required}, ${valuesLit}, ${aliasLit}, ${cdLit}, ${normLit}, ${jsonStringLiteral(dv)})`;
70
- }
71
-
72
- if (field.subType === FIELD_SUBTYPE_OBJECT) {
73
- // FR-010: nested extract deferred — treat as an opaque required/optional string slot.
74
- return `scalar(${name}, FieldKind.STRING, ${required}) /* FR-010: nested extract deferred */`;
75
- }
76
-
77
- const kind = scalarKind(field.subType) ?? "STRING";
78
- // Scalar-array: the scalar() factory only builds singular specs (array:false), so emit a
79
- // FieldSpec object literal with array:true. Tier-2 win over the Roslyn proof: the emitted
80
- // extract() actually populates the array at runtime (ExtractMap.asStringList).
81
- if (isArray(field)) {
82
- return (
83
- `{ name: ${name}, kind: FieldKind.${kind}, required: ${required}, array: true, ` +
84
- `enumValues: null, enumAlias: null, min: null, max: null, nested: null }`
85
- );
86
- }
87
- return `scalar(${name}, FieldKind.${kind}, ${required})`;
88
- }
89
-
90
- /** Emit the all-nullable mirror interface declaration. */
91
- export function mirrorInterface(vo: MetaData, interfaceName: string): string {
92
- const base = interfaceName.endsWith("Extracted")
93
- ? interfaceName.slice(0, -"Extracted".length)
94
- : interfaceName;
95
- const lines: string[] = [];
96
- lines.push(
97
- `/** Best-effort extracted twin of \`${base}\` — every field nullable (null where lost/malformed). */`,
98
- );
99
- lines.push(`export interface ${interfaceName} {`);
100
- for (const f of fields(vo)) {
101
- lines.push(` ${f.name}: ${mirrorType(f)};`);
102
- }
103
- lines.push("}");
104
- return lines.join("\n");
105
- }
106
-
107
- /** Emit `{ prop: asString(d, "prop"), … }` building the mirror from the forgiving map `d`. */
108
- export function mirrorInitializer(vo: MetaData): string {
109
- const assigns = fields(vo).map((f) => `${f.name}: ${extractMapCall(f)}`);
110
- return `{ ${assigns.join(", ")} }`;
111
- }