@fougere/schema 0.9.2-alpha.0 → 0.10.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 (349) hide show
  1. package/dist/PartialValues.d.ts +4 -0
  2. package/dist/PartialValues.d.ts.map +1 -0
  3. package/dist/PartialValues.js +2 -0
  4. package/dist/PartialValues.js.map +1 -0
  5. package/dist/Schema.d.ts +9 -21
  6. package/dist/Schema.d.ts.map +1 -1
  7. package/dist/Schema.js.map +1 -1
  8. package/dist/SchemaConstraints.d.ts +24 -0
  9. package/dist/SchemaConstraints.d.ts.map +1 -0
  10. package/dist/SchemaConstraints.js +39 -0
  11. package/dist/SchemaConstraints.js.map +1 -0
  12. package/dist/SchemaConstructor.d.ts +25 -0
  13. package/dist/SchemaConstructor.d.ts.map +1 -0
  14. package/dist/SchemaConstructor.js +2 -0
  15. package/dist/SchemaConstructor.js.map +1 -0
  16. package/dist/SchemaDefinition.d.ts +5 -23
  17. package/dist/SchemaDefinition.d.ts.map +1 -1
  18. package/dist/SchemaDefinition.js +1 -38
  19. package/dist/SchemaDefinition.js.map +1 -1
  20. package/dist/SchemaDerivation.d.ts +1 -1
  21. package/dist/SchemaDerivation.d.ts.map +1 -1
  22. package/dist/SchemaView.d.ts +6 -8
  23. package/dist/SchemaView.d.ts.map +1 -1
  24. package/dist/Values.d.ts +6 -0
  25. package/dist/Values.d.ts.map +1 -0
  26. package/dist/Values.js +2 -0
  27. package/dist/Values.js.map +1 -0
  28. package/dist/axis/Axis.d.ts +2 -2
  29. package/dist/axis/Axis.d.ts.map +1 -1
  30. package/dist/axis/Axis.js.map +1 -1
  31. package/dist/axis/Resolver.d.ts +2 -0
  32. package/dist/axis/Resolver.d.ts.map +1 -0
  33. package/dist/axis/Resolver.js +2 -0
  34. package/dist/axis/Resolver.js.map +1 -0
  35. package/dist/axis/boundary/Boundaries.d.ts +3 -12
  36. package/dist/axis/boundary/Boundaries.d.ts.map +1 -1
  37. package/dist/axis/boundary/Boundaries.js.map +1 -1
  38. package/dist/axis/boundary/Boundary.d.ts +3 -10
  39. package/dist/axis/boundary/Boundary.d.ts.map +1 -1
  40. package/dist/axis/boundary/Boundary.js +1 -1
  41. package/dist/axis/boundary/Boundary.js.map +1 -1
  42. package/dist/axis/boundary/BoundaryAxis.d.ts +1 -1
  43. package/dist/axis/boundary/BoundaryAxis.d.ts.map +1 -1
  44. package/dist/axis/boundary/BoundaryRef.d.ts +3 -0
  45. package/dist/axis/boundary/BoundaryRef.d.ts.map +1 -0
  46. package/dist/axis/boundary/BoundaryRef.js +2 -0
  47. package/dist/axis/boundary/BoundaryRef.js.map +1 -0
  48. package/dist/axis/boundary/BoundaryRules.d.ts +9 -0
  49. package/dist/axis/boundary/BoundaryRules.d.ts.map +1 -0
  50. package/dist/axis/boundary/BoundaryRules.js +2 -0
  51. package/dist/axis/boundary/BoundaryRules.js.map +1 -0
  52. package/dist/axis/boundary/Decoder.d.ts +26 -0
  53. package/dist/axis/boundary/Decoder.d.ts.map +1 -0
  54. package/dist/axis/boundary/Decoder.js +25 -0
  55. package/dist/axis/boundary/Decoder.js.map +1 -0
  56. package/dist/axis/boundary/Encoder.d.ts +2 -0
  57. package/dist/axis/boundary/Encoder.d.ts.map +1 -0
  58. package/dist/axis/boundary/Encoder.js +2 -0
  59. package/dist/axis/boundary/Encoder.js.map +1 -0
  60. package/dist/axis/lifecycle/Lifecycle.d.ts +1 -10
  61. package/dist/axis/lifecycle/Lifecycle.d.ts.map +1 -1
  62. package/dist/axis/lifecycle/Lifecycle.js +0 -2
  63. package/dist/axis/lifecycle/Lifecycle.js.map +1 -1
  64. package/dist/axis/lifecycle/LifecycleAxis.d.ts +1 -1
  65. package/dist/axis/lifecycle/LifecycleAxis.d.ts.map +1 -1
  66. package/dist/axis/lifecycle/LifecycleAxis.js +1 -1
  67. package/dist/axis/lifecycle/LifecycleAxis.js.map +1 -1
  68. package/dist/axis/lifecycle/LifecycleRules.d.ts +12 -0
  69. package/dist/axis/lifecycle/LifecycleRules.d.ts.map +1 -0
  70. package/dist/axis/lifecycle/LifecycleRules.js +3 -0
  71. package/dist/axis/lifecycle/LifecycleRules.js.map +1 -0
  72. package/dist/axis/lifecycle/apply.d.ts +1 -1
  73. package/dist/axis/lifecycle/apply.d.ts.map +1 -1
  74. package/dist/axis/lifecycle/apply.js.map +1 -1
  75. package/dist/axis/role/EntityConstructor.d.ts +2 -0
  76. package/dist/axis/role/EntityConstructor.d.ts.map +1 -0
  77. package/dist/axis/role/EntityConstructor.js +2 -0
  78. package/dist/axis/role/EntityConstructor.js.map +1 -0
  79. package/dist/axis/role/Relation.d.ts +1 -1
  80. package/dist/axis/role/Relation.d.ts.map +1 -1
  81. package/dist/axis/role/Relation.js.map +1 -1
  82. package/dist/axis/role/Role.d.ts +3 -7
  83. package/dist/axis/role/Role.d.ts.map +1 -1
  84. package/dist/axis/role/Role.js.map +1 -1
  85. package/dist/axis/role/RoleAxis.d.ts +2 -2
  86. package/dist/axis/role/RoleAxis.d.ts.map +1 -1
  87. package/dist/axis/role/RoleAxis.js.map +1 -1
  88. package/dist/axis/role/RoleRules.d.ts +8 -0
  89. package/dist/axis/role/RoleRules.d.ts.map +1 -0
  90. package/dist/axis/role/RoleRules.js +2 -0
  91. package/dist/axis/role/RoleRules.js.map +1 -0
  92. package/dist/axis/shape/FormatPredicate.d.ts +2 -0
  93. package/dist/axis/shape/FormatPredicate.d.ts.map +1 -0
  94. package/dist/axis/shape/FormatPredicate.js +2 -0
  95. package/dist/axis/shape/FormatPredicate.js.map +1 -0
  96. package/dist/axis/shape/Formats.d.ts +1 -2
  97. package/dist/axis/shape/Formats.d.ts.map +1 -1
  98. package/dist/axis/shape/Formats.js.map +1 -1
  99. package/dist/axis/shape/Shape.d.ts +3 -9
  100. package/dist/axis/shape/Shape.d.ts.map +1 -1
  101. package/dist/axis/shape/Shape.js +1 -1
  102. package/dist/axis/shape/Shape.js.map +1 -1
  103. package/dist/axis/shape/ShapeType.d.ts +8 -0
  104. package/dist/axis/shape/ShapeType.d.ts.map +1 -0
  105. package/dist/axis/shape/ShapeType.js +2 -0
  106. package/dist/axis/shape/ShapeType.js.map +1 -0
  107. package/dist/axis/shape/StringFormat.d.ts +2 -0
  108. package/dist/axis/shape/StringFormat.d.ts.map +1 -0
  109. package/dist/axis/shape/StringFormat.js +2 -0
  110. package/dist/axis/shape/StringFormat.js.map +1 -0
  111. package/dist/entity/CompositeUnique.d.ts +4 -0
  112. package/dist/entity/CompositeUnique.d.ts.map +1 -0
  113. package/dist/entity/CompositeUnique.js +2 -0
  114. package/dist/entity/CompositeUnique.js.map +1 -0
  115. package/dist/entity/EntityAdapterSet.d.ts +1 -1
  116. package/dist/entity/EntityAdapterSet.d.ts.map +1 -1
  117. package/dist/entity/EntityAdapters.d.ts +3 -3
  118. package/dist/entity/EntityAdapters.d.ts.map +1 -1
  119. package/dist/entity/EntityDeclarations.d.ts +3 -3
  120. package/dist/entity/EntityDeclarations.d.ts.map +1 -1
  121. package/dist/entity/FougereEntityAdapters.d.ts +3 -0
  122. package/dist/entity/FougereEntityAdapters.d.ts.map +1 -0
  123. package/dist/entity/FougereEntityAdapters.js +2 -0
  124. package/dist/entity/FougereEntityAdapters.js.map +1 -0
  125. package/dist/entity/PreviousNames.d.ts +4 -0
  126. package/dist/entity/PreviousNames.d.ts.map +1 -0
  127. package/dist/entity/PreviousNames.js +2 -0
  128. package/dist/entity/PreviousNames.js.map +1 -0
  129. package/dist/entity.d.ts +2 -2
  130. package/dist/entity.d.ts.map +1 -1
  131. package/dist/entity.js.map +1 -1
  132. package/dist/field/Field.d.ts +3 -5
  133. package/dist/field/Field.d.ts.map +1 -1
  134. package/dist/field/Field.js +1 -1
  135. package/dist/field/Field.js.map +1 -1
  136. package/dist/field/FieldName.d.ts +3 -0
  137. package/dist/field/FieldName.d.ts.map +1 -0
  138. package/dist/field/FieldName.js +2 -0
  139. package/dist/field/FieldName.js.map +1 -0
  140. package/dist/field/FieldSet.d.ts +3 -2
  141. package/dist/field/FieldSet.d.ts.map +1 -1
  142. package/dist/field/FieldSet.js.map +1 -1
  143. package/dist/field/Fields.d.ts +3 -0
  144. package/dist/field/Fields.d.ts.map +1 -0
  145. package/dist/field/Fields.js +2 -0
  146. package/dist/field/Fields.js.map +1 -0
  147. package/dist/index.d.ts +21 -10
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +3 -3
  150. package/dist/index.js.map +1 -1
  151. package/dist/lib/Checked.d.ts +11 -0
  152. package/dist/lib/Checked.d.ts.map +1 -0
  153. package/dist/lib/Checked.js +2 -0
  154. package/dist/lib/Checked.js.map +1 -0
  155. package/dist/lib/ValidationError.d.ts +10 -0
  156. package/dist/lib/ValidationError.d.ts.map +1 -0
  157. package/dist/lib/ValidationError.js +2 -0
  158. package/dist/lib/ValidationError.js.map +1 -0
  159. package/dist/lib/ValidationResult.d.ts +14 -0
  160. package/dist/lib/ValidationResult.d.ts.map +1 -0
  161. package/dist/lib/{validation.js → ValidationResult.js} +1 -1
  162. package/dist/lib/ValidationResult.js.map +1 -0
  163. package/dist/projection/Cases.d.ts +1 -18
  164. package/dist/projection/Cases.d.ts.map +1 -1
  165. package/dist/projection/Cases.js.map +1 -1
  166. package/dist/projection/ValidationCase.d.ts +19 -0
  167. package/dist/projection/ValidationCase.d.ts.map +1 -0
  168. package/dist/projection/ValidationCase.js +2 -0
  169. package/dist/projection/ValidationCase.js.map +1 -0
  170. package/dist/projection/Visibility.d.ts +1 -1
  171. package/dist/projection/Visibility.d.ts.map +1 -1
  172. package/dist/projection/card/Bundle.d.ts +3 -2
  173. package/dist/projection/card/Bundle.d.ts.map +1 -1
  174. package/dist/projection/card/Bundle.js.map +1 -1
  175. package/dist/projection/card/Card.d.ts +10 -6
  176. package/dist/projection/card/Card.d.ts.map +1 -1
  177. package/dist/projection/card/Card.js +3 -3
  178. package/dist/projection/card/Card.js.map +1 -1
  179. package/dist/projection/card/Change.d.ts +70 -0
  180. package/dist/projection/card/Change.d.ts.map +1 -0
  181. package/dist/projection/card/Change.js +2 -0
  182. package/dist/projection/card/Change.js.map +1 -0
  183. package/dist/projection/card/DerivedFrom.d.ts +12 -0
  184. package/dist/projection/card/DerivedFrom.d.ts.map +1 -0
  185. package/dist/projection/card/DerivedFrom.js +2 -0
  186. package/dist/projection/card/DerivedFrom.js.map +1 -0
  187. package/dist/projection/card/Diff.d.ts +18 -0
  188. package/dist/projection/card/Diff.d.ts.map +1 -0
  189. package/dist/projection/card/{diff.js → Diff.js} +1 -1
  190. package/dist/projection/card/{diff.js.map → Diff.js.map} +1 -1
  191. package/dist/projection/card/DiffOptions.d.ts +5 -0
  192. package/dist/projection/card/DiffOptions.d.ts.map +1 -0
  193. package/dist/projection/card/DiffOptions.js +2 -0
  194. package/dist/projection/card/DiffOptions.js.map +1 -0
  195. package/dist/projection/card/FieldDescriptor.d.ts +11 -0
  196. package/dist/projection/card/FieldDescriptor.d.ts.map +1 -0
  197. package/dist/projection/card/FieldDescriptor.js +2 -0
  198. package/dist/projection/card/FieldDescriptor.js.map +1 -0
  199. package/dist/projection/card/FieldExtension.d.ts +9 -0
  200. package/dist/projection/card/FieldExtension.d.ts.map +1 -0
  201. package/dist/projection/card/FieldExtension.js +2 -0
  202. package/dist/projection/card/FieldExtension.js.map +1 -0
  203. package/dist/projection/card/RelationDescriptor.d.ts +5 -0
  204. package/dist/projection/card/RelationDescriptor.d.ts.map +1 -0
  205. package/dist/projection/card/RelationDescriptor.js +2 -0
  206. package/dist/projection/card/RelationDescriptor.js.map +1 -0
  207. package/dist/projection/card/RenameCandidate.d.ts +6 -0
  208. package/dist/projection/card/RenameCandidate.d.ts.map +1 -0
  209. package/dist/projection/card/RenameCandidate.js +2 -0
  210. package/dist/projection/card/RenameCandidate.js.map +1 -0
  211. package/dist/projection/card/RoleDescriptor.d.ts +7 -0
  212. package/dist/projection/card/RoleDescriptor.d.ts.map +1 -0
  213. package/dist/projection/card/RoleDescriptor.js +2 -0
  214. package/dist/projection/card/RoleDescriptor.js.map +1 -0
  215. package/dist/projection/card/SchemaBundle.d.ts +7 -0
  216. package/dist/projection/card/SchemaBundle.d.ts.map +1 -0
  217. package/dist/projection/card/SchemaBundle.js +2 -0
  218. package/dist/projection/card/SchemaBundle.js.map +1 -0
  219. package/dist/projection/card/SchemaDescriptor.d.ts +12 -0
  220. package/dist/projection/card/SchemaDescriptor.d.ts.map +1 -0
  221. package/dist/projection/card/SchemaDescriptor.js +2 -0
  222. package/dist/projection/card/SchemaDescriptor.js.map +1 -0
  223. package/dist/projection/card/SetDiff.d.ts +10 -0
  224. package/dist/projection/card/SetDiff.d.ts.map +1 -0
  225. package/dist/projection/card/SetDiff.js +2 -0
  226. package/dist/projection/card/SetDiff.js.map +1 -0
  227. package/dist/projection/card/SetDiffOptions.d.ts +5 -0
  228. package/dist/projection/card/SetDiffOptions.d.ts.map +1 -0
  229. package/dist/projection/card/SetDiffOptions.js +2 -0
  230. package/dist/projection/card/SetDiffOptions.js.map +1 -0
  231. package/dist/projection/card/ShapeKeywords.d.ts +7 -0
  232. package/dist/projection/card/ShapeKeywords.d.ts.map +1 -0
  233. package/dist/projection/card/ShapeKeywords.js +2 -0
  234. package/dist/projection/card/ShapeKeywords.js.map +1 -0
  235. package/dist/projection/card/TypeSet.d.ts +3 -0
  236. package/dist/projection/card/TypeSet.d.ts.map +1 -0
  237. package/dist/projection/card/TypeSet.js +2 -0
  238. package/dist/projection/card/TypeSet.js.map +1 -0
  239. package/dist/projection/card/admission.d.ts +2 -2
  240. package/dist/projection/card/admission.d.ts.map +1 -1
  241. package/dist/projection/card/admission.js +2 -2
  242. package/dist/projection/card/admission.js.map +1 -1
  243. package/dist/validator/FieldDeclarationValidator.d.ts +1 -1
  244. package/dist/validator/FieldDeclarationValidator.d.ts.map +1 -1
  245. package/dist/validator/FieldDeclarationValidator.js.map +1 -1
  246. package/dist/validator/FieldValueValidator.d.ts +1 -1
  247. package/dist/validator/FieldValueValidator.d.ts.map +1 -1
  248. package/dist/validator/FieldValueValidator.js.map +1 -1
  249. package/dist/validator/InputValidator.d.ts +4 -5
  250. package/dist/validator/InputValidator.d.ts.map +1 -1
  251. package/dist/validator/InputValidator.js.map +1 -1
  252. package/dist/validator/ValidateOptions.d.ts +4 -0
  253. package/dist/validator/ValidateOptions.d.ts.map +1 -0
  254. package/dist/validator/ValidateOptions.js +2 -0
  255. package/dist/validator/ValidateOptions.js.map +1 -0
  256. package/dist/vocabulary/primitive/many.d.ts +1 -1
  257. package/dist/vocabulary/primitive/many.d.ts.map +1 -1
  258. package/dist/vocabulary/primitive/many.js.map +1 -1
  259. package/dist/vocabulary/primitive/ref.d.ts +1 -1
  260. package/dist/vocabulary/primitive/ref.d.ts.map +1 -1
  261. package/dist/vocabulary/primitive/ref.js.map +1 -1
  262. package/dist/vocabulary/primitive/text.d.ts +1 -1
  263. package/dist/vocabulary/primitive/text.d.ts.map +1 -1
  264. package/package.json +1 -1
  265. package/src/PartialValues.ts +4 -0
  266. package/src/Schema.ts +12 -32
  267. package/src/SchemaConstraints.ts +46 -0
  268. package/src/SchemaConstructor.ts +32 -0
  269. package/src/SchemaDefinition.ts +6 -50
  270. package/src/SchemaDerivation.ts +1 -1
  271. package/src/SchemaView.ts +6 -10
  272. package/src/Values.ts +6 -0
  273. package/src/axis/Axis.ts +2 -3
  274. package/src/axis/Resolver.ts +1 -0
  275. package/src/axis/boundary/Boundaries.ts +3 -9
  276. package/src/axis/boundary/Boundary.ts +7 -10
  277. package/src/axis/boundary/BoundaryAxis.ts +1 -1
  278. package/src/axis/boundary/BoundaryRef.ts +3 -0
  279. package/src/axis/boundary/BoundaryRules.ts +4 -0
  280. package/src/axis/boundary/Decoder.ts +42 -0
  281. package/src/axis/boundary/Encoder.ts +1 -0
  282. package/src/axis/lifecycle/Lifecycle.ts +1 -8
  283. package/src/axis/lifecycle/LifecycleAxis.ts +3 -2
  284. package/src/axis/lifecycle/LifecycleRules.ts +9 -0
  285. package/src/axis/lifecycle/apply.ts +2 -1
  286. package/src/axis/role/EntityConstructor.ts +1 -0
  287. package/src/axis/role/Relation.ts +2 -1
  288. package/src/axis/role/Role.ts +3 -8
  289. package/src/axis/role/RoleAxis.ts +7 -5
  290. package/src/axis/role/RoleRules.ts +8 -0
  291. package/src/axis/shape/FormatPredicate.ts +1 -0
  292. package/src/axis/shape/Formats.ts +1 -11
  293. package/src/axis/shape/Shape.ts +20 -24
  294. package/src/axis/shape/ShapeType.ts +12 -0
  295. package/src/axis/shape/StringFormat.ts +8 -0
  296. package/src/entity/CompositeUnique.ts +6 -0
  297. package/src/entity/EntityAdapterSet.ts +1 -1
  298. package/src/entity/EntityAdapters.ts +3 -4
  299. package/src/entity/EntityDeclarations.ts +3 -9
  300. package/src/entity/FougereEntityAdapters.ts +2 -0
  301. package/src/entity/PreviousNames.ts +6 -0
  302. package/src/entity.ts +3 -2
  303. package/src/field/Field.ts +4 -8
  304. package/src/field/FieldName.ts +3 -0
  305. package/src/field/FieldSet.ts +4 -2
  306. package/src/field/Fields.ts +3 -0
  307. package/src/index.ts +21 -19
  308. package/src/lib/Checked.ts +5 -0
  309. package/src/lib/ValidationError.ts +9 -0
  310. package/src/lib/ValidationResult.ts +11 -0
  311. package/src/projection/Cases.ts +1 -17
  312. package/src/projection/ValidationCase.ts +16 -0
  313. package/src/projection/Visibility.ts +1 -1
  314. package/src/projection/card/Bundle.ts +7 -4
  315. package/src/projection/card/Card.ts +16 -13
  316. package/src/projection/card/Change.ts +24 -0
  317. package/src/projection/card/DerivedFrom.ts +11 -0
  318. package/src/projection/card/{diff.ts → Diff.ts} +7 -49
  319. package/src/projection/card/DiffOptions.ts +4 -0
  320. package/src/projection/card/FieldDescriptor.ts +11 -0
  321. package/src/projection/card/FieldExtension.ts +9 -0
  322. package/src/projection/card/RelationDescriptor.ts +3 -0
  323. package/src/projection/card/RenameCandidate.ts +5 -0
  324. package/src/projection/card/RoleDescriptor.ts +7 -0
  325. package/src/projection/card/SchemaBundle.ts +7 -0
  326. package/src/projection/card/SchemaDescriptor.ts +12 -0
  327. package/src/projection/card/SetDiff.ts +10 -0
  328. package/src/projection/card/SetDiffOptions.ts +4 -0
  329. package/src/projection/card/ShapeKeywords.ts +7 -0
  330. package/src/projection/card/TypeSet.ts +2 -0
  331. package/src/projection/card/admission.ts +3 -3
  332. package/src/validator/FieldDeclarationValidator.ts +2 -1
  333. package/src/validator/FieldValueValidator.ts +5 -3
  334. package/src/validator/InputValidator.ts +5 -6
  335. package/src/validator/ValidateOptions.ts +3 -0
  336. package/src/vocabulary/primitive/many.ts +2 -1
  337. package/src/vocabulary/primitive/ref.ts +2 -1
  338. package/src/vocabulary/primitive/text.ts +1 -1
  339. package/dist/lib/validation.d.ts +0 -32
  340. package/dist/lib/validation.d.ts.map +0 -1
  341. package/dist/lib/validation.js.map +0 -1
  342. package/dist/projection/card/Descriptor.d.ts +0 -55
  343. package/dist/projection/card/Descriptor.d.ts.map +0 -1
  344. package/dist/projection/card/Descriptor.js +0 -2
  345. package/dist/projection/card/Descriptor.js.map +0 -1
  346. package/dist/projection/card/diff.d.ts +0 -104
  347. package/dist/projection/card/diff.d.ts.map +0 -1
  348. package/src/lib/validation.ts +0 -25
  349. package/src/projection/card/Descriptor.ts +0 -60
