@metaobjectsdev/metadata 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 (392) hide show
  1. package/dist/attr-schema-validate.d.ts +1 -1
  2. package/dist/attr-schema-validate.d.ts.map +1 -1
  3. package/dist/attr-schema-validate.js +96 -11
  4. package/dist/attr-schema-validate.js.map +1 -1
  5. package/dist/constraint-merge.d.ts +18 -0
  6. package/dist/constraint-merge.d.ts.map +1 -0
  7. package/dist/constraint-merge.js +0 -0
  8. package/dist/constraint-merge.js.map +1 -0
  9. package/dist/constraint-validate.d.ts +6 -0
  10. package/dist/constraint-validate.d.ts.map +1 -0
  11. package/dist/constraint-validate.js +274 -0
  12. package/dist/constraint-validate.js.map +1 -0
  13. package/dist/core/attr/attr-constants.d.ts +13 -3
  14. package/dist/core/attr/attr-constants.d.ts.map +1 -1
  15. package/dist/core/attr/attr-constants.js +11 -2
  16. package/dist/core/attr/attr-constants.js.map +1 -1
  17. package/dist/core/attr/attr-definition.embedded.d.ts +3 -0
  18. package/dist/core/attr/attr-definition.embedded.d.ts.map +1 -0
  19. package/dist/core/attr/attr-definition.embedded.js +60 -0
  20. package/dist/core/attr/attr-definition.embedded.js.map +1 -0
  21. package/dist/core/documentation/doc-constants.d.ts +3 -2
  22. package/dist/core/documentation/doc-constants.d.ts.map +1 -1
  23. package/dist/core/documentation/doc-constants.js +3 -1
  24. package/dist/core/documentation/doc-constants.js.map +1 -1
  25. package/dist/core/documentation/doc-provider.d.ts.map +1 -1
  26. package/dist/core/documentation/doc-provider.js +6 -2
  27. package/dist/core/documentation/doc-provider.js.map +1 -1
  28. package/dist/core/documentation/documentation-definition.embedded.d.ts +3 -0
  29. package/dist/core/documentation/documentation-definition.embedded.d.ts.map +1 -0
  30. package/dist/core/documentation/documentation-definition.embedded.js +79 -0
  31. package/dist/core/documentation/documentation-definition.embedded.js.map +1 -0
  32. package/dist/core/field/field-constants.d.ts +7 -4
  33. package/dist/core/field/field-constants.d.ts.map +1 -1
  34. package/dist/core/field/field-constants.js +7 -7
  35. package/dist/core/field/field-constants.js.map +1 -1
  36. package/dist/core/field/field-definition.embedded.d.ts +3 -0
  37. package/dist/core/field/field-definition.embedded.d.ts.map +1 -0
  38. package/dist/core/field/field-definition.embedded.js +236 -0
  39. package/dist/core/field/field-definition.embedded.js.map +1 -0
  40. package/dist/core/field/meta-field.d.ts.map +1 -1
  41. package/dist/core/field/meta-field.js +7 -5
  42. package/dist/core/field/meta-field.js.map +1 -1
  43. package/dist/core/identity/identity-constants.d.ts.map +1 -1
  44. package/dist/core/identity/identity-constants.js +3 -0
  45. package/dist/core/identity/identity-constants.js.map +1 -1
  46. package/dist/core/identity/identity-definition.embedded.d.ts +3 -0
  47. package/dist/core/identity/identity-definition.embedded.d.ts.map +1 -0
  48. package/dist/core/identity/identity-definition.embedded.js +93 -0
  49. package/dist/core/identity/identity-definition.embedded.js.map +1 -0
  50. package/dist/core/identity/meta-identity.d.ts.map +1 -1
  51. package/dist/core/identity/meta-identity.js +8 -1
  52. package/dist/core/identity/meta-identity.js.map +1 -1
  53. package/dist/core/identity/validate-identity-passthrough.d.ts +42 -0
  54. package/dist/core/identity/validate-identity-passthrough.d.ts.map +1 -0
  55. package/dist/core/identity/validate-identity-passthrough.js +158 -0
  56. package/dist/core/identity/validate-identity-passthrough.js.map +1 -0
  57. package/dist/core/object/object-constants.d.ts +2 -1
  58. package/dist/core/object/object-constants.d.ts.map +1 -1
  59. package/dist/core/object/object-constants.js +3 -0
  60. package/dist/core/object/object-constants.js.map +1 -1
  61. package/dist/core/object/object-definition.embedded.d.ts +3 -0
  62. package/dist/core/object/object-definition.embedded.d.ts.map +1 -0
  63. package/dist/core/object/object-definition.embedded.js +110 -0
  64. package/dist/core/object/object-definition.embedded.js.map +1 -0
  65. package/dist/core/object/validate-discriminator.d.ts.map +1 -1
  66. package/dist/core/object/validate-discriminator.js +1 -3
  67. package/dist/core/object/validate-discriminator.js.map +1 -1
  68. package/dist/core/query/query-constants.d.ts.map +1 -1
  69. package/dist/core/query/query-constants.js +5 -3
  70. package/dist/core/query/query-constants.js.map +1 -1
  71. package/dist/core/relationship/derive-m2m-fields.d.ts +26 -0
  72. package/dist/core/relationship/derive-m2m-fields.d.ts.map +1 -0
  73. package/dist/core/relationship/derive-m2m-fields.js +102 -0
  74. package/dist/core/relationship/derive-m2m-fields.js.map +1 -0
  75. package/dist/core/relationship/meta-relationship.d.ts +6 -4
  76. package/dist/core/relationship/meta-relationship.d.ts.map +1 -1
  77. package/dist/core/relationship/meta-relationship.js +12 -8
  78. package/dist/core/relationship/meta-relationship.js.map +1 -1
  79. package/dist/core/relationship/relationship-constants.d.ts +6 -2
  80. package/dist/core/relationship/relationship-constants.d.ts.map +1 -1
  81. package/dist/core/relationship/relationship-constants.js +6 -2
  82. package/dist/core/relationship/relationship-constants.js.map +1 -1
  83. package/dist/core/relationship/relationship-definition.embedded.d.ts +3 -0
  84. package/dist/core/relationship/relationship-definition.embedded.d.ts.map +1 -0
  85. package/dist/core/relationship/relationship-definition.embedded.js +310 -0
  86. package/dist/core/relationship/relationship-definition.embedded.js.map +1 -0
  87. package/dist/core/validator/validator-constants.d.ts +14 -1
  88. package/dist/core/validator/validator-constants.d.ts.map +1 -1
  89. package/dist/core/validator/validator-constants.js +20 -1
  90. package/dist/core/validator/validator-constants.js.map +1 -1
  91. package/dist/core/validator/validator-definition.embedded.d.ts +3 -0
  92. package/dist/core/validator/validator-definition.embedded.d.ts.map +1 -0
  93. package/dist/core/validator/validator-definition.embedded.js +255 -0
  94. package/dist/core/validator/validator-definition.embedded.js.map +1 -0
  95. package/dist/core/yaml-desugar.d.ts.map +1 -1
  96. package/dist/core/yaml-desugar.js +88 -10
  97. package/dist/core/yaml-desugar.js.map +1 -1
  98. package/dist/core-types.d.ts +5 -2
  99. package/dist/core-types.d.ts.map +1 -1
  100. package/dist/core-types.js +285 -116
  101. package/dist/core-types.js.map +1 -1
  102. package/dist/errors.d.ts +3 -3
  103. package/dist/errors.d.ts.map +1 -1
  104. package/dist/errors.js +87 -0
  105. package/dist/errors.js.map +1 -1
  106. package/dist/index.d.ts +17 -2
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +26 -1
  109. package/dist/index.js.map +1 -1
  110. package/dist/library/embedded-library.generated.d.ts +2 -0
  111. package/dist/library/embedded-library.generated.d.ts.map +1 -0
  112. package/dist/library/embedded-library.generated.js +11 -0
  113. package/dist/library/embedded-library.generated.js.map +1 -0
  114. package/dist/library/library-sources.d.ts +12 -0
  115. package/dist/library/library-sources.d.ts.map +1 -0
  116. package/dist/library/library-sources.js +88 -0
  117. package/dist/library/library-sources.js.map +1 -0
  118. package/dist/loader/meta-data-loader.d.ts +10 -2
  119. package/dist/loader/meta-data-loader.d.ts.map +1 -1
  120. package/dist/loader/meta-data-loader.js +57 -6
  121. package/dist/loader/meta-data-loader.js.map +1 -1
  122. package/dist/loader/shortcuts.d.ts +2 -5
  123. package/dist/loader/shortcuts.d.ts.map +1 -1
  124. package/dist/loader/shortcuts.js.map +1 -1
  125. package/dist/loader/validation-passes.d.ts +3 -0
  126. package/dist/loader/validation-passes.d.ts.map +1 -1
  127. package/dist/loader/validation-passes.js +519 -34
  128. package/dist/loader/validation-passes.js.map +1 -1
  129. package/dist/loader/validation-registry.d.ts +10 -0
  130. package/dist/loader/validation-registry.d.ts.map +1 -0
  131. package/dist/loader/validation-registry.js +84 -0
  132. package/dist/loader/validation-registry.js.map +1 -0
  133. package/dist/metamodel-docs/index.d.ts +19 -0
  134. package/dist/metamodel-docs/index.d.ts.map +1 -0
  135. package/dist/metamodel-docs/index.js +37 -0
  136. package/dist/metamodel-docs/index.js.map +1 -0
  137. package/dist/metamodel-docs/provenance.d.ts +42 -0
  138. package/dist/metamodel-docs/provenance.d.ts.map +1 -0
  139. package/dist/metamodel-docs/provenance.js +148 -0
  140. package/dist/metamodel-docs/provenance.js.map +1 -0
  141. package/dist/metamodel-docs/provider-definitions.d.ts +8 -0
  142. package/dist/metamodel-docs/provider-definitions.d.ts.map +1 -0
  143. package/dist/metamodel-docs/provider-definitions.js +48 -0
  144. package/dist/metamodel-docs/provider-definitions.js.map +1 -0
  145. package/dist/metamodel-docs/render.d.ts +12 -0
  146. package/dist/metamodel-docs/render.d.ts.map +1 -0
  147. package/dist/metamodel-docs/render.js +252 -0
  148. package/dist/metamodel-docs/render.js.map +1 -0
  149. package/dist/naming-refs.d.ts +41 -0
  150. package/dist/naming-refs.d.ts.map +1 -0
  151. package/dist/naming-refs.js +144 -0
  152. package/dist/naming-refs.js.map +1 -0
  153. package/dist/naming.d.ts.map +1 -1
  154. package/dist/naming.js +10 -2
  155. package/dist/naming.js.map +1 -1
  156. package/dist/parser-core.d.ts.map +1 -1
  157. package/dist/parser-core.js +84 -9
  158. package/dist/parser-core.js.map +1 -1
  159. package/dist/persistence/db/db-constants.d.ts +10 -0
  160. package/dist/persistence/db/db-constants.d.ts.map +1 -1
  161. package/dist/persistence/db/db-constants.js +14 -0
  162. package/dist/persistence/db/db-constants.js.map +1 -1
  163. package/dist/persistence/db/db-definition.embedded.d.ts +3 -0
  164. package/dist/persistence/db/db-definition.embedded.d.ts.map +1 -0
  165. package/dist/persistence/db/db-definition.embedded.js +227 -0
  166. package/dist/persistence/db/db-definition.embedded.js.map +1 -0
  167. package/dist/persistence/db/db-provider.d.ts.map +1 -1
  168. package/dist/persistence/db/db-provider.js +13 -18
  169. package/dist/persistence/db/db-provider.js.map +1 -1
  170. package/dist/persistence/origin/origin-definition.embedded.d.ts +3 -0
  171. package/dist/persistence/origin/origin-definition.embedded.d.ts.map +1 -0
  172. package/dist/persistence/origin/origin-definition.embedded.js +88 -0
  173. package/dist/persistence/origin/origin-definition.embedded.js.map +1 -0
  174. package/dist/persistence/source/source-definition.embedded.d.ts +3 -0
  175. package/dist/persistence/source/source-definition.embedded.d.ts.map +1 -0
  176. package/dist/persistence/source/source-definition.embedded.js +17 -0
  177. package/dist/persistence/source/source-definition.embedded.js.map +1 -0
  178. package/dist/persistence/source/validate-source-parameter-ref.d.ts.map +1 -1
  179. package/dist/persistence/source/validate-source-parameter-ref.js +7 -1
  180. package/dist/persistence/source/validate-source-parameter-ref.js.map +1 -1
  181. package/dist/persistence/source/validate-source-roles.d.ts.map +1 -1
  182. package/dist/persistence/source/validate-source-roles.js +16 -1
  183. package/dist/persistence/source/validate-source-roles.js.map +1 -1
  184. package/dist/presentation/layout/layout-definition.embedded.d.ts +3 -0
  185. package/dist/presentation/layout/layout-definition.embedded.d.ts.map +1 -0
  186. package/dist/presentation/layout/layout-definition.embedded.js +16 -0
  187. package/dist/presentation/layout/layout-definition.embedded.js.map +1 -0
  188. package/dist/presentation/ui/ui-definition.embedded.d.ts +3 -0
  189. package/dist/presentation/ui/ui-definition.embedded.d.ts.map +1 -0
  190. package/dist/presentation/ui/ui-definition.embedded.js +114 -0
  191. package/dist/presentation/ui/ui-definition.embedded.js.map +1 -0
  192. package/dist/presentation/ui/ui-provider.d.ts +3 -0
  193. package/dist/presentation/ui/ui-provider.d.ts.map +1 -0
  194. package/dist/presentation/ui/ui-provider.js +21 -0
  195. package/dist/presentation/ui/ui-provider.js.map +1 -0
  196. package/dist/presentation/view/view-definition.embedded.d.ts +3 -0
  197. package/dist/presentation/view/view-definition.embedded.d.ts.map +1 -0
  198. package/dist/presentation/view/view-definition.embedded.js +76 -0
  199. package/dist/presentation/view/view-definition.embedded.js.map +1 -0
  200. package/dist/provider-data.d.ts +184 -0
  201. package/dist/provider-data.d.ts.map +1 -0
  202. package/dist/provider-data.js +271 -0
  203. package/dist/provider-data.js.map +1 -0
  204. package/dist/provider.d.ts +3 -1
  205. package/dist/provider.d.ts.map +1 -1
  206. package/dist/provider.js +15 -1
  207. package/dist/provider.js.map +1 -1
  208. package/dist/registry-coverage.d.ts +99 -0
  209. package/dist/registry-coverage.d.ts.map +1 -0
  210. package/dist/registry-coverage.js +294 -0
  211. package/dist/registry-coverage.js.map +1 -0
  212. package/dist/registry-manifest-exclusions.d.ts +62 -0
  213. package/dist/registry-manifest-exclusions.d.ts.map +1 -0
  214. package/dist/registry-manifest-exclusions.js +163 -0
  215. package/dist/registry-manifest-exclusions.js.map +1 -0
  216. package/dist/registry-manifest.d.ts +117 -0
  217. package/dist/registry-manifest.d.ts.map +1 -0
  218. package/dist/registry-manifest.js +242 -0
  219. package/dist/registry-manifest.js.map +1 -0
  220. package/dist/registry.d.ts +76 -2
  221. package/dist/registry.d.ts.map +1 -1
  222. package/dist/registry.js +37 -1
  223. package/dist/registry.js.map +1 -1
  224. package/dist/shared/structural.d.ts +7 -0
  225. package/dist/shared/structural.d.ts.map +1 -1
  226. package/dist/shared/structural.js +7 -0
  227. package/dist/shared/structural.js.map +1 -1
  228. package/dist/subtype-rules.d.ts.map +1 -1
  229. package/dist/subtype-rules.js +97 -13
  230. package/dist/subtype-rules.js.map +1 -1
  231. package/dist/super-resolve.d.ts +49 -2
  232. package/dist/super-resolve.d.ts.map +1 -1
  233. package/dist/super-resolve.js +128 -43
  234. package/dist/super-resolve.js.map +1 -1
  235. package/dist/template/meta-template.d.ts +3 -2
  236. package/dist/template/meta-template.d.ts.map +1 -1
  237. package/dist/template/meta-template.js +3 -2
  238. package/dist/template/meta-template.js.map +1 -1
  239. package/dist/template/prompt-definition.embedded.d.ts +3 -0
  240. package/dist/template/prompt-definition.embedded.d.ts.map +1 -0
  241. package/dist/template/prompt-definition.embedded.js +368 -0
  242. package/dist/template/prompt-definition.embedded.js.map +1 -0
  243. package/dist/template/prompt-provider.d.ts +3 -0
  244. package/dist/template/prompt-provider.d.ts.map +1 -0
  245. package/dist/template/prompt-provider.js +25 -0
  246. package/dist/template/prompt-provider.js.map +1 -0
  247. package/dist/template/template-constants.d.ts +2 -0
  248. package/dist/template/template-constants.d.ts.map +1 -1
  249. package/dist/template/template-constants.js +7 -0
  250. package/dist/template/template-constants.js.map +1 -1
  251. package/dist/template/template-definition.embedded.d.ts +3 -0
  252. package/dist/template/template-definition.embedded.d.ts.map +1 -0
  253. package/dist/template/template-definition.embedded.js +30 -0
  254. package/dist/template/template-definition.embedded.js.map +1 -0
  255. package/dist/validate-max-occurs.d.ts +5 -0
  256. package/dist/validate-max-occurs.d.ts.map +1 -0
  257. package/dist/validate-max-occurs.js +28 -0
  258. package/dist/validate-max-occurs.js.map +1 -0
  259. package/dist/validation-types.d.ts +36 -0
  260. package/dist/validation-types.d.ts.map +1 -0
  261. package/dist/validation-types.js +7 -0
  262. package/dist/validation-types.js.map +1 -0
  263. package/package.json +33 -22
  264. package/src/attr-schema-validate.ts +108 -8
  265. package/src/constraint-merge.ts +0 -0
  266. package/src/constraint-validate.ts +363 -0
  267. package/src/core/attr/attr-constants.ts +15 -3
  268. package/src/core/attr/attr-definition.embedded.ts +67 -0
  269. package/src/core/documentation/doc-constants.ts +3 -1
  270. package/src/core/documentation/doc-provider.ts +6 -2
  271. package/src/core/documentation/documentation-definition.embedded.ts +86 -0
  272. package/src/core/field/field-constants.ts +8 -7
  273. package/src/core/field/field-definition.embedded.ts +243 -0
  274. package/src/core/field/meta-field.ts +6 -7
  275. package/src/core/identity/identity-constants.ts +4 -0
  276. package/src/core/identity/identity-definition.embedded.ts +100 -0
  277. package/src/core/identity/meta-identity.ts +8 -1
  278. package/src/core/identity/validate-identity-passthrough.ts +194 -0
  279. package/src/core/object/object-constants.ts +3 -0
  280. package/src/core/object/object-definition.embedded.ts +117 -0
  281. package/src/core/object/validate-discriminator.ts +0 -4
  282. package/src/core/query/query-constants.ts +5 -3
  283. package/src/core/relationship/derive-m2m-fields.ts +145 -0
  284. package/src/core/relationship/meta-relationship.ts +15 -9
  285. package/src/core/relationship/relationship-constants.ts +6 -2
  286. package/src/core/relationship/relationship-definition.embedded.ts +317 -0
  287. package/src/core/validator/validator-constants.ts +22 -1
  288. package/src/core/validator/validator-definition.embedded.ts +262 -0
  289. package/src/core/yaml-desugar.ts +96 -7
  290. package/src/core-types.ts +314 -150
  291. package/src/errors.ts +89 -2
  292. package/src/index.ts +47 -2
  293. package/src/library/embedded-library.generated.ts +10 -0
  294. package/src/library/library-sources.ts +97 -0
  295. package/src/loader/meta-data-loader.ts +78 -7
  296. package/src/loader/shortcuts.ts +2 -2
  297. package/src/loader/validation-passes.ts +690 -34
  298. package/src/loader/validation-registry.ts +93 -0
  299. package/src/metamodel-docs/index.ts +41 -0
  300. package/src/metamodel-docs/provenance.ts +187 -0
  301. package/src/metamodel-docs/provider-definitions.ts +50 -0
  302. package/src/metamodel-docs/render.ts +309 -0
  303. package/src/naming-refs.ts +162 -0
  304. package/src/naming.ts +10 -2
  305. package/src/parser-core.ts +96 -9
  306. package/src/persistence/db/db-constants.ts +16 -0
  307. package/src/persistence/db/db-definition.embedded.ts +234 -0
  308. package/src/persistence/db/db-provider.ts +13 -18
  309. package/src/persistence/origin/origin-definition.embedded.ts +95 -0
  310. package/src/persistence/source/source-definition.embedded.ts +24 -0
  311. package/src/persistence/source/validate-source-parameter-ref.ts +7 -1
  312. package/src/persistence/source/validate-source-roles.ts +22 -1
  313. package/src/presentation/layout/layout-definition.embedded.ts +23 -0
  314. package/src/presentation/ui/ui-definition.embedded.ts +121 -0
  315. package/src/presentation/ui/ui-provider.ts +25 -0
  316. package/src/presentation/view/view-definition.embedded.ts +83 -0
  317. package/src/provider-data.ts +463 -0
  318. package/src/provider.ts +18 -0
  319. package/src/registry-coverage.ts +430 -0
  320. package/src/registry-manifest-exclusions.ts +176 -0
  321. package/src/registry-manifest.ts +334 -0
  322. package/src/registry.ts +106 -3
  323. package/src/shared/structural.ts +8 -0
  324. package/src/subtype-rules.ts +135 -18
  325. package/src/super-resolve.ts +153 -43
  326. package/src/template/meta-template.ts +3 -2
  327. package/src/template/prompt-definition.embedded.ts +375 -0
  328. package/src/template/prompt-provider.ts +29 -0
  329. package/src/template/template-constants.ts +8 -0
  330. package/src/template/template-definition.embedded.ts +37 -0
  331. package/src/validate-max-occurs.ts +39 -0
  332. package/src/validation-types.ts +57 -0
  333. package/dist/core/documentation/doc-schema.d.ts +0 -8
  334. package/dist/core/documentation/doc-schema.d.ts.map +0 -1
  335. package/dist/core/documentation/doc-schema.js +0 -53
  336. package/dist/core/documentation/doc-schema.js.map +0 -1
  337. package/dist/core/field/field-schema.d.ts +0 -22
  338. package/dist/core/field/field-schema.d.ts.map +0 -1
  339. package/dist/core/field/field-schema.js +0 -171
  340. package/dist/core/field/field-schema.js.map +0 -1
  341. package/dist/core/identity/identity-schema.d.ts +0 -6
  342. package/dist/core/identity/identity-schema.d.ts.map +0 -1
  343. package/dist/core/identity/identity-schema.js +0 -55
  344. package/dist/core/identity/identity-schema.js.map +0 -1
  345. package/dist/core/object/object-schema.d.ts +0 -4
  346. package/dist/core/object/object-schema.d.ts.map +0 -1
  347. package/dist/core/object/object-schema.js +0 -28
  348. package/dist/core/object/object-schema.js.map +0 -1
  349. package/dist/core/relationship/relationship-schema.d.ts +0 -4
  350. package/dist/core/relationship/relationship-schema.d.ts.map +0 -1
  351. package/dist/core/relationship/relationship-schema.js +0 -51
  352. package/dist/core/relationship/relationship-schema.js.map +0 -1
  353. package/dist/core/validator/validator-schema.d.ts +0 -4
  354. package/dist/core/validator/validator-schema.d.ts.map +0 -1
  355. package/dist/core/validator/validator-schema.js +0 -38
  356. package/dist/core/validator/validator-schema.js.map +0 -1
  357. package/dist/persistence/db/db-schema.d.ts +0 -14
  358. package/dist/persistence/db/db-schema.d.ts.map +0 -1
  359. package/dist/persistence/db/db-schema.js +0 -35
  360. package/dist/persistence/db/db-schema.js.map +0 -1
  361. package/dist/persistence/origin/origin-schema.d.ts +0 -4
  362. package/dist/persistence/origin/origin-schema.d.ts.map +0 -1
  363. package/dist/persistence/origin/origin-schema.js +0 -59
  364. package/dist/persistence/origin/origin-schema.js.map +0 -1
  365. package/dist/persistence/source/source-schema.d.ts +0 -4
  366. package/dist/persistence/source/source-schema.d.ts.map +0 -1
  367. package/dist/persistence/source/source-schema.js +0 -98
  368. package/dist/persistence/source/source-schema.js.map +0 -1
  369. package/dist/presentation/layout/layout-schema.d.ts +0 -4
  370. package/dist/presentation/layout/layout-schema.d.ts.map +0 -1
  371. package/dist/presentation/layout/layout-schema.js +0 -46
  372. package/dist/presentation/layout/layout-schema.js.map +0 -1
  373. package/dist/presentation/view/view-schema.d.ts +0 -4
  374. package/dist/presentation/view/view-schema.d.ts.map +0 -1
  375. package/dist/presentation/view/view-schema.js +0 -15
  376. package/dist/presentation/view/view-schema.js.map +0 -1
  377. package/dist/template/template-schema.d.ts +0 -3
  378. package/dist/template/template-schema.d.ts.map +0 -1
  379. package/dist/template/template-schema.js +0 -173
  380. package/dist/template/template-schema.js.map +0 -1
  381. package/src/core/documentation/doc-schema.ts +0 -64
  382. package/src/core/field/field-schema.ts +0 -228
  383. package/src/core/identity/identity-schema.ts +0 -80
  384. package/src/core/object/object-schema.ts +0 -35
  385. package/src/core/relationship/relationship-schema.ts +0 -67
  386. package/src/core/validator/validator-schema.ts +0 -50
  387. package/src/persistence/db/db-schema.ts +0 -50
  388. package/src/persistence/origin/origin-schema.ts +0 -80
  389. package/src/persistence/source/source-schema.ts +0 -129
  390. package/src/presentation/layout/layout-schema.ts +0 -62
  391. package/src/presentation/view/view-schema.ts +0 -21
  392. package/src/template/template-schema.ts +0 -211
