@metaobjectsdev/metadata 0.9.0-rc.1 → 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 (426) 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 +84 -7
  4. package/dist/attr-schema-validate.js.map +1 -1
  5. package/dist/constants.d.ts +208 -0
  6. package/dist/constants.d.ts.map +1 -0
  7. package/dist/constants.js +419 -0
  8. package/dist/constants.js.map +1 -0
  9. package/dist/constraint-merge.d.ts +18 -0
  10. package/dist/constraint-merge.d.ts.map +1 -0
  11. package/dist/constraint-merge.js +0 -0
  12. package/dist/constraint-merge.js.map +1 -0
  13. package/dist/constraint-validate.d.ts +6 -0
  14. package/dist/constraint-validate.d.ts.map +1 -0
  15. package/dist/constraint-validate.js +274 -0
  16. package/dist/constraint-validate.js.map +1 -0
  17. package/dist/core/attr/attr-constants.d.ts +13 -3
  18. package/dist/core/attr/attr-constants.d.ts.map +1 -1
  19. package/dist/core/attr/attr-constants.js +11 -2
  20. package/dist/core/attr/attr-constants.js.map +1 -1
  21. package/dist/core/attr/attr-definition.embedded.d.ts +3 -0
  22. package/dist/core/attr/attr-definition.embedded.d.ts.map +1 -0
  23. package/dist/core/attr/attr-definition.embedded.js +60 -0
  24. package/dist/core/attr/attr-definition.embedded.js.map +1 -0
  25. package/dist/core/documentation/doc-constants.d.ts +3 -2
  26. package/dist/core/documentation/doc-constants.d.ts.map +1 -1
  27. package/dist/core/documentation/doc-constants.js +3 -1
  28. package/dist/core/documentation/doc-constants.js.map +1 -1
  29. package/dist/core/documentation/doc-provider.d.ts.map +1 -1
  30. package/dist/core/documentation/doc-provider.js +6 -2
  31. package/dist/core/documentation/doc-provider.js.map +1 -1
  32. package/dist/core/documentation/doc-schema.d.ts +1 -1
  33. package/dist/core/documentation/doc-schema.d.ts.map +1 -1
  34. package/dist/core/documentation/doc-schema.js +13 -5
  35. package/dist/core/documentation/doc-schema.js.map +1 -1
  36. package/dist/core/documentation/documentation-definition.embedded.d.ts +3 -0
  37. package/dist/core/documentation/documentation-definition.embedded.d.ts.map +1 -0
  38. package/dist/core/documentation/documentation-definition.embedded.js +79 -0
  39. package/dist/core/documentation/documentation-definition.embedded.js.map +1 -0
  40. package/dist/core/field/field-constants.d.ts +7 -4
  41. package/dist/core/field/field-constants.d.ts.map +1 -1
  42. package/dist/core/field/field-constants.js +7 -7
  43. package/dist/core/field/field-constants.js.map +1 -1
  44. package/dist/core/field/field-definition.embedded.d.ts +3 -0
  45. package/dist/core/field/field-definition.embedded.d.ts.map +1 -0
  46. package/dist/core/field/field-definition.embedded.js +236 -0
  47. package/dist/core/field/field-definition.embedded.js.map +1 -0
  48. package/dist/core/field/field-schema.d.ts +0 -16
  49. package/dist/core/field/field-schema.d.ts.map +1 -1
  50. package/dist/core/field/field-schema.js +10 -158
  51. package/dist/core/field/field-schema.js.map +1 -1
  52. package/dist/core/field/meta-field.d.ts.map +1 -1
  53. package/dist/core/field/meta-field.js +7 -5
  54. package/dist/core/field/meta-field.js.map +1 -1
  55. package/dist/core/file-meta-data-loader.d.ts +18 -0
  56. package/dist/core/file-meta-data-loader.d.ts.map +1 -0
  57. package/dist/core/file-meta-data-loader.js +81 -0
  58. package/dist/core/file-meta-data-loader.js.map +1 -0
  59. package/dist/core/file-source.d.ts +12 -0
  60. package/dist/core/file-source.d.ts.map +1 -0
  61. package/dist/core/file-source.js +46 -0
  62. package/dist/core/file-source.js.map +1 -0
  63. package/dist/core/identity/identity-definition.embedded.d.ts +3 -0
  64. package/dist/core/identity/identity-definition.embedded.d.ts.map +1 -0
  65. package/dist/core/identity/identity-definition.embedded.js +91 -0
  66. package/dist/core/identity/identity-definition.embedded.js.map +1 -0
  67. package/dist/core/identity/identity-schema.d.ts.map +1 -1
  68. package/dist/core/identity/identity-schema.js +3 -2
  69. package/dist/core/identity/identity-schema.js.map +1 -1
  70. package/dist/core/identity/validate-identity-passthrough.d.ts +42 -0
  71. package/dist/core/identity/validate-identity-passthrough.d.ts.map +1 -0
  72. package/dist/core/identity/validate-identity-passthrough.js +158 -0
  73. package/dist/core/identity/validate-identity-passthrough.js.map +1 -0
  74. package/dist/core/object/object-constants.d.ts +2 -1
  75. package/dist/core/object/object-constants.d.ts.map +1 -1
  76. package/dist/core/object/object-constants.js +3 -0
  77. package/dist/core/object/object-constants.js.map +1 -1
  78. package/dist/core/object/object-definition.embedded.d.ts +3 -0
  79. package/dist/core/object/object-definition.embedded.d.ts.map +1 -0
  80. package/dist/core/object/object-definition.embedded.js +110 -0
  81. package/dist/core/object/object-definition.embedded.js.map +1 -0
  82. package/dist/core/object/validate-discriminator.d.ts.map +1 -1
  83. package/dist/core/object/validate-discriminator.js +1 -3
  84. package/dist/core/object/validate-discriminator.js.map +1 -1
  85. package/dist/core/query/query-constants.d.ts.map +1 -1
  86. package/dist/core/query/query-constants.js +5 -3
  87. package/dist/core/query/query-constants.js.map +1 -1
  88. package/dist/core/relationship/derive-m2m-fields.d.ts +26 -0
  89. package/dist/core/relationship/derive-m2m-fields.d.ts.map +1 -0
  90. package/dist/core/relationship/derive-m2m-fields.js +102 -0
  91. package/dist/core/relationship/derive-m2m-fields.js.map +1 -0
  92. package/dist/core/relationship/meta-relationship.d.ts +6 -4
  93. package/dist/core/relationship/meta-relationship.d.ts.map +1 -1
  94. package/dist/core/relationship/meta-relationship.js +12 -8
  95. package/dist/core/relationship/meta-relationship.js.map +1 -1
  96. package/dist/core/relationship/relationship-constants.d.ts +6 -2
  97. package/dist/core/relationship/relationship-constants.d.ts.map +1 -1
  98. package/dist/core/relationship/relationship-constants.js +6 -2
  99. package/dist/core/relationship/relationship-constants.js.map +1 -1
  100. package/dist/core/relationship/relationship-definition.embedded.d.ts +3 -0
  101. package/dist/core/relationship/relationship-definition.embedded.d.ts.map +1 -0
  102. package/dist/core/relationship/relationship-definition.embedded.js +310 -0
  103. package/dist/core/relationship/relationship-definition.embedded.js.map +1 -0
  104. package/dist/core/relationship/relationship-schema.d.ts.map +1 -1
  105. package/dist/core/relationship/relationship-schema.js +13 -7
  106. package/dist/core/relationship/relationship-schema.js.map +1 -1
  107. package/dist/core/validator/validator-definition.embedded.d.ts +3 -0
  108. package/dist/core/validator/validator-definition.embedded.d.ts.map +1 -0
  109. package/dist/core/validator/validator-definition.embedded.js +134 -0
  110. package/dist/core/validator/validator-definition.embedded.js.map +1 -0
  111. package/dist/core/yaml-desugar.d.ts.map +1 -1
  112. package/dist/core/yaml-desugar.js +88 -10
  113. package/dist/core/yaml-desugar.js.map +1 -1
  114. package/dist/core-attr-schemas.d.ts +22 -0
  115. package/dist/core-attr-schemas.d.ts.map +1 -0
  116. package/dist/core-attr-schemas.js +324 -0
  117. package/dist/core-attr-schemas.js.map +1 -0
  118. package/dist/core-types.d.ts +5 -2
  119. package/dist/core-types.d.ts.map +1 -1
  120. package/dist/core-types.js +261 -115
  121. package/dist/core-types.js.map +1 -1
  122. package/dist/db/db-attr-schemas.d.ts +8 -0
  123. package/dist/db/db-attr-schemas.d.ts.map +1 -0
  124. package/dist/db/db-attr-schemas.js +26 -0
  125. package/dist/db/db-attr-schemas.js.map +1 -0
  126. package/dist/db/db-provider.d.ts +3 -0
  127. package/dist/db/db-provider.d.ts.map +1 -0
  128. package/dist/db/db-provider.js +28 -0
  129. package/dist/db/db-provider.js.map +1 -0
  130. package/dist/errors.d.ts +1 -1
  131. package/dist/errors.d.ts.map +1 -1
  132. package/dist/errors.js +78 -0
  133. package/dist/errors.js.map +1 -1
  134. package/dist/index.d.ts +17 -2
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +26 -1
  137. package/dist/index.js.map +1 -1
  138. package/dist/library/embedded-library.generated.d.ts +2 -0
  139. package/dist/library/embedded-library.generated.d.ts.map +1 -0
  140. package/dist/library/embedded-library.generated.js +11 -0
  141. package/dist/library/embedded-library.generated.js.map +1 -0
  142. package/dist/library/library-sources.d.ts +12 -0
  143. package/dist/library/library-sources.d.ts.map +1 -0
  144. package/dist/library/library-sources.js +88 -0
  145. package/dist/library/library-sources.js.map +1 -0
  146. package/dist/loader/meta-data-loader.d.ts +10 -2
  147. package/dist/loader/meta-data-loader.d.ts.map +1 -1
  148. package/dist/loader/meta-data-loader.js +47 -6
  149. package/dist/loader/meta-data-loader.js.map +1 -1
  150. package/dist/loader/shortcuts.d.ts +2 -5
  151. package/dist/loader/shortcuts.d.ts.map +1 -1
  152. package/dist/loader/shortcuts.js.map +1 -1
  153. package/dist/loader/validation-passes.d.ts +3 -0
  154. package/dist/loader/validation-passes.d.ts.map +1 -1
  155. package/dist/loader/validation-passes.js +513 -33
  156. package/dist/loader/validation-passes.js.map +1 -1
  157. package/dist/meta/find-reference.d.ts +22 -0
  158. package/dist/meta/find-reference.d.ts.map +1 -0
  159. package/dist/meta/find-reference.js +29 -0
  160. package/dist/meta/find-reference.js.map +1 -0
  161. package/dist/meta/meta-attr.d.ts +8 -0
  162. package/dist/meta/meta-attr.d.ts.map +1 -0
  163. package/dist/meta/meta-attr.js +17 -0
  164. package/dist/meta/meta-attr.js.map +1 -0
  165. package/dist/meta/meta-data.d.ts +107 -0
  166. package/dist/meta/meta-data.d.ts.map +1 -0
  167. package/dist/meta/meta-data.js +302 -0
  168. package/dist/meta/meta-data.js.map +1 -0
  169. package/dist/meta/meta-field.d.ts +48 -0
  170. package/dist/meta/meta-field.d.ts.map +1 -0
  171. package/dist/meta/meta-field.js +94 -0
  172. package/dist/meta/meta-field.js.map +1 -0
  173. package/dist/meta/meta-identity.d.ts +71 -0
  174. package/dist/meta/meta-identity.d.ts.map +1 -0
  175. package/dist/meta/meta-identity.js +129 -0
  176. package/dist/meta/meta-identity.js.map +1 -0
  177. package/dist/meta/meta-layout.d.ts +23 -0
  178. package/dist/meta/meta-layout.d.ts.map +1 -0
  179. package/dist/meta/meta-layout.js +45 -0
  180. package/dist/meta/meta-layout.js.map +1 -0
  181. package/dist/meta/meta-object.d.ts +40 -0
  182. package/dist/meta/meta-object.d.ts.map +1 -0
  183. package/dist/meta/meta-object.js +81 -0
  184. package/dist/meta/meta-object.js.map +1 -0
  185. package/dist/meta/meta-origin.d.ts +32 -0
  186. package/dist/meta/meta-origin.d.ts.map +1 -0
  187. package/dist/meta/meta-origin.js +55 -0
  188. package/dist/meta/meta-origin.js.map +1 -0
  189. package/dist/meta/meta-relationship.d.ts +11 -0
  190. package/dist/meta/meta-relationship.d.ts.map +1 -0
  191. package/dist/meta/meta-relationship.js +27 -0
  192. package/dist/meta/meta-relationship.js.map +1 -0
  193. package/dist/meta/meta-root.d.ts +12 -0
  194. package/dist/meta/meta-root.d.ts.map +1 -0
  195. package/dist/meta/meta-root.js +24 -0
  196. package/dist/meta/meta-root.js.map +1 -0
  197. package/dist/meta/meta-source.d.ts +18 -0
  198. package/dist/meta/meta-source.d.ts.map +1 -0
  199. package/dist/meta/meta-source.js +31 -0
  200. package/dist/meta/meta-source.js.map +1 -0
  201. package/dist/meta/meta-validator.d.ts +29 -0
  202. package/dist/meta/meta-validator.d.ts.map +1 -0
  203. package/dist/meta/meta-validator.js +49 -0
  204. package/dist/meta/meta-validator.js.map +1 -0
  205. package/dist/meta/meta-view.d.ts +4 -0
  206. package/dist/meta/meta-view.d.ts.map +1 -0
  207. package/dist/meta/meta-view.js +8 -0
  208. package/dist/meta/meta-view.js.map +1 -0
  209. package/dist/metamodel-docs/index.d.ts +19 -0
  210. package/dist/metamodel-docs/index.d.ts.map +1 -0
  211. package/dist/metamodel-docs/index.js +37 -0
  212. package/dist/metamodel-docs/index.js.map +1 -0
  213. package/dist/metamodel-docs/provenance.d.ts +42 -0
  214. package/dist/metamodel-docs/provenance.d.ts.map +1 -0
  215. package/dist/metamodel-docs/provenance.js +148 -0
  216. package/dist/metamodel-docs/provenance.js.map +1 -0
  217. package/dist/metamodel-docs/provider-definitions.d.ts +8 -0
  218. package/dist/metamodel-docs/provider-definitions.d.ts.map +1 -0
  219. package/dist/metamodel-docs/provider-definitions.js +48 -0
  220. package/dist/metamodel-docs/provider-definitions.js.map +1 -0
  221. package/dist/metamodel-docs/render.d.ts +12 -0
  222. package/dist/metamodel-docs/render.d.ts.map +1 -0
  223. package/dist/metamodel-docs/render.js +252 -0
  224. package/dist/metamodel-docs/render.js.map +1 -0
  225. package/dist/naming-refs.d.ts +41 -0
  226. package/dist/naming-refs.d.ts.map +1 -0
  227. package/dist/naming-refs.js +144 -0
  228. package/dist/naming-refs.js.map +1 -0
  229. package/dist/naming.d.ts.map +1 -1
  230. package/dist/naming.js +10 -2
  231. package/dist/naming.js.map +1 -1
  232. package/dist/parser-core.d.ts.map +1 -1
  233. package/dist/parser-core.js +74 -8
  234. package/dist/parser-core.js.map +1 -1
  235. package/dist/persistence/db/db-attr-schemas.d.ts +8 -0
  236. package/dist/persistence/db/db-attr-schemas.d.ts.map +1 -0
  237. package/dist/persistence/db/db-attr-schemas.js +28 -0
  238. package/dist/persistence/db/db-attr-schemas.js.map +1 -0
  239. package/dist/persistence/db/db-definition.embedded.d.ts +3 -0
  240. package/dist/persistence/db/db-definition.embedded.d.ts.map +1 -0
  241. package/dist/persistence/db/db-definition.embedded.js +170 -0
  242. package/dist/persistence/db/db-definition.embedded.js.map +1 -0
  243. package/dist/persistence/db/db-provider.d.ts.map +1 -1
  244. package/dist/persistence/db/db-provider.js +13 -18
  245. package/dist/persistence/db/db-provider.js.map +1 -1
  246. package/dist/persistence/db/db-schema.d.ts +14 -0
  247. package/dist/persistence/db/db-schema.d.ts.map +1 -1
  248. package/dist/persistence/db/db-schema.js +27 -0
  249. package/dist/persistence/db/db-schema.js.map +1 -1
  250. package/dist/persistence/origin/origin-definition.embedded.d.ts +3 -0
  251. package/dist/persistence/origin/origin-definition.embedded.d.ts.map +1 -0
  252. package/dist/persistence/origin/origin-definition.embedded.js +88 -0
  253. package/dist/persistence/origin/origin-definition.embedded.js.map +1 -0
  254. package/dist/persistence/origin/origin-schema.d.ts.map +1 -1
  255. package/dist/persistence/origin/origin-schema.js +7 -3
  256. package/dist/persistence/origin/origin-schema.js.map +1 -1
  257. package/dist/persistence/source/source-definition.embedded.d.ts +3 -0
  258. package/dist/persistence/source/source-definition.embedded.d.ts.map +1 -0
  259. package/dist/persistence/source/source-definition.embedded.js +17 -0
  260. package/dist/persistence/source/source-definition.embedded.js.map +1 -0
  261. package/dist/persistence/source/validate-source-parameter-ref.d.ts.map +1 -1
  262. package/dist/persistence/source/validate-source-parameter-ref.js +7 -1
  263. package/dist/persistence/source/validate-source-parameter-ref.js.map +1 -1
  264. package/dist/persistence/source/validate-source-roles.d.ts.map +1 -1
  265. package/dist/persistence/source/validate-source-roles.js +16 -1
  266. package/dist/persistence/source/validate-source-roles.js.map +1 -1
  267. package/dist/presentation/layout/layout-definition.embedded.d.ts +3 -0
  268. package/dist/presentation/layout/layout-definition.embedded.d.ts.map +1 -0
  269. package/dist/presentation/layout/layout-definition.embedded.js +16 -0
  270. package/dist/presentation/layout/layout-definition.embedded.js.map +1 -0
  271. package/dist/presentation/layout/layout-schema.d.ts.map +1 -1
  272. package/dist/presentation/layout/layout-schema.js +3 -2
  273. package/dist/presentation/layout/layout-schema.js.map +1 -1
  274. package/dist/presentation/ui/ui-definition.embedded.d.ts +3 -0
  275. package/dist/presentation/ui/ui-definition.embedded.d.ts.map +1 -0
  276. package/dist/presentation/ui/ui-definition.embedded.js +114 -0
  277. package/dist/presentation/ui/ui-definition.embedded.js.map +1 -0
  278. package/dist/presentation/ui/ui-provider.d.ts +3 -0
  279. package/dist/presentation/ui/ui-provider.d.ts.map +1 -0
  280. package/dist/presentation/ui/ui-provider.js +21 -0
  281. package/dist/presentation/ui/ui-provider.js.map +1 -0
  282. package/dist/presentation/ui/ui-schema.d.ts +10 -0
  283. package/dist/presentation/ui/ui-schema.d.ts.map +1 -0
  284. package/dist/presentation/ui/ui-schema.js +41 -0
  285. package/dist/presentation/ui/ui-schema.js.map +1 -0
  286. package/dist/presentation/view/view-definition.embedded.d.ts +3 -0
  287. package/dist/presentation/view/view-definition.embedded.d.ts.map +1 -0
  288. package/dist/presentation/view/view-definition.embedded.js +76 -0
  289. package/dist/presentation/view/view-definition.embedded.js.map +1 -0
  290. package/dist/provider-data.d.ts +169 -0
  291. package/dist/provider-data.d.ts.map +1 -0
  292. package/dist/provider-data.js +269 -0
  293. package/dist/provider-data.js.map +1 -0
  294. package/dist/provider.d.ts +3 -1
  295. package/dist/provider.d.ts.map +1 -1
  296. package/dist/provider.js +15 -1
  297. package/dist/provider.js.map +1 -1
  298. package/dist/registry-coverage.d.ts +99 -0
  299. package/dist/registry-coverage.d.ts.map +1 -0
  300. package/dist/registry-coverage.js +294 -0
  301. package/dist/registry-coverage.js.map +1 -0
  302. package/dist/registry-manifest-exclusions.d.ts +62 -0
  303. package/dist/registry-manifest-exclusions.d.ts.map +1 -0
  304. package/dist/registry-manifest-exclusions.js +163 -0
  305. package/dist/registry-manifest-exclusions.js.map +1 -0
  306. package/dist/registry-manifest.d.ts +117 -0
  307. package/dist/registry-manifest.d.ts.map +1 -0
  308. package/dist/registry-manifest.js +242 -0
  309. package/dist/registry-manifest.js.map +1 -0
  310. package/dist/registry.d.ts +60 -2
  311. package/dist/registry.d.ts.map +1 -1
  312. package/dist/registry.js +37 -1
  313. package/dist/registry.js.map +1 -1
  314. package/dist/shared/structural.d.ts +7 -0
  315. package/dist/shared/structural.d.ts.map +1 -1
  316. package/dist/shared/structural.js +7 -0
  317. package/dist/shared/structural.js.map +1 -1
  318. package/dist/subtype-rules.d.ts.map +1 -1
  319. package/dist/subtype-rules.js +97 -13
  320. package/dist/subtype-rules.js.map +1 -1
  321. package/dist/super-resolve.d.ts +49 -2
  322. package/dist/super-resolve.d.ts.map +1 -1
  323. package/dist/super-resolve.js +128 -43
  324. package/dist/super-resolve.js.map +1 -1
  325. package/dist/template/meta-template.d.ts +3 -2
  326. package/dist/template/meta-template.d.ts.map +1 -1
  327. package/dist/template/meta-template.js +3 -2
  328. package/dist/template/meta-template.js.map +1 -1
  329. package/dist/template/prompt-definition.embedded.d.ts +3 -0
  330. package/dist/template/prompt-definition.embedded.d.ts.map +1 -0
  331. package/dist/template/prompt-definition.embedded.js +368 -0
  332. package/dist/template/prompt-definition.embedded.js.map +1 -0
  333. package/dist/template/prompt-provider.d.ts +3 -0
  334. package/dist/template/prompt-provider.d.ts.map +1 -0
  335. package/dist/template/prompt-provider.js +25 -0
  336. package/dist/template/prompt-provider.js.map +1 -0
  337. package/dist/template/prompt-schema.d.ts +20 -0
  338. package/dist/template/prompt-schema.d.ts.map +1 -0
  339. package/dist/template/prompt-schema.js +70 -0
  340. package/dist/template/prompt-schema.js.map +1 -0
  341. package/dist/template/template-constants.d.ts +2 -0
  342. package/dist/template/template-constants.d.ts.map +1 -1
  343. package/dist/template/template-constants.js +7 -0
  344. package/dist/template/template-constants.js.map +1 -1
  345. package/dist/template/template-definition.embedded.d.ts +3 -0
  346. package/dist/template/template-definition.embedded.d.ts.map +1 -0
  347. package/dist/template/template-definition.embedded.js +30 -0
  348. package/dist/template/template-definition.embedded.js.map +1 -0
  349. package/dist/template/template-schema.d.ts.map +1 -1
  350. package/dist/template/template-schema.js +12 -4
  351. package/dist/template/template-schema.js.map +1 -1
  352. package/package.json +33 -22
  353. package/src/attr-schema-validate.ts +96 -4
  354. package/src/constraint-merge.ts +0 -0
  355. package/src/constraint-validate.ts +363 -0
  356. package/src/core/attr/attr-constants.ts +15 -3
  357. package/src/core/attr/attr-definition.embedded.ts +67 -0
  358. package/src/core/documentation/doc-constants.ts +3 -1
  359. package/src/core/documentation/doc-provider.ts +6 -2
  360. package/src/core/documentation/documentation-definition.embedded.ts +86 -0
  361. package/src/core/field/field-constants.ts +8 -7
  362. package/src/core/field/field-definition.embedded.ts +243 -0
  363. package/src/core/field/meta-field.ts +6 -7
  364. package/src/core/identity/identity-definition.embedded.ts +98 -0
  365. package/src/core/identity/validate-identity-passthrough.ts +194 -0
  366. package/src/core/object/object-constants.ts +3 -0
  367. package/src/core/object/object-definition.embedded.ts +117 -0
  368. package/src/core/object/validate-discriminator.ts +0 -4
  369. package/src/core/query/query-constants.ts +5 -3
  370. package/src/core/relationship/derive-m2m-fields.ts +145 -0
  371. package/src/core/relationship/meta-relationship.ts +15 -9
  372. package/src/core/relationship/relationship-constants.ts +6 -2
  373. package/src/core/relationship/relationship-definition.embedded.ts +317 -0
  374. package/src/core/validator/validator-definition.embedded.ts +141 -0
  375. package/src/core/yaml-desugar.ts +96 -7
  376. package/src/core-types.ts +289 -150
  377. package/src/errors.ts +78 -0
  378. package/src/index.ts +47 -2
  379. package/src/library/embedded-library.generated.ts +10 -0
  380. package/src/library/library-sources.ts +97 -0
  381. package/src/loader/meta-data-loader.ts +66 -7
  382. package/src/loader/shortcuts.ts +2 -2
  383. package/src/loader/validation-passes.ts +679 -33
  384. package/src/metamodel-docs/index.ts +41 -0
  385. package/src/metamodel-docs/provenance.ts +187 -0
  386. package/src/metamodel-docs/provider-definitions.ts +50 -0
  387. package/src/metamodel-docs/render.ts +309 -0
  388. package/src/naming-refs.ts +162 -0
  389. package/src/naming.ts +10 -2
  390. package/src/parser-core.ts +86 -8
  391. package/src/persistence/db/db-definition.embedded.ts +177 -0
  392. package/src/persistence/db/db-provider.ts +13 -18
  393. package/src/persistence/origin/origin-definition.embedded.ts +95 -0
  394. package/src/persistence/source/source-definition.embedded.ts +24 -0
  395. package/src/persistence/source/validate-source-parameter-ref.ts +7 -1
  396. package/src/persistence/source/validate-source-roles.ts +22 -1
  397. package/src/presentation/layout/layout-definition.embedded.ts +23 -0
  398. package/src/presentation/ui/ui-definition.embedded.ts +121 -0
  399. package/src/presentation/ui/ui-provider.ts +25 -0
  400. package/src/presentation/view/view-definition.embedded.ts +83 -0
  401. package/src/provider-data.ts +446 -0
  402. package/src/provider.ts +18 -0
  403. package/src/registry-coverage.ts +430 -0
  404. package/src/registry-manifest-exclusions.ts +176 -0
  405. package/src/registry-manifest.ts +334 -0
  406. package/src/registry.ts +90 -3
  407. package/src/shared/structural.ts +8 -0
  408. package/src/subtype-rules.ts +135 -18
  409. package/src/super-resolve.ts +153 -43
  410. package/src/template/meta-template.ts +3 -2
  411. package/src/template/prompt-definition.embedded.ts +375 -0
  412. package/src/template/prompt-provider.ts +29 -0
  413. package/src/template/template-constants.ts +8 -0
  414. package/src/template/template-definition.embedded.ts +37 -0
  415. package/src/core/documentation/doc-schema.ts +0 -64
  416. package/src/core/field/field-schema.ts +0 -228
  417. package/src/core/identity/identity-schema.ts +0 -80
  418. package/src/core/object/object-schema.ts +0 -35
  419. package/src/core/relationship/relationship-schema.ts +0 -67
  420. package/src/core/validator/validator-schema.ts +0 -50
  421. package/src/persistence/db/db-schema.ts +0 -50
  422. package/src/persistence/origin/origin-schema.ts +0 -80
  423. package/src/persistence/source/source-schema.ts +0 -129
  424. package/src/presentation/layout/layout-schema.ts +0 -62
  425. package/src/presentation/view/view-schema.ts +0 -21
  426. package/src/template/template-schema.ts +0 -211