@@ -1,4 +1,4 @@
1
- import { type EntityConstructor } from '../../axis/role/Relation.js';
1
+ import { type EntityConstructor } from '../../axis/role/EntityConstructor.js';
2
2
  import { Field } from '../../field/Field.js';
3
3
  /**
4
4
  * The far side of a `ref()`: no column of its own, and absent from what a client sends.
@@ -1 +1 @@
1
- {"version":3,"file":"many.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/many.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,iBAAiB,EAC9C,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GACpB,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAK1B"}
1
+ {"version":3,"file":"many.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/many.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,iBAAiB,EAC9C,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GACpB,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAK1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"many.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/many.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA0B,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAClB,MAAqB;IAErB,OAAO,IAAI,KAAK,CAAoB;QAClC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;KAC1C,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"many.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/many.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAClB,MAAqB;IAErB,OAAO,IAAI,KAAK,CAAoB;QAClC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;KAC1C,CAAC,CAAC;AACL,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type EntityConstructor } from '../../axis/role/Relation.js';
1
+ import { type EntityConstructor } from '../../axis/role/EntityConstructor.js';
2
2
  import { Field } from '../../field/Field.js';
3
3
  export interface RefOptions {
4
4
  cascade?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,GAAG,CAAC,CAAC,SAAS,iBAAiB,EAC7C,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACrB,IAAI,CAAC,EAAE,UAAU,GAChB,KAAK,CAAC,MAAM,CAAC,CAKf"}
1
+ {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,GAAG,CAAC,CAAC,SAAS,iBAAiB,EAC7C,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACrB,IAAI,CAAC,EAAE,UAAU,GAChB,KAAK,CAAC,MAAM,CAAC,CAKf"}
@@ -1 +1 @@
1
- {"version":3,"file":"ref.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA0B,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAM7C,MAAM,UAAU,GAAG,CACjB,MAAqB,EACrB,IAAiB;IAEjB,OAAO,IAAI,KAAK,CAAS;QACvB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;KACxD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"ref.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/ref.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAM7C,MAAM,UAAU,GAAG,CACjB,MAAqB,EACrB,IAAiB;IAEjB,OAAO,IAAI,KAAK,CAAS;QACvB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;KACxD,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { Field } from '../../field/Field.js';
2
- import { type StringFormat } from '../../axis/shape/Formats.js';
2
+ import { type StringFormat } from '../../axis/shape/StringFormat.js';
3
3
  export interface TextOptions {
4
4
  min?: number;
5
5
  max?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAatD"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAatD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fougere/schema",
3
- "version": "0.9.2-alpha.0",
3
+ "version": "0.10.0-alpha.0",
4
4
  "description": "The entity and its 4 axes — shape, role, lifecycle, boundary. Subject-owned judgments, edge-safe.",
5
5
  "keywords": [
6
6
  "fougere",
@@ -0,0 +1,4 @@
1
+ import type { Fields } from './field/Fields.js';
2
+ import type { Values } from './Values.js';
3
+
4
+ export type PartialValues<TFields extends Fields> = Partial<Values<TFields>>;
package/src/Schema.ts CHANGED
@@ -1,42 +1,21 @@
1
1
  import { Boundary } from './axis/boundary/Boundary.js';
2
- import { type Fields } from './field/Field.js';
3
- import {
4
- type CompositeUnique,
5
- type EntityDeclarations,
6
- type PreviousNames,
7
- } from './entity/EntityDeclarations.js';
2
+ import { type Fields } from './field/Fields.js';
3
+ import { type CompositeUnique } from './entity/CompositeUnique.js';
4
+ import { type EntityDeclarations } from './entity/EntityDeclarations.js';
5
+ import { type PreviousNames } from './entity/PreviousNames.js';
8
6
  import { type EntityAdapters } from './entity/EntityAdapters.js';
9
7
  import { InputValidator } from './validator/InputValidator.js';
10
8
  import { SchemaDerivation } from './SchemaDerivation.js';
11
- import { SchemaDefinition, type SchemaConstraints } from './SchemaDefinition.js';
12
- import { type ValidateOptions } from './validator/InputValidator.js';
9
+ import { type SchemaConstraints } from './SchemaConstraints.js';
10
+ import { SchemaDefinition } from './SchemaDefinition.js';
11
+ import { type ValidateOptions } from './validator/ValidateOptions.js';
13
12
  import type { StandardSchemaV1 } from './projection/standard.js';
14
- import type { PartialValues, Values, SchemaView } from './SchemaView.js';
15
13
 
16
- export const ANONYMOUS_SCHEMA_NAME = 'Schema';
14
+ import type { SchemaView } from './SchemaView.js';
17
15
 
18
- export interface SchemaConstructor<TFields extends Fields> extends SchemaView<TFields> {
19
- new (data: PartialValues<TFields>): Values<TFields>;
20
- readonly '~standard': StandardSchemaV1.Props<Record<string, unknown>, Values<TFields>>;
21
- readonly derivation?: SchemaDerivation;
22
- readonly previous?: PreviousNames<TFields>;
23
- readonly anchored?: boolean;
24
- from(data: Record<string, unknown>): Values<TFields>;
25
- pick<K extends string & keyof TFields>(
26
- ...keys: K[]
27
- ): SchemaConstructor<Pick<TFields, K>>;
28
- omit<K extends string & keyof TFields>(
29
- ...keys: K[]
30
- ): SchemaConstructor<Omit<TFields, K>>;
31
- partial(): SchemaConstructor<TFields>;
32
- extend<E extends Fields>(extra: E): SchemaConstructor<TFields & E>;
33
- declares(declarations: EntityDeclarations<TFields>): SchemaConstructor<TFields>;
34
- anchor(): SchemaConstructor<TFields>;
35
- named(name: string): SchemaConstructor<TFields>;
36
- rename(
37
- mapping: Partial<Record<string & keyof TFields, string>>,
38
- ): SchemaConstructor<Fields>;
39
- }
16
+ import type { SchemaConstructor } from './SchemaConstructor.js';
17
+
18
+ export const ANONYMOUS_SCHEMA_NAME = 'Schema';
40
19
 
41
20
  export class Schema {
42
21
  /** The one place a schema holds what it is. The readings below are its projections. */