@@ -1,17 +1,37 @@
1
1
  // Cross-language subtype rules for object subtypes.
2
2
  //
3
- // - value objects MUST NOT have a primary identity (error)
3
+ // - value objects MUST NOT have ANY identity (primary, secondary,
4
+ // reference) — values are pure data shapes (error, FR-024/ADR-0028)
5
+ // - value objects MUST NOT have a source.* child — values are not
6
+ // persisted shapes (error, FR-024/ADR-0028)
4
7
  // - entity objects SHOULD have a primary identity, unless @isAbstract (warning)
8
+ // - projection objects may only extend other projections (error,
9
+ // FR-024/ADR-0028); identity on a projection is OPTIONAL (no warning)
10
+ // - projection sources must have a read-only @kind — view,
11
+ // materializedView, storedProc, tableFunction (ERR_PROJECTION_SOURCE_WRITABLE)
5
12
  // - base objects have no rule (template, may or may not have identity)
13
+ // - every identity.* node MUST have a name (FR-024 D2: identities are named,
14
+ // author-chosen, so the dotted by-name extends form can address them)
15
+ //
16
+ // The entity-primary-source-readonly hard cutover (an entity whose PRIMARY
17
+ // source is a read-only kind must become a projection) is deferred to
18
+ // FR-024 Phase E (B4b) — view-primary entities still load today.
6
19
 
