@metaobjectsdev/metadata 0.5.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/LICENSE +189 -0
  2. package/README.md +29 -0
  3. package/dist/attr-class-map.d.ts +26 -0
  4. package/dist/attr-class-map.d.ts.map +1 -0
  5. package/dist/attr-class-map.js +44 -0
  6. package/dist/attr-class-map.js.map +1 -0
  7. package/dist/attr-schema-validate.d.ts +9 -0
  8. package/dist/attr-schema-validate.d.ts.map +1 -0
  9. package/dist/attr-schema-validate.js +100 -0
  10. package/dist/attr-schema-validate.js.map +1 -0
  11. package/dist/constants.d.ts +208 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +419 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/core/attr/attr-constants.d.ts +12 -0
  16. package/dist/core/attr/attr-constants.d.ts.map +1 -0
  17. package/dist/core/attr/attr-constants.js +27 -0
  18. package/dist/core/attr/attr-constants.js.map +1 -0
  19. package/dist/core/attr/meta-attr-filter.d.ts +10 -0
  20. package/dist/core/attr/meta-attr-filter.d.ts.map +1 -0
  21. package/dist/core/attr/meta-attr-filter.js +56 -0
  22. package/dist/core/attr/meta-attr-filter.js.map +1 -0
  23. package/dist/core/attr/meta-attr-properties.d.ts +9 -0
  24. package/dist/core/attr/meta-attr-properties.d.ts.map +1 -0
  25. package/dist/core/attr/meta-attr-properties.js +22 -0
  26. package/dist/core/attr/meta-attr-properties.js.map +1 -0
  27. package/dist/core/attr/meta-attr-stringarray.d.ts +9 -0
  28. package/dist/core/attr/meta-attr-stringarray.d.ts.map +1 -0
  29. package/dist/core/attr/meta-attr-stringarray.js +29 -0
  30. package/dist/core/attr/meta-attr-stringarray.js.map +1 -0
  31. package/dist/core/attr/meta-attr.d.ts +37 -0
  32. package/dist/core/attr/meta-attr.d.ts.map +1 -0
  33. package/dist/core/attr/meta-attr.js +97 -0
  34. package/dist/core/attr/meta-attr.js.map +1 -0
  35. package/dist/core/export-json.d.ts +29 -0
  36. package/dist/core/export-json.d.ts.map +1 -0
  37. package/dist/core/export-json.js +45 -0
  38. package/dist/core/export-json.js.map +1 -0
  39. package/dist/core/field/field-constants.d.ts +40 -0
  40. package/dist/core/field/field-constants.d.ts.map +1 -0
  41. package/dist/core/field/field-constants.js +66 -0
  42. package/dist/core/field/field-constants.js.map +1 -0
  43. package/dist/core/field/field-schema.d.ts +6 -0
  44. package/dist/core/field/field-schema.d.ts.map +1 -0
  45. package/dist/core/field/field-schema.js +92 -0
  46. package/dist/core/field/field-schema.js.map +1 -0
  47. package/dist/core/field/meta-field.d.ts +50 -0
  48. package/dist/core/field/meta-field.d.ts.map +1 -0
  49. package/dist/core/field/meta-field.js +121 -0
  50. package/dist/core/field/meta-field.js.map +1 -0
  51. package/dist/core/file-meta-data-loader.d.ts +18 -0
  52. package/dist/core/file-meta-data-loader.d.ts.map +1 -0
  53. package/dist/core/file-meta-data-loader.js +81 -0
  54. package/dist/core/file-meta-data-loader.js.map +1 -0
  55. package/dist/core/file-source.d.ts +12 -0
  56. package/dist/core/file-source.d.ts.map +1 -0
  57. package/dist/core/file-source.js +46 -0
  58. package/dist/core/file-source.js.map +1 -0
  59. package/dist/core/identity/identity-constants.d.ts +19 -0
  60. package/dist/core/identity/identity-constants.d.ts.map +1 -0
  61. package/dist/core/identity/identity-constants.js +35 -0
  62. package/dist/core/identity/identity-constants.js.map +1 -0
  63. package/dist/core/identity/identity-schema.d.ts +6 -0
  64. package/dist/core/identity/identity-schema.d.ts.map +1 -0
  65. package/dist/core/identity/identity-schema.js +55 -0
  66. package/dist/core/identity/identity-schema.js.map +1 -0
  67. package/dist/core/identity/meta-identity.d.ts +71 -0
  68. package/dist/core/identity/meta-identity.d.ts.map +1 -0
  69. package/dist/core/identity/meta-identity.js +129 -0
  70. package/dist/core/identity/meta-identity.js.map +1 -0
  71. package/dist/core/index.d.ts +6 -0
  72. package/dist/core/index.d.ts.map +1 -0
  73. package/dist/core/index.js +11 -0
  74. package/dist/core/index.js.map +1 -0
  75. package/dist/core/object/meta-object.d.ts +39 -0
  76. package/dist/core/object/meta-object.d.ts.map +1 -0
  77. package/dist/core/object/meta-object.js +80 -0
  78. package/dist/core/object/meta-object.js.map +1 -0
  79. package/dist/core/object/object-constants.d.ts +5 -0
  80. package/dist/core/object/object-constants.d.ts.map +1 -0
  81. package/dist/core/object/object-constants.js +18 -0
  82. package/dist/core/object/object-constants.js.map +1 -0
  83. package/dist/core/object/object-schema.d.ts +4 -0
  84. package/dist/core/object/object-schema.d.ts.map +1 -0
  85. package/dist/core/object/object-schema.js +5 -0
  86. package/dist/core/object/object-schema.js.map +1 -0
  87. package/dist/core/parser-yaml.d.ts +3 -0
  88. package/dist/core/parser-yaml.d.ts.map +1 -0
  89. package/dist/core/parser-yaml.js +39 -0
  90. package/dist/core/parser-yaml.js.map +1 -0
  91. package/dist/core/query/query-constants.d.ts +20 -0
  92. package/dist/core/query/query-constants.d.ts.map +1 -0
  93. package/dist/core/query/query-constants.js +56 -0
  94. package/dist/core/query/query-constants.js.map +1 -0
  95. package/dist/core/relationship/find-reference.d.ts +22 -0
  96. package/dist/core/relationship/find-reference.d.ts.map +1 -0
  97. package/dist/core/relationship/find-reference.js +29 -0
  98. package/dist/core/relationship/find-reference.js.map +1 -0
  99. package/dist/core/relationship/meta-relationship.d.ts +11 -0
  100. package/dist/core/relationship/meta-relationship.d.ts.map +1 -0
  101. package/dist/core/relationship/meta-relationship.js +27 -0
  102. package/dist/core/relationship/meta-relationship.js.map +1 -0
  103. package/dist/core/relationship/relationship-constants.d.ts +14 -0
  104. package/dist/core/relationship/relationship-constants.d.ts.map +1 -0
  105. package/dist/core/relationship/relationship-constants.js +28 -0
  106. package/dist/core/relationship/relationship-constants.js.map +1 -0
  107. package/dist/core/relationship/relationship-schema.d.ts +4 -0
  108. package/dist/core/relationship/relationship-schema.d.ts.map +1 -0
  109. package/dist/core/relationship/relationship-schema.js +37 -0
  110. package/dist/core/relationship/relationship-schema.js.map +1 -0
  111. package/dist/core/validator/meta-validator.d.ts +29 -0
  112. package/dist/core/validator/meta-validator.d.ts.map +1 -0
  113. package/dist/core/validator/meta-validator.js +49 -0
  114. package/dist/core/validator/meta-validator.js.map +1 -0
  115. package/dist/core/validator/validator-constants.d.ts +11 -0
  116. package/dist/core/validator/validator-constants.d.ts.map +1 -0
  117. package/dist/core/validator/validator-constants.js +25 -0
  118. package/dist/core/validator/validator-constants.js.map +1 -0
  119. package/dist/core/validator/validator-schema.d.ts +4 -0
  120. package/dist/core/validator/validator-schema.d.ts.map +1 -0
  121. package/dist/core/validator/validator-schema.js +38 -0
  122. package/dist/core/validator/validator-schema.js.map +1 -0
  123. package/dist/core/yaml-desugar.d.ts +10 -0
  124. package/dist/core/yaml-desugar.d.ts.map +1 -0
  125. package/dist/core/yaml-desugar.js +99 -0
  126. package/dist/core/yaml-desugar.js.map +1 -0
  127. package/dist/core-attr-schemas.d.ts +22 -0
  128. package/dist/core-attr-schemas.d.ts.map +1 -0
  129. package/dist/core-attr-schemas.js +324 -0
  130. package/dist/core-attr-schemas.js.map +1 -0
  131. package/dist/core-types.d.ts +20 -0
  132. package/dist/core-types.d.ts.map +1 -0
  133. package/dist/core-types.js +225 -0
  134. package/dist/core-types.js.map +1 -0
  135. package/dist/data-converter.d.ts +17 -0
  136. package/dist/data-converter.d.ts.map +1 -0
  137. package/dist/data-converter.js +117 -0
  138. package/dist/data-converter.js.map +1 -0
  139. package/dist/data-type.d.ts +15 -0
  140. package/dist/data-type.d.ts.map +1 -0
  141. package/dist/data-type.js +25 -0
  142. package/dist/data-type.js.map +1 -0
  143. package/dist/db/db-attr-schemas.d.ts +8 -0
  144. package/dist/db/db-attr-schemas.d.ts.map +1 -0
  145. package/dist/db/db-attr-schemas.js +26 -0
  146. package/dist/db/db-attr-schemas.js.map +1 -0
  147. package/dist/db/db-provider.d.ts +3 -0
  148. package/dist/db/db-provider.d.ts.map +1 -0
  149. package/dist/db/db-provider.js +28 -0
  150. package/dist/db/db-provider.js.map +1 -0
  151. package/dist/errors.d.ts +26 -0
  152. package/dist/errors.d.ts.map +1 -0
  153. package/dist/errors.js +59 -0
  154. package/dist/errors.js.map +1 -0
  155. package/dist/index.d.ts +70 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +76 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/loader/meta-data-loader.d.ts +87 -0
  160. package/dist/loader/meta-data-loader.d.ts.map +1 -0
  161. package/dist/loader/meta-data-loader.js +232 -0
  162. package/dist/loader/meta-data-loader.js.map +1 -0
  163. package/dist/loader/meta-data-source.d.ts +23 -0
  164. package/dist/loader/meta-data-source.d.ts.map +1 -0
  165. package/dist/loader/meta-data-source.js +20 -0
  166. package/dist/loader/meta-data-source.js.map +1 -0
  167. package/dist/loader/validation-passes.d.ts +7 -0
  168. package/dist/loader/validation-passes.d.ts.map +1 -0
  169. package/dist/loader/validation-passes.js +244 -0
  170. package/dist/loader/validation-passes.js.map +1 -0
  171. package/dist/meta/find-reference.d.ts +22 -0
  172. package/dist/meta/find-reference.d.ts.map +1 -0
  173. package/dist/meta/find-reference.js +29 -0
  174. package/dist/meta/find-reference.js.map +1 -0
  175. package/dist/meta/meta-attr.d.ts +8 -0
  176. package/dist/meta/meta-attr.d.ts.map +1 -0
  177. package/dist/meta/meta-attr.js +17 -0
  178. package/dist/meta/meta-attr.js.map +1 -0
  179. package/dist/meta/meta-data.d.ts +107 -0
  180. package/dist/meta/meta-data.d.ts.map +1 -0
  181. package/dist/meta/meta-data.js +302 -0
  182. package/dist/meta/meta-data.js.map +1 -0
  183. package/dist/meta/meta-field.d.ts +48 -0
  184. package/dist/meta/meta-field.d.ts.map +1 -0
  185. package/dist/meta/meta-field.js +94 -0
  186. package/dist/meta/meta-field.js.map +1 -0
  187. package/dist/meta/meta-identity.d.ts +71 -0
  188. package/dist/meta/meta-identity.d.ts.map +1 -0
  189. package/dist/meta/meta-identity.js +129 -0
  190. package/dist/meta/meta-identity.js.map +1 -0
  191. package/dist/meta/meta-layout.d.ts +23 -0
  192. package/dist/meta/meta-layout.d.ts.map +1 -0
  193. package/dist/meta/meta-layout.js +45 -0
  194. package/dist/meta/meta-layout.js.map +1 -0
  195. package/dist/meta/meta-object.d.ts +40 -0
  196. package/dist/meta/meta-object.d.ts.map +1 -0
  197. package/dist/meta/meta-object.js +81 -0
  198. package/dist/meta/meta-object.js.map +1 -0
  199. package/dist/meta/meta-origin.d.ts +32 -0
  200. package/dist/meta/meta-origin.d.ts.map +1 -0
  201. package/dist/meta/meta-origin.js +55 -0
  202. package/dist/meta/meta-origin.js.map +1 -0
  203. package/dist/meta/meta-relationship.d.ts +11 -0
  204. package/dist/meta/meta-relationship.d.ts.map +1 -0
  205. package/dist/meta/meta-relationship.js +27 -0
  206. package/dist/meta/meta-relationship.js.map +1 -0
  207. package/dist/meta/meta-root.d.ts +12 -0
  208. package/dist/meta/meta-root.d.ts.map +1 -0
  209. package/dist/meta/meta-root.js +24 -0
  210. package/dist/meta/meta-root.js.map +1 -0
  211. package/dist/meta/meta-source.d.ts +18 -0
  212. package/dist/meta/meta-source.d.ts.map +1 -0
  213. package/dist/meta/meta-source.js +31 -0
  214. package/dist/meta/meta-source.js.map +1 -0
  215. package/dist/meta/meta-validator.d.ts +29 -0
  216. package/dist/meta/meta-validator.d.ts.map +1 -0
  217. package/dist/meta/meta-validator.js +49 -0
  218. package/dist/meta/meta-validator.js.map +1 -0
  219. package/dist/meta/meta-view.d.ts +4 -0
  220. package/dist/meta/meta-view.d.ts.map +1 -0
  221. package/dist/meta/meta-view.js +8 -0
  222. package/dist/meta/meta-view.js.map +1 -0
  223. package/dist/naming.d.ts +27 -0
  224. package/dist/naming.d.ts.map +1 -0
  225. package/dist/naming.js +72 -0
  226. package/dist/naming.js.map +1 -0
  227. package/dist/object-serializer.d.ts +10 -0
  228. package/dist/object-serializer.d.ts.map +1 -0
  229. package/dist/object-serializer.js +128 -0
  230. package/dist/object-serializer.js.map +1 -0
  231. package/dist/overlay.d.ts +2 -0
  232. package/dist/overlay.d.ts.map +1 -0
  233. package/dist/overlay.js +6 -0
  234. package/dist/overlay.js.map +1 -0
  235. package/dist/parser-core.d.ts +47 -0
  236. package/dist/parser-core.d.ts.map +1 -0
  237. package/dist/parser-core.js +516 -0
  238. package/dist/parser-core.js.map +1 -0
  239. package/dist/parser-json.d.ts +4 -0
  240. package/dist/parser-json.d.ts.map +1 -0
  241. package/dist/parser-json.js +19 -0
  242. package/dist/parser-json.js.map +1 -0
  243. package/dist/persistence/db/db-attr-schemas.d.ts +8 -0
  244. package/dist/persistence/db/db-attr-schemas.d.ts.map +1 -0
  245. package/dist/persistence/db/db-attr-schemas.js +28 -0
  246. package/dist/persistence/db/db-attr-schemas.js.map +1 -0
  247. package/dist/persistence/db/db-constants.d.ts +5 -0
  248. package/dist/persistence/db/db-constants.d.ts.map +1 -0
  249. package/dist/persistence/db/db-constants.js +6 -0
  250. package/dist/persistence/db/db-constants.js.map +1 -0
  251. package/dist/persistence/db/db-provider.d.ts +3 -0
  252. package/dist/persistence/db/db-provider.d.ts.map +1 -0
  253. package/dist/persistence/db/db-provider.js +29 -0
  254. package/dist/persistence/db/db-provider.js.map +1 -0
  255. package/dist/persistence/db/db-schema.d.ts +8 -0
  256. package/dist/persistence/db/db-schema.d.ts.map +1 -0
  257. package/dist/persistence/db/db-schema.js +27 -0
  258. package/dist/persistence/db/db-schema.js.map +1 -0
  259. package/dist/persistence/origin/meta-origin.d.ts +32 -0
  260. package/dist/persistence/origin/meta-origin.d.ts.map +1 -0
  261. package/dist/persistence/origin/meta-origin.js +55 -0
  262. package/dist/persistence/origin/meta-origin.js.map +1 -0
  263. package/dist/persistence/origin/origin-constants.d.ts +12 -0
  264. package/dist/persistence/origin/origin-constants.d.ts.map +1 -0
  265. package/dist/persistence/origin/origin-constants.js +27 -0
  266. package/dist/persistence/origin/origin-constants.js.map +1 -0
  267. package/dist/persistence/origin/origin-schema.d.ts +4 -0
  268. package/dist/persistence/origin/origin-schema.d.ts.map +1 -0
  269. package/dist/persistence/origin/origin-schema.js +49 -0
  270. package/dist/persistence/origin/origin-schema.js.map +1 -0
  271. package/dist/persistence/source/meta-source.d.ts +18 -0
  272. package/dist/persistence/source/meta-source.d.ts.map +1 -0
  273. package/dist/persistence/source/meta-source.js +31 -0
  274. package/dist/persistence/source/meta-source.js.map +1 -0
  275. package/dist/persistence/source/source-constants.d.ts +16 -0
  276. package/dist/persistence/source/source-constants.d.ts.map +1 -0
  277. package/dist/persistence/source/source-constants.js +28 -0
  278. package/dist/persistence/source/source-constants.js.map +1 -0
  279. package/dist/presentation/layout/layout-constants.d.ts +10 -0
  280. package/dist/presentation/layout/layout-constants.d.ts.map +1 -0
  281. package/dist/presentation/layout/layout-constants.js +21 -0
  282. package/dist/presentation/layout/layout-constants.js.map +1 -0
  283. package/dist/presentation/layout/layout-schema.d.ts +4 -0
  284. package/dist/presentation/layout/layout-schema.d.ts.map +1 -0
  285. package/dist/presentation/layout/layout-schema.js +46 -0
  286. package/dist/presentation/layout/layout-schema.js.map +1 -0
  287. package/dist/presentation/layout/meta-layout.d.ts +23 -0
  288. package/dist/presentation/layout/meta-layout.d.ts.map +1 -0
  289. package/dist/presentation/layout/meta-layout.js +47 -0
  290. package/dist/presentation/layout/meta-layout.js.map +1 -0
  291. package/dist/presentation/view/meta-view.d.ts +4 -0
  292. package/dist/presentation/view/meta-view.d.ts.map +1 -0
  293. package/dist/presentation/view/meta-view.js +8 -0
  294. package/dist/presentation/view/meta-view.js.map +1 -0
  295. package/dist/presentation/view/view-constants.d.ts +20 -0
  296. package/dist/presentation/view/view-constants.d.ts.map +1 -0
  297. package/dist/presentation/view/view-constants.js +47 -0
  298. package/dist/presentation/view/view-constants.js.map +1 -0
  299. package/dist/presentation/view/view-schema.d.ts +4 -0
  300. package/dist/presentation/view/view-schema.d.ts.map +1 -0
  301. package/dist/presentation/view/view-schema.js +15 -0
  302. package/dist/presentation/view/view-schema.js.map +1 -0
  303. package/dist/provider.d.ts +20 -0
  304. package/dist/provider.d.ts.map +1 -0
  305. package/dist/provider.js +58 -0
  306. package/dist/provider.js.map +1 -0
  307. package/dist/registry.d.ts +89 -0
  308. package/dist/registry.d.ts.map +1 -0
  309. package/dist/registry.js +107 -0
  310. package/dist/registry.js.map +1 -0
  311. package/dist/serializer-json.d.ts +16 -0
  312. package/dist/serializer-json.d.ts.map +1 -0
  313. package/dist/serializer-json.js +154 -0
  314. package/dist/serializer-json.js.map +1 -0
  315. package/dist/shared/base-types.d.ts +23 -0
  316. package/dist/shared/base-types.d.ts.map +1 -0
  317. package/dist/shared/base-types.js +43 -0
  318. package/dist/shared/base-types.js.map +1 -0
  319. package/dist/shared/meta-data.d.ts +123 -0
  320. package/dist/shared/meta-data.d.ts.map +1 -0
  321. package/dist/shared/meta-data.js +365 -0
  322. package/dist/shared/meta-data.js.map +1 -0
  323. package/dist/shared/meta-root.d.ts +12 -0
  324. package/dist/shared/meta-root.d.ts.map +1 -0
  325. package/dist/shared/meta-root.js +24 -0
  326. package/dist/shared/meta-root.js.map +1 -0
  327. package/dist/shared/structural.d.ts +20 -0
  328. package/dist/shared/structural.d.ts.map +1 -0
  329. package/dist/shared/structural.js +49 -0
  330. package/dist/shared/structural.js.map +1 -0
  331. package/dist/subtype-rules.d.ts +8 -0
  332. package/dist/subtype-rules.d.ts.map +1 -0
  333. package/dist/subtype-rules.js +34 -0
  334. package/dist/subtype-rules.js.map +1 -0
  335. package/dist/super-resolve.d.ts +34 -0
  336. package/dist/super-resolve.d.ts.map +1 -0
  337. package/dist/super-resolve.js +124 -0
  338. package/dist/super-resolve.js.map +1 -0
  339. package/package.json +50 -0
  340. package/src/attr-class-map.ts +64 -0
  341. package/src/attr-schema-validate.ts +134 -0
  342. package/src/core/attr/attr-constants.ts +31 -0
  343. package/src/core/attr/meta-attr-filter.ts +67 -0
  344. package/src/core/attr/meta-attr-properties.ts +26 -0
  345. package/src/core/attr/meta-attr-stringarray.ts +31 -0
  346. package/src/core/attr/meta-attr.ts +125 -0
  347. package/src/core/export-json.ts +66 -0
  348. package/src/core/field/field-constants.ts +79 -0
  349. package/src/core/field/field-schema.ts +121 -0
  350. package/src/core/field/meta-field.ts +179 -0
  351. package/src/core/file-meta-data-loader.ts +89 -0
  352. package/src/core/file-source.ts +52 -0
  353. package/src/core/identity/identity-constants.ts +44 -0
  354. package/src/core/identity/identity-schema.ts +80 -0
  355. package/src/core/identity/meta-identity.ts +148 -0
  356. package/src/core/index.ts +12 -0
  357. package/src/core/object/meta-object.ts +151 -0
  358. package/src/core/object/object-constants.ts +21 -0
  359. package/src/core/object/object-schema.ts +7 -0
  360. package/src/core/parser-yaml.ts +54 -0
  361. package/src/core/query/query-constants.ts +66 -0
  362. package/src/core/relationship/find-reference.ts +44 -0
  363. package/src/core/relationship/meta-relationship.ts +36 -0
  364. package/src/core/relationship/relationship-constants.ts +38 -0
  365. package/src/core/relationship/relationship-schema.ts +49 -0
  366. package/src/core/validator/meta-validator.ts +62 -0
  367. package/src/core/validator/validator-constants.ts +31 -0
  368. package/src/core/validator/validator-schema.ts +50 -0
  369. package/src/core/yaml-desugar.ts +145 -0
  370. package/src/core-types.ts +329 -0
  371. package/src/data-converter.ts +125 -0
  372. package/src/data-type.ts +33 -0
  373. package/src/errors.ts +68 -0
  374. package/src/index.ts +165 -0
  375. package/src/loader/meta-data-loader.ts +307 -0
  376. package/src/loader/meta-data-source.ts +35 -0
  377. package/src/loader/validation-passes.ts +370 -0
  378. package/src/naming.ts +86 -0
  379. package/src/object-serializer.ts +153 -0
  380. package/src/overlay.ts +5 -0
  381. package/src/parser-core.ts +815 -0
  382. package/src/parser-json.ts +28 -0
  383. package/src/persistence/db/db-constants.ts +6 -0
  384. package/src/persistence/db/db-provider.ts +36 -0
  385. package/src/persistence/db/db-schema.ts +40 -0
  386. package/src/persistence/origin/meta-origin.ts +67 -0
  387. package/src/persistence/origin/origin-constants.ts +35 -0
  388. package/src/persistence/origin/origin-schema.ts +66 -0
  389. package/src/persistence/source/meta-source.ts +38 -0
  390. package/src/persistence/source/source-constants.ts +35 -0
  391. package/src/presentation/layout/layout-constants.ts +27 -0
  392. package/src/presentation/layout/layout-schema.ts +62 -0
  393. package/src/presentation/layout/meta-layout.ts +61 -0
  394. package/src/presentation/view/meta-view.ts +8 -0
  395. package/src/presentation/view/view-constants.ts +53 -0
  396. package/src/presentation/view/view-schema.ts +21 -0
  397. package/src/provider.ts +85 -0
  398. package/src/registry.ts +190 -0
  399. package/src/serializer-json.ts +210 -0
  400. package/src/shared/base-types.ts +52 -0
  401. package/src/shared/meta-data.ts +443 -0
  402. package/src/shared/meta-root.ts +33 -0
  403. package/src/shared/structural.ts +62 -0
  404. package/src/subtype-rules.ts +56 -0
  405. package/src/super-resolve.ts +147 -0