@@ -196,6 +175,7 @@ type UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) exten
196
175
  ) => void
197
176
  ? I
198
177
  : never;
178
+
199
179
  type Merged<T extends SchemaView[]> = UnionToIntersection<
200
180
  T[number] extends { getFields(): infer F } ? F : Fields
201
181
  > &
@@ -0,0 +1,46 @@
1
+ import { type FieldName } from './field/FieldName.js';
2
+ import { type Fields } from './field/Fields.js';
3
+ import { type CompositeUnique } from './entity/CompositeUnique.js';
4
+
5
+ /**
6
+ * What a schema constrains beyond any single field.
7
+ *
8
+ * `unique` is the one member today. It sits under an owner rather than beside `fields`
9
+ * and `opts` because the next rule spanning two fields — a check, an exclusion — is a
10
+ * member here, not an eighth positional argument in a list that has already lost one.
11
+ */
12
+ export class SchemaConstraints<TFields extends Fields = Fields> {
13
+ readonly unique?: CompositeUnique<TFields>;
14
+
15
+ private constructor(unique?: CompositeUnique<TFields>) {
16
+ if (unique) this.unique = unique;
17
+ }
18
+
19
+ static readonly none = new SchemaConstraints();
20
+
21
+ /**
22
+ * The order is part of a group, so `['a','b']` and `['b','a']` are two constraints.
23
+ * FR : l'ordre fait partie du groupe : `['a','b']` et `['b','a']` sont deux contraintes.
24
+ * `SchemaConstraints.of([['a','b'], ['a','b']])` → `unique` holds one group
25
+ */
26
+ static of<TFields extends Fields>(
27
+ groups: readonly (readonly FieldName<TFields>[])[],
28
+ ): SchemaConstraints<TFields> {
29
+ const seen = new Map<string, readonly FieldName<TFields>[]>();
30
+ for (const group of groups) seen.set(JSON.stringify(group), group);
31
+
32
+ return new SchemaConstraints(seen.size ? [...seen.values()] : undefined);
33
+ }
34
+
35
+ /** One member gone and the group is gone: it constrained a pair that no longer exists. */
36
+ renamed(transform: (key: string) => string | undefined): SchemaConstraints {
37
+ if (!this.unique) return SchemaConstraints.none;
38
+ const kept: string[][] = [];
39
+ for (const group of this.unique) {
40
+ const renamed = group.map(transform);
41
+ if (renamed.every((key): key is string => key !== undefined)) kept.push(renamed);
42
+ }
43
+
44
+ return SchemaConstraints.of(kept);
45
+ }
46
+ }
@@ -0,0 +1,32 @@
1
+ import { type Fields } from './field/Fields.js';
2
+
3
+ import { type EntityDeclarations } from './entity/EntityDeclarations.js';
4
+ import { type PreviousNames } from './entity/PreviousNames.js';
5
+ import { SchemaDerivation } from './SchemaDerivation.js';
6
+ import type { StandardSchemaV1 } from './projection/standard.js';
7
+ import type { PartialValues } from './PartialValues.js';
8
+ import type { SchemaView } from './SchemaView.js';
9
+ import type { Values } from './Values.js';
10
+
11
+ export interface SchemaConstructor<TFields extends Fields> extends SchemaView<TFields> {
12
+ new (data: PartialValues<TFields>): Values<TFields>;
13
+ readonly '~standard': StandardSchemaV1.Props<Record<string, unknown>, Values<TFields>>;
14
+ readonly derivation?: SchemaDerivation;
15
+ readonly previous?: PreviousNames<TFields>;
16
+ readonly anchored?: boolean;
17
+ from(data: Record<string, unknown>): Values<TFields>;
18
+ pick<K extends string & keyof TFields>(
19
+ ...keys: K[]
20
+ ): SchemaConstructor<Pick<TFields, K>>;
21
+ omit<K extends string & keyof TFields>(
22
+ ...keys: K[]
23
+ ): SchemaConstructor<Omit<TFields, K>>;
24
+ partial(): SchemaConstructor<TFields>;
25
+ extend<E extends Fields>(extra: E): SchemaConstructor<TFields & E>;
26
+ declares(declarations: EntityDeclarations<TFields>): SchemaConstructor<TFields>;
27
+ anchor(): SchemaConstructor<TFields>;
28
+ named(name: string): SchemaConstructor<TFields>;
29
+ rename(
30
+ mapping: Partial<Record<string & keyof TFields, string>>,
31
+ ): SchemaConstructor<Fields>;
32
+ }
@@ -1,58 +1,14 @@
1
- import { type FieldName, type Fields } from './field/Field.js';
1
+ import { type Fields } from './field/Fields.js';
2
2
  import { FieldSet } from './field/FieldSet.js';
