@metaobjectsdev/metadata 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -5,9 +5,9 @@
5
5
  // carries the LLM-overlay attrs. References (@payloadRef, @textRef) are plain
6
6
  // strings here — resolution against a real payload / text source is render-time
7
7
  // `verify` scope (Plan #3), not load-time validation.
8
- import { ATTR_SUBTYPE_STRING, ATTR_SUBTYPE_INT, ATTR_SUBTYPE_STRINGARRAY, } from "../core/attr/attr-constants.js";
8
+ import { ATTR_SUBTYPE_STRING, ATTR_SUBTYPE_INT, } from "../core/attr/attr-constants.js";
9
9
  import { SUBTYPE_BASE } from "../shared/base-types.js";
10
- import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, TEMPLATE_ATTR_PROMPT_STYLE, PROMPT_STYLE_DEFAULT, PROMPT_STYLES, TEMPLATE_ATTR_KIND, TEMPLATE_KINDS, TEMPLATE_KIND_DEFAULT, TEMPLATE_ATTR_SUBJECT_REF, TEMPLATE_ATTR_HTML_BODY_REF, TEMPLATE_ATTR_TEXT_BODY_REF, } from "./template-constants.js";
10
+ import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_RESPONSE_REF, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, TEMPLATE_ATTR_PROMPT_STYLE, PROMPT_STYLE_DEFAULT, PROMPT_STYLES, TEMPLATE_ATTR_KIND, TEMPLATE_KINDS, TEMPLATE_KIND_DEFAULT, TEMPLATE_ATTR_SUBJECT_REF, TEMPLATE_ATTR_HTML_BODY_REF, TEMPLATE_ATTR_TEXT_BODY_REF, } from "./template-constants.js";
11
11
  // Generic attrs shared by template.prompt and template.output.
12
12
  const genericAttrs = [
13
13
  {
@@ -55,7 +55,8 @@ const genericAttrs = [
55
55
  },
56
56
  {
57
57
  name: TEMPLATE_ATTR_REQUIRED_TAGS,
58
- valueType: ATTR_SUBTYPE_STRINGARRAY,
58
+ valueType: ATTR_SUBTYPE_STRING,
59
+ isArray: true,
59
60
  required: false,
60
61
  description: "Output tags the rendered text must contain (drives the verify output-tag check).",
61
62
  },
@@ -114,7 +115,8 @@ const promptOverlayAttrs = [
114
115
  },
115
116
  {
116
117
  name: TEMPLATE_ATTR_REQUIRED_SLOTS,
117
- valueType: ATTR_SUBTYPE_STRINGARRAY,
118
+ valueType: ATTR_SUBTYPE_STRING,
119
+ isArray: true,
118
120
  required: false,
119
121
  description: "Slots that must resolve at render time (drives the verify check).",
120
122
  },
@@ -124,6 +126,12 @@ const promptOverlayAttrs = [
124
126
  required: false,
125
127
  description: "Target model id (LLM-specific).",
126
128
  },
129
+ {
130
+ name: TEMPLATE_ATTR_RESPONSE_REF,
131
+ valueType: ATTR_SUBTYPE_STRING,
132
+ required: false,
133
+ description: "Optional ref to the response value-object this prompt expects (peer of @payloadRef; drives typed LLM-call trace derivation).",
134
+ },
127
135
  ];
128
136
  // Toolcall attrs (template.toolcall only — does NOT inherit genericAttrs).
129
137
  // Per ADR-0011: vendor-agnostic in core; vendor wire details (retry semantics,
@@ -1 +1 @@
1
- {"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaobjectsdev/metadata",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "Metamodel loader, types, and constants for the MetaObjects standard.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -17,7 +17,12 @@
17
17
  "default": "./dist/core/index.js"
18
18
  }
19
19
  },
