@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
package/README.md CHANGED
@@ -52,4 +52,4 @@ pnpm add @fougere/schema
52
52
 
53
53
  Part of [Fougere](https://github.com/chok/fougere) — one schema, a gradient from
54
54
  monolith to distributed, the same user code.
55
- Reference documentation: [the site](https://chok.github.io/fougere/) (en/fr).
55
+ Reference documentation: [the site](https://fougere.dev/) (en/fr).
@@ -0,0 +1,26 @@
1
+ import type { FieldName, Fields } from './fields/Field.js';
2
+ export interface FougereEntityAdapters<K extends string> {
3
+ }
4
+ export type EntityAdapters<TFields extends Fields> = Partial<FougereEntityAdapters<FieldName<TFields>>>;
5
+ /**
6
+ * What one schema states per adapter: an adapter name, a field name, then that adapter's own value.
7
+ */
8
+ export declare class EntityAdapterSet {
9
+ private readonly byAdapter;
10
+ private constructor();
11
+ static of(declared: EntityAdapters<Fields> | undefined): EntityAdapterSet | undefined;
12
+ /** Several schemas folded into one set; a later source wins, per adapter and per field. */
13
+ static merged(sources: readonly (EntityAdapters<Fields> | undefined)[]): EntityAdapterSet | undefined;
14
+ /** The plain object, which is what a reader outside this package receives. */
15
+ get stated(): EntityAdapters<Fields>;
16
+ /**
17
+ * The entries whose field survives a cut, re-addressed by that field's new name.
18
+ *
19
+ * The adapter name is not a field and does not move; only the level below it does. An
20
+ * entry left on the old name is not an error anywhere downstream — `adapter/sql` looks
21
+ * it up by the field it is iterating and simply finds nothing.
22
+ */
23
+ cut(survives: (key: string) => string | undefined): EntityAdapterSet | undefined;
24
+ private static made;
25
+ }
26
+ //# sourceMappingURL=EntityAdapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityAdapters.d.ts","sourceRoot":"","sources":["../src/EntityAdapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3D,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,MAAM;CAAI;AAE3D,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,IAAI,OAAO,CAAC,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAOxG;;GAEG;AACH,qBAAa,gBAAgB;IACP,OAAO,CAAC,QAAQ,CAAC,SAAS;IAA9C,OAAO,eAA2D;IAElE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAyBpF;IAED,2FAA2F;IAC3F,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,gBAAgB,GAAG,SAAS,CAapG;IAED,8EAA8E;IAC9E,IAAI,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAEnC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAe/E;IAED,OAAO,CAAC,MAAM,CAAC,IAAI;CAGpB"}
@@ -0,0 +1,71 @@
1
+ import { isObject } from './judge/ValueForm.js';
2
+ /**
3
+ * What one schema states per adapter: an adapter name, a field name, then that adapter's own value.
4
+ */
5
+ export class EntityAdapterSet {
6
+ byAdapter;
7
+ constructor(byAdapter) {
8
+ this.byAdapter = byAdapter;
9
+ }
10
+ static of(declared) {
11
+ if (declared === undefined)
12
+ return undefined;
13
+ if (!isObject(declared)) {
14
+ throw new Error(`adapters: expected an object keyed by adapter name, got ${typeof declared}.`);
15
+ }
16
+ const byAdapter = {};
17
+ for (const [adapter, perField] of Object.entries(declared)) {
18
+ if (perField === undefined)
19
+ continue;
20
+ if (!isObject(perField)) {
21
+ throw new Error(`adapters.${adapter}: expected an object keyed by field name, got ${typeof perField}. ` +
22
+ `What an adapter is handed is addressed by the field it applies to.`);
23
+ }
24
+ if (Object.keys(perField).length)
25
+ byAdapter[adapter] = perField;
26
+ }
27
+ return EntityAdapterSet.made(byAdapter);
28
+ }
29
+ /** Several schemas folded into one set; a later source wins, per adapter and per field. */
30
+ static merged(sources) {
31
+ const out = {};
32
+ for (const source of sources) {
33
+ const set = EntityAdapterSet.of(source);
34
+ if (!set)
35
+ continue;
36
+ for (const [adapter, perField] of Object.entries(set.byAdapter)) {
37
+ out[adapter] = { ...out[adapter], ...perField };
38
+ }
39
+ }
40
+ return EntityAdapterSet.made(out);
41
+ }
42
+ /** The plain object, which is what a reader outside this package receives. */
43
+ get stated() {
44
+ return this.byAdapter;
45
+ }
46
+ /**
47
+ * The entries whose field survives a cut, re-addressed by that field's new name.
48
+ *
49
+ * The adapter name is not a field and does not move; only the level below it does. An
50
+ * entry left on the old name is not an error anywhere downstream — `adapter/sql` looks
51
+ * it up by the field it is iterating and simply finds nothing.
52
+ */
53
+ cut(survives) {
54
+ const out = {};
55
+ for (const [adapter, perField] of Object.entries(this.byAdapter)) {
56
+ const mapped = {};
57
+ for (const [key, entry] of Object.entries(perField)) {
58
+ const next = survives(key);
59
+ if (next !== undefined)
60
+ mapped[next] = entry;
61
+ }
62
+ if (Object.keys(mapped).length)
63
+ out[adapter] = mapped;
64
+ }
65
+ return EntityAdapterSet.made(out);
66
+ }
67
+ static made(byAdapter) {
68
+ return Object.keys(byAdapter).length ? new EntityAdapterSet(byAdapter) : undefined;
69
+ }
70
+ }
71
+ //# sourceMappingURL=EntityAdapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityAdapters.js","sourceRoot":"","sources":["../src/EntityAdapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { FieldName, Fields } from './fields/Field.js';
2
+ import type { EntityAdapters } from './EntityAdapters.js';
3
+ export type CompositeUnique<TFields extends Fields> = readonly (readonly FieldName<TFields>[])[];
4
+ /** New name to old name: the field states what it WAS, which is how a human writes it. */
5
+ export type PreviousNames<TFields extends Fields> = Partial<Record<FieldName<TFields>, string>>;
6
+ export interface EntityDeclarations<TFields extends Fields> {
7
+ unique?: CompositeUnique<TFields>;
8
+ adapters?: EntityAdapters<TFields>;
9
+ /**
10
+ * What a field used to be called — read by `fougere freeze` and by nothing else.
11
+ * It answers the one question two shapes cannot, and is meant to be deleted after.
12
+ */
13
+ previous?: PreviousNames<TFields>;
14
+ }
15
+ //# sourceMappingURL=EntityDeclarations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityDeclarations.d.ts","sourceRoot":"","sources":["../src/EntityDeclarations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,MAAM,IAAI,SAAS,CAAC,SAAS,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAEjG,0FAA0F;AAC1F,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,MAAM,IAAI,OAAO,CACzD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CACnC,CAAC;AAEF,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,MAAM;IACxD,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CACnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EntityDeclarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityDeclarations.js","sourceRoot":"","sources":["../src/EntityDeclarations.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { ValidationError } from '../judge/result.js';
2
+ export interface Axis<Declared = unknown, Wire = unknown> {
3
+ readonly slot: 'role' | 'lifecycle' | 'boundary';
4
+ judge(value: unknown, errors: ValidationError[]): void;
5
+ describe(value: Declared, key: string): Wire | undefined;
6
+ reconstruct(wire: Wire, resolve?: Resolver): Declared;
7
+ }
8
+ export type Resolver = (name: string) => (abstract new (...args: never[]) => unknown) | undefined;
9
+ export declare const EXTENSION_AXES: readonly Axis[];
10
+ /** The slots they occupy: the keys of `x-fougere` on a field descriptor. */
11
+ export declare const EXTENSION_SLOTS: ("boundary" | "lifecycle" | "role")[];
12
+ //# sourceMappingURL=Axis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Axis.d.ts","sourceRoot":"","sources":["../../src/axis/Axis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,IAAI,GAAG,OAAO;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAEjD,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAEvD,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAEzD,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACvD;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,QAAQ,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;AAElG,eAAO,MAAM,cAAc,EAAE,SAAS,IAAI,EAIzC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,eAAe,uCAA0C,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { roleAxis } from './role/RoleAxis.js';
2
+ import { lifecycleAxis } from './lifecycle/LifecycleAxis.js';
3
+ import { boundaryAxis } from './boundary/BoundaryAxis.js';
4
+ export const EXTENSION_AXES = [
5
+ roleAxis,
6
+ lifecycleAxis,
7
+ boundaryAxis,
8
+ ];
9
+ /** The slots they occupy: the keys of `x-fougere` on a field descriptor. */
10
+ export const EXTENSION_SLOTS = EXTENSION_AXES.map((axis) => axis.slot);
11
+ //# sourceMappingURL=Axis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Axis.js","sourceRoot":"","sources":["../../src/axis/Axis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAe1D,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,QAAQ;IACR,aAAa;IACb,YAAY;CACb,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export interface Meta {
2
+ description?: string;
3
+ }
4
+ //# sourceMappingURL=Meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Meta.d.ts","sourceRoot":"","sources":["../../src/axis/Meta.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Meta.js","sourceRoot":"","sources":["../../src/axis/Meta.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { BoundaryRules } from './Boundary.js';
2
+ export type Decoder = (value: unknown) => {
3
+ value: unknown;
4
+ } | {
5
+ error: string;
6
+ };
7
+ export type Encoder = (value: unknown) => unknown;
8
+ export declare class Boundaries {
9
+ private static readonly decoders;
10
+ private static readonly encoders;
11
+ private static readonly aliases;
12
+ static registerDecoder(name: string, fn: Decoder): void;
13
+ static registerEncoder(name: string, fn: Encoder): void;
14
+ static registerAlias(name: string, boundary: BoundaryRules): void;
15
+ static alias(name: string): BoundaryRules | undefined;
16
+ static decoder(name: string): Decoder;
17
+ static encoder(name: string): Encoder;
18
+ private static named;
19
+ }
20
+ //# sourceMappingURL=Boundaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Boundaries.d.ts","sourceRoot":"","sources":["../../../src/axis/boundary/Boundaries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACjF,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;AAElD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAEnE,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAAiC;IACxF,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAAiC;IAExF,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAsC;IAEvG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAmC;IAExF,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAuD;IAC5F,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAuD;IAE5F,OAAO,CAAC,MAAM,CAAC,KAAK;CAUrB"}
@@ -0,0 +1,31 @@
1
+ export class Boundaries {
2
+ static decoders = new Map();
3
+ static encoders = new Map();
4
+ static aliases = new Map();
5
+ static registerDecoder(name, fn) { this.decoders.set(name, fn); }
6
+ static registerEncoder(name, fn) { this.encoders.set(name, fn); }
7
+ static registerAlias(name, boundary) { this.aliases.set(name, boundary); }
8
+ static alias(name) { return this.aliases.get(name); }
9
+ static decoder(name) { return this.named(this.decoders, name, 'decoder'); }
10
+ static encoder(name) { return this.named(this.encoders, name, 'encoder'); }
11
+ static named(registry, name, kind) {
12
+ const fn = registry.get(name);
13
+ if (!fn) {
14
+ throw new Error(`Unknown boundary ${kind}: '${name}'. Register it with ` +
15
+ `Boundaries.register${kind[0].toUpperCase()}${kind.slice(1)}('${name}', …).`);
16
+ }
17
+ return fn;
18
+ }
19
+ }
20
+ Boundaries.registerDecoder('isoDate', (value) => {
21
+ if (value instanceof Date)
22
+ return { value };
23
+ if (typeof value === 'string') {
24
+ const d = new Date(value);
25
+ return Number.isNaN(d.getTime()) ? { error: 'Invalid date' } : { value: d };
26
+ }
27
+ return { error: 'Expected a date' };
28
+ });
29
+ Boundaries.registerEncoder('isoDate', (value) => value instanceof Date ? value.toISOString() : value);
30
+ Boundaries.registerAlias('isoDate', { in: { decode: 'isoDate' }, out: { encode: 'isoDate' } });
31
+ //# sourceMappingURL=Boundaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Boundaries.js","sourceRoot":"","sources":["../../../src/axis/boundary/Boundaries.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,UAAU;IACb,MAAM,CAAU,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IACtD,MAAM,CAAU,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IACtD,MAAM,CAAU,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEnE,MAAM,CAAC,eAAe,CAAC,IAAY,EAAE,EAAW,IAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,CAAC,eAAe,CAAC,IAAY,EAAE,EAAW,IAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,CAAC,aAAa,CAAC,IAAY,EAAE,QAAuB,IAAU,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEvG,MAAM,CAAC,KAAK,CAAC,IAAY,IAA+B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,CAAC,OAAO,CAAC,IAAY,IAAa,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,CAAC,OAAO,CAAC,IAAY,IAAa,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAEpF,MAAM,CAAC,KAAK,CAAI,QAAwB,EAAE,IAAY,EAAE,IAAY;QAC1E,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,MAAM,IAAI,sBAAsB;gBACtD,sBAAsB,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAC/E,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,UAAU,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;IAC9C,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AACtC,CAAC,CAAC,CAAC;AACH,UAAU,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAC9C,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CACpD,CAAC;AACF,UAAU,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Decoder, Encoder } from './Boundaries.js';
2
+ import type { Field } from '../../fields/Field.js';
3
+ import { type Shape } from '../shape/Shape.js';
4
+ export interface BoundaryRules {
5
+ in?: 'closed' | {
6
+ decode: string;
7
+ };
8
+ out?: 'closed' | {
9
+ encode: string;
10
+ };
11
+ }
12
+ export type BoundaryRef = 'isoDate' | (string & {}) | BoundaryRules;
13
+ export declare class Boundary implements BoundaryRules {
14
+ readonly in?: BoundaryRules['in'];
15
+ readonly out?: BoundaryRules['out'];
16
+ readonly decode: Decoder;
17
+ readonly encode: Encoder;
18
+ private constructor();
19
+ static declared(field: Field): Boundary;
20
+ static of(field: Field): Boundary;
21
+ static forShape(shape: Shape | undefined): Boundary;
22
+ with(overrides: BoundaryRules): Boundary;
23
+ get readOnly(): boolean;
24
+ get writeOnly(): boolean;
25
+ }
26
+ //# sourceMappingURL=Boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Boundary.d.ts","sourceRoot":"","sources":["../../../src/axis/boundary/Boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,GAAG,CAAC,EAAE,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACrC;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,aAAa,CAAC;AAKpE,qBAAa,QAAS,YAAW,aAAa;IAC5C,QAAQ,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,OAAO,eAKN;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAQtC;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAQhC;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAMlD;IAED,IAAI,CAAC,SAAS,EAAE,aAAa,GAAG,QAAQ,CAEvC;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;CAEF"}
@@ -0,0 +1,53 @@
1
+ import { Boundaries } from './Boundaries.js';
2
+ import { Anatomy } from '../shape/Shape.js';
3
+ const identityDecoder = (value) => ({ value });
4
+ const identityEncoder = (value) => value;
5
+ export class Boundary {
6
+ in;
7
+ out;
8
+ decode;
9
+ encode;
10
+ constructor(rules = {}, codecs) {
11
+ this.in = rules.in;
12
+ this.out = rules.out;
13
+ this.decode = codecs?.decode ?? identityDecoder;
14
+ this.encode = codecs?.encode ?? identityEncoder;
15
+ }
16
+ static declared(field) {
17
+ const ref = field.boundary;
18
+ if (ref === undefined)
19
+ return new Boundary();
20
+ if (typeof ref !== 'string')
21
+ return new Boundary(ref);
22
+ const alias = Boundaries.alias(ref);
23
+ if (!alias)
24
+ throw new Error(`Unknown boundary alias: '${ref}'`);
25
+ return new Boundary(alias);
26
+ }
27
+ static of(field) {
28
+ const declared = Boundary.declared(field);
29
+ const derived = Boundary.forShape(field.shape);
30
+ const rules = { in: declared.in ?? derived.in, out: declared.out ?? derived.out };
31
+ return new Boundary(rules, {
32
+ decode: typeof rules.in === 'object' ? Boundaries.decoder(rules.in.decode) : identityDecoder,
33
+ encode: typeof rules.out === 'object' ? Boundaries.encoder(rules.out.encode) : identityEncoder,
34
+ });
35
+ }
36
+ static forShape(shape) {
37
+ const base = Anatomy.of(shape).base;
38
+ if (base?.type === 'string' && base.format === 'date-time') {
39
+ return new Boundary(Boundaries.alias('isoDate'));
40
+ }
41
+ return new Boundary();
42
+ }
43
+ with(overrides) {
44
+ return new Boundary({ in: overrides.in ?? this.in, out: overrides.out ?? this.out });
45
+ }
46
+ get readOnly() {
47
+ return this.in === 'closed';
48
+ }
49
+ get writeOnly() {
50
+ return this.out === 'closed';
51
+ }
52
+ }
53
+ //# sourceMappingURL=Boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Boundary.js","sourceRoot":"","sources":["../../../src/axis/boundary/Boundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Axis } from '../Axis.js';
2
+ import type { BoundaryRef } from './Boundary.js';
3
+ export declare const boundaryAxis: Axis<BoundaryRef, BoundaryRef>;
4
+ //# sourceMappingURL=BoundaryAxis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoundaryAxis.d.ts","sourceRoot":"","sources":["../../../src/axis/boundary/BoundaryAxis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CA0BvD,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { admitWire } from '../../card/admission.js';
2
+ import { isObject } from '../../judge/ValueForm.js';
3
+ export const boundaryAxis = {
4
+ slot: 'boundary',
5
+ judge(value, errors) {
6
+ if (typeof value === 'string')
7
+ return;
8
+ if (!isObject(value)) {
9
+ errors.push({
10
+ path: 'boundary',
11
+ message: `Expected an alias name or { in, out } — got ${JSON.stringify(value)}`,
12
+ });
13
+ return;
14
+ }
15
+ for (const [side, verb] of [['in', 'decode'], ['out', 'encode']]) {
16
+ const rule = value[side];
17
+ if (rule === undefined || rule === 'closed')
18
+ continue;
19
+ if (!isObject(rule) || typeof rule[verb] !== 'string') {
20
+ errors.push({ path: `boundary.${side}`, message: `Expected 'closed' or { ${verb}: <name> }` });
21
+ }
22
+ }
23
+ },
24
+ describe: (value) => value,
25
+ reconstruct: (wire) => {
26
+ admitWire(boundaryAxis.judge, wire, 'boundary');
27
+ return wire;
28
+ },
29
+ };
30
+ //# sourceMappingURL=BoundaryAxis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoundaryAxis.js","sourceRoot":"","sources":["../../../src/axis/boundary/BoundaryAxis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD,MAAM,CAAC,MAAM,YAAY,GAAmC;IAC1D,IAAI,EAAE,UAAU;IAEhB,KAAK,CAAC,KAAK,EAAE,MAAM;QACjB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO;QACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,+CAA+C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;aAChF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAU,EAAE,CAAC;YAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACtD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,IAAI,EAAE,EAAE,OAAO,EAAE,0BAA0B,IAAI,YAAY,EAAE,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IAC1B,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;QACpB,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * What "now" means, for the two functions that stamp it.
3
+ *
4
+ * The ONE place either of them reads the time, which is what makes it substitutable at
5
+ * all: `created()`, `updated()` and `create: 'now'` are realized through this and nowhere
6
+ * else, so a test that needs a stable instant sets it here instead of intercepting `Date`
7
+ * globally — where Rails had to build `travel_to` over the language.
8
+ *
9
+ * A value rather than a mock: nothing here is a channel, and a frozen clock is a fact
10
+ * about the run, not an interception of a call.
11
+ */
12
+ export declare class Clock {
13
+ private static reading;
14
+ static now(): number;
15
+ /** Freeze the instant this clock reads. Returns the gesture that restores it. */
16
+ static freeze(at: number | Date): () => void;
17
+ }
18
+ //# sourceMappingURL=Clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Clock.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/Clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,OAAO,CAA0B;IAEhD,MAAM,CAAC,GAAG,IAAI,MAAM,CAEnB;IAED,iFAAiF;IACjF,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,IAAI,CAK3C;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * What "now" means, for the two functions that stamp it.
3
+ *
4
+ * The ONE place either of them reads the time, which is what makes it substitutable at
5
+ * all: `created()`, `updated()` and `create: 'now'` are realized through this and nowhere
6
+ * else, so a test that needs a stable instant sets it here instead of intercepting `Date`
7
+ * globally — where Rails had to build `travel_to` over the language.
8
+ *
9
+ * A value rather than a mock: nothing here is a channel, and a frozen clock is a fact
10
+ * about the run, not an interception of a call.
11
+ */
12
+ export class Clock {
13
+ static reading = Date.now;
14
+ static now() {
15
+ return this.reading();
16
+ }
17
+ /** Freeze the instant this clock reads. Returns the gesture that restores it. */
18
+ static freeze(at) {
19
+ const previous = this.reading;
20
+ const instant = at instanceof Date ? at.getTime() : at;
21
+ this.reading = () => instant;
22
+ return () => { this.reading = previous; };
23
+ }
24
+ }
25
+ //# sourceMappingURL=Clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Clock.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/Clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,KAAK;IACR,MAAM,CAAC,OAAO,GAAiB,IAAI,CAAC,GAAG,CAAC;IAEhD,MAAM,CAAC,GAAG;QACR,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,iFAAiF;IACjF,MAAM,CAAC,MAAM,CAAC,EAAiB;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;QAC7B,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ export type GeneratorRef = 'cuid2' | 'uuid' | 'nanoid' | (string & {});
2
+ /**
3
+ * Who answers a `generate` by name — one registry per process, like `Formats` and
4
+ * `Boundaries`.
5
+ *
6
+ * The three builtins are REGISTERED rather than switched on, which is what brings the
7
+ * refusal back inside: a registry whose unknown name is refused by a `default:` branch in
8
+ * its caller does not know what it holds, so it cannot say so.
9
+ */
10
+ export declare class Generators {
11
+ private static readonly registry;
12
+ static register(name: string, fn: () => string): void;
13
+ /** The generator this name stands for, refused by name when nothing does. */
14
+ static resolve(ref: GeneratorRef): () => string;
15
+ /** Whether a name is answered, for a caller that must not throw to find out. */
16
+ static answers(ref: GeneratorRef): boolean;
17
+ }
18
+ //# sourceMappingURL=Generators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generators.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/Generators.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAUvE;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAI7B;IAEH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,MAAM,GAAG,IAAI,CAEpD;IAED,6EAA6E;IAC7E,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,MAAM,CAO9C;IAED,gFAAgF;IAChF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAEzC;CACF"}
@@ -0,0 +1,38 @@
1
+ import { createId } from '@paralleldrive/cuid2';
2
+ const NANOID_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
3
+ function nanoid() {
4
+ const bytes = new Uint8Array(21);
5
+ globalThis.crypto.getRandomValues(bytes);
6
+ return Array.from(bytes, (byte) => NANOID_ALPHABET[byte & 63]).join('');
7
+ }
8
+ /**
9
+ * Who answers a `generate` by name — one registry per process, like `Formats` and
10
+ * `Boundaries`.
11
+ *
12
+ * The three builtins are REGISTERED rather than switched on, which is what brings the
13
+ * refusal back inside: a registry whose unknown name is refused by a `default:` branch in
14
+ * its caller does not know what it holds, so it cannot say so.
15
+ */
16
+ export class Generators {
17
+ static registry = new Map([
18
+ ['cuid2', createId],
19
+ ['uuid', () => globalThis.crypto.randomUUID()],
20
+ ['nanoid', nanoid],
21
+ ]);
22
+ static register(name, fn) {
23
+ this.registry.set(name, fn);
24
+ }
25
+ /** The generator this name stands for, refused by name when nothing does. */
26
+ static resolve(ref) {
27
+ const found = this.registry.get(ref);
28
+ if (found)
29
+ return found;
30
+ throw new Error(`Unknown generator '${ref}' — register it with Generators.register('${ref}', fn). ` +
31
+ `This process answers ${[...this.registry.keys()].join(', ')}.`);
32
+ }
33
+ /** Whether a name is answered, for a caller that must not throw to find out. */
34
+ static answers(ref) {
35
+ return this.registry.has(ref);
36
+ }
37
+ }
38
+ //# sourceMappingURL=Generators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generators.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/Generators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD,MAAM,eAAe,GAAG,kEAAkE,CAAC;AAE3F,SAAS,MAAM;IACb,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,CAAU,QAAQ,GAAG,IAAI,GAAG,CAAuB;QAC/D,CAAC,OAAO,EAAE,QAAQ,CAAC;QACnB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,CAAC,QAAQ,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IAEH,MAAM,CAAC,QAAQ,CAAC,IAAY,EAAE,EAAgB;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,OAAO,CAAC,GAAiB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,sBAAsB,GAAG,6CAA6C,GAAG,UAAU;YACnF,wBAAwB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAChE,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,MAAM,CAAC,OAAO,CAAC,GAAiB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import type { GeneratorRef } from './Generators.js';
2
+ export declare const CREATE_TOKENS: readonly ['now', 'optional'];
3
+ export declare const UPDATE_TOKENS: readonly ['now', 'forbidden'];
4
+ export interface LifecycleRules {
5
+ create?: {
6
+ value: unknown;
7
+ } | {
8
+ generate: GeneratorRef;
9
+ } | (typeof CREATE_TOKENS)[number];
10
+ update?: (typeof UPDATE_TOKENS)[number];
11
+ }
12
+ export declare class Lifecycle implements LifecycleRules {
13
+ readonly create?: LifecycleRules['create'];
14
+ readonly update?: LifecycleRules['update'];
15
+ private constructor();
16
+ static of(field: {
17
+ lifecycle?: LifecycleRules;
18
+ }): Lifecycle;
19
+ get requiredAtCreate(): boolean;
20
+ get stampedOnce(): boolean;
21
+ get immutable(): boolean;
22
+ get stampedOnUpdate(): boolean;
23
+ get literal(): {
24
+ value: unknown;
25
+ } | undefined;
26
+ get generator(): GeneratorRef | undefined;
27
+ }
28
+ //# sourceMappingURL=Lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lifecycle.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/Lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,eAAO,MAAM,aAAa,YAAI,KAAK,EAAE,UAAU,CAAU,CAAC;AAC1D,eAAO,MAAM,aAAa,YAAI,KAAK,EAAE,WAAW,CAAU,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,QAAQ,EAAE,YAAY,CAAA;KAAE,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,CAAC,EAAE,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,qBAAa,SAAU,YAAW,cAAc;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,eAGN;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,SAAS,CAE1D;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,OAAO,IAAI;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAK5C;IAED,IAAI,SAAS,IAAI,YAAY,GAAG,SAAS,CAKxC;CACF"}
@@ -0,0 +1,38 @@
1
+ export const CREATE_TOKENS = ['now', 'optional'];
2
+ export const UPDATE_TOKENS = ['now', 'forbidden'];
3
+ export class Lifecycle {
4
+ create;
5
+ update;
6
+ constructor(rules = {}) {
7
+ this.create = rules.create;
8
+ this.update = rules.update;
9
+ }
10
+ static of(field) {
11
+ return new Lifecycle(field.lifecycle);
12
+ }
13
+ get requiredAtCreate() {
14
+ return this.create === undefined;
15
+ }
16
+ get stampedOnce() {
17
+ return this.create === 'now' && this.update !== 'now';
18
+ }
19
+ get immutable() {
20
+ return this.update === 'forbidden';
21
+ }
22
+ get stampedOnUpdate() {
23
+ return this.update === 'now';
24
+ }
25
+ get literal() {
26
+ const rule = this.create;
27
+ return typeof rule === 'object' && rule !== null && 'value' in rule
28
+ ? { value: rule.value }
29
+ : undefined;
30
+ }
31
+ get generator() {
32
+ const rule = this.create;
33
+ return typeof rule === 'object' && rule !== null && 'generate' in rule
34
+ ? rule.generate
35
+ : undefined;
36
+ }
37
+ }
38
+ //# sourceMappingURL=Lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lifecycle.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/Lifecycle.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,CAAU,CAAC;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,CAAU,CAAC;AAO3D,MAAM,OAAO,SAAS;IACX,MAAM,CAA4B;IAClC,MAAM,CAA4B;IAE3C,YAAoB,KAAK,GAAmB,EAAE;QAC5C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,KAAqC;QAC7C,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IACnC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;IACxD,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;IACrC,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;IAC/B,CAAC;IAED,IAAI,OAAO;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,IAAI;YACjE,CAAC,CAAC,EAAE,KAAK,EAAG,IAA2B,CAAC,KAAK,EAAE;YAC/C,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,IAAI,SAAS;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,UAAU,IAAI,IAAI;YACpE,CAAC,CAAE,IAAmC,CAAC,QAAQ;YAC/C,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { Axis } from '../Axis.js';
2
+ import { type LifecycleRules } from './Lifecycle.js';
3
+ export declare const lifecycleAxis: Axis<LifecycleRules, LifecycleRules>;
4
+ //# sourceMappingURL=LifecycleAxis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LifecycleAxis.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/LifecycleAxis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnF,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAsB9D,CAAC"}