3
- import {
4
- type CompositeUnique,
5
- type EntityDeclarations,
6
- type PreviousNames,
7
- } from './entity/EntityDeclarations.js';
3
+
4
+ import { type EntityDeclarations } from './entity/EntityDeclarations.js';
5
+ import { type PreviousNames } from './entity/PreviousNames.js';
8
6
  import { type EntityAdapters } from './entity/EntityAdapters.js';
9
7
  import { EntityAdapterSet } from './entity/EntityAdapterSet.js';
10
8
  import { SchemaDerivation } from './SchemaDerivation.js';
11
- import { type ValidateOptions } from './validator/InputValidator.js';
9
+ import { type ValidateOptions } from './validator/ValidateOptions.js';
12
10
  import type { SchemaView } from './SchemaView.js';
13
-
14
- /**
15
- * What a schema constrains beyond any single field.
16
- *
17
- * `unique` is the one member today. It sits under an owner rather than beside `fields`
18
- * and `opts` because the next rule spanning two fields — a check, an exclusion — is a
19
- * member here, not an eighth positional argument in a list that has already lost one.
20
- */
21
- export class SchemaConstraints<TFields extends Fields = Fields> {
22
- readonly unique?: CompositeUnique<TFields>;
23
-
24
- private constructor(unique?: CompositeUnique<TFields>) {
25
- if (unique) this.unique = unique;
26
- }
27
-
28
- static readonly none = new SchemaConstraints();
29
-
30
- /**
31
- * The order is part of a group, so `['a','b']` and `['b','a']` are two constraints.
32
- * FR : l'ordre fait partie du groupe : `['a','b']` et `['b','a']` sont deux contraintes.
33
- * `SchemaConstraints.of([['a','b'], ['a','b']])` → `unique` holds one group
34
- */
35
- static of<TFields extends Fields>(
36
- groups: readonly (readonly FieldName<TFields>[])[],
37
- ): SchemaConstraints<TFields> {
38
- const seen = new Map<string, readonly FieldName<TFields>[]>();
39
- for (const group of groups) seen.set(JSON.stringify(group), group);
40
-
41
- return new SchemaConstraints(seen.size ? [...seen.values()] : undefined);
42
- }
43
-
44
- /** One member gone and the group is gone: it constrained a pair that no longer exists. */
45
- renamed(transform: (key: string) => string | undefined): SchemaConstraints {
46
- if (!this.unique) return SchemaConstraints.none;
47
- const kept: string[][] = [];
48
- for (const group of this.unique) {
49
- const renamed = group.map(transform);
50
- if (renamed.every((key): key is string => key !== undefined)) kept.push(renamed);
51
- }
52
-
53
- return SchemaConstraints.of(kept);
54
- }
55
- }
11
+ import { SchemaConstraints } from './SchemaConstraints.js';
56
12
 
