@fougere/schema 0.2.0-alpha.2 → 0.4.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/README.md +1 -1
  2. package/dist/EntityAdapters.d.ts +26 -0
  3. package/dist/EntityAdapters.d.ts.map +1 -0
  4. package/dist/EntityAdapters.js +71 -0
  5. package/dist/EntityAdapters.js.map +1 -0
  6. package/dist/EntityDeclarations.d.ts +15 -0
  7. package/dist/EntityDeclarations.d.ts.map +1 -0
  8. package/dist/EntityDeclarations.js +2 -0
  9. package/dist/EntityDeclarations.js.map +1 -0
  10. package/dist/axis/Axis.d.ts +12 -0
  11. package/dist/axis/Axis.d.ts.map +1 -0
  12. package/dist/axis/Axis.js +11 -0
  13. package/dist/axis/Axis.js.map +1 -0
  14. package/dist/axis/Meta.d.ts +4 -0
  15. package/dist/axis/Meta.d.ts.map +1 -0
  16. package/dist/axis/Meta.js +2 -0
  17. package/dist/axis/Meta.js.map +1 -0
  18. package/dist/axis/boundary/Boundaries.d.ts +20 -0
  19. package/dist/axis/boundary/Boundaries.d.ts.map +1 -0
  20. package/dist/axis/boundary/Boundaries.js +31 -0
  21. package/dist/axis/boundary/Boundaries.js.map +1 -0
  22. package/dist/axis/boundary/Boundary.d.ts +26 -0
  23. package/dist/axis/boundary/Boundary.d.ts.map +1 -0
  24. package/dist/axis/boundary/Boundary.js +53 -0
  25. package/dist/axis/boundary/Boundary.js.map +1 -0
  26. package/dist/axis/boundary/BoundaryAxis.d.ts +4 -0
  27. package/dist/axis/boundary/BoundaryAxis.d.ts.map +1 -0
  28. package/dist/axis/boundary/BoundaryAxis.js +30 -0
  29. package/dist/axis/boundary/BoundaryAxis.js.map +1 -0
  30. package/dist/axis/lifecycle/Clock.d.ts +18 -0
  31. package/dist/axis/lifecycle/Clock.d.ts.map +1 -0
  32. package/dist/axis/lifecycle/Clock.js +25 -0
  33. package/dist/axis/lifecycle/Clock.js.map +1 -0
  34. package/dist/axis/lifecycle/Generators.d.ts +18 -0
  35. package/dist/axis/lifecycle/Generators.d.ts.map +1 -0
  36. package/dist/axis/lifecycle/Generators.js +38 -0
  37. package/dist/axis/lifecycle/Generators.js.map +1 -0
  38. package/dist/axis/lifecycle/Lifecycle.d.ts +28 -0
  39. package/dist/axis/lifecycle/Lifecycle.d.ts.map +1 -0
  40. package/dist/axis/lifecycle/Lifecycle.js +38 -0
  41. package/dist/axis/lifecycle/Lifecycle.js.map +1 -0
  42. package/dist/axis/lifecycle/LifecycleAxis.d.ts +4 -0
  43. package/dist/axis/lifecycle/LifecycleAxis.d.ts.map +1 -0
  44. package/dist/axis/lifecycle/LifecycleAxis.js +47 -0
  45. package/dist/axis/lifecycle/LifecycleAxis.js.map +1 -0
  46. package/dist/axis/lifecycle/apply.d.ts +6 -0
  47. package/dist/axis/lifecycle/apply.d.ts.map +1 -0
  48. package/dist/axis/lifecycle/apply.js +34 -0
  49. package/dist/axis/lifecycle/apply.js.map +1 -0
  50. package/dist/axis/role/Relation.d.ts +20 -0
  51. package/dist/axis/role/Relation.d.ts.map +1 -0
  52. package/dist/axis/role/Relation.js +21 -0
  53. package/dist/axis/role/Relation.js.map +1 -0
  54. package/dist/axis/role/Role.d.ts +26 -0
  55. package/dist/axis/role/Role.d.ts.map +1 -0
  56. package/dist/axis/role/Role.js +40 -0
  57. package/dist/axis/role/Role.js.map +1 -0
  58. package/dist/axis/role/RoleAxis.d.ts +5 -0
  59. package/dist/axis/role/RoleAxis.d.ts.map +1 -0
  60. package/dist/axis/role/RoleAxis.js +102 -0
  61. package/dist/axis/role/RoleAxis.js.map +1 -0
  62. package/dist/axis/shape/Formats.d.ts +8 -0
  63. package/dist/axis/shape/Formats.d.ts.map +1 -0
  64. package/dist/axis/shape/Formats.js +10 -0
  65. package/dist/axis/shape/Formats.js.map +1 -0
  66. package/dist/axis/shape/Shape.d.ts +58 -0
  67. package/dist/axis/shape/Shape.d.ts.map +1 -0
  68. package/dist/{field/shape.js → axis/shape/Shape.js} +10 -25
  69. package/dist/axis/shape/Shape.js.map +1 -0
  70. package/dist/card/Bundle.d.ts +15 -0
  71. package/dist/card/Bundle.d.ts.map +1 -0
  72. package/dist/card/Bundle.js +67 -0
  73. package/dist/card/Bundle.js.map +1 -0
  74. package/dist/card/Card.d.ts +27 -0
  75. package/dist/card/Card.d.ts.map +1 -0
  76. package/dist/card/Card.js +230 -0
  77. package/dist/card/Card.js.map +1 -0
  78. package/dist/card/Descriptor.d.ts +55 -0
  79. package/dist/card/Descriptor.d.ts.map +1 -0
  80. package/dist/card/Descriptor.js +2 -0
  81. package/dist/card/Descriptor.js.map +1 -0
  82. package/dist/card/EntityTypeSource.d.ts +12 -0
  83. package/dist/card/EntityTypeSource.d.ts.map +1 -0
  84. package/dist/card/EntityTypeSource.js +78 -0
  85. package/dist/card/EntityTypeSource.js.map +1 -0
  86. package/dist/card/FacadeTypeSource.d.ts +19 -0
  87. package/dist/card/FacadeTypeSource.d.ts.map +1 -0
  88. package/dist/card/FacadeTypeSource.js +40 -0
  89. package/dist/card/FacadeTypeSource.js.map +1 -0
  90. package/dist/card/admission.d.ts +9 -0
  91. package/dist/card/admission.d.ts.map +1 -0
  92. package/dist/card/admission.js +16 -0
  93. package/dist/card/admission.js.map +1 -0
  94. package/dist/card/diff.d.ts +96 -0
  95. package/dist/card/diff.d.ts.map +1 -0
  96. package/dist/card/diff.js +2 -0
  97. package/dist/card/diff.js.map +1 -0
  98. package/dist/constraint/FieldGroup.d.ts +21 -0
  99. package/dist/constraint/FieldGroup.d.ts.map +1 -0
  100. package/dist/constraint/FieldGroup.js +65 -0
  101. package/dist/constraint/FieldGroup.js.map +1 -0
  102. package/dist/constraint/Unique.d.ts +4 -0
  103. package/dist/constraint/Unique.d.ts.map +1 -0
  104. package/dist/constraint/Unique.js +4 -0
  105. package/dist/constraint/Unique.js.map +1 -0
  106. package/dist/entity.d.ts +4 -19
  107. package/dist/entity.d.ts.map +1 -1
  108. package/dist/entity.js +8 -39
  109. package/dist/entity.js.map +1 -1
  110. package/dist/fields/Field.d.ts +24 -0
  111. package/dist/fields/Field.d.ts.map +1 -0
  112. package/dist/fields/Field.js +52 -0
  113. package/dist/fields/Field.js.map +1 -0
  114. package/dist/fields/FieldSet.d.ts +28 -0
  115. package/dist/fields/FieldSet.d.ts.map +1 -0
  116. package/dist/fields/FieldSet.js +55 -0
  117. package/dist/fields/FieldSet.js.map +1 -0
  118. package/dist/index.d.ts +59 -37
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +50 -48
  121. package/dist/index.js.map +1 -1
  122. package/dist/judge/Cases.d.ts +50 -0
  123. package/dist/judge/Cases.d.ts.map +1 -0
  124. package/dist/judge/Cases.js +108 -0
  125. package/dist/judge/Cases.js.map +1 -0
  126. package/dist/judge/FieldJudge.d.ts +9 -0
  127. package/dist/judge/FieldJudge.d.ts.map +1 -0
  128. package/dist/judge/FieldJudge.js +54 -0
  129. package/dist/judge/FieldJudge.js.map +1 -0
  130. package/dist/judge/RowJudge.d.ts +12 -0
  131. package/dist/judge/RowJudge.d.ts.map +1 -0
  132. package/dist/judge/RowJudge.js +81 -0
  133. package/dist/judge/RowJudge.js.map +1 -0
  134. package/dist/judge/RowRefusal.d.ts +17 -0
  135. package/dist/judge/RowRefusal.d.ts.map +1 -0
  136. package/dist/judge/RowRefusal.js +16 -0
  137. package/dist/judge/RowRefusal.js.map +1 -0
  138. package/dist/judge/ValueForm.d.ts +3 -0
  139. package/dist/judge/ValueForm.d.ts.map +1 -0
  140. package/dist/judge/ValueForm.js +3 -0
  141. package/dist/judge/ValueForm.js.map +1 -0
  142. package/dist/judge/ValueJudge.d.ts +12 -0
  143. package/dist/judge/ValueJudge.d.ts.map +1 -0
  144. package/dist/judge/ValueJudge.js +60 -0
  145. package/dist/judge/ValueJudge.js.map +1 -0
  146. package/dist/judge/options.d.ts +4 -0
  147. package/dist/judge/options.d.ts.map +1 -0
  148. package/dist/judge/options.js +2 -0
  149. package/dist/judge/options.js.map +1 -0
  150. package/dist/judge/result.d.ts +17 -0
  151. package/dist/judge/result.d.ts.map +1 -0
  152. package/dist/judge/result.js +2 -0
  153. package/dist/judge/result.js.map +1 -0
  154. package/dist/projection/SchemaOrCard.d.ts +7 -0
  155. package/dist/projection/SchemaOrCard.d.ts.map +1 -0
  156. package/dist/projection/SchemaOrCard.js +11 -0
  157. package/dist/projection/SchemaOrCard.js.map +1 -0
  158. package/dist/projection/Visibility.d.ts +10 -0
  159. package/dist/projection/Visibility.d.ts.map +1 -0
  160. package/dist/projection/Visibility.js +55 -0
  161. package/dist/projection/Visibility.js.map +1 -0
  162. package/dist/{projections → projection}/standard.d.ts +2 -10
  163. package/dist/projection/standard.d.ts.map +1 -0
  164. package/dist/projection/standard.js +2 -0
  165. package/dist/projection/standard.js.map +1 -0
  166. package/dist/schema/Schema.d.ts +63 -0
  167. package/dist/schema/Schema.d.ts.map +1 -0
  168. package/dist/schema/Schema.js +129 -0
  169. package/dist/schema/Schema.js.map +1 -0
  170. package/dist/schema/SchemaDefinition.d.ts +46 -0
  171. package/dist/schema/SchemaDefinition.d.ts.map +1 -0
  172. package/dist/schema/SchemaDefinition.js +64 -0
  173. package/dist/schema/SchemaDefinition.js.map +1 -0
  174. package/dist/schema/SchemaDerivation.d.ts +28 -0
  175. package/dist/schema/SchemaDerivation.d.ts.map +1 -0
  176. package/dist/schema/SchemaDerivation.js +37 -0
  177. package/dist/schema/SchemaDerivation.js.map +1 -0
  178. package/dist/schema/SchemaView.d.ts +23 -0
  179. package/dist/schema/SchemaView.d.ts.map +1 -0
  180. package/dist/schema/SchemaView.js +2 -0
  181. package/dist/schema/SchemaView.js.map +1 -0
  182. package/dist/utils.d.ts +4 -0
  183. package/dist/utils.d.ts.map +1 -0
  184. package/dist/utils.js +13 -0
  185. package/dist/utils.js.map +1 -0
  186. package/dist/vocabulary/bool.d.ts +1 -1
  187. package/dist/vocabulary/bool.d.ts.map +1 -1
  188. package/dist/vocabulary/bool.js +1 -1
  189. package/dist/vocabulary/bool.js.map +1 -1
  190. package/dist/vocabulary/created.d.ts +1 -5
  191. package/dist/vocabulary/created.d.ts.map +1 -1
  192. package/dist/vocabulary/created.js +1 -5
  193. package/dist/vocabulary/created.js.map +1 -1
  194. package/dist/vocabulary/date.d.ts +1 -1
  195. package/dist/vocabulary/date.d.ts.map +1 -1
  196. package/dist/vocabulary/date.js +1 -1
  197. package/dist/vocabulary/date.js.map +1 -1
  198. package/dist/vocabulary/email.d.ts +1 -2
  199. package/dist/vocabulary/email.d.ts.map +1 -1
  200. package/dist/vocabulary/email.js +0 -1
  201. package/dist/vocabulary/email.js.map +1 -1
  202. package/dist/vocabulary/immutable.d.ts +2 -6
  203. package/dist/vocabulary/immutable.d.ts.map +1 -1
  204. package/dist/vocabulary/immutable.js +4 -7
  205. package/dist/vocabulary/immutable.js.map +1 -1
  206. package/dist/vocabulary/indexed.d.ts +2 -7
  207. package/dist/vocabulary/indexed.d.ts.map +1 -1
  208. package/dist/vocabulary/indexed.js +2 -8
  209. package/dist/vocabulary/indexed.js.map +1 -1
  210. package/dist/vocabulary/json.d.ts +2 -10
  211. package/dist/vocabulary/json.d.ts.map +1 -1
  212. package/dist/vocabulary/json.js +12 -7
  213. package/dist/vocabulary/json.js.map +1 -1
  214. package/dist/vocabulary/list.d.ts +1 -12
  215. package/dist/vocabulary/list.d.ts.map +1 -1
  216. package/dist/vocabulary/list.js +1 -14
  217. package/dist/vocabulary/list.js.map +1 -1
  218. package/dist/vocabulary/many.d.ts +2 -5
  219. package/dist/vocabulary/many.d.ts.map +1 -1
  220. package/dist/vocabulary/many.js +3 -6
  221. package/dist/vocabulary/many.js.map +1 -1
  222. package/dist/vocabulary/nullable.d.ts +2 -6
  223. package/dist/vocabulary/nullable.d.ts.map +1 -1
  224. package/dist/vocabulary/nullable.js +5 -8
  225. package/dist/vocabulary/nullable.js.map +1 -1
  226. package/dist/vocabulary/number.d.ts +1 -1
  227. package/dist/vocabulary/number.d.ts.map +1 -1
  228. package/dist/vocabulary/number.js +1 -1
  229. package/dist/vocabulary/number.js.map +1 -1
  230. package/dist/vocabulary/oneOf.d.ts +1 -8
  231. package/dist/vocabulary/oneOf.d.ts.map +1 -1
  232. package/dist/vocabulary/oneOf.js +1 -1
  233. package/dist/vocabulary/oneOf.js.map +1 -1
  234. package/dist/vocabulary/optional.d.ts +2 -9
  235. package/dist/vocabulary/optional.d.ts.map +1 -1
  236. package/dist/vocabulary/optional.js +6 -14
  237. package/dist/vocabulary/optional.js.map +1 -1
  238. package/dist/vocabulary/primary.d.ts +2 -15
  239. package/dist/vocabulary/primary.d.ts.map +1 -1
  240. package/dist/vocabulary/primary.js +4 -11
  241. package/dist/vocabulary/primary.js.map +1 -1
  242. package/dist/vocabulary/readOnly.d.ts +2 -6
  243. package/dist/vocabulary/readOnly.d.ts.map +1 -1
  244. package/dist/vocabulary/readOnly.js +5 -8
  245. package/dist/vocabulary/readOnly.js.map +1 -1
  246. package/dist/vocabulary/ref.d.ts +2 -7
  247. package/dist/vocabulary/ref.d.ts.map +1 -1
  248. package/dist/vocabulary/ref.js +3 -14
  249. package/dist/vocabulary/ref.js.map +1 -1
  250. package/dist/vocabulary/text.d.ts +2 -2
  251. package/dist/vocabulary/text.d.ts.map +1 -1
  252. package/dist/vocabulary/text.js +1 -1
  253. package/dist/vocabulary/text.js.map +1 -1
  254. package/dist/vocabulary/unique.d.ts +2 -12
  255. package/dist/vocabulary/unique.d.ts.map +1 -1
  256. package/dist/vocabulary/unique.js +5 -13
  257. package/dist/vocabulary/unique.js.map +1 -1
  258. package/dist/vocabulary/updated.d.ts +1 -6
  259. package/dist/vocabulary/updated.d.ts.map +1 -1
  260. package/dist/vocabulary/updated.js +0 -5
  261. package/dist/vocabulary/updated.js.map +1 -1
  262. package/dist/vocabulary/url.d.ts +1 -2
  263. package/dist/vocabulary/url.d.ts.map +1 -1
  264. package/dist/vocabulary/url.js +0 -1
  265. package/dist/vocabulary/url.js.map +1 -1
  266. package/dist/vocabulary/vocabulary.d.ts +4 -0
  267. package/dist/vocabulary/vocabulary.d.ts.map +1 -0
  268. package/dist/vocabulary/vocabulary.js +31 -0
  269. package/dist/vocabulary/vocabulary.js.map +1 -0
  270. package/dist/vocabulary/writeOnly.d.ts +2 -6
  271. package/dist/vocabulary/writeOnly.d.ts.map +1 -1
  272. package/dist/vocabulary/writeOnly.js +5 -8
  273. package/dist/vocabulary/writeOnly.js.map +1 -1
  274. package/package.json +8 -4
  275. package/src/EntityAdapters.ts +95 -0
  276. package/src/EntityDeclarations.ts +19 -0
  277. package/src/axis/Axis.ts +25 -0
  278. package/src/axis/Meta.ts +3 -0
  279. package/src/axis/boundary/Boundaries.ts +44 -0
  280. package/src/axis/boundary/Boundary.ts +69 -0
  281. package/src/axis/boundary/BoundaryAxis.ts +32 -0
  282. package/src/axis/lifecycle/Clock.ts +26 -0
  283. package/src/axis/lifecycle/Generators.ts +46 -0
  284. package/src/axis/lifecycle/Lifecycle.ts +53 -0
  285. package/src/axis/lifecycle/LifecycleAxis.ts +49 -0
  286. package/src/axis/lifecycle/apply.ts +38 -0
  287. package/src/axis/role/Relation.ts +31 -0
  288. package/src/axis/role/Role.ts +56 -0
  289. package/src/axis/role/RoleAxis.ts +115 -0
  290. package/src/axis/shape/Formats.ts +22 -0
  291. package/src/axis/shape/Shape.ts +91 -0
  292. package/src/card/Bundle.ts +80 -0
  293. package/src/card/Card.ts +256 -0
  294. package/src/card/Descriptor.ts +68 -0
  295. package/src/card/EntityTypeSource.ts +90 -0
  296. package/src/card/FacadeTypeSource.ts +55 -0
  297. package/src/card/admission.ts +25 -0
  298. package/src/card/diff.ts +56 -0
  299. package/src/constraint/FieldGroup.ts +91 -0
  300. package/src/constraint/Unique.ts +3 -0
  301. package/src/entity.ts +15 -0
  302. package/src/fields/Field.ts +80 -0
  303. package/src/fields/FieldSet.ts +62 -0
  304. package/src/index.ts +64 -0
  305. package/src/judge/Cases.ts +139 -0
  306. package/src/judge/FieldJudge.ts +61 -0
  307. package/src/judge/RowJudge.ts +84 -0
  308. package/src/judge/RowRefusal.ts +17 -0
  309. package/src/judge/ValueForm.ts +7 -0
  310. package/src/judge/ValueJudge.ts +72 -0
  311. package/src/judge/options.ts +3 -0
  312. package/src/judge/result.ts +10 -0
  313. package/src/projection/SchemaOrCard.ts +18 -0
  314. package/src/projection/Visibility.ts +47 -0
  315. package/src/projection/standard.ts +47 -0
  316. package/src/schema/Schema.ts +167 -0
  317. package/src/schema/SchemaDefinition.ts +87 -0
  318. package/src/schema/SchemaDerivation.ts +46 -0
  319. package/src/schema/SchemaView.ts +25 -0
  320. package/src/utils.ts +13 -0
  321. package/src/vocabulary/bool.ts +9 -0
  322. package/src/vocabulary/created.ts +8 -0
  323. package/src/vocabulary/date.ts +5 -0
  324. package/src/vocabulary/email.ts +6 -0
  325. package/src/vocabulary/immutable.ts +6 -0
  326. package/src/vocabulary/indexed.ts +4 -0
  327. package/src/vocabulary/json.ts +22 -0
  328. package/src/vocabulary/list.ts +13 -0
  329. package/src/vocabulary/many.ts +9 -0
  330. package/src/vocabulary/nullable.ts +7 -0
  331. package/src/vocabulary/number.ts +17 -0
  332. package/src/vocabulary/oneOf.ts +24 -0
  333. package/src/vocabulary/optional.ts +8 -0
  334. package/src/vocabulary/primary.ts +33 -0
  335. package/src/vocabulary/readOnly.ts +7 -0
  336. package/src/vocabulary/ref.ts +13 -0
  337. package/src/vocabulary/text.ts +19 -0
  338. package/src/vocabulary/unique.ts +10 -0
  339. package/src/vocabulary/updated.ts +7 -0
  340. package/src/vocabulary/url.ts +6 -0
  341. package/src/vocabulary/vocabulary.ts +40 -0
  342. package/src/vocabulary/writeOnly.ts +7 -0
  343. package/dist/field/boundary.d.ts +0 -69
  344. package/dist/field/boundary.d.ts.map +0 -1
  345. package/dist/field/boundary.js +0 -82
  346. package/dist/field/boundary.js.map +0 -1
  347. package/dist/field/field.d.ts +0 -21
  348. package/dist/field/field.d.ts.map +0 -1
  349. package/dist/field/field.js +0 -24
  350. package/dist/field/field.js.map +0 -1
  351. package/dist/field/format.d.ts +0 -29
  352. package/dist/field/format.d.ts.map +0 -1
  353. package/dist/field/format.js +0 -24
  354. package/dist/field/format.js.map +0 -1
  355. package/dist/field/index.d.ts +0 -8
  356. package/dist/field/index.d.ts.map +0 -1
  357. package/dist/field/index.js +0 -10
  358. package/dist/field/index.js.map +0 -1
  359. package/dist/field/lifecycle.d.ts +0 -31
  360. package/dist/field/lifecycle.d.ts.map +0 -1
  361. package/dist/field/lifecycle.js +0 -20
  362. package/dist/field/lifecycle.js.map +0 -1
  363. package/dist/field/meta.d.ts +0 -5
  364. package/dist/field/meta.d.ts.map +0 -1
  365. package/dist/field/meta.js +0 -5
  366. package/dist/field/meta.js.map +0 -1
  367. package/dist/field/role.d.ts +0 -47
  368. package/dist/field/role.d.ts.map +0 -1
  369. package/dist/field/role.js +0 -35
  370. package/dist/field/role.js.map +0 -1
  371. package/dist/field/shape.d.ts +0 -89
  372. package/dist/field/shape.d.ts.map +0 -1
  373. package/dist/field/shape.js.map +0 -1
  374. package/dist/hints.d.ts +0 -28
  375. package/dist/hints.d.ts.map +0 -1
  376. package/dist/hints.js +0 -23
  377. package/dist/hints.js.map +0 -1
  378. package/dist/name.d.ts +0 -8
  379. package/dist/name.d.ts.map +0 -1
  380. package/dist/name.js +0 -10
  381. package/dist/name.js.map +0 -1
  382. package/dist/projections/card.d.ts +0 -98
  383. package/dist/projections/card.d.ts.map +0 -1
  384. package/dist/projections/card.js +0 -8
  385. package/dist/projections/card.js.map +0 -1
  386. package/dist/projections/describe.d.ts +0 -25
  387. package/dist/projections/describe.d.ts.map +0 -1
  388. package/dist/projections/describe.js +0 -131
  389. package/dist/projections/describe.js.map +0 -1
  390. package/dist/projections/encode.d.ts +0 -11
  391. package/dist/projections/encode.d.ts.map +0 -1
  392. package/dist/projections/encode.js +0 -26
  393. package/dist/projections/encode.js.map +0 -1
  394. package/dist/projections/io.d.ts +0 -24
  395. package/dist/projections/io.d.ts.map +0 -1
  396. package/dist/projections/io.js +0 -46
  397. package/dist/projections/io.js.map +0 -1
  398. package/dist/projections/lifecycle.d.ts +0 -29
  399. package/dist/projections/lifecycle.d.ts.map +0 -1
  400. package/dist/projections/lifecycle.js +0 -93
  401. package/dist/projections/lifecycle.js.map +0 -1
  402. package/dist/projections/reconstruct.d.ts +0 -31
  403. package/dist/projections/reconstruct.d.ts.map +0 -1
  404. package/dist/projections/reconstruct.js +0 -146
  405. package/dist/projections/reconstruct.js.map +0 -1
  406. package/dist/projections/source.d.ts +0 -18
  407. package/dist/projections/source.d.ts.map +0 -1
  408. package/dist/projections/source.js +0 -18
  409. package/dist/projections/source.js.map +0 -1
  410. package/dist/projections/standard.d.ts.map +0 -1
  411. package/dist/projections/standard.js +0 -10
  412. package/dist/projections/standard.js.map +0 -1
  413. package/dist/projections/typescript.d.ts +0 -37
  414. package/dist/projections/typescript.d.ts.map +0 -1
  415. package/dist/projections/typescript.js +0 -157
  416. package/dist/projections/typescript.js.map +0 -1
  417. package/dist/schema/index.d.ts +0 -3
  418. package/dist/schema/index.d.ts.map +0 -1
  419. package/dist/schema/index.js +0 -2
  420. package/dist/schema/index.js.map +0 -1
  421. package/dist/schema/schema.d.ts +0 -74
  422. package/dist/schema/schema.d.ts.map +0 -1
  423. package/dist/schema/schema.js +0 -162
  424. package/dist/schema/schema.js.map +0 -1
  425. package/dist/schema/view.d.ts +0 -26
  426. package/dist/schema/view.d.ts.map +0 -1
  427. package/dist/schema/view.js +0 -2
  428. package/dist/schema/view.js.map +0 -1
  429. package/dist/unique.d.ts +0 -40
  430. package/dist/unique.d.ts.map +0 -1
  431. package/dist/unique.js +0 -57
  432. package/dist/unique.js.map +0 -1
  433. package/dist/validation/index.d.ts +0 -4
  434. package/dist/validation/index.d.ts.map +0 -1
  435. package/dist/validation/index.js +0 -2
  436. package/dist/validation/index.js.map +0 -1
  437. package/dist/validation/judge.d.ts +0 -55
  438. package/dist/validation/judge.d.ts.map +0 -1
  439. package/dist/validation/judge.js +0 -351
  440. package/dist/validation/judge.js.map +0 -1
  441. package/dist/validation/options.d.ts +0 -6
  442. package/dist/validation/options.d.ts.map +0 -1
  443. package/dist/validation/options.js +0 -3
  444. package/dist/validation/options.js.map +0 -1
  445. package/dist/validation/result.d.ts +0 -20
  446. package/dist/validation/result.d.ts.map +0 -1
  447. package/dist/validation/result.js +0 -3
  448. package/dist/validation/result.js.map +0 -1