7
20
  import type { MetaData } from "./shared/meta-data.js";
8
21
  import { ParseError } from "./errors.js";
9
- import { TYPE_OBJECT, TYPE_IDENTITY } from "./shared/base-types.js";
22
+ import {
23
+ TYPE_OBJECT,
24
+ TYPE_IDENTITY,
25
+ TYPE_SOURCE,
26
+ } from "./shared/base-types.js";
10
27
  import { IDENTITY_SUBTYPE_PRIMARY } from "./core/identity/identity-constants.js";
11
28
  import {
12
29
  OBJECT_SUBTYPE_ENTITY,
13
30
  OBJECT_SUBTYPE_VALUE,
31
+ OBJECT_SUBTYPE_PROJECTION,
14
32
  } from "./core/object/object-constants.js";
33
+ import { MetaSource } from "./persistence/source/meta-source.js";
34
+ import { SOURCE_READ_ONLY_KINDS } from "./persistence/source/source-constants.js";
15
35
 
16
36
  export interface SubtypeRuleResult {
17
37
  errors: ParseError[];
@@ -26,31 +46,128 @@ export function validateSubtypeRules(root: MetaData): SubtypeRuleResult {
26
46
  }
27
47
 
28
48
  function walk(model: MetaData, errors: ParseError[], warnings: string[]): void {
29
- if (model.type === TYPE_OBJECT) {
30
- const hasPrimary = model.children().some(
31
- (c) => c.type === TYPE_IDENTITY && c.subType === IDENTITY_SUBTYPE_PRIMARY,
49
+ // FR-024 D2 identity nodes require an author-chosen name (any nesting:
50
+ // object children AND field-nested identities). A nameless node parses
51
+ // with name === "".
52
+ if (model.type === TYPE_IDENTITY && model.name === "") {
53
+ const owner = model.parent?.fqn();
54
+ errors.push(
55
+ new ParseError(
56
+ `identity.${model.subType}${owner !== undefined && owner !== "" ? ` under '${owner}'` : ""} has no name — ` +
57
+ `identity nodes require an author-chosen name (e.g. "id") so dotted ` +
58
+ `extends refs can address them (FR-024)`,
59
+ { code: "ERR_IDENTITY_NAME_REQUIRED", source: model.source },
60
+ ),
32
61
  );
33
- if (model.subType === OBJECT_SUBTYPE_VALUE && hasPrimary) {
62
+ }
63
+
64
+ if (model.type === TYPE_OBJECT) {
65
+ switch (model.subType) {
66
+ case OBJECT_SUBTYPE_VALUE:
67
+ validateValuePurity(model, errors);
68
+ break;
69
+ case OBJECT_SUBTYPE_ENTITY:
70
+ validateEntityIdentity(model, warnings);
71
+ break;
72
+ case OBJECT_SUBTYPE_PROJECTION:
73
+ validateProjectionLicensing(model, errors);
74
+ break;
75
+ default:
76
+ // object.base is a template — no rule.
77
+ break;
78
+ }
79
+ }
80
+
81
+ for (const child of model.ownChildren()) {
82
+ walk(child, errors, warnings);
83
+ }
84
+ }
85
+
86
+ // FR-024 value purity (ADR-0028): a value object is a pure data shape — it
87
+ // carries NO identity of any subtype and NO source.
88
+ function validateValuePurity(model: MetaData, errors: ParseError[]): void {
89
+ for (const child of model.children()) {
90
+ if (child.type === TYPE_IDENTITY) {
34
91
  errors.push(
35
92
  new ParseError(
36
- `value object '${model.fqn()}' must not have a primary identity ` +
37
- `(use subType: "entity" for records with identity)`,
38
- { code: "ERR_SUBTYPE_RULE_VIOLATION", source: model.source },
93
+ `value object '${model.fqn()}' must not have an identity ` +
94
+ `(${TYPE_IDENTITY}.${child.subType} '${child.name}') value objects are ` +
95
+ `pure data shapes; use subType: "entity" for records with identity ` +
96
+ `(FR-024, ADR-0028)`,
97
+ { code: "ERR_SUBTYPE_RULE_VIOLATION", source: child.source },
39
98
  ),
40
99
  );
41
- } else if (
42
- model.subType === OBJECT_SUBTYPE_ENTITY &&
43
- !hasPrimary &&
44
- !model.isAbstract
45
- ) {
46
- warnings.push(
47
- `entity object '${model.fqn()}' has no primary identity ` +
48
- `(add an identity child or mark @isAbstract: true)`,
100
+ } else if (child.type === TYPE_SOURCE) {
101
+ errors.push(
102
+ new ParseError(
103
+ `value object '${model.fqn()}' must not have a source ` +
104
+ `(${TYPE_SOURCE}.${child.subType}) — value objects are not persisted ` +
105
+ `shapes; use subType: "entity" or "projection" for stored objects ` +
106
+ `(FR-024, ADR-0028)`,
107
+ { code: "ERR_SUBTYPE_RULE_VIOLATION", source: child.source },
108
+ ),
49
109
  );
50
110
  }
51
111
  }
112
+ }
52
113
 
114
+ // Entities SHOULD have a primary identity unless abstract (warning).
115
+ function validateEntityIdentity(model: MetaData, warnings: string[]): void {
116
+ const hasPrimary = model
117
+ .children()
118
+ .some(
119
+ (c) => c.type === TYPE_IDENTITY && c.subType === IDENTITY_SUBTYPE_PRIMARY,
120
+ );
121
+ if (!hasPrimary && !model.isAbstract) {
122
+ warnings.push(
123
+ `entity object '${model.fqn()}' has no primary identity ` +
124
+ `(add an identity child or mark @isAbstract: true)`,
125
+ );
126
+ }
127
+ }
128
+
129
+ // FR-024 projection licensing (ADR-0028):
130
+ // - a projection's object-level extends may only target another
131
+ // object.projection (ERR_SUBTYPE_RULE_VIOLATION);
132
+ // - every source.* on a projection must have a read-only @kind
133
+ // (ERR_PROJECTION_SOURCE_WRITABLE);
134
+ // - identity is OPTIONAL on a projection — no warning when absent.
135
+ function validateProjectionLicensing(
136
+ model: MetaData,
137
+ errors: ParseError[],
138
+ ): void {
139
+ const sup = model.superResolved;
140
+ if (
141
+ sup !== undefined &&
142
+ (sup.type !== TYPE_OBJECT || sup.subType !== OBJECT_SUBTYPE_PROJECTION)
143
+ ) {
144
+ errors.push(
145
+ new ParseError(
146
+ `projection '${model.fqn()}' extends '${sup.fqn()}' which is ` +
147
+ `${sup.type}.${sup.subType} — a projection may only extend another ` +
148
+ `projection (FR-024, ADR-0028)`,
149
+ { code: "ERR_SUBTYPE_RULE_VIOLATION", source: model.source },
150
+ ),
151
+ );
152
+ }
153
+
154
+ // OWN sources only: an inherited source is validated on the (projection)
155
+ // object that declares it; an inherited source from a non-projection super
156
+ // is unreachable without first tripping the extends rule above.
53
157
  for (const child of model.ownChildren()) {
54
- walk(child, errors, warnings);
158
+ if (child.type !== TYPE_SOURCE) continue;
159
+ const kind =
160
+ child instanceof MetaSource ? child.effectiveKind : child.subType;
161
+ if (!SOURCE_READ_ONLY_KINDS.has(kind)) {
162
+ errors.push(
163
+ new ParseError(
164
+ `projection '${model.fqn()}' has a writable source (@kind "${kind}") — ` +
165
+ `a projection is a derived read-only representation; its sources must ` +
166
+ `be read-only kinds (view, materializedView, storedProc, ` +
167
+ `tableFunction) (FR-024, ADR-0028)`,
168
+ { code: "ERR_PROJECTION_SOURCE_WRITABLE", source: child.source },
169
+ ),
170
+ );
171
+ }
55
172
  }
56
173
  }
@@ -1,18 +1,26 @@
1
- // super reference resolution — package navigation helpers
1
+ // super reference resolution — pure FQN match (FR-032 / ADR-0032)
2
2
  //
3
- // Reference syntax (Java metaobjects-core conventions):
4
- // Bare name "Fruit" → resolve in contextPackage, then root fallback
5
- // Absolute "::fishstore::Fish" strip leading ::, walk from root
6
- // Relative parent "..::common::id" → up one package level, then resolve "common::id"
7
- // Multi-level "..::..::shared::User" → up two levels, then resolve "shared::User"
8
- // Same-package "common::id" try contextPackage prepend first, then root-rooted
3
+ // FR-032 made canonical refs fully-qualified: the YAML desugar expands every
4
+ // authored relative/bare-current ref to its FQN (`expandRef`, naming-refs.ts),
5
+ // and the canonical-JSON guard rejects any surviving `::`/`..::` form. So the
6
+ // refs that reach this resolver are already FQN, and resolution is a pure tree
7
+ // match:
8
+ // Qualified "pkg::Name" findInTree(fqn)
9
+ // Bare "Name" (rare in-tree) → current package only (`<ctx>::Name`),
10
+ // then literal (root-level). NO root
11
+ // fallback for a packaged bare ref.
12
+ // The old `::`-strip (absolute), `..::`-reduce (relative) and
13
+ // bare-current-then-root-fallback branches were DELETED — that fallback was the
14
+ // silent-shadowing footgun ADR-0032 removes.
9
15
  //
10
- // Super resolution is now IMMEDIATE during parse (Java behavior).
11
- // This module provides only the lookup helper; the parser calls it inline.
12
- // The old resolveSupers() multi-pass walker has been deleted.
16
+ // FR-024: a ref whose final `::`-segment is dotted (`pkg::Customer.id`) targets
17
+ // a child nested in the owner object resolved type-scoped to the referrer.
18
+ //
19
+ // Super resolution is IMMEDIATE during parse (Java behavior). This module
20
+ // provides only the lookup helper; the parser calls it inline.
13
21
 
14
22
  import type { MetaData } from "./shared/meta-data.js";
15
- import { PACKAGE_SEPARATOR, PACKAGE_PARENT } from "./shared/structural.js";
23
+ import { PACKAGE_SEPARATOR, CHILD_REF_SEPARATOR } from "./shared/structural.js";
16
24
 
17
25
  // ---------------------------------------------------------------------------
18
26
  // Tree search helper
@@ -52,6 +60,51 @@ function findInTree(root: MetaData, fqn: string): MetaData | undefined {
52
60
  // Reference parsing & resolution
53
61
  // ---------------------------------------------------------------------------
54
62
 
63
+ /**
64
+ * FR-024 (ADR-0029): the type-scope of the node whose `extends` is being
65
+ * resolved. A dotted `Entity.child` ref selects among the owner's children of
66
+ * the SAME type as the referrer — a field ref resolves fields, an identity
67
+ * ref resolves identities. Required for the dotted branch; ignored for
68
+ * dot-free refs (legacy behavior unchanged).
69
+ */
70
+ export interface ReferrerScope {
71
+ readonly type: string;
72
+ }
73
+
74
+ /**
75
+ * FR-024: true when a ref's final `::`-segment contains a `.` — i.e. the ref
76
+ * targets a child nested inside an object (`Customer.id`,
77
+ * `acme::sales::Customer.id`). Names cannot contain `.`, so this is
78
+ * unambiguous. Call sites use this to apply the dotted-only
79
+ * type/subtype-mismatch check (ERR_EXTENDS_TARGET_MISMATCH) without altering
80
+ * shipped top-level extends behavior.
81
+ */
82
+ export function isChildTargetingRef(ref: string): boolean {
83
+ const lastSep = ref.lastIndexOf(PACKAGE_SEPARATOR);
84
+ const lastSegment = lastSep === -1 ? ref : ref.slice(lastSep + PACKAGE_SEPARATOR.length);
85
+ return lastSegment.includes(CHILD_REF_SEPARATOR);
86
+ }
87
+
88
+ /**
89
+ * FR-024: split a child-targeting ref into the owner-object ref and the child
90
+ * traversal path. A multi-dot ref (`X.y.z`) traverses child names to any depth
91
+ * (object → field → view); returns undefined only for degenerate empty parts
92
+ * (`.id`, `Customer.`, `Customer..x`).
93
+ */
94
+ function parseChildTargetingRef(
95
+ ref: string,
96
+ ): { ownerRef: string; path: readonly string[] } | undefined {
97
+ const lastSep = ref.lastIndexOf(PACKAGE_SEPARATOR);
98
+ const segStart = lastSep === -1 ? 0 : lastSep + PACKAGE_SEPARATOR.length;
99
+ const lastSegment = ref.slice(segStart);
100
+ const parts = lastSegment.split(CHILD_REF_SEPARATOR);
101
+ if (parts.length < 2 || parts.some((p) => p === "")) return undefined;
102
+ return {
103
+ ownerRef: ref.slice(0, segStart) + parts[0],
104
+ path: parts.slice(1),
105
+ };
106
+ }
107
+
55
108
  /**
56
109
  * Resolve a single super reference string against a tree.
57
110
  *
@@ -59,51 +112,72 @@ function findInTree(root: MetaData, fqn: string): MetaData | undefined {
59
112
  * against the loader's accumulating root (intoRoot). Java semantics: if the
60
113
  * ref cannot be resolved, the parser throws ParseError.
61
114
  *
62
- * @param ref - The raw super reference (e.g., "Fruit", "::pkg::Name", "..::common::id")
115
+ * FR-024 (ADR-0029): a ref whose final segment is dotted (`Customer.id`)
116
+ * targets a child nested inside an object. The owner part resolves with the
117
+ * existing strategies (absolute / relative / bare / same-package); the child
118
+ * is then selected among the owner's EFFECTIVE children (so inherited
119
+ * children resolve) by name AND the referrer's type (type-scoped). A dotted
120
+ * ref that does not resolve returns undefined WITHOUT falling through to the
121
+ * bare lookup; a dotted ref with no `referrerScope` is unresolvable.
122
+ *
123
+ * @param ref - The raw super reference (e.g., "Fruit", "::pkg::Name", "..::common::id", "Customer.id")
63
124
  * @param contextPackage - The package of the model whose super is being resolved
64
125
  * @param root - The root MetaData of the accumulating tree to search within
126
+ * @param referrerScope - FR-024: the extending node's type — required to resolve dotted refs
65
127
  * @returns The resolved MetaData, or undefined if the reference cannot be resolved
66
128
  */
67
129
  export function resolveSuperRef(
68
130
  ref: string,
69
131
  contextPackage: string,
70
132
  root: MetaData,
133
+ referrerScope?: ReferrerScope,
71
134
  ): MetaData | undefined {
72
135
  // -------------------------------------------------------------------------
73
- // 1. Absolute reference: leading "::"
74
- // -------------------------------------------------------------------------
75
- if (ref.startsWith(PACKAGE_SEPARATOR)) {
76
- const absolutePath = ref.slice(PACKAGE_SEPARATOR.length);
77
- return findInTree(root, absolutePath);
78
- }
79
-
80
- // -------------------------------------------------------------------------
81
- // 2. Relative reference: one or more leading "..::"
136
+ // 0. FR-024 dotted child-targeting ref: `<rootRef>.<child>...<child>`
137
+ //
138
+ // Addressing model (ADR-0029): the package qualifies the ROOT-level node
139
+ // only; each subsequent segment traverses CHILD NAMES, to any depth
140
+ // (object → field → view: `Customer.priceCents.display`). INTERMEDIATE
141
+ // segments select by unique name among the current node's effective
142
+ // children (a cross-type name collision, e.g. a field AND an identity both
143
+ // named "id", is ambiguous → unresolved); the FINAL segment is type-scoped
144
+ // to the referrer (a field ref resolves fields, a view ref views), which is
145
+ // also what disambiguates the common 2-segment `Customer.id` case.
82
146
  // -------------------------------------------------------------------------
83
- if (ref.startsWith(PACKAGE_PARENT + PACKAGE_SEPARATOR)) {
84
- const parts = ref.split(PACKAGE_SEPARATOR);
85
- let levels = 0;
86
- while (levels < parts.length && parts[levels] === PACKAGE_PARENT) {
87
- levels++;
147
+ if (isChildTargetingRef(ref)) {
148
+ if (referrerScope === undefined) return undefined;
149
+ const parsed = parseChildTargetingRef(ref);
150
+ if (parsed === undefined) return undefined; // degenerate (empty segment)
151
+ let current: MetaData | undefined = resolveSuperRef(parsed.ownerRef, contextPackage, root);
152
+ if (current === undefined) return undefined;
153
+ for (let i = 0; i < parsed.path.length - 1; i++) {
154
+ const seg = parsed.path[i]!;
155
+ const matches: MetaData[] = current.children().filter((c) => c.name === seg);
156
+ if (matches.length !== 1) return undefined; // missing or ambiguous intermediate
157
+ current = matches[0]!;
88
158
  }
89
-
90
- const pkgParts = contextPackage !== "" ? contextPackage.split(PACKAGE_SEPARATOR) : [];
91
- const remainder = parts.slice(levels);
92
- if (pkgParts.length < levels || remainder.length === 0) {
93
- return undefined;
94
- }
95
-
96
- const allParts = [...pkgParts.slice(0, pkgParts.length - levels), ...remainder];
97
- return findInTree(root, allParts.join(PACKAGE_SEPARATOR));
159
+ const last = parsed.path[parsed.path.length - 1]!;
160
+ return current
161
+ .children()
162
+ .find((c) => c.name === last && c.type === referrerScope.type);
98
163
  }
99
-
100
164
  // -------------------------------------------------------------------------
101
- // 3. Bare name OR same-package shorthand (contains "::" but no leading
102
- // "::" or "..::"): try contextPackage prepend first, then root-rooted.
165
+ // 1. FR-032 (ADR-0032): refs in the loaded tree are already fully-qualified.
166
+ // The YAML desugar expanded every relative/bare-current ref to FQN
167
+ // (`expandRef`), and the canonical-JSON guard rejects any surviving
168
+ // `::`/`..::` form (ERR_RELATIVE_REF_IN_CANONICAL). So resolution is a
169
+ // pure FQN match — the old `::`-strip (absolute), `..::`-reduce (relative)
170
+ // and bare-current-then-ROOT-FALLBACK branches are deleted (the footgun).
171
+ //
172
+ // A qualified ref (`pkg::Name`) matches its node directly. A bare ref
173
+ // (no `::`) is the rare in-tree case: a root-level/empty-package type, or
174
+ // a bare ref constructed during dotted-owner recursion — resolve it in the
175
+ // current package ONLY (try `<ctx>::ref`), then bare (root-level) as the
176
+ // literal name. NO root fallback for a packaged bare ref.
103
177
  // -------------------------------------------------------------------------
104
- if (contextPackage !== "") {
105
- const found = findInTree(root, `${contextPackage}${PACKAGE_SEPARATOR}${ref}`);
106
- if (found !== undefined) return found;
178
+ if (!ref.includes(PACKAGE_SEPARATOR) && contextPackage !== "") {
179
+ const inPackage = findInTree(root, `${contextPackage}${PACKAGE_SEPARATOR}${ref}`);
180
+ if (inPackage !== undefined) return inPackage;
107
181
  }
108
182
  return findInTree(root, ref);
109
183
  }
@@ -119,6 +193,19 @@ export interface DeferredSuperFailure {
119
193
  ref: string;
120
194
  /** ADR-0009 provenance envelope of the referencing node (FR5a). */
121
195
  source: import("./source.js").ErrorSource;
196
+ /**
197
+ * FR-024: why resolution failed.
198
+ * - "unresolved" — no target found (loader emits ERR_UNRESOLVED_SUPER).
199
+ * - "target-mismatch" — a dotted child-targeting ref resolved, but the
200
+ * target's type/subtype differs from the extending node's (loader emits
201
+ * ERR_EXTENDS_TARGET_MISMATCH). Applies ONLY to dotted refs — top-level
202
+ * extends behavior is unchanged.
203
+ */
204
+ kind: "unresolved" | "target-mismatch";
205
+ /** target-mismatch only: the resolved target's identity, for the message. */
206
+ target?: { type: string; subType: string };
207
+ /** target-mismatch only: the extending node's type/subtype, for the message. */
208
+ referrer?: { type: string; subType: string };
122
209
  }
123
210
 
124
211
  /**
@@ -140,15 +227,38 @@ export function resolveDeferredSupers(root: MetaData): DeferredSuperFailure[] {
140
227
  if (node.superRef === undefined) return;
141
228
  if (node.superResolved !== undefined) return;
142
229
  const effectivePkg = node.package ?? node.fileDefaultPackage ?? "";
143
- const target = resolveSuperRef(node.superRef, effectivePkg, root);
230
+ // FR-024: thread the referrer's type so dotted `Entity.child` refs resolve
231
+ // type-scoped (a field ref selects fields; an identity ref identities).
232
+ const target = resolveSuperRef(node.superRef, effectivePkg, root, { type: node.type });
144
233
  if (target !== undefined) {
234
+ // FR-024: a dotted ref must target a node of the SAME type and subtype
235
+ // as the extending node. Dotted-only — top-level extends is unchanged.
236
+ if (
237
+ isChildTargetingRef(node.superRef) &&
238
+ (target.type !== node.type || target.subType !== node.subType)
239
+ ) {
240
+ failures.push({
241
+ nodeFqn: node.fqn(),
242
+ ref: node.superRef,
243
+ source: node.source,
244
+ kind: "target-mismatch",
245
+ target: { type: target.type, subType: target.subType },
246
+ referrer: { type: node.type, subType: node.subType },
247
+ });
248
+ return;
249
+ }
145
250
  try {
146
251
  node.setSuperResolved(target);
147
252
  } catch {
148
253
  // Frozen — ignore; the loader should resolve before freeze.
149
254
  }
150
255
  } else {
151
- failures.push({ nodeFqn: node.fqn(), ref: node.superRef, source: node.source });
256
+ failures.push({
257
+ nodeFqn: node.fqn(),
258
+ ref: node.superRef,
259
+ source: node.source,
260
+ kind: "unresolved",
261
+ });
152
262
  }
153
263
  });
154
264
  return failures;
@@ -3,9 +3,10 @@ import { MetaData } from "../shared/meta-data.js";
3
3
  /**
4
4
  * `template.*` node — the fourth-pillar metatype (FR-004, R1).
5
5
  *
6
- * A single class backs both subtypes (`template.prompt`, `template.output`),
6
+ * A single class backs every subtype (`template.base/prompt/output/toolcall`),
7
7
  * mirroring `MetaSource`: the loader dispatches by subtype and per-subtype
8
- * attribute schemas (see `template-schema.ts`) drive validation. Typed accessors
8
+ * attribute schemas (FR-033: externalized to spec/metamodel/template.json,
9
+ * embedded at build into TEMPLATE_DEFINITION) drive validation. Typed accessors
9
10
  * are deferred to the render-engine / verify work — attr values read generically
10
11
  * via `ownAttr(...)` until then, so no untested forward-looking surface ships.
11
12
  */