57
13
  /**
58
14
  * Everything a definition is made of, every member required.
@@ -1,4 +1,4 @@
1
- import { type Fields } from './field/Field.js';
1
+ import { type Fields } from './field/Fields.js';
2
2
  import type { SchemaView } from './SchemaView.js';
3
3
 
4
4
  /**
package/src/SchemaView.ts CHANGED
@@ -1,15 +1,11 @@
1
- import type { Field, Fields } from './field/Field.js';
2
- import type { CompositeUnique, PreviousNames } from './entity/EntityDeclarations.js';
1
+ import type { Fields } from './field/Fields.js';
2
+ import type { CompositeUnique } from './entity/CompositeUnique.js';
3
+ import type { PreviousNames } from './entity/PreviousNames.js';
3
4
  import type { EntityAdapters } from './entity/EntityAdapters.js';
4
- import type { ValidationResult } from './lib/validation.js';
5
- import type { ValidateOptions } from './validator/InputValidator.js';
5
+ import type { ValidationResult } from './lib/ValidationResult.js';
6
+ import type { ValidateOptions } from './validator/ValidateOptions.js';
6
7
  import type { SchemaDerivation } from './SchemaDerivation.js';
7
-
8
- export type Values<TFields extends Fields> = {
9
- [K in keyof TFields]: TFields[K] extends Field<infer T> ? T : never;
10
- };
11
-
12
- export type PartialValues<TFields extends Fields> = Partial<Values<TFields>>;
8
+ import type { Values } from './Values.js';
13
9
 
14
10
  export interface SchemaView<TFields extends Fields = Fields> {
15
11
  readonly name: string;
package/src/Values.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { Field } from './field/Field.js';
2
+ import type { Fields } from './field/Fields.js';
3
+
4
+ export type Values<TFields extends Fields> = {
5
+ [K in keyof TFields]: TFields[K] extends Field<infer T> ? T : never;
6
+ };
package/src/axis/Axis.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { roleAxis } from './role/RoleAxis.js';
2
2
  import { lifecycleAxis } from './lifecycle/LifecycleAxis.js';
3
3
  import { boundaryAxis } from './boundary/BoundaryAxis.js';
4
- import type { ValidationError } from '../lib/validation.js';
4
+ import type { ValidationError } from '../lib/ValidationError.js';
5
+ import type { Resolver } from './Resolver.js';
5
6
 
6
7
  export interface Axis<Declared = unknown, Wire = unknown> {
7
8
  readonly slot: 'role' | 'lifecycle' | 'boundary';
@@ -13,8 +14,6 @@ export interface Axis<Declared = unknown, Wire = unknown> {
13
14
  reconstruct(wire: Wire, resolve?: Resolver): Declared;
14
15
  }
15
16
 
16
- export type Resolver = (name: string) => (abstract new (...args: never[]) => unknown) | undefined;
17
-
18
17
  export const EXTENSION_AXES: readonly Axis[] = [
19
18
  roleAxis,
20
19
  lifecycleAxis,
@@ -0,0 +1 @@
1
+ export type Resolver = (name: string) => (abstract new (...args: never[]) => unknown) | undefined;
@@ -1,14 +1,8 @@
1
- import type { BoundaryRules } from './Boundary.js';
1
+ import type { Decoder } from './Decoder.js';
2
+ import type { Encoder } from './Encoder.js';
3
+ import type { BoundaryRules } from './BoundaryRules.js';
2
4
  import { Registry } from '../../lib/Registry.js';
3
5
 
4
- /**
5
- * Wire to domain, and it must ANSWER a value it already produced: two doors decode — the
6
- * client one on what arrives, `StorageGuard` on what a handler writes — so a decoder that
7
- * halves cents halves them twice and stores a hundredth.
8
- */
9
- export type Decoder = (value: unknown) => { value: unknown } | { error: string };
10
- export type Encoder = (value: unknown) => unknown;
11
-
12
6
  /**
13
7
  * `decoders` for a value coming in, `encoders` for one going out, `aliases` for the word
14
8
  * that names a pair. Three registries, so a codec is never half declared.
@@ -1,16 +1,13 @@
1
- import type { Decoder, Encoder } from './Boundaries.js';
2
- import { Boundaries } from './Boundaries.js';
1
+ import type { Decoder } from './Decoder.js';
2
+ import type { Encoder } from './Encoder.js';
3
+ import { Boundaries } from './Decoder.js';
3
4
  import type { Field } from '../../field/Field.js';
4
- import { Shapes, type Shape } from '../shape/Shape.js';
5
-
6
- export interface BoundaryRules {
7
- in?: 'closed' | { decode: string };
8
- out?: 'closed' | { encode: string };
9
- }
10
-
11
- export type BoundaryRef = 'isoDate' | (string & {}) | BoundaryRules;
5
+ import { type Shape } from '../shape/Shape.js';
6
+ import { Shapes } from '../shape/Shape.js';
7
+ import type { BoundaryRules } from './BoundaryRules.js';
12
8
 
13
9
  const identityDecoder: Decoder = (value) => ({ value });
10
+
14
11
  const identityEncoder: Encoder = (value) => value;
15
12
 
16
13
  export class Boundary {
@@ -1,7 +1,7 @@
1
1
  import type { Axis } from '../Axis.js';
2
2
  import { admitWire } from '../../projection/card/admission.js';
3
3
  import { isObject, shown } from '../../lib/utils.js';
4
- import type { BoundaryRef } from './Boundary.js';
4
+ import type { BoundaryRef } from './BoundaryRef.js';
5
5
 
6
6
  export const boundaryAxis: Axis<BoundaryRef, BoundaryRef> = {
7
7
  slot: 'boundary',
@@ -0,0 +1,3 @@
1
+ import type { BoundaryRules } from './BoundaryRules.js';
2
+
3
+ export type BoundaryRef = 'isoDate' | (string & {}) | BoundaryRules;
@@ -0,0 +1,4 @@
1
+ export interface BoundaryRules {
2
+ in?: 'closed' | { decode: string };
3
+ out?: 'closed' | { encode: string };
4
+ }
@@ -0,0 +1,42 @@
1
+ import type { BoundaryRules } from './BoundaryRules.js';
2
+ import { Registry } from '../../lib/Registry.js';
3
+ import type { Encoder } from './Encoder.js';
4
+
5
+ /**
6
+ * Wire to domain, and it must ANSWER a value it already produced: two facades decode — the
7
+ * client one on what arrives, `StorageGuard` on what a handler writes — so a decoder that
8
+ * halves cents halves them twice and stores a hundredth.
9
+ */
10
+ export type Decoder = (value: unknown) => { value: unknown } | { error: string };
11
+
12
+ /**
13
+ * `decoders` for a value coming in, `encoders` for one going out, `aliases` for the word
14
+ * that names a pair. Three registries, so a codec is never half declared.
15
+ * FR : `decoders` à l'entrée, `encoders` à la sortie, `aliases` pour le mot qui nomme la paire.
16
+ * `Boundaries.aliases.register('isoDate', { in: { decode: 'isoDate' }, out: { encode: 'isoDate' } })`
17
+ * → a field saying `boundary: 'isoDate'` decodes to a `Date` and leaves as a string
18
+ */
19
+ export const Boundaries = {
20
+ decoders: new Registry<Decoder>(
21
+ 'boundary decoder',
22
+ 'call Boundaries.decoders.register(name, fn)',
23
+ ),
24
+ encoders: new Registry<Encoder>(
25
+ 'boundary encoder',
26
+ 'call Boundaries.encoders.register(name, fn)',
27
+ ),
28
+ aliases: new Registry<BoundaryRules>('boundary alias'),
29
+ };
30
+
31
+ Boundaries.decoders.register('isoDate', (value) => {
32
+ if (value instanceof Date) return { value };
33
+ if (typeof value === 'string') {
34
+ const date = new Date(value);
35
+ return Number.isNaN(date.getTime()) ? { error: 'Invalid date' } : { value: date };
36
+ }
37
+ return { error: 'Expected a date' };
38
+ });
39
+ Boundaries.encoders.register('isoDate', (value) =>
40
+ value instanceof Date ? value.toISOString() : value,
41
+ );
42
+ Boundaries.aliases.register('isoDate', { in: { decode: 'isoDate' }, out: { encode: 'isoDate' } });
@@ -0,0 +1 @@
1
+ export type Encoder = (value: unknown) => unknown;
@@ -1,12 +1,5 @@
1
1
  import type { GeneratorRef } from './Generators.js';