@@ -0,0 +1,232 @@
1
+ // MetaDataLoader — loader with full load pipeline.
2
+ //
3
+ // Owns the load pipeline contract, lifecycle state, and accessor members.
4
+ // The load() method sequences MetaDataSource reads into one accumulating tree,
5
+ // using the parser's `intoRoot` param for merge-during-parse.
6
+ //
7
+ // Java MetaDataLoader lifecycle phases: UNINITIALIZED → LOADING → LOADED → ERROR.
8
+ // Reads call _checkStateForRead() to enforce "loaded before read."
9
+ import { MetaRoot } from "../shared/meta-root.js";
10
+ import { TypeId, TypeRegistry } from "../registry.js";
11
+ import { coreProviders } from "../core-types.js";
12
+ import { composeRegistry } from "../provider.js";
13
+ import { TYPE_METADATA, SUBTYPE_ROOT } from "../shared/base-types.js";
14
+ import { ParseError } from "../errors.js";
15
+ import { parseJson } from "../parser-json.js";
16
+ import { validateDataGridSortFields, validateFilterableHasIndex, validateOriginPaths, validateDataGridFilterValues } from "./validation-passes.js";
17
+ import { resolveDeferredSupers } from "../super-resolve.js";
18
+ import { validateSubtypeRules } from "../subtype-rules.js";
19
+ import { validateAttrSchema } from "../attr-schema-validate.js";
20
+ // ---------------------------------------------------------------------------
21
+ // Synthetic empty root (used when all sources fail to parse)
22
+ // ---------------------------------------------------------------------------
23
+ function makeSyntheticRoot() {
24
+ return new MetaRoot(new TypeId(TYPE_METADATA, SUBTYPE_ROOT), "");
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // MetaDataLoader class
28
+ // ---------------------------------------------------------------------------
29
+ export class MetaDataLoader {
30
+ _registry;
31
+ _freeze;
32
+ _strict;
33
+ _state = "uninitialized";
34
+ _root;
35
+ constructor(opts) {
36
+ this._registry = opts?.registry ?? MetaDataLoader._defaultRegistry();
37
+ this._freeze = opts?.freeze !== false; // default true
38
+ this._strict = opts?.strict === true; // default false
39
+ }
40
+ static _defaultRegistry() {
41
+ return composeRegistry(coreProviders);
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Lifecycle
45
+ // ---------------------------------------------------------------------------
46
+ /** Current loading state. */
47
+ get state() {
48
+ return this._state;
49
+ }
50
+ /**
51
+ * The TypeRegistry this MetaDataLoader uses to look up type definitions.
52
+ * Either the one passed in via constructor, or the default registry
53
+ * pre-populated with core types via composeRegistry(coreProviders).
54
+ *
55
+ * Exposed for downstream consumers (codegen, runtime libraries) that
56
+ * need to introspect registered types.
57
+ */
58
+ get registry() {
59
+ return this._registry;
60
+ }
61
+ /**
62
+ * Returns the loaded root MetaRoot.
63
+ * Accessible once load() has completed, in either "loaded" or "error" state.
64
+ * Throws only before or during loading (state "uninitialized" or "loading").
65
+ */
66
+ get root() {
67
+ this._checkStateForRead();
68
+ return this._root;
69
+ }
70
+ /**
71
+ * Guards read accessors — throws only when loading has not yet completed
72
+ * (state "uninitialized" or "loading"). Both "loaded" and "error" states
73
+ * are valid for reads: load() always sets _root before returning.
74
+ */
75
+ _checkStateForRead() {
76
+ if (this._state === "uninitialized" || this._state === "loading") {
77
+ throw new Error(`MetaDataLoader.root accessed before loading has completed (state: "${this._state}"). ` +
78
+ `Call load() first.`);
79
+ }
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Convenience accessors (mirror Java's MetaDataLoader getChildOfType etc.)
83
+ // ---------------------------------------------------------------------------
84
+ /**
85
+ * Returns the first child of the root with the given name, or undefined.
86
+ * Throws if not yet loaded.
87
+ */
88
+ findByName(name) {
89
+ this._checkStateForRead();
90
+ return this._root.ownChildByName(name);
91
+ }
92
+ /**
93
+ * Returns the first child of the root with the given (type, name), or undefined.
94
+ * Throws if not yet loaded.
95
+ */
96
+ findByTypeAndName(type, name) {
97
+ this._checkStateForRead();
98
+ return this._root.ownChildByTypeAndName(type, name);
99
+ }
100
+ /**
101
+ * Returns all direct children of the root with the given type.
102
+ * Throws if not yet loaded.
103
+ */
104
+ childrenOfType(type) {
105
+ this._checkStateForRead();
106
+ return this._root.ownChildrenOfType(type);
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // parseSource — overridable format dispatch seam
110
+ // ---------------------------------------------------------------------------
111
+ /**
112
+ * Parse one source's raw content into a ParseResult. The base loader handles
113
+ * JSON only; a non-JSON format throws. Subclasses override this seam to add
114
+ * formats — e.g. FileMetaDataLoader (in @metaobjectsdev/metadata/core) adds YAML.
115
+ * This keeps the browser-safe base loader free of the YAML parser.
116
+ */
117
+ parseSource(content, source, parseOpts) {
118
+ if (source.format === "json") {
119
+ return parseJson(content, parseOpts);
120
+ }
121
+ throw new Error(`MetaDataLoader parses JSON only; format "${source.format}" for source ` +
122
+ `"${source.id}" requires FileMetaDataLoader (from @metaobjectsdev/metadata/core)`);
123
+ }
124
+ // ---------------------------------------------------------------------------
125
+ // load — async pipeline over MetaDataSource[]
126
+ // ---------------------------------------------------------------------------
127
+ /**
128
+ * Load metadata from one or more MetaDataSource instances. Sources are read
129
+ * in order; each source's content is parsed and merged into the accumulating
130
+ * root using the parser's `intoRoot` mechanism.
131
+ *
132
+ * Source read failures are collected in errors[] — no throw. If all sources
133
+ * fail (read or parse), a synthetic empty root is returned.
134
+ *
135
+ * This is a one-shot pipeline — calling load() again on the same loader
136
+ * after it has completed (state "loaded" or "error") throws.
137
+ */
138
+ async load(sources) {
139
+ // Disallow re-use after a completed load (matches Java MetaDataLoader's
140
+ // INITIALIZED-once contract). Loader is a one-shot pipeline.
141
+ if (this._state === "loaded" || this._state === "error") {
142
+ throw new Error("MetaDataLoader cannot be reused after load completes. Construct a new MetaDataLoader for additional loads.");
143
+ }
144
+ this._state = "loading";
145
+ const warnings = [];
146
+ const errors = [];
147
+ let root;
148
+ // Parse all sources with super resolution DEFERRED so cross-file super
149
+ // refs work — one source may declare a super target that's defined in a
150
+ // source parsed later. A second pass (resolveDeferredSupers) resolves
151
+ // everything against the fully-merged root.
152
+ for (const source of sources) {
153
+ let content;
154
+ try {
155
+ content = await source.read();
156
+ }
157
+ catch (err) {
158
+ errors.push(err instanceof Error
159
+ ? err
160
+ : new Error(`Failed to read source "${source.id}": ${String(err)}`));
161
+ continue;
162
+ }
163
+ // Build parser options, honoring exactOptionalPropertyTypes — only include
164
+ // sourceName / intoRoot keys when defined.
165
+ const parseOpts = {
166
+ registry: this._registry,
167
+ strict: this._strict,
168
+ deferSuperResolution: true,
169
+ sourceName: source.id,
170
+ };
171
+ if (root !== undefined)
172
+ parseOpts.intoRoot = root;
173
+ try {
174
+ const parseResult = this.parseSource(content, source, parseOpts);
175
+ warnings.push(...parseResult.warnings);
176
+ errors.push(...parseResult.errors);
177
+ root = parseResult.root;
178
+ }
179
+ catch (err) {
180
+ errors.push(err instanceof Error
181
+ ? err
182
+ : new Error(`Parse error in "${source.id}": ${String(err)}`));
183
+ }
184
+ }
185
+ // Second pass: resolve every deferred super ref against the full tree.
186
+ // Unresolved refs are always errors (matches the original eager-throw
187
+ // behavior — broken metadata is broken regardless of strict mode).
188
+ if (root !== undefined) {
189
+ const failures = resolveDeferredSupers(root);
190
+ for (const failure of failures) {
191
+ errors.push(new ParseError(`the SuperClass '${failure.ref}' does not exist (referenced by ${failure.nodeFqn})`, { code: "ERR_UNRESOLVED_SUPER" }));
192
+ }
193
+ // Third pass: subtype rule validation (entity should have primary identity,
194
+ // value must not have one).
195
+ const ruleResult = validateSubtypeRules(root);
196
+ errors.push(...ruleResult.errors);
197
+ warnings.push(...ruleResult.warnings);
198
+ // Fourth pass: data-grid @defaultSortField cross-reference validation.
199
+ errors.push(...validateDataGridSortFields(root));
200
+ // Fifth pass: @filterable without index drift warning.
201
+ warnings.push(...validateFilterableHasIndex(root));
202
+ // Sixth pass: origin path validation — validates passthrough.@from,
203
+ // aggregate.@of, and .@via relationship chains.
204
+ errors.push(...validateOriginPaths(root));
205
+ // Seventh pass: @filter value validation — fields filterable + ops allowed per subtype.
206
+ errors.push(...validateDataGridFilterValues(root));
207
+ // Eighth pass: attribute-schema validation (Phase A3) — checks each
208
+ // node's @-attributes against its (type, subType) AttrSchema: required
209
+ // attrs present, declared attrs well-typed, allowedValues honored.
210
+ const attrSchemaResult = validateAttrSchema(root, this._registry);
211
+ errors.push(...attrSchemaResult.errors);
212
+ warnings.push(...attrSchemaResult.warnings);
213
+ }
214
+ // If nothing parsed successfully, synthesize an empty root so callers
215
+ // always get a valid MetaData. The state captures whether errors occurred.
216
+ if (root === undefined) {
217
+ root = makeSyntheticRoot();
218
+ this._state = errors.length > 0 ? "error" : "loaded";
219
+ }
220
+ else {
221
+ this._state = "loaded";
222
+ }
223
+ // Freeze applies to BOTH paths — synthetic-root callers shouldn't get a
224
+ // mutable model just because their inputs failed.
225
+ if (this._freeze) {
226
+ root.freeze();
227
+ }
228
+ this._root = root;
229
+ return { root, warnings, errors };
230
+ }
231
+ }
232
+ //# sourceMappingURL=meta-data-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-data-loader.js","sourceRoot":"","sources":["../../src/loader/meta-data-loader.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,0EAA0E;AAC1E,+EAA+E;AAC/E,8DAA8D;AAC9D,EAAE;AACF,kFAAkF;AAClF,mEAAmE;AAGnE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACnJ,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AA0BhE,8EAA8E;AAC9E,6DAA6D;AAC7D,8EAA8E;AAE9E,SAAS,iBAAiB;IACxB,OAAO,IAAI,QAAQ,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,OAAO,cAAc;IACR,SAAS,CAAe;IACxB,OAAO,CAAU;IACjB,OAAO,CAAU;IAE1B,MAAM,GAAiB,eAAe,CAAC;IACvC,KAAK,CAAuB;IAEpC,YAAY,IAAkB;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,QAAQ,IAAI,cAAc,CAAC,gBAAgB,EAAE,CAAC;QACrE,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,eAAe;QACtD,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,CAAE,gBAAgB;IACzD,CAAC;IAEO,MAAM,CAAC,gBAAgB;QAC7B,OAAO,eAAe,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAED,8EAA8E;IAC9E,YAAY;IACZ,8EAA8E;IAE9E,6BAA6B;IAC7B,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,IAAI,IAAI;QACN,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAM,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACK,kBAAkB;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CACb,sEAAsE,IAAI,CAAC,MAAM,MAAM;gBACvF,oBAAoB,CACrB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,2EAA2E;IAC3E,8EAA8E;IAE9E;;;OAGG;IACH,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,IAAY,EAAE,IAAY;QAC1C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,8EAA8E;IAC9E,iDAAiD;IACjD,8EAA8E;IAE9E;;;;;OAKG;IACO,WAAW,CACnB,OAAe,EACf,MAAsB,EACtB,SAAuB;QAEvB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,IAAI,KAAK,CACb,4CAA4C,MAAM,CAAC,MAAM,eAAe;YACtE,IAAI,MAAM,CAAC,EAAE,oEAAoE,CACpF,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,8CAA8C;IAC9C,8EAA8E;IAE9E;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,CAAC,OAAyB;QAClC,wEAAwE;QACxE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,IAAI,IAA0B,CAAC;QAE/B,uEAAuE;QACvE,wEAAwE;QACxE,sEAAsE;QACtE,4CAA4C;QAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CACT,GAAG,YAAY,KAAK;oBAClB,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CACtE,CAAC;gBACF,SAAS;YACX,CAAC;YAED,2EAA2E;YAC3E,2CAA2C;YAC3C,MAAM,SAAS,GAAoC;gBACjD,QAAQ,EAAE,IAAI,CAAC,SAAS;gBACxB,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,oBAAoB,EAAE,IAAI;gBAC1B,UAAU,EAAE,MAAM,CAAC,EAAE;aACtB,CAAC;YACF,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;YAElD,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBACjE,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;YAC1B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CACT,GAAG,YAAY,KAAK;oBAClB,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAC/D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,uEAAuE;QACvE,sEAAsE;QACtE,mEAAmE;QACnE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CACT,IAAI,UAAU,CACZ,mBAAmB,OAAO,CAAC,GAAG,mCAAmC,OAAO,CAAC,OAAO,GAAG,EACnF,EAAE,IAAI,EAAE,sBAAsB,EAAE,CACjC,CACF,CAAC;YACJ,CAAC;YAED,4EAA4E;YAC5E,4BAA4B;YAC5B,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YAEtC,uEAAuE;YACvE,MAAM,CAAC,IAAI,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;YAEjD,uDAAuD;YACvD,QAAQ,CAAC,IAAI,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;YAEnD,oEAAoE;YACpE,gDAAgD;YAChD,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;YAE1C,wFAAwF;YACxF,MAAM,CAAC,IAAI,CAAC,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC;YAEnD,oEAAoE;YACpE,uEAAuE;YACvE,mEAAmE;YACnE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,sEAAsE;QACtE,2EAA2E;QAC3E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,GAAG,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACzB,CAAC;QAED,wEAAwE;QACxE,kDAAkD;QAClD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /** Format of a source's content. Selects the parser. */
2
+ export type MetaDataFormat = "json" | "yaml";
3
+ /** One unit of raw metadata input. */
4
+ export interface MetaDataSource {
5
+ /** Human-readable identifier — used in parse-error messages (e.g. a filename). */
6
+ readonly id: string;
7
+ /** Content format hint — selects the parser. */
8
+ readonly format: MetaDataFormat;
9
+ /** Resolve the raw content. May perform I/O. */
10
+ read(): Promise<string>;
11
+ }
12
+ /** A metadata source backed by an in-memory string. */
13
+ export declare class InMemorySource implements MetaDataSource {
14
+ readonly id: string;
15
+ readonly format: MetaDataFormat;
16
+ private readonly _content;
17
+ constructor(content: string, opts?: {
18
+ id?: string;
19
+ format?: MetaDataFormat;
20
+ });
21
+ read(): Promise<string>;
22
+ }
23
+ //# sourceMappingURL=meta-data-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-data-source.d.ts","sourceRoot":"","sources":["../../src/loader/meta-data-source.ts"],"names":[],"mappings":"AAMA,wDAAwD;AACxD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,gDAAgD;IAChD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,uDAAuD;AACvD,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE;IAM5E,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAGxB"}
@@ -0,0 +1,20 @@
1
+ // MetaDataSource — the raw-document unit consumed by the loader pipeline.
2
+ //
3
+ // A loader (FileMetaDataLoader, later UrlMetaDataLoader) discovers/acquires
4
+ // sources; the MetaDataLoader pipeline calls read() on each. read() is async
5
+ // so file/URL sources can do I/O; InMemorySource resolves immediately.
6
+ /** A metadata source backed by an in-memory string. */
7
+ export class InMemorySource {
8
+ id;
9
+ format;
10
+ _content;
11
+ constructor(content, opts) {
12
+ this._content = content;
13
+ this.id = opts?.id ?? "<in-memory>";
14
+ this.format = opts?.format ?? "json";
15
+ }
16
+ read() {
17
+ return Promise.resolve(this._content);
18
+ }
19
+ }
20
+ //# sourceMappingURL=meta-data-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-data-source.js","sourceRoot":"","sources":["../../src/loader/meta-data-source.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,uEAAuE;AAevE,uDAAuD;AACvD,MAAM,OAAO,cAAc;IAChB,EAAE,CAAS;IACX,MAAM,CAAiB;IACf,QAAQ,CAAS;IAElC,YAAY,OAAe,EAAE,IAA+C;QAC1E,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,aAAa,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,MAAM,CAAC;IACvC,CAAC;IAED,IAAI;QACF,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { MetaData } from "../shared/meta-data.js";
2
+ import { ParseError } from "../errors.js";
3
+ export declare function validateDataGridSortFields(root: MetaData): ParseError[];
4
+ export declare function validateFilterableHasIndex(root: MetaData): string[];
5
+ export declare function validateOriginPaths(root: MetaData): ParseError[];
6
+ export declare function validateDataGridFilterValues(root: MetaData): ParseError[];
7
+ //# sourceMappingURL=validation-passes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-passes.d.ts","sourceRoot":"","sources":["../../src/loader/validation-passes.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAsC1C,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,EAAE,CAuBvE;AAMD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CA8BnE;AAsID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,EAAE,CAiDhE;AAWD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,EAAE,CAoBzE"}
@@ -0,0 +1,244 @@
1
+ // Stateless validation passes for the MetaDataLoader pipeline.
2
+ //
3
+ // Each function takes a fully-merged MetaData root and returns errors or
4
+ // warnings. No loader state is read or written — these are pure functions.
5
+ //
6
+ // Exported: validateDataGridSortFields, validateFilterableHasIndex,
7
+ // validateOriginPaths (called by MetaDataLoader.load() in order).
8
+ // Private: _findObject, _findField, _findRelationship,
9
+ // _validateFromPath, _validateViaPath (helpers, not exported).
10
+ import { ParseError } from "../errors.js";
11
+ import { TYPE_OBJECT, TYPE_FIELD, TYPE_LAYOUT, TYPE_IDENTITY, TYPE_ORIGIN, TYPE_RELATIONSHIP, } from "../shared/base-types.js";
12
+ import { LAYOUT_SUBTYPE_DATA_GRID, LAYOUT_DATA_GRID_ATTR_DEFAULT_SORT_FIELD, LAYOUT_DATA_GRID_ATTR_FILTER, } from "../presentation/layout/layout-constants.js";
13
+ import { FIELD_ATTR_FILTERABLE, } from "../core/field/field-constants.js";
14
+ import { FIELD_ATTR_DB_INDEXED } from "../persistence/db/db-constants.js";
15
+ import { IDENTITY_ATTR_FIELDS } from "../core/identity/identity-constants.js";
16
+ import { ORIGIN_SUBTYPE_PASSTHROUGH, ORIGIN_SUBTYPE_AGGREGATE, ORIGIN_PASSTHROUGH_ATTR_FROM, ORIGIN_PASSTHROUGH_ATTR_VIA, ORIGIN_AGGREGATE_ATTR_OF, ORIGIN_AGGREGATE_ATTR_VIA, } from "../persistence/origin/origin-constants.js";
17
+ import { RELATIONSHIP_ATTR_OBJECT_REF } from "../core/relationship/relationship-constants.js";
18
+ import { FILTER_COMPOSE_OR, FILTER_COMPOSE_AND, opsForSubType, } from "../core/query/query-constants.js";
19
+ // ---------------------------------------------------------------------------
20
+ // Layout dataGrid @defaultSortField validation
21
+ // ---------------------------------------------------------------------------
22
+ export function validateDataGridSortFields(root) {
23
+ const errors = [];
24
+ for (const obj of root.ownChildren().filter((c) => c.type === TYPE_OBJECT)) {
25
+ // Use children() so inherited fields (via extends:/super:) are
26
+ // visible when validating @defaultSortField references.
27
+ const effective = obj.children();
28
+ const fieldNames = new Set(effective.filter((c) => c.type === TYPE_FIELD).map((f) => f.name));
29
+ for (const layout of effective.filter((c) => c.type === TYPE_LAYOUT && c.subType === LAYOUT_SUBTYPE_DATA_GRID)) {
30
+ const sortField = layout.ownAttr(LAYOUT_DATA_GRID_ATTR_DEFAULT_SORT_FIELD);
31
+ if (typeof sortField === "string" && !fieldNames.has(sortField)) {
32
+ errors.push(new ParseError(`dataGrid layout "${layout.name}" on entity "${obj.name}" has @defaultSortField "${sortField}" ` +
33
+ `but no such field exists on "${obj.name}". Available fields: ${[...fieldNames].join(", ")}`, { code: "ERR_BAD_DEFAULT_SORT_FIELD" }));
34
+ }
35
+ }
36
+ }
37
+ return errors;
38
+ }
39
+ // ---------------------------------------------------------------------------
40
+ // @filterable without index validation
41
+ // ---------------------------------------------------------------------------
42
+ export function validateFilterableHasIndex(root) {
43
+ const warnings = [];
44
+ for (const obj of root.ownChildren().filter((c) => c.type === TYPE_OBJECT)) {
45
+ // Use children() so inherited fields and identities (via extends:/super:)
46
+ // are included when checking filterable-without-index.
47
+ const effective = obj.children();
48
+ // Build the set of field names that are part of any identity on this object.
49
+ const indexedFieldNames = new Set();
50
+ for (const identity of effective.filter((c) => c.type === TYPE_IDENTITY)) {
51
+ const fields = identity.ownAttr(IDENTITY_ATTR_FIELDS);
52
+ if (typeof fields === "string") {
53
+ for (const name of fields.split(","))
54
+ indexedFieldNames.add(name.trim());
55
+ }
56
+ else if (Array.isArray(fields)) {
57
+ for (const name of fields)
58
+ if (typeof name === "string")
59
+ indexedFieldNames.add(name);
60
+ }
61
+ }
62
+ for (const field of effective.filter((c) => c.type === TYPE_FIELD)) {
63
+ const filterable = field.ownAttr(FIELD_ATTR_FILTERABLE);
64
+ if (filterable !== true)
65
+ continue;
66
+ if (field.ownAttr(FIELD_ATTR_DB_INDEXED) === true)
67
+ continue;
68
+ if (indexedFieldNames.has(field.name))
69
+ continue;
70
+ warnings.push(`[filterable-without-index] field "${obj.name}.${field.name}" has @filterable: true but is not ` +
71
+ `part of any identity. Filtering on this field will sequential-scan. Add @db.indexed: true ` +
72
+ `to the field (when supported), or remove @filterable: true.`);
73
+ }
74
+ }
75
+ return warnings;
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Origin path validation
79
+ //
80
+ // Walks every projection's fields, finds `origin` (TYPE_ORIGIN) children,
81
+ // and validates:
82
+ // - passthrough.@from resolves to an existing entity + field
83
+ // - aggregate.@of resolves to an existing entity + field
84
+ // - .@via paths resolve through real relationships, hopping entity-by-entity
85
+ // using each relationship's @objectRef
86
+ //
87
+ // Note: @agg vocabulary is validated by validateAttrSchema (A3 pass) via
88
+ // allowedValues on the origin.aggregate @agg attr schema — not here.
89
+ // ---------------------------------------------------------------------------
90
+ function _findObject(root, name) {
91
+ return root.ownChildren().find((c) => c.type === TYPE_OBJECT && c.name === name);
92
+ }
93
+ function _findField(obj, name) {
94
+ // Use children() so inherited fields (via extends:/super:) are included.
95
+ return obj.children().find((c) => c.type === TYPE_FIELD && c.name === name);
96
+ }
97
+ function _findRelationship(obj, name) {
98
+ // Use children() so inherited relationships (via extends:/super:) are included.
99
+ return obj.children().find((c) => c.type === TYPE_RELATIONSHIP && c.name === name);
100
+ }
101
+ function _validateFromPath(fromAttr, root, projectionName, fieldName, errors, label = "origin.passthrough.@from") {
102
+ const dotIdx = fromAttr.indexOf(".");
103
+ if (dotIdx < 1 || dotIdx === fromAttr.length - 1) {
104
+ errors.push(new ParseError(`${label} "${fromAttr}" on ${projectionName}.${fieldName}: must be of form "Entity.field".`, { code: "ERR_INVALID_ORIGIN" }));
105
+ return;
106
+ }
107
+ const entityName = fromAttr.slice(0, dotIdx);
108
+ const targetFieldName = fromAttr.slice(dotIdx + 1);
109
+ const sourceObj = _findObject(root, entityName);
110
+ if (!sourceObj) {
111
+ errors.push(new ParseError(`${label} "${fromAttr}" on ${projectionName}.${fieldName}: no such entity "${entityName}".`, { code: "ERR_INVALID_ORIGIN" }));
112
+ return;
113
+ }
114
+ const sourceField = _findField(sourceObj, targetFieldName);
115
+ if (!sourceField) {
116
+ errors.push(new ParseError(`${label} "${fromAttr}" on ${projectionName}.${fieldName}: no such field "${targetFieldName}" on ${entityName}.`, { code: "ERR_INVALID_ORIGIN" }));
117
+ }
118
+ }
119
+ function _validateViaPath(viaAttr, root, projectionName, fieldName, errors) {
120
+ const segments = viaAttr.split(".");
121
+ if (segments.length < 2) {
122
+ errors.push(new ParseError(`origin.@via "${viaAttr}" on ${projectionName}.${fieldName}: must be of form "Entity.relationship[.relationship...]".`, { code: "ERR_INVALID_ORIGIN" }));
123
+ return;
124
+ }
125
+ const [entityName, ...relSegments] = segments;
126
+ let currentObj = _findObject(root, entityName);
127
+ if (!currentObj) {
128
+ errors.push(new ParseError(`origin.@via "${viaAttr}" on ${projectionName}.${fieldName}: no such entity "${entityName}".`, { code: "ERR_INVALID_ORIGIN" }));
129
+ return;
130
+ }
131
+ for (const relName of relSegments) {
132
+ const rel = _findRelationship(currentObj, relName);
133
+ if (!rel) {
134
+ errors.push(new ParseError(`origin.@via "${viaAttr}" on ${projectionName}.${fieldName}: no such relationship "${relName}" on ${currentObj.name}.`, { code: "ERR_INVALID_ORIGIN" }));
135
+ return;
136
+ }
137
+ const refTarget = rel.ownAttr(RELATIONSHIP_ATTR_OBJECT_REF);
138
+ if (typeof refTarget !== "string" || refTarget === "") {
139
+ errors.push(new ParseError(`origin.@via "${viaAttr}" on ${projectionName}.${fieldName}: relationship "${relName}" on ${currentObj.name} is missing @objectRef.`, { code: "ERR_INVALID_ORIGIN" }));
140
+ return;
141
+ }
142
+ const nextObj = _findObject(root, refTarget);
143
+ if (!nextObj) {
144
+ errors.push(new ParseError(`origin.@via "${viaAttr}" on ${projectionName}.${fieldName}: relationship "${relName}" points to non-existent entity "${refTarget}".`, { code: "ERR_INVALID_ORIGIN" }));
145
+ return;
146
+ }
147
+ currentObj = nextObj;
148
+ }
149
+ }
150
+ export function validateOriginPaths(root) {
151
+ const errors = [];
152
+ for (const obj of root.ownChildren().filter((c) => c.type === TYPE_OBJECT)) {
153
+ for (const field of obj.ownChildren().filter((c) => c.type === TYPE_FIELD)) {
154
+ for (const origin of field.ownChildren().filter((c) => c.type === TYPE_ORIGIN)) {
155
+ if (origin.subType === ORIGIN_SUBTYPE_PASSTHROUGH) {
156
+ const from = origin.ownAttr(ORIGIN_PASSTHROUGH_ATTR_FROM);
157
+ if (typeof from !== "string" || from === "") {
158
+ errors.push(new ParseError(`origin.passthrough on ${obj.name}.${field.name}: missing @from.`, { code: "ERR_INVALID_ORIGIN" }));
159
+ continue;
160
+ }
161
+ _validateFromPath(from, root, obj.name, field.name, errors);
162
+ const via = origin.ownAttr(ORIGIN_PASSTHROUGH_ATTR_VIA);
163
+ if (typeof via === "string" && via !== "") {
164
+ _validateViaPath(via, root, obj.name, field.name, errors);
165
+ }
166
+ }
167
+ else if (origin.subType === ORIGIN_SUBTYPE_AGGREGATE) {
168
+ const of_ = origin.ownAttr(ORIGIN_AGGREGATE_ATTR_OF);
169
+ if (typeof of_ !== "string" || of_ === "") {
170
+ errors.push(new ParseError(`origin.aggregate on ${obj.name}.${field.name}: missing @of.`, { code: "ERR_INVALID_ORIGIN" }));
171
+ continue;
172
+ }
173
+ _validateFromPath(of_, root, obj.name, field.name, errors, "origin.aggregate.@of");
174
+ const via = origin.ownAttr(ORIGIN_AGGREGATE_ATTR_VIA);
175
+ if (typeof via !== "string" || via === "") {
176
+ errors.push(new ParseError(`origin.aggregate on ${obj.name}.${field.name}: missing @via (aggregates require a relationship path).`, { code: "ERR_INVALID_ORIGIN" }));
177
+ continue;
178
+ }
179
+ _validateViaPath(via, root, obj.name, field.name, errors);
180
+ }
181
+ }
182
+ }
183
+ }
184
+ return errors;
185
+ }
186
+ // ---------------------------------------------------------------------------
187
+ // Layout dataGrid @filter value validation
188
+ //
189
+ // Runs after extends: resolution (so inherited @filterable fields are visible)
190
+ // and after parse-time desugaring (so every clause is canonical { op: value }).
191
+ // Builds the allowlist from @filterable fields using OPS_BY_SUBTYPE, then checks
192
+ // every filtered field is filterable and every op is allowed for its subtype.
193
+ // ---------------------------------------------------------------------------
194
+ export function validateDataGridFilterValues(root) {
195
+ const errors = [];
196
+ for (const obj of root.ownChildren().filter((c) => c.type === TYPE_OBJECT)) {
197
+ const effective = obj.children();
198
+ const allow = new Map();
199
+ for (const f of effective.filter((c) => c.type === TYPE_FIELD)) {
200
+ if (f.ownAttr(FIELD_ATTR_FILTERABLE) === true) {
201
+ allow.set(f.name, opsForSubType(f.subType));
202
+ }
203
+ }
204
+ for (const layout of effective.filter((c) => c.type === TYPE_LAYOUT && c.subType === LAYOUT_SUBTYPE_DATA_GRID)) {
205
+ const filter = layout.ownAttr(LAYOUT_DATA_GRID_ATTR_FILTER);
206
+ // Type errors (e.g. legacy string form) are reported by validateAttrSchema.
207
+ if (typeof filter !== "object" || filter === null || Array.isArray(filter))
208
+ continue;
209
+ checkFilterClauses(filter, allow, obj.name, layout.name, errors);
210
+ }
211
+ }
212
+ return errors;
213
+ }
214
+ function checkFilterClauses(filter, allow, entityName, layoutName, errors) {
215
+ for (const [key, clause] of Object.entries(filter)) {
216
+ if (key === FILTER_COMPOSE_OR || key === FILTER_COMPOSE_AND) {
217
+ if (Array.isArray(clause)) {
218
+ for (const sub of clause) {
219
+ if (typeof sub === "object" && sub !== null && !Array.isArray(sub)) {
220
+ checkFilterClauses(sub, allow, entityName, layoutName, errors);
221
+ }
222
+ }
223
+ }
224
+ continue;
225
+ }
226
+ const allowedOps = allow.get(key);
227
+ if (allowedOps === undefined) {
228
+ errors.push(new ParseError(`dataGrid layout "${layoutName}" on entity "${entityName}" has @filter over ` +
229
+ `non-filterable field "${key}". Filterable fields: ${[...allow.keys()].join(", ") || "(none)"}`, { code: "ERR_BAD_ATTR_FILTER" }));
230
+ continue;
231
+ }
232
+ // After parse-time desugaring (FilterAttr.desugar), every non-composition field clause
233
+ // is canonical { op: value } — a bare scalar should not reach here; the object guard is defensive.
234
+ if (typeof clause === "object" && clause !== null && !Array.isArray(clause)) {
235
+ for (const op of Object.keys(clause)) {
236
+ if (!allowedOps.includes(op)) {
237
+ errors.push(new ParseError(`dataGrid layout "${layoutName}" on entity "${entityName}" @filter uses disallowed ` +
238
+ `op "${key}.${op}". Allowed ops for "${key}": ${allowedOps.join(", ")}`, { code: "ERR_BAD_ATTR_FILTER" }));
239
+ }
240
+ }
241
+ }
242
+ }
243
+ }
244
+ //# sourceMappingURL=validation-passes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-passes.js","sourceRoot":"","sources":["../../src/loader/validation-passes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { MetaObject } from "./meta-object.js";
2
+ import type { MetaReferenceIdentity } from "./meta-identity.js";
3
+ export interface ReferenceLookup {
4
+ /** The entity whose identity.reference points at `other`. */
5
+ readonly holder: MetaObject;
6
+ /** The other side of the reference. */
7
+ readonly other: MetaObject;
8
+ /** The matching identity.reference declaration on `holder`. */
9
+ readonly referenceIdentity: MetaReferenceIdentity;
10
+ }
11
+ /**
12
+ * Find an identity.reference on either `a` or `b` whose @references targets the
13
+ * other side. Returns undefined if neither side declares one.
14
+ *
15
+ * Comparison is package-insensitive: `@references` may be a bare entity name
16
+ * ("User") or a fully-qualified one ("pkg::User"); both match `other.name`.
17
+ *
18
+ * If both sides declare references targeting each other (rare, but legal for
19
+ * mutual 1:1), returns the first found, walking `a` first.
20
+ */
21
+ export declare function findReferenceBetween(a: MetaObject, b: MetaObject): ReferenceLookup | undefined;
22
+ //# sourceMappingURL=find-reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-reference.d.ts","sourceRoot":"","sources":["../../src/meta/find-reference.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGhE,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;CACnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,UAAU,GACZ,eAAe,GAAG,SAAS,CAS7B"}
@@ -0,0 +1,29 @@
1
+ // Cross-entity reference lookup — anchored to identity.reference declarations.
2
+ //
3
+ // Given a relationship-style query "is there a reference between A and B?",
4
+ // walk A's and B's identity.reference children to find the side that physically
5
+ // holds the reference. This is the single source of truth for FK direction
6
+ // across projection codegen, Drizzle schema emit, relations() blocks, and
7
+ // migration schema comparison.
8
+ import { stripPackage } from "../naming.js";
9
+ /**
10
+ * Find an identity.reference on either `a` or `b` whose @references targets the
11
+ * other side. Returns undefined if neither side declares one.
12
+ *
13
+ * Comparison is package-insensitive: `@references` may be a bare entity name
14
+ * ("User") or a fully-qualified one ("pkg::User"); both match `other.name`.
15
+ *
16
+ * If both sides declare references targeting each other (rare, but legal for
17
+ * mutual 1:1), returns the first found, walking `a` first.
18
+ */
19
+ export function findReferenceBetween(a, b) {
20
+ for (const [holder, other] of [[a, b], [b, a]]) {
21
+ for (const ref of holder.referenceIdentities()) {
22
+ if (stripPackage(ref.targetEntity) === other.name) {
23
+ return { holder, other, referenceIdentity: ref };
24
+ }
25
+ }
26
+ }
27
+ return undefined;
28
+ }
29
+ //# sourceMappingURL=find-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-reference.js","sourceRoot":"","sources":["../../src/meta/find-reference.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,2EAA2E;AAC3E,0EAA0E;AAC1E,+BAA+B;AAI/B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAW5C;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,CAAa,EACb,CAAa;IAEb,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAU,EAAE,CAAC;QACxD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC/C,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;gBAClD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}