@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,26 @@
1
+ // PropertiesAttr — attr subtype `properties`. Object-shaped value (a string
2
+ // bag / arbitrary JSON object). No desugar (identity); object validation.
3
+
4
+ import { MetaAttr, type ValueError, runtimeTypeName } from "./meta-attr.js";
5
+ import { type AttrValue } from "../../shared/meta-data.js";
6
+ import { DATA_TYPE_OBJECT, type DataType } from "../../data-type.js";
7
+ import { registerAttrClass } from "../../attr-class-map.js";
8
+ import { ATTR_SUBTYPE_PROPERTIES } from "./attr-constants.js";
9
+
10
+ export class PropertiesAttr extends MetaAttr {
11
+ override get dataType(): DataType {
12
+ return DATA_TYPE_OBJECT;
13
+ }
14
+
15
+ override coerce(raw: unknown): AttrValue {
16
+ return raw as AttrValue;
17
+ }
18
+
19
+ override validateValue(value: AttrValue): ValueError[] {
20
+ return typeof value === "object" && value !== null && !Array.isArray(value)
21
+ ? []
22
+ : [{ message: `attribute '@${this.name}' must be of type 'properties' but got ${runtimeTypeName(value)}` }];
23
+ }
24
+ }
25
+
26
+ registerAttrClass(ATTR_SUBTYPE_PROPERTIES, PropertiesAttr);
@@ -0,0 +1,31 @@
1
+ // StringArrayAttr — attr subtype `stringarray`. A bare string is the degenerate
2
+ // one-element authoring form (`"@fields": "id"`); coerce wraps it into a
3
+ // one-element array so the loaded tree always holds a real string[]. Moved here
4
+ // from parser-core.ts `normalizeStringArrayAttr`.
5
+
6
+ import { MetaAttr, type ValueError, runtimeTypeName } from "./meta-attr.js";
7
+ import { type AttrValue } from "../../shared/meta-data.js";
8
+ import { DATA_TYPE_STRING, type DataType } from "../../data-type.js";
9
+ import { registerAttrClass } from "../../attr-class-map.js";
10
+ import { ATTR_SUBTYPE_STRINGARRAY } from "./attr-constants.js";
11
+
12
+ export class StringArrayAttr extends MetaAttr {
13
+ override get dataType(): DataType {
14
+ return DATA_TYPE_STRING;
15
+ }
16
+
17
+ override coerce(raw: unknown): AttrValue {
18
+ if (Array.isArray(raw)) return raw.map((el) => String(el));
19
+ if (typeof raw === "string") return [raw];
20
+ // Non-string scalar (number/boolean) → leave as-is so validateValue flags it.
21
+ return raw as AttrValue;
22
+ }
23
+
24
+ override validateValue(value: AttrValue): ValueError[] {
25
+ return Array.isArray(value) && value.every((el) => typeof el === "string")
26
+ ? []
27
+ : [{ message: `attribute '@${this.name}' must be a string[] but got ${runtimeTypeName(value)}` }];
28
+ }
29
+ }
30
+
31
+ registerAttrClass(ATTR_SUBTYPE_STRINGARRAY, StringArrayAttr);
@@ -0,0 +1,125 @@
1
+ // MetaAttr — concrete node class for type=attr nodes.
2
+ //
3
+ // Every attribute in the loaded model is a MetaAttr instance (inline @-syntax is
4
+ // parse-time sugar; see parser-core.ts). The base class owns value behavior —
5
+ // dataType / coerce / validateValue / desugar — resolved by this.subType.
6
+ // Subclasses (StringArrayAttr, FilterAttr, PropertiesAttr) override only what
7
+ // differs. Adding a new value-shaped attr subtype is one subclass + one
8
+ // registration line in core-types.ts (ATTR_CLASS_MAP) — zero central edits.
9
+
10
+ import { MetaData, type AttrValue } from "../../shared/meta-data.js";
11
+ import {
12
+ type DataType,
13
+ type DataTypeAware,
14
+ DATA_TYPE_STRING,
15
+ DATA_TYPE_INT,
16
+ DATA_TYPE_LONG,
17
+ DATA_TYPE_DOUBLE,
18
+ DATA_TYPE_BOOLEAN,
19
+ } from "../../data-type.js";
20
+ import { convertToDataType, toAttrValue } from "../../data-converter.js";
21
+ import { registerFallbackAttrClass } from "../../attr-class-map.js";
22
+ import { SUBTYPE_BASE } from "../../shared/base-types.js";
23
+ import { RESERVED_KEY_VALUE } from "../../shared/structural.js";
24
+ import {
25
+ ATTR_SUBTYPE_STRING,
26
+ ATTR_SUBTYPE_CLASS,
27
+ ATTR_SUBTYPE_INT,
28
+ ATTR_SUBTYPE_LONG,
29
+ ATTR_SUBTYPE_DOUBLE,
30
+ ATTR_SUBTYPE_BOOLEAN,
31
+ } from "./attr-constants.js";
32
+
33
+ /** A value-level validation finding, surfaced by the attr-schema pass. */
34
+ export interface ValueError {
35
+ message: string;
36
+ }
37
+
38
+ /** Base-subtype → DataType. Each MetaAttr subclass owns its own DataType: the
39
+ * base covers the scalar/string subtypes; object/array subtypes override
40
+ * `get dataType()`. This replaces the central ATTR_DATA_TYPE map. */
41
+ const BASE_ATTR_DATA_TYPE: Readonly<Record<string, DataType>> = {
42
+ [SUBTYPE_BASE]: DATA_TYPE_STRING,
43
+ [ATTR_SUBTYPE_STRING]: DATA_TYPE_STRING,
44
+ [ATTR_SUBTYPE_CLASS]: DATA_TYPE_STRING,
45
+ [ATTR_SUBTYPE_INT]: DATA_TYPE_INT,
46
+ [ATTR_SUBTYPE_LONG]: DATA_TYPE_LONG,
47
+ [ATTR_SUBTYPE_DOUBLE]: DATA_TYPE_DOUBLE,
48
+ [ATTR_SUBTYPE_BOOLEAN]: DATA_TYPE_BOOLEAN,
49
+ };
50
+
51
+ export class MetaAttr extends MetaData implements DataTypeAware {
52
+ /** This attribute's coerced value (stored on the instance under RESERVED_KEY_VALUE). */
53
+ get value(): AttrValue | undefined {
54
+ return this.ownAttr(RESERVED_KEY_VALUE);
55
+ }
56
+
57
+ /** The coarse value-type classification for this attribute's subtype. */
58
+ get dataType(): DataType {
59
+ return BASE_ATTR_DATA_TYPE[this.subType] ?? DATA_TYPE_STRING;
60
+ }
61
+
62
+ /**
63
+ * Coerce a raw parsed value toward this attr's value shape. The base handles
64
+ * the scalar subtypes (string / class / int / long / double / boolean) by
65
+ * delegating to convertToDataType. Subclasses override for array/object shapes.
66
+ *
67
+ * SUBTYPE_BASE is the polymorphic/unconstrained marker (e.g. an `attr.base`
68
+ * child node, or an untyped `@default`): the value is stored type-preserved,
69
+ * never stringified — mirroring validateValue, which accepts any type for base.
70
+ */
71
+ coerce(raw: unknown): AttrValue {
72
+ if (this.subType === SUBTYPE_BASE) {
73
+ return toAttrValue(raw);
74
+ }
75
+ return convertToDataType(this.dataType, raw);
76
+ }
77
+
78
+ /**
79
+ * Desugar a coerced value to its canonical stored form. Default identity;
80
+ * FilterAttr overrides to normalize `{ field: value }` → `{ field: { op: value } }`.
81
+ */
82
+ desugar(value: AttrValue): AttrValue {
83
+ return value;
84
+ }
85
+
86
+ /**
87
+ * Validate a stored value against this attr's value shape. Returns [] when
88
+ * valid. The base checks the scalar/string subtypes; subclasses override for
89
+ * array/object shapes. Replaces the central valueMatchesType + subtype-sets.
90
+ */
91
+ validateValue(value: AttrValue): ValueError[] {
92
+ const dt = this.dataType;
93
+ if (dt === DATA_TYPE_STRING) {
94
+ return typeof value === "string" ? [] : [this._typeError("string", value)];
95
+ }
96
+ if (dt === DATA_TYPE_INT || dt === DATA_TYPE_LONG || dt === DATA_TYPE_DOUBLE) {
97
+ return typeof value === "number" ? [] : [this._typeError("number", value)];
98
+ }
99
+ if (dt === DATA_TYPE_BOOLEAN) {
100
+ return typeof value === "boolean" ? [] : [this._typeError("boolean", value)];
101
+ }
102
+ // SUBTYPE_BASE / unconstrained — accept anything.
103
+ return [];
104
+ }
105
+
106
+ protected _typeError(_expected: string, value: AttrValue): ValueError {
107
+ return {
108
+ message:
109
+ `attribute '@${this.name}' must be of type '${this.subType}' ` +
110
+ `but got ${runtimeTypeName(value)}`,
111
+ };
112
+ }
113
+ }
114
+
115
+ /** Human-readable runtime type of an attr value, for error messages. */
116
+ export function runtimeTypeName(value: AttrValue): string {
117
+ if (Array.isArray(value)) return "array";
118
+ if (value !== null && typeof value === "object") return "object";
119
+ return typeof value;
120
+ }
121
+
122
+ // Register the base MetaAttr as the fallback for unmapped (scalar/string) attr
123
+ // subtypes. Subclasses register their own subtype in their module (see
124
+ // meta-attr-stringarray / -filter / -properties).
125
+ registerFallbackAttrClass(MetaAttr);
@@ -0,0 +1,66 @@
1
+ // Convenience export API — load a metadata directory and emit one flattened
2
+ // canonical-JSON document.
3
+ //
4
+ // This module wires Loader + canonicalSerialize into a single call so
5
+ // consumers (e.g. a React app's build step, the upcoming `meta export` CLI
6
+ // command) can go from "a directory of meta.*.json files" to "one JSON
7
+ // payload" without having to orchestrate the two steps manually.
8
+ //
9
+ // Error semantics (match Loader's own conventions):
10
+ // - Content errors (parse/validation failures) are collected in errors[] and
11
+ // returned in the result — they do NOT throw. `json` is still produced from
12
+ // whatever tree the Loader returned (Loader always returns a valid MetaData).
13
+ // - I/O failures (missing/unreadable directory) are caught by
14
+ // `loadFromDirectory` and returned in its `errors[]`; `loadAndExportJson`
15
+ // surfaces them unchanged in `ExportResult.errors`. It does not throw for
16
+ // directory or metadata problems.
17
+
18
+ import { FileMetaDataLoader } from "./file-meta-data-loader.js";
19
+ import type { LoadOptions } from "../loader/meta-data-loader.js";
20
+ import { canonicalSerialize } from "../serializer-json.js";
21
+
22
+ // ---------------------------------------------------------------------------
23
+ // Public API
24
+ // ---------------------------------------------------------------------------
25
+
26
+ export interface ExportResult {
27
+ /** The single flattened canonical-JSON document of the entire loaded metadata model. */
28
+ json: string;
29
+ /**
30
+ * Parse/validation errors collected during load.
31
+ * Non-empty → `json` may be partial or empty; the caller decides whether to use it.
32
+ */
33
+ errors: Error[];
34
+ /** Non-fatal warnings collected during load. */
35
+ warnings: string[];
36
+ }
37
+
38
+ /**
39
+ * Load all metadata under `dir` and export the entire model as one flattened
40
+ * canonical-JSON document.
41
+ *
42
+ * Internally constructs a fresh `FileMetaDataLoader` (using the default registry
43
+ * composed via `composeRegistry(coreProviders)`), calls `loadDirectory`, then serializes the
44
+ * resulting tree with `canonicalSerialize`.
45
+ *
46
+ * @param dir Absolute or relative path to the directory containing `meta.*.json` files.
47
+ * @param opts Optional loader options forwarded to the `FileMetaDataLoader` constructor
48
+ * (registry, freeze, strict). The `exclude` glob list can be
49
+ * supplied as `opts.exclude` — see `FileMetaDataLoader.loadDirectory`.
50
+ */
51
+ export async function loadAndExportJson(
52
+ dir: string,
53
+ opts?: LoadOptions & { exclude?: string[] },
54
+ ): Promise<ExportResult> {
55
+ const { exclude, ...loaderOpts } = opts ?? {};
56
+ const loader = new FileMetaDataLoader(loaderOpts);
57
+ // Only pass the exclude option when defined, to satisfy exactOptionalPropertyTypes.
58
+ const dirOpts = exclude !== undefined ? { exclude } : undefined;
59
+ const result = await loader.loadDirectory(dir, dirOpts);
60
+ const json = canonicalSerialize(result.root);
61
+ return {
62
+ json,
63
+ errors: result.errors,
64
+ warnings: result.warnings,
65
+ };
66
+ }
@@ -0,0 +1,79 @@
1
+ // Field concern constants — subtypes, field-level attr keys, and currency attrs.
2
+
3
+ import { SUBTYPE_BASE } from "../../shared/base-types.js";
4
+
5
+ // ---------------------------------------------------------------------------
6
+ // Field subtypes (15)
7
+ // ---------------------------------------------------------------------------
8
+
9
+ export const FIELD_SUBTYPE_STRING = "string";
10
+ export const FIELD_SUBTYPE_INT = "int";
11
+ export const FIELD_SUBTYPE_SHORT = "short";
12
+ export const FIELD_SUBTYPE_BYTE = "byte";
13
+ export const FIELD_SUBTYPE_LONG = "long";
14
+ export const FIELD_SUBTYPE_DOUBLE = "double";
15
+ export const FIELD_SUBTYPE_FLOAT = "float";
16
+ export const FIELD_SUBTYPE_DECIMAL = "decimal";
17
+ export const FIELD_SUBTYPE_BOOLEAN = "boolean";
18
+ export const FIELD_SUBTYPE_DATE = "date";
19
+ export const FIELD_SUBTYPE_TIME = "time";
20
+ export const FIELD_SUBTYPE_TIMESTAMP = "timestamp";
21
+ export const FIELD_SUBTYPE_OBJECT = "object";
22
+ export const FIELD_SUBTYPE_CLASS = "class";
23
+ export const FIELD_SUBTYPE_CURRENCY = "currency";
24
+
25
+ export const FIELD_SUBTYPES = [
26
+ SUBTYPE_BASE,
27
+ FIELD_SUBTYPE_STRING,
28
+ FIELD_SUBTYPE_INT,
29
+ FIELD_SUBTYPE_SHORT,
30
+ FIELD_SUBTYPE_BYTE,
31
+ FIELD_SUBTYPE_LONG,
32
+ FIELD_SUBTYPE_DOUBLE,
33
+ FIELD_SUBTYPE_FLOAT,
34
+ FIELD_SUBTYPE_DECIMAL,
35
+ FIELD_SUBTYPE_BOOLEAN,
36
+ FIELD_SUBTYPE_DATE,
37
+ FIELD_SUBTYPE_TIME,
38
+ FIELD_SUBTYPE_TIMESTAMP,
39
+ FIELD_SUBTYPE_OBJECT,
40
+ FIELD_SUBTYPE_CLASS,
41
+ FIELD_SUBTYPE_CURRENCY,
42
+ ] as const;
43
+ export type FieldSubType = (typeof FIELD_SUBTYPES)[number];
44
+
45
+ // ---------------------------------------------------------------------------
46
+ // Field-level attrs (used by codegen-ts column mapper)
47
+ // ---------------------------------------------------------------------------
48
+
49
+ export const FIELD_ATTR_REQUIRED = "required";
50
+ export const FIELD_ATTR_UNIQUE = "unique";
51
+ export const FIELD_ATTR_DEFAULT = "default";
52
+ export const FIELD_ATTR_MAX_LENGTH = "maxLength";
53
+ export const FIELD_ATTR_PRECISION = "precision";
54
+ export const FIELD_ATTR_SCALE = "scale";
55
+ export const FIELD_ATTR_FILTERABLE = "filterable";
56
+ export const FIELD_ATTR_SORTABLE = "sortable";
57
+ export const FIELD_ATTR_SORTABLE_DEFAULT_ORDER = "sortableDefaultOrder";
58
+
59
+ /** Auto-set semantics on a timestamp field. Values: "onCreate" | "onUpdate". */
60
+ export const FIELD_ATTR_AUTO_SET = "autoSet";
61
+
62
+ /** Name (or FQN) of the target object an object-typed field nests. Same wire
63
+ * spelling as the relationship `@objectRef` — Java's single ATTR_OBJECT_REF. */
64
+ export const FIELD_ATTR_OBJECT_REF = "objectRef";
65
+
66
+ export const AUTO_SET_ON_CREATE = "onCreate";
67
+ export const AUTO_SET_ON_UPDATE = "onUpdate";
68
+
69
+ export const AUTO_SET_VALUES = [AUTO_SET_ON_CREATE, AUTO_SET_ON_UPDATE] as const;
70
+ export type AutoSetValue = (typeof AUTO_SET_VALUES)[number];
71
+
72
+ // ---------------------------------------------------------------------------
73
+ // Currency attrs (on currency-subtype fields)
74
+ // ---------------------------------------------------------------------------
75
+
76
+ /** ISO 4217 currency code on a currency-subtype field. Defaults to "USD" when omitted. */
77
+ export const FIELD_ATTR_CURRENCY = "currency";
78
+ /** Default ISO 4217 currency code when @currency is omitted on a currency field. */
79
+ export const FIELD_ATTR_CURRENCY_DEFAULT = "USD";
@@ -0,0 +1,121 @@
1
+ // Field attribute schemas — attrs common to every field subtype, plus the
2
+ // @currency attr specific to field.currency. Consumed by registerCoreTypes().
3
+
4
+ import type { AttrSchema } from "../../registry.js";
5
+ import {
6
+ ATTR_SUBTYPE_STRING,
7
+ ATTR_SUBTYPE_INT,
8
+ ATTR_SUBTYPE_BOOLEAN,
9
+ } from "../attr/attr-constants.js";
10
+ import { SORT_ORDER_VALUES } from "../query/query-constants.js";
11
+ import {
12
+ FIELD_ATTR_OBJECT_REF,
13
+ FIELD_ATTR_REQUIRED,
14
+ FIELD_ATTR_UNIQUE,
15
+ FIELD_ATTR_DEFAULT,
16
+ FIELD_ATTR_MAX_LENGTH,
17
+ FIELD_ATTR_PRECISION,
18
+ FIELD_ATTR_SCALE,
19
+ FIELD_ATTR_FILTERABLE,
20
+ FIELD_ATTR_SORTABLE,
21
+ FIELD_ATTR_SORTABLE_DEFAULT_ORDER,
22
+ FIELD_ATTR_CURRENCY,
23
+ FIELD_ATTR_CURRENCY_DEFAULT,
24
+ FIELD_ATTR_AUTO_SET,
25
+ AUTO_SET_VALUES,
26
+ } from "./field-constants.js";
27
+
28
+ /** Attrs common to every field subtype (codegen-ts column mapper + Project D filter/sort). */
29
+ export const commonFieldAttrs: AttrSchema[] = [
30
+ {
31
+ name: FIELD_ATTR_OBJECT_REF,
32
+ valueType: ATTR_SUBTYPE_STRING,
33
+ required: false,
34
+ description:
35
+ "Name (or FQN) of the target object an object-typed field nests — drives nested-object (de)serialization.",
36
+ },
37
+ {
38
+ name: FIELD_ATTR_REQUIRED,
39
+ valueType: ATTR_SUBTYPE_BOOLEAN,
40
+ required: false,
41
+ description:
42
+ "When true, the field is NOT NULL. Equivalent to attaching a validator.required child.",
43
+ },
44
+ {
45
+ name: FIELD_ATTR_UNIQUE,
46
+ valueType: ATTR_SUBTYPE_BOOLEAN,
47
+ required: false,
48
+ description: "When true, the field gets a column-level UNIQUE constraint.",
49
+ },
50
+ {
51
+ name: FIELD_ATTR_DEFAULT,
52
+ // @default is polymorphic: its value type follows the OWNING field's
53
+ // subtype — a boolean field defaults to a boolean, an int field to a
54
+ // number, a string field to a string. No single fixed valueType can
55
+ // capture that, so valueType is intentionally omitted (declared-but-untyped).
56
+ // The parser stores the raw JSON value type-preserved (no coercion).
57
+ // Typed conversion happens at consumption time via MetaField.defaultValue(),
58
+ // which applies the field's own DataType — Java parity with
59
+ // MetaField.getDefaultValue() / DataConverter.toTypeSafe(getDataType(), o).
60
+ required: false,
61
+ description:
62
+ "Default value applied to the column when no value is supplied. Its type follows the field's own subtype (string / boolean / number / ...). Converted at consumption time via MetaField.defaultValue().",
63
+ },
64
+ {
65
+ name: FIELD_ATTR_MAX_LENGTH,
66
+ valueType: ATTR_SUBTYPE_INT,
67
+ required: false,
68
+ description: "Maximum character length for string-typed fields (drives VARCHAR(n)).",
69
+ },
70
+ {
71
+ name: FIELD_ATTR_PRECISION,
72
+ valueType: ATTR_SUBTYPE_INT,
73
+ required: false,
74
+ description: "Total number of significant digits for decimal-typed fields.",
75
+ },
76
+ {
77
+ name: FIELD_ATTR_SCALE,
78
+ valueType: ATTR_SUBTYPE_INT,
79
+ required: false,
80
+ description: "Number of digits to the right of the decimal point for decimal-typed fields.",
81
+ },
82
+ {
83
+ name: FIELD_ATTR_FILTERABLE,
84
+ valueType: ATTR_SUBTYPE_BOOLEAN,
85
+ required: false,
86
+ description:
87
+ "When true, the field is exposed in generated CRUD filter allowlists (Project D filter layer).",
88
+ },
89
+ {
90
+ name: FIELD_ATTR_SORTABLE,
91
+ valueType: ATTR_SUBTYPE_BOOLEAN,
92
+ required: false,
93
+ description:
94
+ "When true, the field is exposed in generated CRUD sort allowlists. Inherits from @filterable by default; set false to opt out.",
95
+ },
96
+ {
97
+ name: FIELD_ATTR_SORTABLE_DEFAULT_ORDER,
98
+ valueType: ATTR_SUBTYPE_STRING,
99
+ required: false,
100
+ allowedValues: [...SORT_ORDER_VALUES],
101
+ description: "Default sort direction applied when this field is the default sort field.",
102
+ },
103
+ {
104
+ name: FIELD_ATTR_AUTO_SET,
105
+ valueType: ATTR_SUBTYPE_STRING,
106
+ required: false,
107
+ allowedValues: [...AUTO_SET_VALUES],
108
+ description:
109
+ "Auto-set semantics for timestamp-like fields: 'onCreate' stamps on insert, 'onUpdate' stamps on every write.",
110
+ },
111
+ ];
112
+
113
+ /** The @currency attr — only on field.currency. */
114
+ export const currencyFieldAttr: AttrSchema = {
115
+ name: FIELD_ATTR_CURRENCY,
116
+ valueType: ATTR_SUBTYPE_STRING,
117
+ required: false,
118
+ default: FIELD_ATTR_CURRENCY_DEFAULT,
119
+ description:
120
+ "ISO 4217 currency code for a currency-subtype field. Storage is integer minor units; defaults to 'USD' when omitted.",
121
+ };
@@ -0,0 +1,179 @@
1
+ // MetaField — concrete node class for type=field nodes.
2
+ //
3
+ // Extends MetaData directly: no model wrapper, no metaOf() indirection.
4
+ // Children are already concrete typed nodes; accessors filter by type constant.
5
+
6
+ import { MetaData, type AttrValue } from "../../shared/meta-data.js";
7
+ import {
8
+ type DataType,
9
+ type DataTypeAware,
10
+ DATA_TYPE_STRING,
11
+ DATA_TYPE_INT,
12
+ DATA_TYPE_LONG,
13
+ DATA_TYPE_DOUBLE,
14
+ DATA_TYPE_BOOLEAN,
15
+ DATA_TYPE_DATE,
16
+ DATA_TYPE_OBJECT,
17
+ } from "../../data-type.js";
18
+ import { convertToDataType } from "../../data-converter.js";
19
+ import { TYPE_VALIDATOR, TYPE_VIEW, SUBTYPE_BASE } from "../../shared/base-types.js";
20
+ import {
21
+ FIELD_SUBTYPE_STRING,
22
+ FIELD_SUBTYPE_CLASS,
23
+ FIELD_SUBTYPE_INT,
24
+ FIELD_SUBTYPE_SHORT,
25
+ FIELD_SUBTYPE_BYTE,
26
+ FIELD_SUBTYPE_LONG,
27
+ FIELD_SUBTYPE_CURRENCY,
28
+ FIELD_SUBTYPE_DOUBLE,
29
+ FIELD_SUBTYPE_FLOAT,
30
+ FIELD_SUBTYPE_DECIMAL,
31
+ FIELD_SUBTYPE_BOOLEAN,
32
+ FIELD_SUBTYPE_DATE,
33
+ FIELD_SUBTYPE_TIME,
34
+ FIELD_SUBTYPE_TIMESTAMP,
35
+ FIELD_SUBTYPE_OBJECT,
36
+ FIELD_ATTR_REQUIRED,
37
+ FIELD_ATTR_UNIQUE,
38
+ FIELD_ATTR_DEFAULT,
39
+ FIELD_ATTR_MAX_LENGTH,
40
+ FIELD_ATTR_PRECISION,
41
+ FIELD_ATTR_SCALE,
42
+ FIELD_ATTR_OBJECT_REF,
43
+ } from "./field-constants.js";
44
+ import { FIELD_ATTR_DB_COLUMN } from "../../persistence/db/db-constants.js";
45
+ import { VALIDATOR_SUBTYPE_REQUIRED } from "../validator/validator-constants.js";
46
+ import type { MetaValidator } from "../validator/meta-validator.js";
47
+ import type { MetaView } from "../../presentation/view/meta-view.js";
48
+
49
+ /** Field subtype → DataType. Co-located with the class — a provider adding a
50
+ * field subtype supplies its own dataType the same way. */
51
+ const FIELD_DATA_TYPE: Readonly<Record<string, DataType>> = {
52
+ [SUBTYPE_BASE]: DATA_TYPE_STRING,
53
+ [FIELD_SUBTYPE_STRING]: DATA_TYPE_STRING,
54
+ [FIELD_SUBTYPE_CLASS]: DATA_TYPE_STRING,
55
+ [FIELD_SUBTYPE_INT]: DATA_TYPE_INT,
56
+ [FIELD_SUBTYPE_SHORT]: DATA_TYPE_INT,
57
+ [FIELD_SUBTYPE_BYTE]: DATA_TYPE_INT,
58
+ [FIELD_SUBTYPE_LONG]: DATA_TYPE_LONG,
59
+ [FIELD_SUBTYPE_CURRENCY]: DATA_TYPE_LONG,
60
+ [FIELD_SUBTYPE_DOUBLE]: DATA_TYPE_DOUBLE,
61
+ [FIELD_SUBTYPE_FLOAT]: DATA_TYPE_DOUBLE,
62
+ [FIELD_SUBTYPE_DECIMAL]: DATA_TYPE_DOUBLE,
63
+ [FIELD_SUBTYPE_BOOLEAN]: DATA_TYPE_BOOLEAN,
64
+ [FIELD_SUBTYPE_DATE]: DATA_TYPE_DATE,
65
+ [FIELD_SUBTYPE_TIME]: DATA_TYPE_DATE,
66
+ [FIELD_SUBTYPE_TIMESTAMP]: DATA_TYPE_DATE,
67
+ [FIELD_SUBTYPE_OBJECT]: DATA_TYPE_OBJECT,
68
+ };
69
+
70
+ export class MetaField extends MetaData implements DataTypeAware {
71
+ /** The coarse value-type classification for this field's subtype. */
72
+ get dataType(): DataType {
73
+ return FIELD_DATA_TYPE[this.subType] ?? this._dataType ?? DATA_TYPE_STRING;
74
+ }
75
+
76
+ /** Coerce a raw value toward this field's DataType (Java DataConverter parity). */
77
+ coerce(raw: unknown): AttrValue {
78
+ return convertToDataType(this.dataType, raw);
79
+ }
80
+
81
+ /** The target object name for an object-typed field (the `@objectRef` attr). */
82
+ get objectRef(): string | undefined {
83
+ const v = this.ownAttr(FIELD_ATTR_OBJECT_REF);
84
+ return typeof v === "string" ? v : undefined;
85
+ }
86
+
87
+ get dbColumn(): string | undefined {
88
+ const v = this.ownAttr(FIELD_ATTR_DB_COLUMN);
89
+ return typeof v === "string" ? v : undefined;
90
+ }
91
+
92
+ get default(): unknown {
93
+ return this.ownAttr(FIELD_ATTR_DEFAULT);
94
+ }
95
+
96
+ /**
97
+ * The default value for this field, converted to the field's own DataType.
98
+ *
99
+ * Java parity: MetaField.getDefaultValue() — reads the raw @default attr and
100
+ * converts it via DataConverter.toTypeSafe(getDataType(), raw). This ensures
101
+ * that even if the raw value was stored as a string (e.g. "@default": "false"
102
+ * in YAML or string-keyed JSON), the returned value is the correctly-typed
103
+ * boolean/number/string for this field's subtype.
104
+ *
105
+ * Returns undefined when @default is not set on this field.
106
+ * Result is cached after freeze (same pattern as validators()/views()).
107
+ */
108
+ defaultValue(): AttrValue | undefined {
109
+ return this.cached("defaultValue", () => {
110
+ const raw = this.ownAttr(FIELD_ATTR_DEFAULT);
111
+ if (raw === undefined) return undefined;
112
+ return this.coerce(raw);
113
+ });
114
+ }
115
+
116
+ get maxLength(): number | undefined {
117
+ const v = this.ownAttr(FIELD_ATTR_MAX_LENGTH);
118
+ return typeof v === "number" ? v : undefined;
119
+ }
120
+
121
+ get precision(): number | undefined {
122
+ const v = this.ownAttr(FIELD_ATTR_PRECISION);
123
+ return typeof v === "number" ? v : undefined;
124
+ }
125
+
126
+ get scale(): number | undefined {
127
+ const v = this.ownAttr(FIELD_ATTR_SCALE);
128
+ return typeof v === "number" ? v : undefined;
129
+ }
130
+
131
+ /** True if `@unique: true` is set on the field itself (column-level unique). */
132
+ get unique(): boolean {
133
+ return this.ownAttr(FIELD_ATTR_UNIQUE) === true;
134
+ }
135
+
136
+ /**
137
+ * True if the field is required (NOT NULL).
138
+ *
139
+ * Checks both `@required: true` attr and `validator.required` children —
140
+ * matches the codegen-ts isRequired() semantics.
141
+ */
142
+ get isRequired(): boolean {
143
+ if (this.ownAttr(FIELD_ATTR_REQUIRED) === true) return true;
144
+ return this.validators().some((v) => v.subType === VALIDATOR_SUBTYPE_REQUIRED);
145
+ }
146
+
147
+ /** All effective validators (own + inherited via extends). Java parity: MetaField.getValidators() / getChildren(MetaValidator.class, true). */
148
+ validators(): MetaValidator[] {
149
+ return this.cached("validators", () =>
150
+ this.children().filter((c): c is MetaValidator => c.type === TYPE_VALIDATOR),
151
+ );
152
+ }
153
+
154
+ /** Own validators only — excludes validators inherited via extends. Java parity: getChildren(Class, false). */
155
+ ownValidators(): MetaValidator[] {
156
+ return this.cached("ownValidators", () =>
157
+ this.ownChildren().filter((c): c is MetaValidator => c.type === TYPE_VALIDATOR),
158
+ );
159
+ }
160
+
161
+ /** All effective views (own + inherited via extends). Java parity: MetaField.getViews() / getChildren(MetaView.class, true). */
162
+ views(): MetaView[] {
163
+ return this.cached("views", () =>
164
+ this.children().filter((c): c is MetaView => c.type === TYPE_VIEW),
165
+ );
166
+ }
167
+
168
+ /** Own views only — excludes views inherited via extends. */
169
+ ownViews(): MetaView[] {
170
+ return this.cached("ownViews", () =>
171
+ this.ownChildren().filter((c): c is MetaView => c.type === TYPE_VIEW),
172
+ );
173
+ }
174
+
175
+ /** The typed supertype field if `extends:` resolved, else undefined. */
176
+ resolveSuper(): MetaField | undefined {
177
+ return this.superData as MetaField | undefined;
178
+ }
179
+ }