20
- "files": ["dist", "src", "README.md", "LICENSE"],
20
+ "files": [
21
+ "dist",
22
+ "src",
23
+ "README.md",
24
+ "LICENSE"
25
+ ],
21
26
  "scripts": {
22
27
  "build": "tsc -p .",
23
28
  "typecheck": "tsc -p tsconfig.typecheck.json",
@@ -27,24 +32,30 @@
27
32
  "author": "Doug Mealing <doug@dougmealing.com>",
28
33
  "homepage": "https://metaobjects.dev",
29
34
  "bugs": {
30
- "url": "https://github.com/metaobjectsdev/metaobjects/issues"
31
- },
32
- "repository": {
33
- "type": "git",
34
- "url": "https://github.com/metaobjectsdev/metaobjects.git",
35
- "directory": "server/typescript/packages/metadata"
36
- },
37
- "keywords": ["metaobjects", "metadata", "schema", "loader", "typescript"],
38
- "publishConfig": {
39
- "access": "public"
40
- },
41
- "dependencies": {
42
- "yaml": "^2.9.0"
43
- },
44
- "devDependencies": {
45
- "@metaobjectsdev/conformance": "0.1.0",
46
- "@stryker-mutator/core": "^9.6.1",
47
- "bun-types": "latest",
48
- "typescript": "^5.6.0"
49
- }
35
+ "url": "https://github.com/metaobjectsdev/metaobjects/issues"
36
+ },
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/metaobjectsdev/metaobjects.git",
40
+ "directory": "server/typescript/packages/metadata"
41
+ },
42
+ "keywords": [
43
+ "metaobjects",
44
+ "metadata",
45
+ "schema",
46
+ "loader",
47
+ "typescript"
48
+ ],
49
+ "publishConfig": {
50
+ "access": "public"
51
+ },
52
+ "dependencies": {
53
+ "yaml": "^2.9.0"
54
+ },
55
+ "devDependencies": {
56
+ "@metaobjectsdev/conformance": "0.1.0",
57
+ "@stryker-mutator/core": "^9.6.1",
58
+ "bun-types": "latest",
59
+ "typescript": "^5.6.0"
60
+ }
50
61
  }
@@ -12,7 +12,21 @@
12
12
  // MetaAttr instance's own validateValue.
13
13
  // 3. allowedValues honored — declared attrs with a non-empty
14
14
  // allowedValues set must hold a member value.
15
- // 4. Undeclared attrs — NOT an error, NOT a warning (open policy).
15
+ // 4. Undeclared attrs — under strict load (ADR-0023) an own
16
+ // @-attr that matches NO per-type attr
17
+ // schema AND NO commonAttr is an
18
+ // ERR_UNKNOWN_ATTR. In lax mode (strict
19
+ // false) it stays the legacy open policy:
20
+ // NOT an error, NOT a warning. Own-only,
21
+ // so an inherited/overlaid declared attr
22
+ // (validated on its declaring node) is fine.
23
+ // 5. Structural-child placement — FR-033: under strict load a STRUCTURAL
24
+ // (Check 0b) child (field/identity/source/… — not an
25
+ // attr) not admitted by the parent's
26
+ // registered childRules is ERR_CHILD_NOT_
27
+ // ALLOWED (the structural analogue of #4). A
28
+ // no-op under today's wildcard childRules —
29
+ // the rail strict per-subtype rules use in S1.
16
30
  //
17
31
  // `default` values are NOT auto-applied — A3 is pure validation, not mutation.
18
32
  //
@@ -30,7 +44,9 @@
30
44
  import type { MetaData } from "./shared/meta-data.js";
31
45
  import { ParseError } from "./errors.js";
32
46
  import type { AttrSchema, TypeRegistry } from "./registry.js";
47
+ import { childRuleMatches } from "./registry.js";
33
48
  import { TYPE_FIELD } from "./shared/base-types.js";