@@ -0,0 +1,47 @@
1
+ import { admitWire } from '../../card/admission.js';
2
+ import { isObject, oneOfTokens } from '../../judge/ValueForm.js';
3
+ import { CREATE_TOKENS, UPDATE_TOKENS } from './Lifecycle.js';
4
+ export const lifecycleAxis = {
5
+ slot: 'lifecycle',
6
+ judge(value, errors) {
7
+ if (!isObject(value)) {
8
+ errors.push({ path: 'lifecycle', message: `Expected an object — got ${JSON.stringify(value)}` });
9
+ return;
10
+ }
11
+ if (value.create !== undefined)
12
+ judgeCreate(value.create, errors);
13
+ if (value.update !== undefined && !oneOfTokens(value.update, UPDATE_TOKENS)) {
14
+ errors.push({
15
+ path: 'lifecycle.update',
16
+ message: `Expected 'now' or 'forbidden' — got ${JSON.stringify(value.update)}`,
17
+ });
18
+ }
19
+ },
20
+ describe: (value) => value,
21
+ reconstruct: (wire) => {
22
+ admitWire(lifecycleAxis.judge, wire, 'lifecycle');
23
+ return wire;
24
+ },
25
+ };
26
+ function judgeCreate(rule, errors) {
27
+ if (oneOfTokens(rule, CREATE_TOKENS))
28
+ return;
29
+ if (isObject(rule)) {
30
+ if ('value' in rule)
31
+ return;
32
+ if ('generate' in rule) {
33
+ if (typeof rule.generate !== 'string') {
34
+ errors.push({
35
+ path: 'lifecycle.create.generate',
36
+ message: `Expected a generator name — got ${JSON.stringify(rule.generate)}`,
37
+ });
38
+ }
39
+ return;
40
+ }
41
+ }
42
+ errors.push({
43
+ path: 'lifecycle.create',
44
+ message: `Expected 'now', 'optional', { value } or { generate } — got ${JSON.stringify(rule)}`,
45
+ });
46
+ }
47
+ //# sourceMappingURL=LifecycleAxis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LifecycleAxis.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/LifecycleAxis.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAuB,MAAM,gBAAgB,CAAC;AAEnF,MAAM,CAAC,MAAM,aAAa,GAAyC;IACjE,IAAI,EAAE,WAAW;IAEjB,KAAK,CAAC,KAAK,EAAE,MAAM;QACjB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACjG,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,uCAAuC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;aAC/E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IAC1B,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;QACpB,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,SAAS,WAAW,CAAC,IAAa,EAAE,MAAyB;IAC3D,IAAI,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;QAAE,OAAO;IAC7C,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO;QAC5B,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,2BAA2B;oBACjC,OAAO,EAAE,mCAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;iBAC5E,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,+DAA+D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;KAC/F,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type Fields } from '../../fields/Field.js';
2
+ type Row = Record<string, unknown>;
3
+ export declare function applyCreate(fields: Fields, input: Row): Row;
4
+ export declare function applyUpdate(fields: Fields, patch: Row): Row;
5
+ export {};
6
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/apply.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEhE,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnC,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAc3D;AAOD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAS3D"}
@@ -0,0 +1,34 @@
1
+ import { Lifecycle } from './Lifecycle.js';
2
+ import { Generators } from './Generators.js';
3
+ import { Clock } from './Clock.js';
4
+ export function applyCreate(fields, input) {
5
+ const out = { ...input };
6
+ const instant = Clock.now();
7
+ for (const [name, field] of Object.entries(fields)) {
8
+ if (name in out)
9
+ continue;
10
+ const rule = Lifecycle.of(field);
11
+ if (rule.create === 'now')
12
+ out[name] = new Date(instant);
13
+ else if (rule.literal)
14
+ out[name] = freshValue(rule.literal.value);
15
+ else if (rule.generator)
16
+ out[name] = Generators.resolve(rule.generator)();
17
+ }
18
+ return out;
19
+ }
20
+ function freshValue(value) {
21
+ if (value === null || typeof value !== 'object')
22
+ return value;
23
+ return structuredClone(value);
24
+ }
25
+ export function applyUpdate(fields, patch) {
26
+ const out = { ...patch };
27
+ const instant = Clock.now();
28
+ for (const [name, field] of Object.entries(fields)) {
29
+ if (Lifecycle.of(field).stampedOnUpdate && !(name in out))
30
+ out[name] = new Date(instant);
31
+ }
32
+ return out;
33
+ }
34
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,KAAU;IACpD,MAAM,GAAG,GAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAsB,EAAE,CAAC;QACxE,IAAI,IAAI,IAAI,GAAG;YAAE,SAAS;QAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;aACpD,IAAI,IAAI,CAAC,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAC7D,IAAI,IAAI,CAAC,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC5E,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,KAAU;IACpD,MAAM,GAAG,GAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAsB,EAAE,CAAC;QACxE,IAAI,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type EntityConstructor = abstract new (...args: any[]) => any;
2
+ export declare const RELATION_KINDS: readonly ['one', 'many'];
3
+ export declare const ON_DELETE: readonly ['cascade', 'restrict', 'set null'];
4
+ export interface Relation {
5
+ to: () => EntityConstructor;
6
+ kind: (typeof RELATION_KINDS)[number];
7
+ onDelete?: (typeof ON_DELETE)[number];
8
+ }
9
+ /**
10
+ * How a relation is built — the one place a target becomes a thunk.
11
+ *
12
+ * A target arrives as the class or as a function returning it, because a cycle between two
13
+ * entities can only be written the second way. Recognised by FORM, `getFields` on the
14
+ * value: a class answers it, a thunk does not.
15
+ */
16
+ export declare const Relation: {
17
+ one(target: EntityConstructor | (() => EntityConstructor), cascade?: boolean): Relation;
18
+ many(target: EntityConstructor | (() => EntityConstructor)): Relation;
19
+ };
20
+ //# sourceMappingURL=Relation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Relation.d.ts","sourceRoot":"","sources":["../../../src/axis/role/Relation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAErE,eAAO,MAAM,cAAc,YAAI,KAAK,EAAE,MAAM,CAAU,CAAC;AACvD,eAAO,MAAM,SAAS,YAAI,SAAS,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,iBAAiB,CAAC;IAC5B,IAAI,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;CACvC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ;IACnB,GAAG,SAAS,iBAAiB,GAAG,CAAC,MAAM,iBAAiB,CAAC,YAAY,OAAO,GAAG,QAAQ;IAIvF,IAAI,SAAS,iBAAiB,GAAG,CAAC,MAAM,iBAAiB,CAAC,GAAG,QAAQ;CAGtE,CAAC"}
@@ -0,0 +1,21 @@
1
+ export const RELATION_KINDS = ['one', 'many'];
2
+ export const ON_DELETE = ['cascade', 'restrict', 'set null'];
3
+ /**
4
+ * How a relation is built — the one place a target becomes a thunk.
5
+ *
6
+ * A target arrives as the class or as a function returning it, because a cycle between two
7
+ * entities can only be written the second way. Recognised by FORM, `getFields` on the
8
+ * value: a class answers it, a thunk does not.
9
+ */
10
+ export const Relation = {
11
+ one(target, cascade) {
12
+ return { to: thunk(target), kind: 'one', onDelete: cascade ? 'cascade' : undefined };
13
+ },
14
+ many(target) {
15
+ return { to: thunk(target), kind: 'many' };
16
+ },
17
+ };
18
+ function thunk(target) {
19
+ return 'getFields' in target ? () => target : target;
20
+ }
21
+ //# sourceMappingURL=Relation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Relation.js","sourceRoot":"","sources":["../../../src/axis/role/Relation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAC;AACvD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAQtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,CAAC,MAAqD,EAAE,OAAiB;QAC1E,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACvF,CAAC;IAED,IAAI,CAAC,MAAqD;QACxD,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC7C,CAAC;CACF,CAAC;AAEF,SAAS,KAAK,CAA8B,MAAqB;IAC/D,OAAO,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAW,CAAC,CAAC,CAAE,MAAkB,CAAC;AACzE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { FieldGroup } from "../../constraint/FieldGroup.js";
2
+ import type { EntityConstructor, Relation } from "./Relation.js";
3
+ export interface RoleRules {
4
+ primary?: boolean;
5
+ index?: boolean;
6
+ relation?: Relation;
7
+ rules?: readonly FieldGroup[];
8
+ }
9
+ export declare class Role implements RoleRules {
10
+ readonly primary?: boolean;
11
+ readonly index?: boolean;
12
+ readonly relation?: Relation;
13
+ readonly rules?: readonly FieldGroup[];
14
+ private constructor();
15
+ static of(field: {
16
+ role?: RoleRules;
17
+ }): Role;
18
+ /** A group written with no members means "this field": only the key it is declared under resolves it. */
19
+ static resolvedOn(role: RoleRules | undefined, key?: string): RoleRules | undefined;
20
+ get isPrimary(): boolean;
21
+ get isIndexed(): boolean;
22
+ get isCollection(): boolean;
23
+ get isReference(): boolean;
24
+ get target(): EntityConstructor | undefined;
25
+ }
26
+ //# sourceMappingURL=Role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Role.d.ts","sourceRoot":"","sources":["../../../src/axis/role/Role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEjE,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B;AAED,qBAAa,IAAK,YAAW,SAAS;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAEvC,OAAO,eAKN;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAE3C;IAED,yGAAyG;IACzG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAKlF;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,MAAM,IAAI,iBAAiB,GAAG,SAAS,CAE1C;CACF"}
@@ -0,0 +1,40 @@
1
+ import { FieldGroup } from "../../constraint/FieldGroup.js";
2
+ import { Unique } from "../../constraint/Unique.js";
3
+ export class Role {
4
+ primary;
5
+ index;
6
+ relation;
7
+ rules;
8
+ constructor(declared = {}) {
9
+ this.primary = declared.primary;
10
+ this.index = declared.index;
11
+ this.relation = declared.relation;
12
+ this.rules = declared.rules;
13
+ }
14
+ static of(field) {
15
+ return new Role(field.role);
16
+ }
17
+ /** A group written with no members means "this field": only the key it is declared under resolves it. */
18
+ static resolvedOn(role, key) {
19
+ let rules = FieldGroup.normalize(role?.rules, (members) => new Unique(members));
20
+ if (rules && key !== undefined && rules.some((group) => group.isSelf))
21
+ rules = rules.map((group) => group.resolvedOn(key));
22
+ return rules === role?.rules ? role : { ...role, rules };
23
+ }
24
+ get isPrimary() {
25
+ return this.primary === true;
26
+ }
27
+ get isIndexed() {
28
+ return this.index === true;
29
+ }
30
+ get isCollection() {
31
+ return this.relation?.kind === "many";
32
+ }
33
+ get isReference() {
34
+ return this.relation?.kind === "one";
35
+ }
36
+ get target() {
37
+ return this.relation?.to();
38
+ }
39
+ }
40
+ //# sourceMappingURL=Role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Role.js","sourceRoot":"","sources":["../../../src/axis/role/Role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAUpD,MAAM,OAAO,IAAI;IACN,OAAO,CAAW;IAClB,KAAK,CAAW;IAChB,QAAQ,CAAY;IACpB,KAAK,CAAyB;IAEvC,YAAoB,QAAQ,GAAc,EAAE;QAC1C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,KAA2B;QACnC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,yGAAyG;IACzG,MAAM,CAAC,UAAU,CAAC,IAA2B,EAAE,GAAY;QACzD,IAAI,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAChF,IAAI,KAAK,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;YACnE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,OAAO,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IAC/B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IAC7B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC;IACxC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC;IACvC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { Axis } from '../Axis.js';
2
+ import { type RoleRules } from './Role.js';
3
+ import type { RoleDescriptor } from '../../card/Descriptor.js';
4
+ export declare const roleAxis: Axis<RoleRules, RoleDescriptor>;
5
+ //# sourceMappingURL=RoleAxis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleAxis.d.ts","sourceRoot":"","sources":["../../../src/axis/role/RoleAxis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,YAAY,CAAC;AAKjD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CA+EpD,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { refuse } from '../../card/admission.js';
2
+ import { isObject, oneOfTokens } from '../../judge/ValueForm.js';
3
+ import { ON_DELETE, RELATION_KINDS } from './Relation.js';
4
+ import { FieldGroup } from '../../constraint/FieldGroup.js';
5
+ import { Unique } from '../../constraint/Unique.js';
6
+ import { lowerFirst } from '../../utils.js';
7
+ export const roleAxis = {
8
+ slot: 'role',
9
+ judge(value, errors) {
10
+ if (!isObject(value)) {
11
+ errors.push({ path: 'role', message: `Expected an object — got ${JSON.stringify(value)}` });
12
+ return;
13
+ }
14
+ for (const flag of ['primary', 'index']) {
15
+ if (value[flag] !== undefined && typeof value[flag] !== 'boolean') {
16
+ errors.push({
17
+ path: `role.${flag}`,
18
+ message: `Expected a boolean — got ${JSON.stringify(value[flag])}`,
19
+ });
20
+ }
21
+ }
22
+ if (value.rules !== undefined) {
23
+ const legal = Array.isArray(value.rules) &&
24
+ value.rules.every((rule) => rule instanceof FieldGroup ||
25
+ (Array.isArray(rule) && rule.every((member) => typeof member === 'string')));
26
+ if (!legal) {
27
+ errors.push({
28
+ path: 'role.rules',
29
+ message: 'Expected field groups, or the member lists they denote — string[][]',
30
+ });
31
+ }
32
+ }
33
+ if (value.relation !== undefined)
34
+ judgeRelation(value.relation, errors);
35
+ },
36
+ describe(role, key) {
37
+ const out = {};
38
+ if (role.primary)
39
+ out.primary = true;
40
+ const unique = (role.rules ?? []).filter((rule) => rule instanceof Unique);
41
+ if (unique.length)
42
+ out.unique = unique.map((rule) => [...rule.resolvedOn(key).members]);
43
+ if (role.index)
44
+ out.index = true;
45
+ if (role.relation) {
46
+ const target = role.relation.to();
47
+ out.relation = {
48
+ to: lowerFirst(target.name ?? ''),
49
+ kind: role.relation.kind,
50
+ ...(role.relation.onDelete ? { onDelete: role.relation.onDelete } : {}),
51
+ };
52
+ }
53
+ return Object.keys(out).length ? out : undefined;
54
+ },
55
+ reconstruct(wire, resolve) {
56
+ const out = {};
57
+ if (wire.primary)
58
+ out.primary = true;
59
+ if (wire.unique?.length)
60
+ out.rules = wire.unique.map((group) => new Unique(group));
61
+ if (wire.index)
62
+ out.index = true;
63
+ if (wire.relation) {
64
+ // `judge` cannot serve here: it demands a thunk where a card carries a name.
65
+ if (!oneOfTokens(wire.relation.kind, RELATION_KINDS)) {
66
+ refuse(`role.relation.kind is ${JSON.stringify(wire.relation.kind)}`, `Expected one of ${RELATION_KINDS.join(', ')}.`);
67
+ }
68
+ if (wire.relation.onDelete !== undefined && !oneOfTokens(wire.relation.onDelete, ON_DELETE)) {
69
+ refuse(`role.relation.onDelete is ${JSON.stringify(wire.relation.onDelete)}`, `Expected one of ${ON_DELETE.join(', ')}.`);
70
+ }
71
+ const name = wire.relation.to;
72
+ out.relation = {
73
+ to: () => (resolve?.(name) ?? { name }),
74
+ kind: wire.relation.kind,
75
+ ...(wire.relation.onDelete ? { onDelete: wire.relation.onDelete } : {}),
76
+ };
77
+ }
78
+ return out;
79
+ },
80
+ };
81
+ function judgeRelation(relation, errors) {
82
+ if (!isObject(relation)) {
83
+ errors.push({ path: 'role.relation', message: `Expected an object — got ${JSON.stringify(relation)}` });
84
+ return;
85
+ }
86
+ if (!oneOfTokens(relation.kind, RELATION_KINDS)) {
87
+ errors.push({
88
+ path: 'role.relation.kind',
89
+ message: `Expected 'one' or 'many' — got ${JSON.stringify(relation.kind)}`,
90
+ });
91
+ }
92
+ if (typeof relation.to !== 'function') {
93
+ errors.push({ path: 'role.relation.to', message: 'Expected a thunk returning the target entity' });
94
+ }
95
+ if (relation.onDelete !== undefined && !oneOfTokens(relation.onDelete, ON_DELETE)) {
96
+ errors.push({
97
+ path: 'role.relation.onDelete',
98
+ message: `Expected 'cascade', 'restrict' or 'set null' — got ${JSON.stringify(relation.onDelete)}`,
99
+ });
100
+ }
101
+ }
102
+ //# sourceMappingURL=RoleAxis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleAxis.js","sourceRoot":"","sources":["../../../src/axis/role/RoleAxis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type StringFormat = 'date-time' | 'date' | 'time' | 'email' | 'uuid' | 'uri' | (string & {});
2
+ export type FormatPredicate = (value: string) => boolean;
3
+ export declare class Formats {
4
+ private static readonly registry;
5
+ static register(name: string, predicate: FormatPredicate): void;
6
+ static resolve(name: string): FormatPredicate | undefined;
7
+ }
8
+ //# sourceMappingURL=Formats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Formats.d.ts","sourceRoot":"","sources":["../../../src/axis/shape/Formats.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,GACL,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAEzD,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAEtE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,IAAI,CAE9D;IAED,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAExD;CACF"}
@@ -0,0 +1,10 @@
1
+ export class Formats {
2
+ static registry = new Map();
3
+ static register(name, predicate) {
4
+ this.registry.set(name, predicate);
5
+ }
6
+ static resolve(name) {
7
+ return this.registry.get(name);
8
+ }
9
+ }
10
+ //# sourceMappingURL=Formats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Formats.js","sourceRoot":"","sources":["../../../src/axis/shape/Formats.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,OAAO;IACV,MAAM,CAAU,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEtE,MAAM,CAAC,QAAQ,CAAC,IAAY,EAAE,SAA0B;QACtD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,58 @@
1
+ import type { StringFormat } from './Formats.js';
2
+ type Nullably<T extends string> = T | readonly [T, 'null'];
3
+ interface StringConstraints {
4
+ minLength?: number;
5
+ maxLength?: number;
6
+ pattern?: string;
7
+ enum?: readonly (string | null)[];
8
+ format?: StringFormat;
9
+ }
10
+ interface NumericConstraints {
11
+ minimum?: number;
12
+ maximum?: number;
13
+ }
14
+ interface ArrayConstraints {
15
+ items?: Shape;
16
+ minItems?: number;
17
+ maxItems?: number;
18
+ }
19
+ interface ObjectConstraints {
20
+ properties?: Record<string, unknown>;
21
+ required?: readonly string[];
22
+ }
23
+ export type Shape = ({
24
+ type: Nullably<'string'>;
25
+ } & StringConstraints) | ({
26
+ type: Nullably<'number'> | Nullably<'integer'>;
27
+ } & NumericConstraints) | {
28
+ type: Nullably<'boolean'>;
29
+ } | ({
30
+ type: Nullably<'array'>;
31
+ } & ArrayConstraints) | ({
32
+ type: Nullably<'object'>;
33
+ } & ObjectConstraints);
34
+ type BaseShape = ({
35
+ type: 'string';
36
+ } & StringConstraints) | ({
37
+ type: 'number' | 'integer';
38
+ } & NumericConstraints) | {
39
+ type: 'boolean';
40
+ } | ({
41
+ type: 'array';
42
+ } & ArrayConstraints) | ({
43
+ type: 'object';
44
+ } & ObjectConstraints);
45
+ interface ShapeAnatomy {
46
+ base?: BaseShape;
47
+ nullable: boolean;
48
+ }
49
+ export declare class Anatomy {
50
+ static is(value: unknown): value is Shape;
51
+ static nullable(shape: Shape): Shape;
52
+ private static readonly cache;
53
+ private static readonly none;
54
+ static of(shape?: Shape): ShapeAnatomy;
55
+ static isNullable(shape?: Shape): boolean;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=Shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shape.d.ts","sourceRoot":"","sources":["../../../src/axis/shape/Shape.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,KAAK,QAAQ,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAE3D,UAAU,iBAAiB;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAAE;AAClJ,UAAU,kBAAkB;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AACnE,UAAU,gBAAgB;IAAG,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAClF,UAAU,iBAAiB;IAAG,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE;AAElG,MAAM,MAAM,KAAK,GACb,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;CAAE,GAAG,iBAAiB,CAAC,GAClD,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;CAAE,GAAG,kBAAkB,CAAC,GACzE;IAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;CAAE,GAC7B,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAAE,GAAG,gBAAgB,CAAC,GAChD,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;CAAE,GAAG,iBAAiB,CAAC,CAAC;AAcvD,KAAK,SAAS,GACV,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,iBAAiB,CAAC,GACxC,CAAC;IAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,GAAG,kBAAkB,CAAC,GACrD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB,CAAC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACtC,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,iBAAiB,CAAC,CAAC;AAW7C,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,OAAO;IAClB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAExC;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAEnC;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAuC;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAsD;IAElF,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,YAAY,CAiBrC;IAED,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAExC;CACF"}
@@ -1,13 +1,5 @@
1
- /**
2
- * The BASE type names — what `Anatomy.of(shape).base?.type` narrows to for a dispatch.
3
- *
4
- * The runtime list is the source and the type derives from it, not the reverse: a type
5
- * union cannot be enumerated at runtime, so writing both by hand means two lists that
6
- * drift. {@link isShape} needs the values, so it is the values that are declared.
7
- */
8
- export const SHAPE_TYPES = ['string', 'number', 'integer', 'boolean', 'array', 'object'];
9
- /** Is this a shape? Asked of its `type`, against {@link SHAPE_TYPES}. */
10
- export function isShape(value) {
1
+ const SHAPE_TYPES = ['string', 'number', 'integer', 'boolean', 'array', 'object'];
2
+ function isShapeImpl(value) {
11
3
  if (typeof value !== 'object' || value === null)
12
4
  return false;
13
5
  const declared = value.type;
@@ -15,13 +7,7 @@ export function isShape(value) {
15
7
  return (names.some((name) => SHAPE_TYPES.includes(name)) &&
16
8
  names.every((name) => name === 'null' || SHAPE_TYPES.includes(name)));
17
9
  }
18
- // ─── nullableShape / anatomy — the two gates of the union ──────────
19
- /**
20
- * Write side: make a shape's grammar accept `null` — the type becomes the union
21
- * `[T, 'null']`, and `null` joins `enum` when present (an enum is a closed value
22
- * set; null must be IN it to be legal). Idempotent.
23
- */
24
- export function nullableShape(shape) {
10
+ function nullableShapeImpl(shape) {
25
11
  if (Array.isArray(shape.type))
26
12
  return shape;
27
13
  const out = { ...shape, type: [shape.type, 'null'] };
@@ -30,13 +16,13 @@ export function nullableShape(shape) {
30
16
  }
31
17
  return out;
32
18
  }
33
- /**
34
- * The read side — the single customs post at the standard's border. Every consumer that
35
- * dispatches on a shape's type comes through here: `shape.type` may be the union
36
- * `[T,'null']`, and a direct comparison fails silently on it.
37
- */
38
19
  export class Anatomy {
39
- /** Cached per shape reference — derivations copy field refs, they never rebuild shapes. */
20
+ static is(value) {
21
+ return isShapeImpl(value);
22
+ }
23
+ static nullable(shape) {
24
+ return nullableShapeImpl(shape);
25
+ }
40
26
  static cache = new WeakMap();
41
27
  static none = { base: undefined, nullable: false };
42
28
  static of(shape) {
@@ -59,9 +45,8 @@ export class Anatomy {
59
45
  }
60
46
  return a;
61
47
  }
62
- /** Sugar for the most common read: does this shape's grammar accept `null`? */
63
48
  static isNullable(shape) {
64
49
  return this.of(shape).nullable;
65
50
  }
66
51
  }
67
- //# sourceMappingURL=shape.js.map
52
+ //# sourceMappingURL=Shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shape.js","sourceRoot":"","sources":["../../../src/axis/shape/Shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SchemaView } from '../schema/SchemaView.js';
2
+ import type { SchemaBundle } from './Descriptor.js';
3
+ import type { SetDiff, SetDiffOptions } from './diff.js';
4
+ type SchemaSet = Record<string, SchemaView> | SchemaView[];
5
+ /** A portable schema map and the decisions that only a map can make. */
6
+ export declare class Bundle {
7
+ readonly descriptor: SchemaBundle;
8
+ private constructor();
9
+ static fromSchemas(schemas: SchemaSet): Bundle;
10
+ static fromDescriptor(descriptor: SchemaBundle): Bundle;
11
+ toSchemas(): Record<string, SchemaView>;
12
+ diff(other: Bundle, options?: SetDiffOptions): SetDiff;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=Bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bundle.d.ts","sourceRoot":"","sources":["../../src/card/Bundle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AACtE,OAAO,KAAK,EAAQ,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE/D,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,UAAU,EAAE,CAAC;AAE3D,wEAAwE;AACxE,qBAAa,MAAM;IACG,QAAQ,CAAC,UAAU,EAAE,YAAY;IAArD,OAAO,eAAkD;IAEzD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CA4B7C;IAED,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,YAAY,GAAG,MAAM,CAEtD;IAED,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAUtC;IAED,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAkBzD;CACF"}
@@ -0,0 +1,67 @@
1
+ import { lowerFirst } from '../utils.js';
2
+ import { Card } from './Card.js';
3
+ /** A portable schema map and the decisions that only a map can make. */
4
+ export class Bundle {
5
+ descriptor;
6
+ constructor(descriptor) {
7
+ this.descriptor = descriptor;
8
+ }
9
+ static fromSchemas(schemas) {
10
+ const definitions = {};
11
+ const claimedBy = new Map();
12
+ const entries = Array.isArray(schemas)
13
+ ? schemas.map((schema) => {
14
+ const card = Card.fromSchema(schema);
15
+ return { name: card.descriptor.title ?? '', schema };
16
+ })
17
+ : Object.entries(schemas).map(([name, schema]) => ({ name, schema }));
18
+ for (const entry of entries) {
19
+ const key = lowerFirst(entry.name);
20
+ const previous = claimedBy.get(key);
21
+ if (previous !== undefined) {
22
+ throw new Error(`Schemas '${previous}' and '${entry.name}' both claim bundle key '${key}'. `
23
+ + 'Each schema in a bundle must have a distinct registration key.');
24
+ }
25
+ claimedBy.set(key, entry.name);
26
+ definitions[key] = Card.fromSchema(entry.schema, key).descriptor;
27
+ }
28
+ return new Bundle({
29
+ $defs: definitions,
30
+ 'x-fougere-version': 1,
31
+ 'x-fougere-vendor': 'fougere',
32
+ });
33
+ }
34
+ static fromDescriptor(descriptor) {
35
+ return new Bundle(descriptor);
36
+ }
37
+ toSchemas() {
38
+ const map = {};
39
+ const resolve = (name) => map[name.toLowerCase()];
40
+ const schemas = {};
41
+ for (const [name, descriptor] of Object.entries(this.descriptor.$defs)) {
42
+ const schema = Card.fromDescriptor(descriptor).toSchema(resolve, name);
43
+ map[name.toLowerCase()] = schema;
44
+ schemas[name] = schema;
45
+ }
46
+ return schemas;
47
+ }
48
+ diff(other, options = {}) {
49
+ const before = this.descriptor.$defs ?? {};
50
+ const after = other.descriptor.$defs ?? {};
51
+ const entities = {};
52
+ for (const [name, descriptor] of Object.entries(before)) {
53
+ const target = after[name];
54
+ if (target === undefined)
55
+ continue;
56
+ const answer = Card.fromDescriptor(descriptor).diff(Card.fromDescriptor(target), { renamed: options.renamed?.[name] ?? {} });
57
+ if (answer.changes.length > 0 || answer.ambiguous.length > 0)
58
+ entities[name] = answer;
59
+ }
60
+ return {
61
+ entitiesAdded: Object.keys(after).filter((name) => !(name in before)),
62
+ entitiesRemoved: Object.keys(before).filter((name) => !(name in after)),
63
+ entities,
64
+ };
65
+ }
66
+ }
67
+ //# sourceMappingURL=Bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bundle.js","sourceRoot":"","sources":["../../src/card/Bundle.ts"],"names":[],"mappings":"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"}