@@ -0,0 +1,446 @@
1
+ // FR-033 — provider definitions as declarative data.
2
+ //
3
+ // A provider's *declarative* metamodel definition (vocabulary + attr constraints
4
+ // + child cardinality + descriptions + rule prose) lives as data; the factory
5
+ // (behavior) is supplied separately. `defineProviderFromData` turns that data +
6
+ // a code-supplied factory map into the `TypeDefinition`s a provider passes to
7
+ // `registry.register()`. This is the data/code boundary: declarative facts and
8
+ // rule *prose* are data; factories, imperative validation, and codegen stay code.
9
+ //
10
+ // See spec/superpowers/specs/2026-06-13-metamodel-self-description-design.md §3 +
11
+ // §3.1 (the constraint model). This module implements Plan Task 1, Task 2, and
12
+ // the format half of Task 7.
13
+
14
+ import type { AttrSchema, ChildRule, TypeDefinition, TypeRegistry } from "./registry.js";
15
+ import { TypeId } from "./registry.js";
16
+ import type { AttrSubType } from "./core/attr/attr-constants.js";
17
+ import type { AttrValue, MetaData } from "./shared/meta-data.js";
18
+ import type { DataType } from "./data-type.js";
19
+ import { CHILD_RULE_WILDCARD } from "./shared/structural.js";
20
+ import { SUBTYPE_BASE } from "./shared/base-types.js";
21
+
22
+ /**
23
+ * A UNIFIED child requirement (spec §3.1). Every constraint on a type — both its
24
+ * structural children AND its attributes — is one of these entries in a single
25
+ * `children` list, distinguished by `type`:
26
+ *
27
+ * - an **attribute** is a `{ type: "attr", … }` entry. Its `subType` is the
28
+ * attr's value-type (a single subtype — never a list), `max` is always 1
29
+ * (single-valued; a list-valued attr sets `isArray: true`), and it carries the
30
+ * attr-only facets `default` / `allowedValues` / `isArray`.
31
+ * - a **structural child** (`field`/`identity`/`source`/`validator`/…) carries
32
+ * full cardinality (`min`/`max`, `max: null` = unbounded) and may admit any of
33
+ * several subtypes via a `subType` list.
34
+ *
35
+ * `type` / `subType` / `name` accept the `"*"` wildcard.
36
+ */
37
+ export interface ChildDef {
38
+ /** Child type, or `"*"` for any. For attrs this is the literal `"attr"`. */
39
+ type: string;
40
+ /**
41
+ * Child subtype: a single subtype, a list of admitted subtypes, or `"*"`.
42
+ * For an `attr` entry this is the attr's value-type and MUST be a single
43
+ * subtype (a list is invalid for attrs). Optional on an `attr` entry: an
44
+ * omitted `subType` declares a polymorphic/untyped attr (e.g. `@default`,
45
+ * whose value-type follows the owning field's subtype). A structural child
46
+ * always supplies a `subType` (or `"*"`).
47
+ */
48
+ subType?: string | readonly string[];
49
+ /** Child name, or `"*"` for any. */
50
+ name: string;
51
+ /** Cardinality lower bound. An attr is required iff `min >= 1`. */
52
+ min: number;
53
+ /** Cardinality upper bound; `null` = unbounded. For an attr this is 1. */
54
+ max: number | null;
55
+ /** Whether the child must carry an explicit name. */
56
+ named?: boolean;
57
+ description?: string;
58
+ /** Prose documenting the complex rules enforced in code. */
59
+ rules?: string;
60
+ /** An example value/usage, shown only in the provider detail page. */
61
+ example?: string;
62
+ /** Guidance on when to reach for this child/attr. */
63
+ whenToUse?: string;
64
+ // --- attr-only facets (carried on a `type: "attr"` entry) ---
65
+ /** Default value applied when the attr is absent. */
66
+ default?: unknown;
67
+ /** Closed enum of allowed values. */
68
+ allowedValues?: readonly unknown[];
69
+ /** Whether the attr is array-valued (the only way an attr's `max` may be > 1). */
70
+ isArray?: boolean;
71
+ }
72
+
73
+ /**
74
+ * A declarative type/subtype definition (spec §3). The `factory` is NOT here — it
75
+ * is code, supplied via the `FactoryMap`. An attribute is a `type: "attr"` entry
76
+ * inside `children`; structural children are the non-`"attr"` entries.
77
+ */
78
+ export interface TypeDef {
79
+ type: string;
80
+ subType: string;
81
+ description: string;
82
+ dataType?: string;
83
+ rules?: string;
84
+ example?: string;
85
+ whenToUse?: string;
86
+ /** Unified children list: attrs (`type: "attr"`) + structural children. */
87
+ children?: ChildDef[];
88
+ /** Child-side placement: the `type.subType`s under which this type is allowed. */
89
+ parents?: readonly string[];
90
+ /**
91
+ * FR-033 base-composition opt-in. When `true` (and this is a non-base subtype),
92
+ * the subtype additively inherits its `<type>.base`'s attrs (dedup by name) and
93
+ * childRules (dedup structurally) — letting the JSON declare per-type-universal
94
+ * rules once on `base`. Default/absent = OFF, so a subtype that deliberately
95
+ * declares FEWER attrs than base (e.g. `validator.required`, which wants no
96
+ * `min`/`max`) is never silently widened. Opted in per-subtype in S1; inert (no
97
+ * registered output change) under S0.
98
+ */
99
+ extendsBase?: boolean;
100
+ }
101
+
102
+ /**
103
+ * FR-033 S1.5 — a declarative `registry.extend` directive. A **concern** provider
104
+ * (db / ui / prompt) does NOT register new `type.subType`s; it ADDS attrs to types
105
+ * an upstream provider (core) already registered. This entry is the data form of a
106
+ * `registry.extend(type, sub, { attributes })` call: `subType` selects the target
107
+ * subtype(s) and `children` are the `type: "attr"` entries (→ `AttrSchema`) to add.
108
+ */
109
+ export interface ExtendDef {
110
+ /** Target type whose subtype(s) are extended (e.g. `"field"`, `"source"`). */
111
+ type: string;
112
+ /**
113
+ * Target subtype(s): a single subtype name, a LIST of subtype names, or the
114
+ * `"*"` wildcard (= every currently-registered subtype of `type`). Resolved at
115
+ * apply time against the registry.
116
+ */
117
+ subType: string | readonly string[];
118
+ /**
119
+ * Attrs to add to each resolved target. Concern providers add attrs only — these
120
+ * must all be `type: "attr"` entries (lowered via `toAttrSchema`). A structural
121
+ * child here is rejected (concern providers do not contribute child rules).
122
+ */
123
+ children: ChildDef[];
124
+ }
125
+
126
+ export interface ProviderDefinition {
127
+ /** Owning provider id (groups doc pages). */
128
+ provider: string;
129
+ /**
130
+ * The provider's type definitions. ONE entry may be the **universal** `*.*`
131
+ * entry (`type: "*", subType: "*"`): it is NOT a registered type — its named
132
+ * `attr` children are COMMON attributes (accepted on every node, registered via
133
+ * `registry.registerCommonAttrs`). Every other entry is a real `type.subType`.
134
+ * Optional — a concern (extends-only) provider declares no new types and may
135
+ * omit this entirely (it carries only `extends`).
136
+ */
137
+ types?: TypeDef[];
138
+ /**
139
+ * FR-033 S1.5 — DATA-DRIVEN `registry.extend` directives. A **concern** provider
140
+ * (db / ui / prompt) declares no new types; it reads its attrs from data and ADDS
141
+ * them to already-registered types via these entries. Applied AFTER `types` in
142
+ * `applyProviderDefinition`. Optional — a provider with only `types` is unaffected.
143
+ */
144
+ extends?: ExtendDef[];
145
+ }
146
+
147
+ /**
148
+ * The code half of the data/code boundary: a `"<type>.<subType>"` → factory map.
149
+ * The factory constructs the node instance; it stays code (behavior).
150
+ */
151
+ export type FactoryMap = Record<string, (typeId: TypeId, name: string) => MetaData>;
152
+
153
+ const ATTR_CHILD_TYPE = "attr";
154
+
155
+ /** Whether a `ChildDef` declares an attribute (vs a structural child). */
156
+ function isAttrChild(child: ChildDef): boolean {
157
+ return child.type === ATTR_CHILD_TYPE;
158
+ }
159
+
160
+ /**
161
+ * Whether a `TypeDef` is the UNIVERSAL `*.*` entry — the carrier for COMMON
162
+ * attributes (attrs accepted on EVERY node). It is NOT a real registered type;
163
+ * its named `attr` children are routed to `registry.registerCommonAttrs(...)` by
164
+ * the unified apply path. Documentation uses this; ordinary providers do not.
165
+ */
166
+ function isUniversalEntry(t: TypeDef): boolean {
167
+ return t.type === CHILD_RULE_WILDCARD && t.subType === CHILD_RULE_WILDCARD;
168
+ }
169
+
170
+ /**
171
+ * Turn a declarative `ProviderDefinition` + a code-supplied factory map into the
172
+ * `TypeDefinition`s a provider passes to `registry.register()`.
173
+ *
174
+ * For each real `TypeDef` (every entry EXCEPT the universal `*.*` entry, which
175
+ * carries common attrs and is handled by `applyProviderDefinition`): look up its
176
+ * factory (throws if missing); fan its `children` out so `type: "attr"` entries
177
+ * become `AttrSchema`s and structural entries become `ChildRule`s; carry `parents`
178
+ * and the optional `rules`/`example`/`whenToUse` doc fields through onto the
179
+ * returned `TypeDefinition`.
180
+ *
181
+ * BASE-COMPOSITION (FR-033): a non-base subtype that opts in via
182
+ * `extendsBase: true` additively inherits its `<type>.base`'s `attributes` (dedup
183
+ * by name) and `childRules` (dedup structurally) — letting a JSON declare
184
+ * universal-per-type rules once on `base`. Purely additive (a subtype's own
185
+ * declarations win on a name/shape collision). OFF by default so a subtype that
186
+ * deliberately declares fewer attrs than base is never widened — inert under S0
187
+ * (no provider opts in yet), the rail S1 will use.
188
+ *
189
+ * Builder-local validation (cheap, structural): an attr entry must be
190
+ * single-valued (`max === 1`) unless `isArray`; an attr entry's `subType` must be
191
+ * a single subtype (not a list); every child must have `min >= 0` and
192
+ * (`max === null || max >= min`).
193
+ */
194
+ export function defineProviderFromData(
195
+ data: ProviderDefinition,
196
+ factories: FactoryMap,
197
+ ): TypeDefinition[] {
198
+ // Pre-compute each type's OWN lowered attrs + childRules, keyed by "type.subType",
199
+ // so base-composition can fold a base's contributions into its subtypes. A
200
+ // concern (extends-only) provider may omit `types` entirely.
201
+ const realTypes = (data.types ?? []).filter((t) => !isUniversalEntry(t));
202
+ const lowered = new Map<
203
+ string,
204
+ { attributes: AttrSchema[]; childRules: ChildRule[] }
205
+ >();
206
+
207
+ for (const t of realTypes) {
208
+ const key = `${t.type}.${t.subType}`;
209
+ const attributes: AttrSchema[] = [];
210
+ const childRules: ChildRule[] = [];
211
+ for (const child of t.children ?? []) {
212
+ validateCardinality(data.provider, key, child);
213
+ if (isAttrChild(child)) {
214
+ attributes.push(toAttrSchema(data.provider, key, child));
215
+ } else {
216
+ childRules.push(toChildRule(child));
217
+ }
218
+ }
219
+ lowered.set(key, { attributes, childRules });
220
+ }
221
+
222
+ return realTypes.map((t): TypeDefinition => {
223
+ const key = `${t.type}.${t.subType}`;
224
+ const factory = factories[key];
225
+ if (factory === undefined) {
226
+ throw new Error(`defineProviderFromData(${data.provider}): no factory for "${key}"`);
227
+ }
228
+
229
+ const self = lowered.get(key)!;
230
+ const { attributes, childRules } = composeWithBase(t, self, lowered);
231
+
232
+ return {
233
+ typeId: new TypeId(t.type, t.subType),
234
+ description: t.description,
235
+ factory,
236
+ childRules,
237
+ attributes,
238
+ ...(t.dataType !== undefined ? { dataType: t.dataType as DataType } : {}),
239
+ ...(t.parents !== undefined ? { parents: t.parents } : {}),
240
+ ...(t.rules !== undefined ? { rules: t.rules } : {}),
241
+ ...(t.example !== undefined ? { example: t.example } : {}),
242
+ ...(t.whenToUse !== undefined ? { whenToUse: t.whenToUse } : {}),
243
+ };
244
+ });
245
+ }
246
+
247
+ /**
248
+ * Apply a `ProviderDefinition` to a registry via the ONE uniform path: register
249
+ * every real `type.subType` (with base-composition) AND register the universal
250
+ * `*.*` entry's named `attr` children as COMMON attrs. This replaces the bespoke
251
+ * `commonAttrs` helper — documentation rides the same mechanism as every other
252
+ * provider.
253
+ */
254
+ export function applyProviderDefinition(
255
+ registry: TypeRegistry,
256
+ data: ProviderDefinition,
257
+ factories: FactoryMap,
258
+ ): void {
259
+ for (const def of defineProviderFromData(data, factories)) {
260
+ registry.register(def);
261
+ }
262
+ const commonAttrs = universalCommonAttrs(data);
263
+ if (commonAttrs.length > 0) {
264
+ registry.registerCommonAttrs(commonAttrs);
265
+ }
266
+ applyExtends(registry, data);
267
+ }
268
+
269
+ /**
270
+ * Apply a definition's `extends` directives (FR-033 S1.5) via `registry.extend`.
271
+ * For each directive: resolve the target subtypes (`"*"` → every registered subtype
272
+ * of the type; a list → each named subtype; a string → that one), lower its `attr`
273
+ * children to `AttrSchema[]`, and `registry.extend(type, sub, { attributes })`.
274
+ * Concern providers contribute attrs only — a non-`attr` child is rejected.
275
+ */
276
+ function applyExtends(registry: TypeRegistry, data: ProviderDefinition): void {
277
+ for (const ext of data.extends ?? []) {
278
+ const attributes: AttrSchema[] = [];
279
+ for (const child of ext.children) {
280
+ if (!isAttrChild(child)) {
281
+ throw new Error(
282
+ `applyProviderDefinition(${data.provider}): extends "${ext.type}" may only carry attr ` +
283
+ `children; found a structural child "${child.type}".`,
284
+ );
285
+ }
286
+ validateCardinality(data.provider, ext.type, child);
287
+ attributes.push(toAttrSchema(data.provider, ext.type, child));
288
+ }
289
+ for (const subType of resolveExtendSubTypes(registry, ext)) {
290
+ registry.extend(ext.type, subType, { attributes });
291
+ }
292
+ }
293
+ }
294
+
295
+ /**
296
+ * Resolve an `ExtendDef`'s `subType` selector to concrete subtype names:
297
+ * - `"*"` → every currently-registered subtype of `ext.type`;
298
+ * - a list → each named subtype, in declared order;
299
+ * - a single string → that one subtype.
300
+ */
301
+ function resolveExtendSubTypes(registry: TypeRegistry, ext: ExtendDef): readonly string[] {
302
+ if (ext.subType === CHILD_RULE_WILDCARD) {
303
+ return registry.allSubTypesOf(ext.type);
304
+ }
305
+ return Array.isArray(ext.subType) ? ext.subType : [ext.subType as string];
306
+ }
307
+
308
+ /**
309
+ * Lower the universal `*.*` entry's named `attr` children into `AttrSchema[]` for
310
+ * `registry.registerCommonAttrs(...)`. Returns `[]` when no `*.*` entry is present.
311
+ * Same field mapping as `toAttrSchema`. Exported for callers that register common
312
+ * attrs themselves; `applyProviderDefinition` is the usual door.
313
+ */
314
+ export function universalCommonAttrs(data: ProviderDefinition): AttrSchema[] {
315
+ const universal = (data.types ?? []).find(isUniversalEntry);
316
+ if (universal === undefined) return [];
317
+ const key = `${universal.type}.${universal.subType}`;
318
+ const out: AttrSchema[] = [];
319
+ for (const child of universal.children ?? []) {
320
+ if (!isAttrChild(child)) {
321
+ throw new Error(
322
+ `applyProviderDefinition(${data.provider}): the universal "${key}" entry may only ` +
323
+ `carry attr children (common attrs); found a structural child "${child.type}".`,
324
+ );
325
+ }
326
+ validateCardinality(data.provider, key, child);
327
+ out.push(toAttrSchema(data.provider, key, child));
328
+ }
329
+ return out;
330
+ }
331
+
332
+ /**
333
+ * Fold a real `TypeDef`'s OWN lowered attrs/childRules with its `<type>.base`'s
334
+ * (when the definition declares one and this subtype is not itself `base`).
335
+ * Additive: own entries win on a name (attr) / structural-shape (rule) collision;
336
+ * base entries the subtype lacks are appended. A NO-OP when there is no base in
337
+ * THIS definition, or when the subtype already declares the full base set.
338
+ */
339
+ function composeWithBase(
340
+ t: TypeDef,
341
+ self: { attributes: AttrSchema[]; childRules: ChildRule[] },
342
+ lowered: Map<string, { attributes: AttrSchema[]; childRules: ChildRule[] }>,
343
+ ): { attributes: AttrSchema[]; childRules: ChildRule[] } {
344
+ // OFF by default (S0): a subtype inherits its base only when it opts in via
345
+ // `extendsBase: true`. Keeps the current canonical byte-identical — no provider
346
+ // sets it yet — while the rail is in place for S1.
347
+ if (t.extendsBase !== true) return self;
348
+ if (t.subType === SUBTYPE_BASE) return self;
349
+ const base = lowered.get(`${t.type}.${SUBTYPE_BASE}`);
350
+ if (base === undefined) return self;
351
+
352
+ const attributes = [...self.attributes];
353
+ const haveAttr = new Set(attributes.map((a) => a.name));
354
+ for (const baseAttr of base.attributes) {
355
+ if (!haveAttr.has(baseAttr.name)) {
356
+ attributes.push(baseAttr);
357
+ haveAttr.add(baseAttr.name);
358
+ }
359
+ }
360
+
361
+ const childRules = [...self.childRules];
362
+ const haveRule = new Set(childRules.map(childRuleId));
363
+ for (const baseRule of base.childRules) {
364
+ const id = childRuleId(baseRule);
365
+ if (!haveRule.has(id)) {
366
+ childRules.push(baseRule);
367
+ haveRule.add(id);
368
+ }
369
+ }
370
+
371
+ return { attributes, childRules };
372
+ }
373
+
374
+ /** A stable structural identity for a ChildRule (base-composition dedup). */
375
+ function childRuleId(rule: ChildRule): string {
376
+ const sub =
377
+ typeof rule.childSubType === "string"
378
+ ? rule.childSubType
379
+ : [...rule.childSubType].sort().join("|");
380
+ return [
381
+ rule.childType,
382
+ sub,
383
+ rule.childName,
384
+ rule.min ?? "",
385
+ rule.max === null ? "null" : (rule.max ?? ""),
386
+ rule.named ?? "",
387
+ ].join(" ");
388
+ }
389
+
390
+ /** Validate the min/max axis (and attr single-valuedness) for one child entry. */
391
+ function validateCardinality(provider: string, typeKey: string, child: ChildDef): void {
392
+ if (child.min < 0) {
393
+ throw new Error(
394
+ `defineProviderFromData(${provider}): child "${child.name}" on "${typeKey}" has min ${child.min} < 0.`,
395
+ );
396
+ }
397
+ if (child.max !== null && child.max < child.min) {
398
+ throw new Error(
399
+ `defineProviderFromData(${provider}): child "${child.name}" on "${typeKey}" has max ${child.max} < min ${child.min}.`,
400
+ );
401
+ }
402
+ if (isAttrChild(child) && child.max !== 1 && child.isArray !== true) {
403
+ throw new Error(
404
+ `defineProviderFromData(${provider}): attr "${child.name}" on "${typeKey}" is single-valued ` +
405
+ `(max must be 1; a list-valued attr sets isArray: true).`,
406
+ );
407
+ }
408
+ }
409
+
410
+ /** An `type: "attr"` child entry IS an `AttrSchema`. */
411
+ function toAttrSchema(provider: string, typeKey: string, child: ChildDef): AttrSchema {
412
+ if (Array.isArray(child.subType)) {
413
+ throw new Error(
414
+ `defineProviderFromData(${provider}): attr "${child.name}" on "${typeKey}" declares a list subType ` +
415
+ `— an attr's value-type is a single subtype.`,
416
+ );
417
+ }
418
+ return {
419
+ name: child.name,
420
+ ...(child.subType !== undefined ? { valueType: child.subType as AttrSubType } : {}),
421
+ ...(child.isArray !== undefined ? { isArray: child.isArray } : {}),
422
+ required: child.min >= 1,
423
+ ...(child.default !== undefined ? { default: child.default as AttrValue } : {}),
424
+ ...(child.allowedValues !== undefined
425
+ ? { allowedValues: child.allowedValues as readonly AttrValue[] }
426
+ : {}),
427
+ description: child.description ?? "",
428
+ ...(child.rules !== undefined ? { rules: child.rules } : {}),
429
+ ...(child.example !== undefined ? { example: child.example } : {}),
430
+ ...(child.whenToUse !== undefined ? { whenToUse: child.whenToUse } : {}),
431
+ };
432
+ }
433
+
434
+ /** A structural (`type !== "attr"`) child entry IS a `ChildRule`. */
435
+ function toChildRule(child: ChildDef): ChildRule {
436
+ return {
437
+ childType: child.type,
438
+ // A structural child always supplies a subType; default to the `"*"`
439
+ // wildcard if (unusually) omitted, so the rule stays well-formed.
440
+ childSubType: child.subType ?? CHILD_RULE_WILDCARD,
441
+ childName: child.name,
442
+ min: child.min,
443
+ max: child.max,
444
+ ...(child.named !== undefined ? { named: child.named } : {}),
445
+ };
446
+ }
package/src/provider.ts CHANGED
@@ -7,6 +7,8 @@
7
7
 