2
-
3
- export const CREATE_TOKENS = ['now', 'optional'] as const;
4
- export const UPDATE_TOKENS = ['now', 'forbidden'] as const;
5
-
6
- export interface LifecycleRules {
7
- create?: { value: unknown } | { generate: GeneratorRef } | (typeof CREATE_TOKENS)[number];
8
- update?: (typeof UPDATE_TOKENS)[number];
9
- }
2
+ import type { LifecycleRules } from './LifecycleRules.js';
10
3
 
11
4
  export class Lifecycle {
12
5
  private readonly create?: LifecycleRules['create'];
@@ -1,8 +1,9 @@
1
1
  import type { Axis } from '../Axis.js';
2
- import type { ValidationError } from '../../lib/validation.js';
2
+ import type { ValidationError } from '../../lib/ValidationError.js';
3
3
  import { admitWire, oneOfTokens } from '../../projection/card/admission.js';
4
4
  import { isObject, shown } from '../../lib/utils.js';
5
- import { CREATE_TOKENS, UPDATE_TOKENS, type LifecycleRules } from './Lifecycle.js';
5
+ import { CREATE_TOKENS, UPDATE_TOKENS } from './LifecycleRules.js';
6
+ import { type LifecycleRules } from './LifecycleRules.js';
6
7
 
7
8
  export const lifecycleAxis: Axis<LifecycleRules, LifecycleRules> = {
8
9
  slot: 'lifecycle',
@@ -0,0 +1,9 @@
1
+ import type { GeneratorRef } from './Generators.js';
2
+
3
+ export const CREATE_TOKENS = ['now', 'optional'] as const;
4
+ export const UPDATE_TOKENS = ['now', 'forbidden'] as const;
5
+
6
+ export interface LifecycleRules {
7
+ create?: { value: unknown } | { generate: GeneratorRef } | (typeof CREATE_TOKENS)[number];
8
+ update?: (typeof UPDATE_TOKENS)[number];
9
+ }
@@ -1,7 +1,8 @@
1
1
  import { Lifecycle } from './Lifecycle.js';
2
2
  import { Generators } from './Generators.js';
3
3
  import { Clock } from './Clock.js';
4
- import { type Field, type Fields } from '../../field/Field.js';
4
+ import { type Field } from '../../field/Field.js';
5
+ import { type Fields } from '../../field/Fields.js';
5
6
 
6
7
  /**
7
8
  * Fills what the declaration leaves to the storage, so no handler stamps a date itself.
@@ -0,0 +1 @@
1
+ export type EntityConstructor = abstract new (...args: any[]) => any;
@@ -1,6 +1,7 @@
1
- export type EntityConstructor = abstract new (...args: any[]) => any;
1
+ import type { EntityConstructor } from './EntityConstructor.js';
2
2
 
3
3
  export const RELATION_KINDS = ['one', 'many'] as const;
4
+
4
5
  export const ON_DELETE = ['cascade', 'restrict', 'set null'] as const;
5
6
 
6
7
  export interface Relation {
@@ -1,11 +1,6 @@
1
- import type { EntityConstructor, Relation } from './Relation.js';
2
-
3
- export interface RoleRules {
4
- primary?: boolean;
5
- index?: boolean;
6
- unique?: boolean;
7
- relation?: Relation;
8
- }
1
+ import type { EntityConstructor } from './EntityConstructor.js';
2
+ import type { Relation } from './Relation.js';
3
+ import type { RoleRules } from './RoleRules.js';
9
4
 
10
5
  export class Role {
11
6
  private readonly primary?: boolean;
@@ -1,10 +1,12 @@
1
- import type { Axis, Resolver } from '../Axis.js';
1
+ import type { Axis } from '../Axis.js';
2
+ import type { Resolver } from '../Resolver.js';
2
3
  import { refuse, oneOfTokens } from '../../projection/card/admission.js';
3
4
  import { isObject, lowerFirst, shown } from '../../lib/utils.js';
4
- import type { ValidationError } from '../../lib/validation.js';
5
- import { ON_DELETE, RELATION_KINDS, type EntityConstructor, type Relation } from './Relation.js';
6
- import { type RoleRules } from './Role.js';
7
- import type { RoleDescriptor } from '../../projection/card/Descriptor.js';
5
+ import type { ValidationError } from '../../lib/ValidationError.js';
6
+ import { type EntityConstructor } from './EntityConstructor.js';
7
+ import { ON_DELETE, RELATION_KINDS, type Relation } from './Relation.js';
8
+ import { type RoleRules } from './RoleRules.js';
9
+ import type { RoleDescriptor } from '../../projection/card/RoleDescriptor.js';
8
10
 
9
11
  export const roleAxis: Axis<RoleRules, RoleDescriptor> = {
10
12
  slot: 'role',
@@ -0,0 +1,8 @@
1
+ import type { Relation } from './Relation.js';
2
+
3
+ export interface RoleRules {
4
+ primary?: boolean;
5
+ index?: boolean;
6
+ unique?: boolean;
7
+ relation?: Relation;
8
+ }
@@ -0,0 +1 @@
1
+ export type FormatPredicate = (value: string) => boolean;
@@ -1,15 +1,5 @@
1
1
  import { Registry } from '../../lib/Registry.js';
2
-
3
- export type StringFormat =
4
- | 'date-time'
5
- | 'date'
6
- | 'time'
7
- | 'email'
8
- | 'uuid'
9
- | 'uri'
10
- | (string & {});
11
-
12
- export type FormatPredicate = (value: string) => boolean;
2
+ import type { FormatPredicate } from './FormatPredicate.js';
13
3
 
14
4
  /**
15
5
  * String formats the JSON Schema engine does not know. `find` answers `undefined` for