49
+ import { ATTR_SUBTYPE_PROPERTIES } from "./core/attr/attr-constants.js";
34
50
  import {
35
51
  FIELD_SUBTYPE_ENUM,
36
52
  FIELD_ATTR_VALUES,
@@ -57,13 +73,18 @@ export interface AttrSchemaValidationResult {
57
73
  export function validateAttrSchema(
58
74
  root: MetaData,
59
75
  registry: TypeRegistry,
76
+ // ADR-0023 — strict load closes the open-attr policy: an own @-attr matching
77
+ // no per-type schema and no commonAttr → ERR_UNKNOWN_ATTR. Defaults false so
78
+ // existing lax callers keep the legacy open policy; the library's own loader
79
+ // (and the conformance runner) load strict.
80
+ strict = false,
60
81
  ): AttrSchemaValidationResult {
61
82
  const errors: ParseError[] = [];
62
83
  // Tracks (type.subType) pairs for which ERR_PROVIDER_ATTR_CONFLICT has already
63
84
  // been emitted. The conflict is a registry-state condition, not a per-node
64
85
  // condition — emit it once per (type, subType), not once per node instance.
65
86
  const reportedConflicts = new Set<string>();
66
- walk(root, registry, errors, reportedConflicts);
87
+ walk(root, registry, errors, reportedConflicts, strict);
67
88
  return { errors, warnings: [] };
68
89
  }
69
90
 
@@ -72,10 +93,11 @@ function walk(
72
93
  registry: TypeRegistry,
73
94
  errors: ParseError[],
74
95
  reportedConflicts: Set<string>,
96
+ strict: boolean,
75
97
  ): void {
76
- validateNode(node, registry, errors, reportedConflicts);
98
+ validateNode(node, registry, errors, reportedConflicts, strict);
77
99
  for (const child of node.ownChildren()) {
78
- walk(child, registry, errors, reportedConflicts);
100
+ walk(child, registry, errors, reportedConflicts, strict);
79
101
  }
80
102
  }
81
103
 
@@ -90,6 +112,7 @@ function validateNode(
90
112
  registry: TypeRegistry,
91
113
  errors: ParseError[],
92
114
  reportedConflicts: Set<string>,
115
+ strict: boolean,
93
116
  ): void {
94
117
  // Build the effective schema in a single pass: per-type attrs win on name
95
118
  // collision; common attrs fill in for unclaimed names. Surface common-vs-per-type
@@ -118,6 +141,75 @@ function validateNode(
118
141
  byName.set(ca.name, ca);
119
142
  }
120
143
 
144
+ // --- Check 0 (ADR-0023): strict-load undeclared-attr rejection ---
145
+ //
146
+ // Runs BEFORE the byName.size early-return: a node type with no per-type
147
+ // schema and no common attrs (byName empty) must still reject an authored
148
+ // @-attr under strict. Own-attrs only — an inherited/overlaid declared attr
149
+ // was validated on its declaring node and never appears in ownMetaAttrs().
150
+ // An own attr matching neither a per-type schema entry nor a commonAttr is
151
+ // a made-up attribute → ERR_UNKNOWN_ATTR (closing the open policy). In lax
152
+ // mode this stays a no-op (legacy open-attr behavior).
153
+ if (strict) {
154
+ for (const inst of node.ownMetaAttrs()) {
155
+ // attr.properties is a first-class, registered, canonical attr subtype
156
+ // whose designed purpose is an arbitrary-named structural property bag
157
+ // (its NAME is intentionally not declared by any per-type schema). It is
158
+ // sanctioned vocabulary, not a made-up attribute, so strict-attr exempts
159
+ // a materialized properties-attr from ERR_UNKNOWN_ATTR. (A typo'd plain
160
+ // @-attr still fails — only the `properties` subtype is exempt.)
161
+ if (inst.subType === ATTR_SUBTYPE_PROPERTIES) continue;
162
+ if (!byName.has(inst.name)) {
163
+ errors.push(
164
+ new ParseError(
165
+ `Unknown attribute '@${inst.name}' on ${nodeLabel(node)} — ` +
166
+ `not declared by any registered provider for ${typeKey}`,
167
+ { code: "ERR_UNKNOWN_ATTR", source: node.source },
168
+ ),
169
+ );
170
+ }
171
+ }
172
+ }
173
+
174
+ // --- Check 0b (FR-033): strict-load structural-child placement ---
175
+ //
176
+ // The structural analogue of Check 0. A STRUCTURAL child (field/identity/
177
+ // source/validator/… — attrs never appear in ownChildren()) must be admitted
178
+ // by the parent's registered childRules under the same wildcard match
179
+ // semantics used everywhere (childType/childSubType/childName may be "*", and
180
+ // childSubType may be a list). A child the rules do not admit → ERR_CHILD_NOT_
181
+ // ALLOWED. A NO-OP today: every parent carries wildcard structural childRules
182
+ // (e.g. field.* / validator.*) that admit everything — the rail strict
183
+ // per-subtype rules will use in S1. Lax mode keeps the legacy open policy.
184
+ //
185
+ // An UNREGISTERED parent (no def) cannot be judged here (ERR_UNKNOWN_TYPE /
186
+ // ERR_UNKNOWN_SUBTYPE is reported elsewhere); skip so we never double-report.
187
+ if (strict) {
188
+ const parentDef = registry.find(node.type, node.subType);
189
+ if (parentDef !== undefined) {
190
+ const rules = parentDef.childRules;
191
+ for (const child of node.ownChildren()) {
192
+ const admitted = rules.some((r) =>
193
+ childRuleMatches(r, {
194
+ type: child.type,
195
+ subType: child.subType,
196
+ name: child.name,
197
+ }),
198
+ );
199
+ if (!admitted) {
200
+ errors.push(
201
+ new ParseError(
202
+ `Child ${nodeLabel(child)} is not allowed under ${nodeLabel(node)} — ` +
203
+ `no registered child rule for ${typeKey} admits ` +
204
+ `(type='${child.type}', subType='${child.subType}', name='${child.name}')`,
205
+ { code: "ERR_CHILD_NOT_ALLOWED", source: node.source },
206
+ ),
207
+ );
208
+ }
209
+ }
210
+ }
211
+ }
212
+
121
213
  if (byName.size === 0) return;
122
214
 
123
215
  // --- Check 1: required attrs present ---
Binary file
@@ -0,0 +1,363 @@
1
+ // FR-033 — the metamodel contradiction validator (spec §3.1, the six checks).
2
+ //
3
+ // `validateConstraints(effective, registry)` runs the six contradiction checks over
4
+ // the merged constraint graph and returns one MetaModelError per contradiction
5
+ // (code ERR_INVALID_METAMODEL_CONSTRAINT). It is the cross-validation pass: the merge
6
+ // (constraint-merge.ts) is purely additive, so this pass is the ONLY place a bad
7
+ // provider set is rejected. Wired into composeRegistry's seal-time bootstrap so a
8
+ // contradictory library provider set fails fast (mirrors ADR-0023 strictness).
9
+ //
10
+ // The six checks (spec §3.1):
11
+ // 1. Dangling ref — a parents/children rule references an unregistered type.subType.
12
+ // 2. Unsatisfiable req. — a required child (min>=1) whose concrete type.subType is
13
+ // not admitted under that parent (after merge).
14
+ // 3. Bad cardinality — min>max (max non-null), max:0 with min>=1, or min<0.
15
+ // 4. Closed-set clash — child C claims parent P via `parents`, but P's OWN children
16
+ // is a CLOSED set (no `*` wildcard) that does not admit C.
17
+ // 5. Required-child cycle— following required (min>=1) child edges forms a cycle.
18
+ // 6. Conflicting attr — same attr name contributed twice (across providers or the
19
+ // extends chain) with a conflicting valueType/required/default.
20
+
21
+ import type {
22
+ AttrSchema,
23
+ ChildRule,
24
+ TypeRegistry,
25
+ TypeDefinition,
26
+ } from "./registry.js";
27
+ import { childRuleMatches } from "./registry.js";
28
+ import { CHILD_RULE_WILDCARD } from "./shared/structural.js";
29
+ import { SUBTYPE_BASE } from "./shared/base-types.js";
30
+ import { MetaModelError } from "./errors.js";
31
+ import type { EffectiveConstraints } from "./constraint-merge.js";
32
+
33
+ const CODE = "ERR_INVALID_METAMODEL_CONSTRAINT" as const;
34
+
35
+ /** Run the six contradiction checks; one MetaModelError per contradiction. */
36
+ export function validateConstraints(
37
+ effective: Map<string, EffectiveConstraints>,
38
+ registry: TypeRegistry,
39
+ ): MetaModelError[] {
40
+ const errors: MetaModelError[] = [];
41
+ const registered = new Set(
42
+ registry.allTypes().map((id) => `${id.type}.${id.subType}`),
43
+ );
44
+
45
+ const sortedKeys = [...effective.keys()].sort();
46
+
47
+ for (const k of sortedKeys) {
48
+ const eff = effective.get(k)!;
49
+
50
+ // --- #1 dangling ref (children) + #3 bad cardinality.
51
+ for (const rule of eff.children) {
52
+ checkDangling(k, rule, registered, errors);
53
+ checkCardinality(k, rule, errors);
54
+ }
55
+
56
+ // --- #1 dangling ref (parents).
57
+ for (const parent of eff.parents) {
58
+ if (!registered.has(parent)) {
59
+ errors.push(
60
+ err(`dangling: type "${k}" claims parent "${parent}", which is not registered.`),
61
+ );
62
+ }
63
+ }
64
+
65
+ // --- #2 unsatisfiable required child.
66
+ for (const rule of eff.children) {
67
+ checkUnsatisfiable(k, rule, registered, errors);
68
+ }
69
+ }
70
+
71
+ // --- #4 closed-set clash: a child's `parents` claim vs the parent's OWN children.
72
+ for (const id of registry.allTypes()) {
73
+ const childKey = `${id.type}.${id.subType}`;
74
+ const def = registry.find(id.type, id.subType);
75
+ for (const parent of def?.parents ?? []) {
76
+ checkClosedSetClash(childKey, id.type, id.subType, parent, registry, errors);
77
+ }
78
+ }
79
+
80
+ // --- #5 required-child cycle.
81
+ checkRequiredCycles(effective, sortedKeys, errors);
82
+
83
+ // --- #6 conflicting attr redefinition (across the extends chain + providers).
84
+ for (const id of registry.allTypes()) {
85
+ checkAttrConflicts(id.type, id.subType, registry, registered, errors);
86
+ }
87
+
88
+ return errors;
89
+ }
90
+
91
+ function err(detail: string): MetaModelError {
92
+ return new MetaModelError(`Invalid metamodel constraint — ${detail}`, { code: CODE });
93
+ }
94
+
95
+ /** #1 — a concrete (non-wildcard) child rule whose type.subType is unregistered. */
96
+ function checkDangling(
97
+ parentKey: string,
98
+ rule: ChildRule,
99
+ registered: ReadonlySet<string>,
100
+ errors: MetaModelError[],
101
+ ): void {
102
+ if (rule.childType === CHILD_RULE_WILDCARD) return; // a wildcard names nothing
103
+ const subTypes = subTypesOf(rule);
104
+ for (const sub of subTypes) {
105
+ if (sub === CHILD_RULE_WILDCARD) continue; // wildcard subtype names nothing
106
+ const refKey = `${rule.childType}.${sub}`;
107
+ if (!registered.has(refKey)) {
108
+ errors.push(
109
+ err(
110
+ `dangling: child rule on "${parentKey}" references "${refKey}", which is not registered.`,
111
+ ),
112
+ );
113
+ }
114
+ }
115
+ }
116
+
117
+ /** #3 — min<0, min>max (max non-null), or max:0 with min>=1. */
118
+ function checkCardinality(
119
+ parentKey: string,
120
+ rule: ChildRule,
121
+ errors: MetaModelError[],
122
+ ): void {
123
+ const min = rule.min ?? 0;
124
+ const max = rule.max ?? null;
125
+ const label = describeRule(rule);
126
+ if (min < 0) {
127
+ errors.push(err(`bad cardinality on "${parentKey}" (${label}): min ${min} < 0.`));
128
+ return;
129
+ }
130
+ if (max !== null && max < min) {
131
+ errors.push(
132
+ err(`bad cardinality on "${parentKey}" (${label}): min ${min} > max ${max}.`),
133
+ );
134
+ return;
135
+ }
136
+ if (max === 0 && min >= 1) {
137
+ errors.push(
138
+ err(`bad cardinality on "${parentKey}" (${label}): max 0 with min ${min} >= 1.`),
139
+ );
140
+ }
141
+ }
142
+
143
+ /**
144
+ * #2 — a required child rule (min>=1) naming concrete subtype(s) where NONE of the
145
+ * named type.subTypes is admitted under this parent (after merge). A required rule
146
+ * with a wildcard type is always satisfiable; a required rule naming a concrete
147
+ * subtype that is registered AND covered by an admitting rule (the rule itself, or
148
+ * another rule) is satisfiable. Unsatisfiable iff the required child cannot be placed.
149
+ */
150
+ function checkUnsatisfiable(
151
+ parentKey: string,
152
+ rule: ChildRule,
153
+ registered: ReadonlySet<string>,
154
+ errors: MetaModelError[],
155
+ ): void {
156
+ const min = rule.min ?? 0;
157
+ if (min < 1) return; // optional → nothing to satisfy
158
+ if (rule.childType === CHILD_RULE_WILDCARD) return; // any child satisfies it
159
+
160
+ // A required rule must name at least one concrete, REGISTERED subtype that some
161
+ // rule (incl. itself) admits. If none of its named subtypes is registered, the
162
+ // required child can never be instantiated → unsatisfiable.
163
+ const subTypes = subTypesOf(rule);
164
+ const concrete = subTypes.filter((s) => s !== CHILD_RULE_WILDCARD);
165
+ if (concrete.length === 0) return; // required of `type.*` — any registered subtype satisfies
166
+
167
+ const anyRegistered = concrete.some((s) => registered.has(`${rule.childType}.${s}`));
168
+ if (!anyRegistered) {
169
+ errors.push(
170
+ err(
171
+ `unsatisfiable required child on "${parentKey}" (${describeRule(rule)}): ` +
172
+ `min ${min} but no named subtype of "${rule.childType}" is registered.`,
173
+ ),
174
+ );
175
+ }
176
+ }
177
+
178
+ /**
179
+ * #4 — child C declares parent P via `parents`, but P's OWN children is a CLOSED set
180
+ * (no `*` wildcard rule) that does not admit C. An OPEN parent (any `*` rule) admits
181
+ * anything → no clash.
182
+ */
183
+ function checkClosedSetClash(
184
+ childKey: string,
185
+ childType: string,
186
+ childSubType: string,
187
+ parentKey: string,
188
+ registry: TypeRegistry,
189
+ errors: MetaModelError[],
190
+ ): void {
191
+ const parentDef = lookup(parentKey, registry);
192
+ if (parentDef === undefined) return; // dangling parent — reported by #1
193
+
194
+ const ownRules = parentDef.childRules;
195
+ const isOpen = ownRules.some((r) => isWildcardRule(r));
196
+ if (isOpen) return; // open parent admits anything
197
+
198
+ const admits = ownRules.some((r) =>
199
+ childRuleMatches(r, { type: childType, subType: childSubType, name: CHILD_RULE_WILDCARD }),
200
+ );
201
+ if (!admits) {
202
+ errors.push(
203
+ err(
204
+ `closed-set clash: child "${childKey}" claims parent "${parentKey}", but ` +
205
+ `"${parentKey}"'s children is a closed set (no wildcard) that does not admit it.`,
206
+ ),
207
+ );
208
+ }
209
+ }
210
+
211
+ /**
212
+ * #5 — required-child cycle: following required (min>=1) child edges forms a cycle.
213
+ * An edge A→B exists when A has a required rule naming a concrete subtype B. A cycle
214
+ * with no non-required escape can never bottom out (A requires B requires A).
215
+ */
216
+ function checkRequiredCycles(
217
+ effective: Map<string, EffectiveConstraints>,
218
+ sortedKeys: string[],
219
+ errors: MetaModelError[],
220
+ ): void {
221
+ // Build the required-edge adjacency: A → each concrete required child subtype.
222
+ const edges = new Map<string, string[]>();
223
+ for (const k of sortedKeys) {
224
+ const targets: string[] = [];
225
+ for (const rule of effective.get(k)!.children) {
226
+ if ((rule.min ?? 0) < 1) continue;
227
+ if (rule.childType === CHILD_RULE_WILDCARD) continue;
228
+ for (const sub of subTypesOf(rule)) {
229
+ if (sub === CHILD_RULE_WILDCARD) continue;
230
+ targets.push(`${rule.childType}.${sub}`);
231
+ }
232
+ }
233
+ edges.set(k, targets);
234
+ }
235
+
236
+ // DFS for back-edges; report each distinct cycle once (keyed by its sorted node set).
237
+ const WHITE = 0,
238
+ GRAY = 1,
239
+ BLACK = 2;
240
+ const color = new Map<string, number>();
241
+ const reported = new Set<string>();
242
+ const stack: string[] = [];
243
+
244
+ const visit = (node: string): void => {
245
+ color.set(node, GRAY);
246
+ stack.push(node);
247
+ for (const next of edges.get(node) ?? []) {
248
+ if (!edges.has(next)) continue; // unregistered target — #1/#2 handles it
249
+ const c = color.get(next) ?? WHITE;
250
+ if (c === GRAY) {
251
+ // Back-edge → cycle. Extract the cycle slice from the stack.
252
+ const idx = stack.indexOf(next);
253
+ const cycle = stack.slice(idx);
254
+ const sig = [...cycle].sort().join(",");
255
+ if (!reported.has(sig)) {
256
+ reported.add(sig);
257
+ errors.push(
258
+ err(
259
+ `required-child cycle that cannot bottom out: ${cycle.concat(next).join(" -> ")}.`,
260
+ ),
261
+ );
262
+ }
263
+ } else if (c === WHITE) {
264
+ visit(next);
265
+ }
266
+ }
267
+ stack.pop();
268
+ color.set(node, BLACK);
269
+ };
270
+
271
+ for (const k of sortedKeys) {
272
+ if ((color.get(k) ?? WHITE) === WHITE) visit(k);
273
+ }
274
+ }
275
+
276
+ /**
277
+ * #6 — the same attr name contributed twice (across providers, or down the extends
278
+ * chain) with a CONFLICTING valueType / required / default. Walks each type's own
279
+ * attrs + its derived super (`<type>.base`) chain and compares same-name pairs.
280
+ */
281
+ function checkAttrConflicts(
282
+ type: string,
283
+ subType: string,
284
+ registry: TypeRegistry,
285
+ registered: ReadonlySet<string>,
286
+ errors: MetaModelError[],
287
+ ): void {
288
+ // Collect (attr, source-key) along the own → super chain.
289
+ const seen = new Map<string, { attr: AttrSchema; from: string }>();
290
+ const reported = new Set<string>();
291
+
292
+ let curType: string | undefined = type;
293
+ let curSub: string | undefined = subType;
294
+ const guard = new Set<string>();
295
+ while (curType !== undefined && curSub !== undefined) {
296
+ const k = `${curType}.${curSub}`;
297
+ if (guard.has(k)) break;
298
+ guard.add(k);
299
+ const def = registry.find(curType, curSub);
300
+ if (def !== undefined) {
301
+ for (const attr of def.attributes) {
302
+ const prior = seen.get(attr.name);
303
+ if (prior === undefined) {
304
+ seen.set(attr.name, { attr, from: k });
305
+ } else if (attrsConflict(prior.attr, attr)) {
306
+ const sig = `${attr.name}|${prior.from}|${k}`;
307
+ if (!reported.has(sig)) {
308
+ reported.add(sig);
309
+ errors.push(
310
+ err(
311
+ `conflicting attr redefinition: attr "${attr.name}" is declared on ` +
312
+ `"${prior.from}" and "${k}" with a conflicting valueType/required/default.`,
313
+ ),
314
+ );
315
+ }
316
+ }
317
+ }
318
+ }
319
+ // Advance up the derived super chain (`<type>.base`).
320
+ if (curSub === SUBTYPE_BASE) break;
321
+ const baseKey = `${curType}.${SUBTYPE_BASE}`;
322
+ if (!registered.has(baseKey)) break;
323
+ curSub = SUBTYPE_BASE;
324
+ }
325
+ }
326
+
327
+ /** Two same-name attrs conflict iff valueType, required, or default differ. */
328
+ function attrsConflict(a: AttrSchema, b: AttrSchema): boolean {
329
+ return (
330
+ a.valueType !== b.valueType ||
331
+ a.required !== b.required ||
332
+ !Object.is(a.default, b.default)
333
+ );
334
+ }
335
+
336
+ // --- helpers ---------------------------------------------------------------
337
+
338
+ function subTypesOf(rule: ChildRule): string[] {
339
+ const s = rule.childSubType;
340
+ return typeof s === "string" ? [s] : [...s];
341
+ }
342
+
343
+ function isWildcardRule(rule: ChildRule): boolean {
344
+ // An OPEN hook is a TYPE-wildcard rule (`*.*` / `*` of any subType) — it admits a
345
+ // child of any type, so a new type can land under this parent. A `field.*` rule is
346
+ // NOT open in this sense: it admits any field SUBTYPE but no other type, so a
347
+ // `policy` child still clashes. Per spec §3.1 #4, the open escape is a `*` (type)
348
+ // wildcard rule.
349
+ return rule.childType === CHILD_RULE_WILDCARD;
350
+ }
351
+
352
+ function describeRule(rule: ChildRule): string {
353
+ const sub = Array.isArray(rule.childSubType)
354
+ ? `[${rule.childSubType.join(",")}]`
355
+ : rule.childSubType;
356
+ return `${rule.childType}.${sub} ${rule.childName}`;
357
+ }
358
+
359
+ function lookup(key: string, registry: TypeRegistry): TypeDefinition | undefined {
360
+ const dot = key.indexOf(".");
361
+ if (dot < 0) return undefined;
362
+ return registry.find(key.slice(0, dot), key.slice(dot + 1));
363
+ }