8
8
  import { TypeRegistry } from "./registry.js";
9
9
  import { MetaModelError } from "./errors.js";
10
+ import { mergeConstraints } from "./constraint-merge.js";
11
+ import { validateConstraints } from "./constraint-validate.js";
10
12
 
11
13
  /** A unit of metamodel registration. One provider per package. */
12
14
  export interface MetaDataTypeProvider {
@@ -28,12 +30,28 @@ export interface MetaDataTypeProvider {
28
30
  */
29
31
  export function composeRegistry(
30
32
  providers: readonly MetaDataTypeProvider[],
33
+ opts?: { validate?: boolean },
31
34
  ): TypeRegistry {
32
35
  const ordered = topoSortProviders(providers);
33
36
  const registry = new TypeRegistry();
34
37
  for (const provider of ordered) {
35
38
  provider.registerTypes(registry);
36
39
  }
40
+ // FR-033 — opt-in metamodel contradiction gate. The library bootstrap (the
41
+ // loader's default registry) sets validate:true so a contradictory provider set
42
+ // fails fast at bootstrap (mirrors ADR-0023 strictness). Off by default so
43
+ // synthetic/partial registries (tests, incremental composition) are unaffected.
44
+ if (opts?.validate === true) {
45
+ const contradictions = validateConstraints(mergeConstraints(registry), registry);
46
+ if (contradictions.length > 0) {
47
+ throw new MetaModelError(
48
+ `composeRegistry: the provider set has ${contradictions.length} metamodel ` +
49
+ `constraint contradiction(s) (FR-033):\n` +
50
+ contradictions.map((e) => ` - ${e.message}`).join("\n"),
51
+ { code: "ERR_INVALID_METAMODEL_CONSTRAINT" },
52
+ );
53
+ }
54
+ }
37
55
  return registry;
38
56
  }
39
57