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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/README.md +1 -1
  2. package/dist/EntityAdapters.d.ts +26 -0
  3. package/dist/EntityAdapters.d.ts.map +1 -0
  4. package/dist/EntityAdapters.js +71 -0
  5. package/dist/EntityAdapters.js.map +1 -0
  6. package/dist/EntityDeclarations.d.ts +15 -0
  7. package/dist/EntityDeclarations.d.ts.map +1 -0
  8. package/dist/EntityDeclarations.js +2 -0
  9. package/dist/EntityDeclarations.js.map +1 -0
  10. package/dist/axis/Axis.d.ts +12 -0
  11. package/dist/axis/Axis.d.ts.map +1 -0
  12. package/dist/axis/Axis.js +11 -0
  13. package/dist/axis/Axis.js.map +1 -0
  14. package/dist/axis/Meta.d.ts +4 -0
  15. package/dist/axis/Meta.d.ts.map +1 -0
  16. package/dist/axis/Meta.js +2 -0
  17. package/dist/axis/Meta.js.map +1 -0
  18. package/dist/axis/boundary/Boundaries.d.ts +20 -0
  19. package/dist/axis/boundary/Boundaries.d.ts.map +1 -0
  20. package/dist/axis/boundary/Boundaries.js +31 -0
  21. package/dist/axis/boundary/Boundaries.js.map +1 -0
  22. package/dist/axis/boundary/Boundary.d.ts +26 -0
  23. package/dist/axis/boundary/Boundary.d.ts.map +1 -0
  24. package/dist/axis/boundary/Boundary.js +53 -0
  25. package/dist/axis/boundary/Boundary.js.map +1 -0
  26. package/dist/axis/boundary/BoundaryAxis.d.ts +4 -0
  27. package/dist/axis/boundary/BoundaryAxis.d.ts.map +1 -0
  28. package/dist/axis/boundary/BoundaryAxis.js +30 -0
  29. package/dist/axis/boundary/BoundaryAxis.js.map +1 -0
  30. package/dist/axis/lifecycle/Clock.d.ts +18 -0
  31. package/dist/axis/lifecycle/Clock.d.ts.map +1 -0
  32. package/dist/axis/lifecycle/Clock.js +25 -0
  33. package/dist/axis/lifecycle/Clock.js.map +1 -0
  34. package/dist/axis/lifecycle/Generators.d.ts +18 -0
  35. package/dist/axis/lifecycle/Generators.d.ts.map +1 -0
  36. package/dist/axis/lifecycle/Generators.js +38 -0
  37. package/dist/axis/lifecycle/Generators.js.map +1 -0
  38. package/dist/axis/lifecycle/Lifecycle.d.ts +28 -0
  39. package/dist/axis/lifecycle/Lifecycle.d.ts.map +1 -0
  40. package/dist/axis/lifecycle/Lifecycle.js +38 -0
  41. package/dist/axis/lifecycle/Lifecycle.js.map +1 -0
  42. package/dist/axis/lifecycle/LifecycleAxis.d.ts +4 -0
  43. package/dist/axis/lifecycle/LifecycleAxis.d.ts.map +1 -0
  44. package/dist/axis/lifecycle/LifecycleAxis.js +47 -0
  45. package/dist/axis/lifecycle/LifecycleAxis.js.map +1 -0
  46. package/dist/axis/lifecycle/apply.d.ts +6 -0
  47. package/dist/axis/lifecycle/apply.d.ts.map +1 -0
  48. package/dist/axis/lifecycle/apply.js +34 -0
  49. package/dist/axis/lifecycle/apply.js.map +1 -0
  50. package/dist/axis/role/Relation.d.ts +20 -0
  51. package/dist/axis/role/Relation.d.ts.map +1 -0
  52. package/dist/axis/role/Relation.js +21 -0
  53. package/dist/axis/role/Relation.js.map +1 -0
  54. package/dist/axis/role/Role.d.ts +26 -0
  55. package/dist/axis/role/Role.d.ts.map +1 -0
  56. package/dist/axis/role/Role.js +40 -0
  57. package/dist/axis/role/Role.js.map +1 -0
  58. package/dist/axis/role/RoleAxis.d.ts +5 -0
  59. package/dist/axis/role/RoleAxis.d.ts.map +1 -0
  60. package/dist/axis/role/RoleAxis.js +102 -0
  61. package/dist/axis/role/RoleAxis.js.map +1 -0
  62. package/dist/axis/shape/Formats.d.ts +8 -0
  63. package/dist/axis/shape/Formats.d.ts.map +1 -0
  64. package/dist/axis/shape/Formats.js +10 -0
  65. package/dist/axis/shape/Formats.js.map +1 -0
  66. package/dist/axis/shape/Shape.d.ts +58 -0
  67. package/dist/axis/shape/Shape.d.ts.map +1 -0
  68. package/dist/{field/shape.js → axis/shape/Shape.js} +10 -25
  69. package/dist/axis/shape/Shape.js.map +1 -0
  70. package/dist/card/Bundle.d.ts +15 -0
  71. package/dist/card/Bundle.d.ts.map +1 -0
  72. package/dist/card/Bundle.js +67 -0
  73. package/dist/card/Bundle.js.map +1 -0
  74. package/dist/card/Card.d.ts +27 -0
  75. package/dist/card/Card.d.ts.map +1 -0
  76. package/dist/card/Card.js +230 -0
  77. package/dist/card/Card.js.map +1 -0
  78. package/dist/card/Descriptor.d.ts +55 -0
  79. package/dist/card/Descriptor.d.ts.map +1 -0
  80. package/dist/card/Descriptor.js +2 -0
  81. package/dist/card/Descriptor.js.map +1 -0
  82. package/dist/card/EntityTypeSource.d.ts +12 -0
  83. package/dist/card/EntityTypeSource.d.ts.map +1 -0
  84. package/dist/card/EntityTypeSource.js +78 -0
  85. package/dist/card/EntityTypeSource.js.map +1 -0
  86. package/dist/card/FacadeTypeSource.d.ts +19 -0
  87. package/dist/card/FacadeTypeSource.d.ts.map +1 -0
  88. package/dist/card/FacadeTypeSource.js +40 -0
  89. package/dist/card/FacadeTypeSource.js.map +1 -0
  90. package/dist/card/admission.d.ts +9 -0
  91. package/dist/card/admission.d.ts.map +1 -0
  92. package/dist/card/admission.js +16 -0
  93. package/dist/card/admission.js.map +1 -0
  94. package/dist/card/diff.d.ts +96 -0
  95. package/dist/card/diff.d.ts.map +1 -0
  96. package/dist/card/diff.js +2 -0
  97. package/dist/card/diff.js.map +1 -0
  98. package/dist/constraint/FieldGroup.d.ts +21 -0
  99. package/dist/constraint/FieldGroup.d.ts.map +1 -0
  100. package/dist/constraint/FieldGroup.js +65 -0
  101. package/dist/constraint/FieldGroup.js.map +1 -0
  102. package/dist/constraint/Unique.d.ts +4 -0
  103. package/dist/constraint/Unique.d.ts.map +1 -0
  104. package/dist/constraint/Unique.js +4 -0
  105. package/dist/constraint/Unique.js.map +1 -0
  106. package/dist/entity.d.ts +4 -19
  107. package/dist/entity.d.ts.map +1 -1
  108. package/dist/entity.js +8 -39
  109. package/dist/entity.js.map +1 -1
  110. package/dist/fields/Field.d.ts +24 -0
  111. package/dist/fields/Field.d.ts.map +1 -0
  112. package/dist/fields/Field.js +52 -0
  113. package/dist/fields/Field.js.map +1 -0
  114. package/dist/fields/FieldSet.d.ts +28 -0
  115. package/dist/fields/FieldSet.d.ts.map +1 -0
  116. package/dist/fields/FieldSet.js +55 -0
  117. package/dist/fields/FieldSet.js.map +1 -0
  118. package/dist/index.d.ts +59 -37
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +50 -48
  121. package/dist/index.js.map +1 -1
  122. package/dist/judge/Cases.d.ts +50 -0
  123. package/dist/judge/Cases.d.ts.map +1 -0
  124. package/dist/judge/Cases.js +108 -0
  125. package/dist/judge/Cases.js.map +1 -0
  126. package/dist/judge/FieldJudge.d.ts +9 -0
  127. package/dist/judge/FieldJudge.d.ts.map +1 -0
  128. package/dist/judge/FieldJudge.js +54 -0
  129. package/dist/judge/FieldJudge.js.map +1 -0
  130. package/dist/judge/RowJudge.d.ts +12 -0
  131. package/dist/judge/RowJudge.d.ts.map +1 -0
  132. package/dist/judge/RowJudge.js +81 -0
  133. package/dist/judge/RowJudge.js.map +1 -0
  134. package/dist/judge/RowRefusal.d.ts +17 -0
  135. package/dist/judge/RowRefusal.d.ts.map +1 -0
  136. package/dist/judge/RowRefusal.js +16 -0
  137. package/dist/judge/RowRefusal.js.map +1 -0
  138. package/dist/judge/ValueForm.d.ts +3 -0
  139. package/dist/judge/ValueForm.d.ts.map +1 -0
  140. package/dist/judge/ValueForm.js +3 -0
  141. package/dist/judge/ValueForm.js.map +1 -0
  142. package/dist/judge/ValueJudge.d.ts +12 -0
  143. package/dist/judge/ValueJudge.d.ts.map +1 -0
  144. package/dist/judge/ValueJudge.js +60 -0
  145. package/dist/judge/ValueJudge.js.map +1 -0
  146. package/dist/judge/options.d.ts +4 -0
  147. package/dist/judge/options.d.ts.map +1 -0
  148. package/dist/judge/options.js +2 -0
  149. package/dist/judge/options.js.map +1 -0
  150. package/dist/judge/result.d.ts +17 -0
  151. package/dist/judge/result.d.ts.map +1 -0
  152. package/dist/judge/result.js +2 -0
  153. package/dist/judge/result.js.map +1 -0
  154. package/dist/projection/SchemaOrCard.d.ts +7 -0
  155. package/dist/projection/SchemaOrCard.d.ts.map +1 -0
  156. package/dist/projection/SchemaOrCard.js +11 -0
  157. package/dist/projection/SchemaOrCard.js.map +1 -0
  158. package/dist/projection/Visibility.d.ts +10 -0
  159. package/dist/projection/Visibility.d.ts.map +1 -0
  160. package/dist/projection/Visibility.js +55 -0
  161. package/dist/projection/Visibility.js.map +1 -0
  162. package/dist/{projections → projection}/standard.d.ts +2 -10
  163. package/dist/projection/standard.d.ts.map +1 -0
  164. package/dist/projection/standard.js +2 -0
  165. package/dist/projection/standard.js.map +1 -0
  166. package/dist/schema/Schema.d.ts +63 -0
  167. package/dist/schema/Schema.d.ts.map +1 -0
  168. package/dist/schema/Schema.js +129 -0
  169. package/dist/schema/Schema.js.map +1 -0
  170. package/dist/schema/SchemaDefinition.d.ts +46 -0
  171. package/dist/schema/SchemaDefinition.d.ts.map +1 -0
  172. package/dist/schema/SchemaDefinition.js +64 -0
  173. package/dist/schema/SchemaDefinition.js.map +1 -0
  174. package/dist/schema/SchemaDerivation.d.ts +28 -0
  175. package/dist/schema/SchemaDerivation.d.ts.map +1 -0
  176. package/dist/schema/SchemaDerivation.js +37 -0
  177. package/dist/schema/SchemaDerivation.js.map +1 -0
  178. package/dist/schema/SchemaView.d.ts +23 -0
  179. package/dist/schema/SchemaView.d.ts.map +1 -0
  180. package/dist/schema/SchemaView.js +2 -0
  181. package/dist/schema/SchemaView.js.map +1 -0
  182. package/dist/utils.d.ts +4 -0
  183. package/dist/utils.d.ts.map +1 -0
  184. package/dist/utils.js +13 -0
  185. package/dist/utils.js.map +1 -0
  186. package/dist/vocabulary/bool.d.ts +1 -1
  187. package/dist/vocabulary/bool.d.ts.map +1 -1
  188. package/dist/vocabulary/bool.js +1 -1
  189. package/dist/vocabulary/bool.js.map +1 -1
  190. package/dist/vocabulary/created.d.ts +1 -5
  191. package/dist/vocabulary/created.d.ts.map +1 -1
  192. package/dist/vocabulary/created.js +1 -5
  193. package/dist/vocabulary/created.js.map +1 -1
  194. package/dist/vocabulary/date.d.ts +1 -1
  195. package/dist/vocabulary/date.d.ts.map +1 -1
  196. package/dist/vocabulary/date.js +1 -1
  197. package/dist/vocabulary/date.js.map +1 -1
  198. package/dist/vocabulary/email.d.ts +1 -2
  199. package/dist/vocabulary/email.d.ts.map +1 -1
  200. package/dist/vocabulary/email.js +0 -1
  201. package/dist/vocabulary/email.js.map +1 -1
  202. package/dist/vocabulary/immutable.d.ts +2 -6
  203. package/dist/vocabulary/immutable.d.ts.map +1 -1
  204. package/dist/vocabulary/immutable.js +4 -7
  205. package/dist/vocabulary/immutable.js.map +1 -1
  206. package/dist/vocabulary/indexed.d.ts +2 -7
  207. package/dist/vocabulary/indexed.d.ts.map +1 -1
  208. package/dist/vocabulary/indexed.js +2 -8
  209. package/dist/vocabulary/indexed.js.map +1 -1
  210. package/dist/vocabulary/json.d.ts +2 -10
  211. package/dist/vocabulary/json.d.ts.map +1 -1
  212. package/dist/vocabulary/json.js +12 -7
  213. package/dist/vocabulary/json.js.map +1 -1
  214. package/dist/vocabulary/list.d.ts +1 -12
  215. package/dist/vocabulary/list.d.ts.map +1 -1
  216. package/dist/vocabulary/list.js +1 -14
  217. package/dist/vocabulary/list.js.map +1 -1
  218. package/dist/vocabulary/many.d.ts +2 -5
  219. package/dist/vocabulary/many.d.ts.map +1 -1
  220. package/dist/vocabulary/many.js +3 -6
  221. package/dist/vocabulary/many.js.map +1 -1
  222. package/dist/vocabulary/nullable.d.ts +2 -6
  223. package/dist/vocabulary/nullable.d.ts.map +1 -1
  224. package/dist/vocabulary/nullable.js +5 -8
  225. package/dist/vocabulary/nullable.js.map +1 -1
  226. package/dist/vocabulary/number.d.ts +1 -1
  227. package/dist/vocabulary/number.d.ts.map +1 -1
  228. package/dist/vocabulary/number.js +1 -1
  229. package/dist/vocabulary/number.js.map +1 -1
  230. package/dist/vocabulary/oneOf.d.ts +1 -8
  231. package/dist/vocabulary/oneOf.d.ts.map +1 -1
  232. package/dist/vocabulary/oneOf.js +1 -1
  233. package/dist/vocabulary/oneOf.js.map +1 -1
  234. package/dist/vocabulary/optional.d.ts +2 -9
  235. package/dist/vocabulary/optional.d.ts.map +1 -1
  236. package/dist/vocabulary/optional.js +6 -14
  237. package/dist/vocabulary/optional.js.map +1 -1
  238. package/dist/vocabulary/primary.d.ts +2 -15
  239. package/dist/vocabulary/primary.d.ts.map +1 -1
  240. package/dist/vocabulary/primary.js +4 -11
  241. package/dist/vocabulary/primary.js.map +1 -1
  242. package/dist/vocabulary/readOnly.d.ts +2 -6
  243. package/dist/vocabulary/readOnly.d.ts.map +1 -1
  244. package/dist/vocabulary/readOnly.js +5 -8
  245. package/dist/vocabulary/readOnly.js.map +1 -1
  246. package/dist/vocabulary/ref.d.ts +2 -7
  247. package/dist/vocabulary/ref.d.ts.map +1 -1
  248. package/dist/vocabulary/ref.js +3 -14
  249. package/dist/vocabulary/ref.js.map +1 -1
  250. package/dist/vocabulary/text.d.ts +2 -2
  251. package/dist/vocabulary/text.d.ts.map +1 -1
  252. package/dist/vocabulary/text.js +1 -1
  253. package/dist/vocabulary/text.js.map +1 -1
  254. package/dist/vocabulary/unique.d.ts +2 -12
  255. package/dist/vocabulary/unique.d.ts.map +1 -1
  256. package/dist/vocabulary/unique.js +5 -13
  257. package/dist/vocabulary/unique.js.map +1 -1
  258. package/dist/vocabulary/updated.d.ts +1 -6
  259. package/dist/vocabulary/updated.d.ts.map +1 -1
  260. package/dist/vocabulary/updated.js +0 -5
  261. package/dist/vocabulary/updated.js.map +1 -1
  262. package/dist/vocabulary/url.d.ts +1 -2
  263. package/dist/vocabulary/url.d.ts.map +1 -1
  264. package/dist/vocabulary/url.js +0 -1
  265. package/dist/vocabulary/url.js.map +1 -1
  266. package/dist/vocabulary/vocabulary.d.ts +4 -0
  267. package/dist/vocabulary/vocabulary.d.ts.map +1 -0
  268. package/dist/vocabulary/vocabulary.js +31 -0
  269. package/dist/vocabulary/vocabulary.js.map +1 -0
  270. package/dist/vocabulary/writeOnly.d.ts +2 -6
  271. package/dist/vocabulary/writeOnly.d.ts.map +1 -1
  272. package/dist/vocabulary/writeOnly.js +5 -8
  273. package/dist/vocabulary/writeOnly.js.map +1 -1
  274. package/package.json +8 -4
  275. package/src/EntityAdapters.ts +95 -0
  276. package/src/EntityDeclarations.ts +19 -0
  277. package/src/axis/Axis.ts +25 -0
  278. package/src/axis/Meta.ts +3 -0
  279. package/src/axis/boundary/Boundaries.ts +44 -0
  280. package/src/axis/boundary/Boundary.ts +69 -0
  281. package/src/axis/boundary/BoundaryAxis.ts +32 -0
  282. package/src/axis/lifecycle/Clock.ts +26 -0
  283. package/src/axis/lifecycle/Generators.ts +46 -0
  284. package/src/axis/lifecycle/Lifecycle.ts +53 -0
  285. package/src/axis/lifecycle/LifecycleAxis.ts +49 -0
  286. package/src/axis/lifecycle/apply.ts +38 -0
  287. package/src/axis/role/Relation.ts +31 -0
  288. package/src/axis/role/Role.ts +56 -0
  289. package/src/axis/role/RoleAxis.ts +115 -0
  290. package/src/axis/shape/Formats.ts +22 -0
  291. package/src/axis/shape/Shape.ts +91 -0
  292. package/src/card/Bundle.ts +80 -0
  293. package/src/card/Card.ts +256 -0
  294. package/src/card/Descriptor.ts +68 -0
  295. package/src/card/EntityTypeSource.ts +90 -0
  296. package/src/card/FacadeTypeSource.ts +55 -0
  297. package/src/card/admission.ts +25 -0
  298. package/src/card/diff.ts +56 -0
  299. package/src/constraint/FieldGroup.ts +91 -0
  300. package/src/constraint/Unique.ts +3 -0
  301. package/src/entity.ts +15 -0
  302. package/src/fields/Field.ts +80 -0
  303. package/src/fields/FieldSet.ts +62 -0
  304. package/src/index.ts +64 -0
  305. package/src/judge/Cases.ts +139 -0
  306. package/src/judge/FieldJudge.ts +61 -0
  307. package/src/judge/RowJudge.ts +84 -0
  308. package/src/judge/RowRefusal.ts +17 -0
  309. package/src/judge/ValueForm.ts +7 -0
  310. package/src/judge/ValueJudge.ts +72 -0
  311. package/src/judge/options.ts +3 -0
  312. package/src/judge/result.ts +10 -0
  313. package/src/projection/SchemaOrCard.ts +18 -0
  314. package/src/projection/Visibility.ts +47 -0
  315. package/src/projection/standard.ts +47 -0
  316. package/src/schema/Schema.ts +167 -0
  317. package/src/schema/SchemaDefinition.ts +87 -0
  318. package/src/schema/SchemaDerivation.ts +46 -0
  319. package/src/schema/SchemaView.ts +25 -0
  320. package/src/utils.ts +13 -0
  321. package/src/vocabulary/bool.ts +9 -0
  322. package/src/vocabulary/created.ts +8 -0
  323. package/src/vocabulary/date.ts +5 -0
  324. package/src/vocabulary/email.ts +6 -0
  325. package/src/vocabulary/immutable.ts +6 -0
  326. package/src/vocabulary/indexed.ts +4 -0
  327. package/src/vocabulary/json.ts +22 -0
  328. package/src/vocabulary/list.ts +13 -0
  329. package/src/vocabulary/many.ts +9 -0
  330. package/src/vocabulary/nullable.ts +7 -0
  331. package/src/vocabulary/number.ts +17 -0
  332. package/src/vocabulary/oneOf.ts +24 -0
  333. package/src/vocabulary/optional.ts +8 -0
  334. package/src/vocabulary/primary.ts +33 -0
  335. package/src/vocabulary/readOnly.ts +7 -0
  336. package/src/vocabulary/ref.ts +13 -0
  337. package/src/vocabulary/text.ts +19 -0
  338. package/src/vocabulary/unique.ts +10 -0
  339. package/src/vocabulary/updated.ts +7 -0
  340. package/src/vocabulary/url.ts +6 -0
  341. package/src/vocabulary/vocabulary.ts +40 -0
  342. package/src/vocabulary/writeOnly.ts +7 -0
  343. package/dist/field/boundary.d.ts +0 -69
  344. package/dist/field/boundary.d.ts.map +0 -1
  345. package/dist/field/boundary.js +0 -82
  346. package/dist/field/boundary.js.map +0 -1
  347. package/dist/field/field.d.ts +0 -21
  348. package/dist/field/field.d.ts.map +0 -1
  349. package/dist/field/field.js +0 -24
  350. package/dist/field/field.js.map +0 -1
  351. package/dist/field/format.d.ts +0 -29
  352. package/dist/field/format.d.ts.map +0 -1
  353. package/dist/field/format.js +0 -24
  354. package/dist/field/format.js.map +0 -1
  355. package/dist/field/index.d.ts +0 -8
  356. package/dist/field/index.d.ts.map +0 -1
  357. package/dist/field/index.js +0 -10
  358. package/dist/field/index.js.map +0 -1
  359. package/dist/field/lifecycle.d.ts +0 -31
  360. package/dist/field/lifecycle.d.ts.map +0 -1
  361. package/dist/field/lifecycle.js +0 -20
  362. package/dist/field/lifecycle.js.map +0 -1
  363. package/dist/field/meta.d.ts +0 -5
  364. package/dist/field/meta.d.ts.map +0 -1
  365. package/dist/field/meta.js +0 -5
  366. package/dist/field/meta.js.map +0 -1
  367. package/dist/field/role.d.ts +0 -47
  368. package/dist/field/role.d.ts.map +0 -1
  369. package/dist/field/role.js +0 -35
  370. package/dist/field/role.js.map +0 -1
  371. package/dist/field/shape.d.ts +0 -89
  372. package/dist/field/shape.d.ts.map +0 -1
  373. package/dist/field/shape.js.map +0 -1
  374. package/dist/hints.d.ts +0 -28
  375. package/dist/hints.d.ts.map +0 -1
  376. package/dist/hints.js +0 -23
  377. package/dist/hints.js.map +0 -1
  378. package/dist/name.d.ts +0 -8
  379. package/dist/name.d.ts.map +0 -1
  380. package/dist/name.js +0 -10
  381. package/dist/name.js.map +0 -1
  382. package/dist/projections/card.d.ts +0 -98
  383. package/dist/projections/card.d.ts.map +0 -1
  384. package/dist/projections/card.js +0 -8
  385. package/dist/projections/card.js.map +0 -1
  386. package/dist/projections/describe.d.ts +0 -25
  387. package/dist/projections/describe.d.ts.map +0 -1
  388. package/dist/projections/describe.js +0 -131
  389. package/dist/projections/describe.js.map +0 -1
  390. package/dist/projections/encode.d.ts +0 -11
  391. package/dist/projections/encode.d.ts.map +0 -1
  392. package/dist/projections/encode.js +0 -26
  393. package/dist/projections/encode.js.map +0 -1
  394. package/dist/projections/io.d.ts +0 -24
  395. package/dist/projections/io.d.ts.map +0 -1
  396. package/dist/projections/io.js +0 -46
  397. package/dist/projections/io.js.map +0 -1
  398. package/dist/projections/lifecycle.d.ts +0 -29
  399. package/dist/projections/lifecycle.d.ts.map +0 -1
  400. package/dist/projections/lifecycle.js +0 -93
  401. package/dist/projections/lifecycle.js.map +0 -1
  402. package/dist/projections/reconstruct.d.ts +0 -31
  403. package/dist/projections/reconstruct.d.ts.map +0 -1
  404. package/dist/projections/reconstruct.js +0 -146
  405. package/dist/projections/reconstruct.js.map +0 -1
  406. package/dist/projections/source.d.ts +0 -18
  407. package/dist/projections/source.d.ts.map +0 -1
  408. package/dist/projections/source.js +0 -18
  409. package/dist/projections/source.js.map +0 -1
  410. package/dist/projections/standard.d.ts.map +0 -1
  411. package/dist/projections/standard.js +0 -10
  412. package/dist/projections/standard.js.map +0 -1
  413. package/dist/projections/typescript.d.ts +0 -37
  414. package/dist/projections/typescript.d.ts.map +0 -1
  415. package/dist/projections/typescript.js +0 -157
  416. package/dist/projections/typescript.js.map +0 -1
  417. package/dist/schema/index.d.ts +0 -3
  418. package/dist/schema/index.d.ts.map +0 -1
  419. package/dist/schema/index.js +0 -2
  420. package/dist/schema/index.js.map +0 -1
  421. package/dist/schema/schema.d.ts +0 -74
  422. package/dist/schema/schema.d.ts.map +0 -1
  423. package/dist/schema/schema.js +0 -162
  424. package/dist/schema/schema.js.map +0 -1
  425. package/dist/schema/view.d.ts +0 -26
  426. package/dist/schema/view.d.ts.map +0 -1
  427. package/dist/schema/view.js +0 -2
  428. package/dist/schema/view.js.map +0 -1
  429. package/dist/unique.d.ts +0 -40
  430. package/dist/unique.d.ts.map +0 -1
  431. package/dist/unique.js +0 -57
  432. package/dist/unique.js.map +0 -1
  433. package/dist/validation/index.d.ts +0 -4
  434. package/dist/validation/index.d.ts.map +0 -1
  435. package/dist/validation/index.js +0 -2
  436. package/dist/validation/index.js.map +0 -1
  437. package/dist/validation/judge.d.ts +0 -55
  438. package/dist/validation/judge.d.ts.map +0 -1
  439. package/dist/validation/judge.js +0 -351
  440. package/dist/validation/judge.js.map +0 -1
  441. package/dist/validation/options.d.ts +0 -6
  442. package/dist/validation/options.d.ts.map +0 -1
  443. package/dist/validation/options.js +0 -3
  444. package/dist/validation/options.js.map +0 -1
  445. package/dist/validation/result.d.ts +0 -20
  446. package/dist/validation/result.d.ts.map +0 -1
  447. package/dist/validation/result.js +0 -3
  448. package/dist/validation/result.js.map +0 -1
@@ -0,0 +1,96 @@
1
+ import type { BoundaryRef } from '../axis/boundary/Boundary.js';
2
+ import type { LifecycleRules } from '../axis/lifecycle/Lifecycle.js';
3
+ import type { FieldDescriptor, RoleDescriptor } from './Descriptor.js';
4
+ /** One named difference, at one place. Each kind exists because a reader asks for it. */
5
+ export type Change =
6
+ /** DDL: add the column. Codec: the old caller never sends it. Boot: refuse when required. */
7
+ {
8
+ kind: 'added';
9
+ field: string;
10
+ to: FieldDescriptor;
11
+ required: boolean;
12
+ }
13
+ /** DDL: drop the column. Codec: the old caller still sends it, and it goes nowhere. */
14
+ | {
15
+ kind: 'removed';
16
+ field: string;
17
+ from: FieldDescriptor;
18
+ required: boolean;
19
+ }
20
+ /** DDL: rename the column. Codec and ORM: one more entry in the field-to-column map. */
21
+ | {
22
+ kind: 'renamed';
23
+ from: string;
24
+ to: string;
25
+ field: FieldDescriptor;
26
+ }
27
+ /** DDL: alter the type. Codec: convert the value, when it can. */
28
+ | {
29
+ kind: 'retyped';
30
+ field: string;
31
+ from: TypeSet;
32
+ to: TypeSet;
33
+ }
34
+ /** Same type, different bounds: a CHECK moves, and a value legal yesterday may not be. */
35
+ | {
36
+ kind: 'reshaped';
37
+ field: string;
38
+ from: FieldDescriptor;
39
+ to: FieldDescriptor;
40
+ }
41
+ /** NOT NULL in either direction. Boot: an old writer cannot fill what it never knew. */
42
+ | {
43
+ kind: 'required';
44
+ field: string;
45
+ from: boolean;
46
+ to: boolean;
47
+ }
48
+ /** An axis other than shape was restated. */
49
+ | {
50
+ kind: 'restated';
51
+ field: string;
52
+ axis: 'role';
53
+ from?: RoleDescriptor;
54
+ to?: RoleDescriptor;
55
+ } | {
56
+ kind: 'restated';
57
+ field: string;
58
+ axis: 'lifecycle';
59
+ from?: LifecycleRules;
60
+ to?: LifecycleRules;
61
+ } | {
62
+ kind: 'restated';
63
+ field: string;
64
+ axis: 'boundary';
65
+ from?: BoundaryRef;
66
+ to?: BoundaryRef;
67
+ };
68
+ /** A field's declared types, always represented as a set. */
69
+ export type TypeSet = string[];
70
+ /** A removal and an addition that could be one rename: same shape, different name. */
71
+ export interface RenameCandidate {
72
+ removed: string;
73
+ added: string;
74
+ }
75
+ export interface Diff {
76
+ changes: Change[];
77
+ /** Questions the comparison refuses to decide without an explicit rename declaration. */
78
+ ambiguous: RenameCandidate[];
79
+ }
80
+ export interface DiffOptions {
81
+ /** Renames as declared at the time: old name to new name. */
82
+ renamed?: Record<string, string>;
83
+ }
84
+ export interface SetDiff {
85
+ /** Entities the target bundle has and the source bundle had not. */
86
+ entitiesAdded: string[];
87
+ /** Entities the source bundle had and the target bundle has not. */
88
+ entitiesRemoved: string[];
89
+ /** Differences for entities present in both bundles; unchanged entities are absent. */
90
+ entities: Record<string, Diff>;
91
+ }
92
+ export interface SetDiffOptions {
93
+ /** Declared renames, per entity: `{ post: { body: 'content' } }`. */
94
+ renamed?: Record<string, Record<string, string>>;
95
+ }
96
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/card/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/card/diff.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type { Field, Fields } from "../fields/Field.js";
2
+ export declare abstract class FieldGroup {
3
+ readonly members: readonly string[];
4
+ constructor(members: readonly string[]);
5
+ protected withMembers(members: readonly string[]): this;
6
+ get isSelf(): boolean;
7
+ resolvedOn(ownKey: string): this;
8
+ covers(key: string): boolean;
9
+ equals(other: FieldGroup): boolean;
10
+ onto(fields: Fields): Fields;
11
+ rename(map: (key: string) => string | undefined): this | null;
12
+ toJSON(): string[];
13
+ static normalize<R extends FieldGroup>(groups: readonly (R | readonly string[])[] | undefined, make: (members: readonly string[]) => R): readonly R[] | undefined;
14
+ static on<R extends FieldGroup>(field: Field, kind: Function & {
15
+ prototype: R;
16
+ }): R[];
17
+ static groupsOf<R extends FieldGroup>(fields: Fields, kind: Function & {
18
+ prototype: R;
19
+ }): R[];
20
+ }
21
+ //# sourceMappingURL=FieldGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldGroup.d.ts","sourceRoot":"","sources":["../../src/constraint/FieldGroup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAExD,8BAAsB,UAAU;IAClB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE;IAA/C,YAAqB,OAAO,EAAE,SAAS,MAAM,EAAE,EAAI;IAEnD,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAItD;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/B;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3B;IAED,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAMjC;IAED,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgB3B;IAED,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAM5D;IAED,MAAM,IAAI,MAAM,EAAE,CAEjB;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,UAAU,EACnC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EACtD,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,CAAC,GACtC,SAAS,CAAC,EAAE,GAAG,SAAS,CAK1B;IAED,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,UAAU,EAC5B,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,QAAQ,GAAG;QAAE,SAAS,EAAE,CAAC,CAAA;KAAE,GAChC,CAAC,EAAE,CAIL;IAED,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,UAAU,EAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,GAAG;QAAE,SAAS,EAAE,CAAC,CAAA;KAAE,GAChC,CAAC,EAAE,CAML;CACF"}
@@ -0,0 +1,65 @@
1
+ export class FieldGroup {
2
+ members;
3
+ constructor(members) {
4
+ this.members = members;
5
+ }
6
+ withMembers(members) {
7
+ return new this.constructor(members);
8
+ }
9
+ get isSelf() {
10
+ return this.members.length === 0;
11
+ }
12
+ resolvedOn(ownKey) {
13
+ return this.isSelf ? this.withMembers([ownKey]) : this;
14
+ }
15
+ covers(key) {
16
+ return this.members.includes(key);
17
+ }
18
+ equals(other) {
19
+ return (this.constructor === other.constructor &&
20
+ this.members.length === other.members.length &&
21
+ this.members.every((member, i) => member === other.members[i]));
22
+ }
23
+ onto(fields) {
24
+ const missing = this.members.filter((key) => !(key in fields));
25
+ if (missing.length)
26
+ throw new Error(`${this.constructor.name.toLowerCase()}: [${this.members.join(", ")}] names ` +
27
+ `${missing.map((m) => `'${m}'`).join(", ")}, which the entity does not declare.`);
28
+ const out = { ...fields };
29
+ for (const key of this.members) {
30
+ const field = out[key];
31
+ out[key] = field.with({
32
+ role: { ...field.role, rules: [...(field.role?.rules ?? []), this] },
33
+ });
34
+ }
35
+ return out;
36
+ }
37
+ rename(map) {
38
+ if (this.isSelf)
39
+ return this;
40
+ const carried = this.members.map(map);
41
+ return carried.every((key) => key !== undefined)
42
+ ? this.withMembers(carried)
43
+ : null;
44
+ }
45
+ toJSON() {
46
+ return [...this.members];
47
+ }
48
+ static normalize(groups, make) {
49
+ if (!groups)
50
+ return undefined;
51
+ return groups.map((group) => group instanceof FieldGroup ? group : make(group));
52
+ }
53
+ static on(field, kind) {
54
+ return (field.role?.rules ?? []).filter((rule) => rule instanceof kind);
55
+ }
56
+ static groupsOf(fields, kind) {
57
+ const seen = new Map();
58
+ for (const field of Object.values(fields))
59
+ for (const rule of FieldGroup.on(field, kind))
60
+ if (rule.members.length > 1)
61
+ seen.set(rule.members.join(" "), rule);
62
+ return [...seen.values()];
63
+ }
64
+ }
65
+ //# sourceMappingURL=FieldGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldGroup.js","sourceRoot":"","sources":["../../src/constraint/FieldGroup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { FieldGroup } from './FieldGroup.js';
2
+ export declare class Unique extends FieldGroup {
3
+ }
4
+ //# sourceMappingURL=Unique.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Unique.d.ts","sourceRoot":"","sources":["../../src/constraint/Unique.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,MAAO,SAAQ,UAAU;CAAG"}
@@ -0,0 +1,4 @@
1
+ import { FieldGroup } from './FieldGroup.js';
2
+ export class Unique extends FieldGroup {
3
+ }
4
+ //# sourceMappingURL=Unique.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Unique.js","sourceRoot":"","sources":["../../src/constraint/Unique.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,MAAO,SAAQ,UAAU;CAAG"}
package/dist/entity.d.ts CHANGED
@@ -1,20 +1,5 @@
1
- import { type Fields } from "./field/index.js";
2
- import { type EntityDeclarations } from "./unique.js";
3
- import { type SchemaConstructor } from "./schema/index.js";
4
- /**
5
- * Define an entity — the factory that produces a schema-carrying class.
6
- *
7
- * ```ts
8
- * class Post extends entity({ id: primary(), title: text({ min: 1 }) }) {}
9
- *
10
- * new Post({ id, title }) // a real instance, data-typed
11
- * Post.pick('title') // a derived view, same static API
12
- * function publish(p: Post) // `Post` IS the data type
13
- * ```
14
- *
15
- * Data and schema metadata only — no business behaviour lives on an entity. The 2nd
16
- * argument carries what the entity states about itself: `unique` groups, and per-adapter
17
- * hints for what a neutral field cannot express.
18
- */
19
- export declare function entity<TFields extends Fields>(fields: TFields, declarations?: EntityDeclarations<TFields>): SchemaConstructor<TFields>;
1
+ import { type Fields } from './fields/Field.js';
2
+ import { type EntityDeclarations } from './EntityDeclarations.js';
3
+ import { type SchemaConstructor } from './schema/Schema.js';
4
+ export declare function entity<TFields extends Fields>(originalFields: TFields, { unique, adapters, previous }?: EntityDeclarations<TFields>): SchemaConstructor<TFields>;
20
5
  //# sourceMappingURL=entity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAU,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEnE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CAAC,OAAO,SAAS,MAAM,EAC3C,MAAM,EAAE,OAAO,EACf,YAAY,CAAC,EAAE,kBAAkB,CAAC,OAAO,CAAC,GACzC,iBAAiB,CAAC,OAAO,CAAC,CAM5B"}
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAU,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,wBAAgB,MAAM,CAAC,OAAO,SAAS,MAAM,EAC3C,cAAc,EAAE,OAAO,EACvB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAE,kBAAkB,CAAC,OAAO,CAAM,GAC/D,iBAAiB,CAAC,OAAO,CAAC,CAM5B"}
package/dist/entity.js CHANGED
@@ -1,41 +1,10 @@
1
- import { Field } from "./field/index.js";
2
- import { Judge } from './validation/index.js';
3
- import { projectUniqueOntoFields } from "./unique.js";
4
- import { Schema } from "./schema/index.js";
5
- /**
6
- * Define an entity — the factory that produces a schema-carrying class.
7
- *
8
- * ```ts
9
- * class Post extends entity({ id: primary(), title: text({ min: 1 }) }) {}
10
- *
11
- * new Post({ id, title }) // a real instance, data-typed
12
- * Post.pick('title') // a derived view, same static API
13
- * function publish(p: Post) // `Post` IS the data type
14
- * ```
15
- *
16
- * Data and schema metadata only — no business behaviour lives on an entity. The 2nd
17
- * argument carries what the entity states about itself: `unique` groups, and per-adapter
18
- * hints for what a neutral field cannot express.
19
- */
20
- export function entity(fields, declarations) {
21
- const own = {};
22
- for (const [key, field] of Object.entries(fields))
23
- own[key] = new Field(field, key);
24
- const projected = projectUniqueOntoFields(own, declarations?.unique);
25
- assertDefaultsAreValid(projected);
26
- return Schema.of(projected, undefined, declarations?.hints, {}, declarations?.unique);
27
- }
28
- function assertDefaultsAreValid(fields) {
29
- for (const [name, field] of Object.entries(fields)) {
30
- const create = field.lifecycle?.create;
31
- if (typeof create !== 'object' || create === null || !('value' in create))
32
- continue;
33
- const checked = Judge.value(field, create.value);
34
- if ('error' in checked) {
35
- throw new Error(`Field '${name}': the declared default ${JSON.stringify(create.value)} `
36
- + `is not a legal value for it — ${checked.error}. It would be written into every row `
37
- + `without passing the judge.`);
38
- }
39
- }
1
+ import { FieldSet } from './fields/FieldSet.js';
2
+ import { Schema } from './schema/Schema.js';
3
+ export function entity(originalFields, { unique, adapters, previous } = {}) {
4
+ return Schema.of({
5
+ fields: FieldSet.declared(originalFields, unique),
6
+ adapters,
7
+ previous,
8
+ });
40
9
  }
41
10
  //# sourceMappingURL=entity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAA2B,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,MAAM,EAA0B,MAAM,mBAAmB,CAAC;AAEnE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,MAAM,CACpB,MAAe,EACf,YAA0C;IAE1C,MAAM,GAAG,GAAG,EAA2B,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAc,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAChF,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAc;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC;QACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC;YAAE,SAAS;QAEpF,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAG,MAA6B,CAAC,KAAK,CAAC,CAAC;QACzE,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,UAAU,IAAI,2BAA2B,IAAI,CAAC,SAAS,CAAE,MAA6B,CAAC,KAAK,CAAC,GAAG;kBAC9F,iCAAiC,OAAO,CAAC,KAAK,uCAAuC;kBACrF,4BAA4B,CAC/B,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAA0B,MAAM,oBAAoB,CAAC;AAEpE,MAAM,UAAU,MAAM,CACpB,cAAuB,EACvB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAgC,EAAE;IAEhE,OAAO,MAAM,CAAC,EAAE,CAAC;QACf,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QACjD,QAAQ;QACR,QAAQ;KACT,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Shape } from "../axis/shape/Shape.js";
2
+ import { type RoleRules } from "../axis/role/Role.js";
3
+ import type { LifecycleRules } from "../axis/lifecycle/Lifecycle.js";
4
+ import type { BoundaryRef } from "../axis/boundary/Boundary.js";
5
+ import type { Meta } from "../axis/Meta.js";
6
+ import type { Axis } from "../axis/Axis.js";
7
+ export type Fields = Record<string, Field>;
8
+ /** A key of a field set — the name a declaration addresses a field by. */
9
+ export type FieldName<TFields extends Fields> = Extract<keyof TFields, string>;
10
+ /** The carrier, the three extension axes, the annotation — the five the judge reads. */
11
+ export type FieldDeclaration = Pick<Field, "shape" | Axis["slot"] | "meta">;
12
+ export declare class Field<T = unknown> {
13
+ readonly shape: Shape;
14
+ readonly role?: RoleRules;
15
+ readonly lifecycle?: LifecycleRules;
16
+ readonly boundary?: BoundaryRef;
17
+ readonly meta?: Meta;
18
+ readonly _type?: T;
19
+ constructor(init: FieldDeclaration, key?: string);
20
+ static is(value: unknown): value is Field;
21
+ with<U = T>(overrides: Partial<FieldDeclaration>): Field<U>;
22
+ rename(map: (key: string) => string | undefined): Field<T>;
23
+ }
24
+ //# sourceMappingURL=Field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/fields/Field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE3C,0EAA0E;AAC1E,MAAM,MAAM,SAAS,CAAC,OAAO,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,CAAC;AAE/E,wFAAwF;AACxF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAE5E,qBAAa,KAAK,CAAC,CAAC,GAAG,OAAO;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAErB,SAAiB,KAAK,CAAC,EAAE,CAAC,CAAC;IAE3B,YAAY,IAAI,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,EAyB/C;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAExC;IAED,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAE1D;IAED,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAgBzD;CACF"}
@@ -0,0 +1,52 @@
1
+ import { Role } from "../axis/role/Role.js";
2
+ import { FieldJudge } from "../judge/FieldJudge.js";
3
+ import { ValueJudge } from "../judge/ValueJudge.js";
4
+ export class Field {
5
+ shape;
6
+ role;
7
+ lifecycle;
8
+ boundary;
9
+ meta;
10
+ constructor(init, key) {
11
+ const verdict = FieldJudge.of(init).verdict;
12
+ if (!verdict.success) {
13
+ throw new Error(`${key ? `Field '${key}': ` : ""}` +
14
+ verdict.errors.map((e) => `${e.path}: ${e.message}`).join("; "));
15
+ }
16
+ this.shape = init.shape;
17
+ this.role = Role.resolvedOn(init.role, key);
18
+ this.lifecycle = init.lifecycle;
19
+ this.boundary = init.boundary;
20
+ this.meta = init.meta;
21
+ const create = this.lifecycle?.create;
22
+ if (typeof create === "object" && create !== null && "value" in create) {
23
+ const checked = ValueJudge.of(this).check(create.value);
24
+ if ("error" in checked)
25
+ throw new Error(`${key ? `Field '${key}': ` : ""}the declared default ${JSON.stringify(create.value)} ` +
26
+ `is not a legal value for it — ${checked.error}.`);
27
+ }
28
+ }
29
+ static is(value) {
30
+ return FieldJudge.of(value).verdict.success;
31
+ }
32
+ with(overrides) {
33
+ return new Field({ ...this, ...overrides });
34
+ }
35
+ rename(map) {
36
+ const rules = this.role?.rules;
37
+ if (!rules?.length)
38
+ return this;
39
+ const carried = rules
40
+ .map((group) => group.rename(map))
41
+ .filter((group) => group !== null);
42
+ const unchanged = carried.length === rules.length &&
43
+ carried.every((group, i) => group.equals(rules[i]));
44
+ if (unchanged)
45
+ return this;
46
+ const { rules: _dropped, ...rest } = this.role;
47
+ return this.with({
48
+ role: carried.length ? { ...rest, rules: carried } : rest,
49
+ });
50
+ }
51
+ }
52
+ //# sourceMappingURL=Field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Field.js","sourceRoot":"","sources":["../../src/fields/Field.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { CompositeUnique } from '../EntityDeclarations.js';
2
+ import { type FieldName, type Fields } from './Field.js';
3
+ export declare class FieldSet<TFields extends Fields = Fields> {
4
+ private readonly fields;
5
+ private constructor();
6
+ static of<TFields extends Fields>(fields: TFields): FieldSet<TFields>;
7
+ /**
8
+ * Every entry through the field door, then the groups declared over several of them.
9
+ * A group written here names its members; one written on a field named itself, and the
10
+ * key it sat under resolved it.
11
+ */
12
+ static declared<TFields extends Fields>(declared: TFields, unique?: CompositeUnique<TFields>): TFields;
13
+ /**
14
+ * The name of the field that carries `primary`, or `undefined` when none does.
15
+ *
16
+ * `Role.of(field).isPrimary` answers about ONE field; this answers about a shape, which
17
+ * is the question every reader actually had. It was the same three lines spelled five
18
+ * times — a mirror's key, a form's row identity, GraphQL's node id, the DDL's primary
19
+ * key and the ORM's `findById` column — so a shape with two primaries meant whichever
20
+ * one that loop happened to see first, five times over.
21
+ *
22
+ * The absence is answered and not defaulted: `'id'` is a fine fallback for a form and a
23
+ * lie for a DDL, so the caller decides.
24
+ */
25
+ get primary(): FieldName<TFields> | undefined;
26
+ get uniqueGroups(): CompositeUnique<TFields> | undefined;
27
+ }
28
+ //# sourceMappingURL=FieldSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldSet.d.ts","sourceRoot":"","sources":["../../src/fields/FieldSet.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAS,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEhE,qBAAa,QAAQ,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAA3C,OAAO,eAAiD;IAExD,MAAM,CAAC,EAAE,CAAC,OAAO,SAAS,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAEpE;IAED;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,SAAS,MAAM,EACpC,QAAQ,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAChC,OAAO,CAKT;IAED;;;;;;;;;;;OAWG;IACH,IAAI,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,SAAS,CAa5C;IAED,IAAI,YAAY,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAKvD;CACF"}
@@ -0,0 +1,55 @@
1
+ import { Role } from '../axis/role/Role.js';
2
+ import { FieldGroup } from '../constraint/FieldGroup.js';
3
+ import { Unique } from '../constraint/Unique.js';
4
+ import { Field } from './Field.js';
5
+ export class FieldSet {
6
+ fields;
7
+ constructor(fields) {
8
+ this.fields = fields;
9
+ }
10
+ static of(fields) {
11
+ return new FieldSet(fields);
12
+ }
13
+ /**
14
+ * Every entry through the field door, then the groups declared over several of them.
15
+ * A group written here names its members; one written on a field named itself, and the
16
+ * key it sat under resolved it.
17
+ */
18
+ static declared(declared, unique) {
19
+ let fields = {};
20
+ for (const [key, field] of Object.entries(declared))
21
+ fields[key] = new Field(field, key);
22
+ for (const group of unique ?? [])
23
+ fields = new Unique(group).onto(fields);
24
+ return fields;
25
+ }
26
+ /**
27
+ * The name of the field that carries `primary`, or `undefined` when none does.
28
+ *
29
+ * `Role.of(field).isPrimary` answers about ONE field; this answers about a shape, which
30
+ * is the question every reader actually had. It was the same three lines spelled five
31
+ * times — a mirror's key, a form's row identity, GraphQL's node id, the DDL's primary
32
+ * key and the ORM's `findById` column — so a shape with two primaries meant whichever
33
+ * one that loop happened to see first, five times over.
34
+ *
35
+ * The absence is answered and not defaulted: `'id'` is a fine fallback for a form and a
36
+ * lie for a DDL, so the caller decides.
37
+ */
38
+ get primary() {
39
+ const primaries = Object.entries(this.fields)
40
+ .filter(([, field]) => Role.of(field).isPrimary)
41
+ .map(([name]) => name);
42
+ if (primaries.length > 1) {
43
+ throw new Error(`FieldSet.primary: ${primaries.map((name) => JSON.stringify(name)).join(', ')} all declare ` +
44
+ '`primary`; a field set can have only one primary field.');
45
+ }
46
+ return primaries[0];
47
+ }
48
+ get uniqueGroups() {
49
+ const groups = FieldGroup.groupsOf(this.fields, Unique);
50
+ return groups.length
51
+ ? groups.map((group) => [...group.members])
52
+ : undefined;
53
+ }
54
+ }
55
+ //# sourceMappingURL=FieldSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldSet.js","sourceRoot":"","sources":["../../src/fields/FieldSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAA+B,MAAM,YAAY,CAAC;AAEhE,MAAM,OAAO,QAAQ;IACkB,MAAM;IAA3C,YAAqC,MAAe;sBAAf,MAAM;IAAY,CAAC;IAExD,MAAM,CAAC,EAAE,CAAyB,MAAe;QAC/C,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CACb,QAAiB,EACjB,MAAiC;QAEjC,IAAI,MAAM,GAAW,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACzF,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE;YAAE,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1E,OAAO,MAAiB,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,IAAI,OAAO;QACT,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;aAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;aAC/C,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAEzB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,qBAAqB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe;gBAC5F,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC,CAAC,CAAmC,CAAC;IACxD,CAAC;IAED,IAAI,YAAY;QACd,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,MAAM;YAClB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAwC;YAClF,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,38 +1,60 @@
1
- export { Field, type Fields, type Shape, type ShapeType, type StringFormat, type FormatPredicate, type Role, type Relation, type Lifecycle, type GeneratorRef, type Boundary, type BoundaryRef, type Decoder, type Encoder, type Meta, nullableShape, uniqueMembers, registerGenerator, resolveCustomGenerator, resolveBoundary, boundaryOf, Anatomy, Formats, Boundaries, type EntityConstructor, } from "./field/index.js";
2
- export { compose, Schema, ANONYMOUS_SCHEMA_NAME, type SchemaConstructor, type SchemaView, type Row, type PartialRow, } from "./schema/index.js";
3
- export { type FougereHints, type Hints } from "./hints.js";
4
- export { type CompositeUnique, type EntityDeclarations } from "./unique.js";
5
- export { primary } from "./vocabulary/primary.js";
6
- export { text, type TextOptions } from "./vocabulary/text.js";
7
- export { email } from "./vocabulary/email.js";
8
- export { url } from "./vocabulary/url.js";
9
- export { list, type ListOptions } from "./vocabulary/list.js";
10
- export { number } from "./vocabulary/number.js";
11
- export { bool } from "./vocabulary/bool.js";
12
- export { date } from "./vocabulary/date.js";
13
- export { created } from "./vocabulary/created.js";
14
- export { updated } from "./vocabulary/updated.js";
15
- export { oneOf } from "./vocabulary/oneOf.js";
16
- export { ref } from "./vocabulary/ref.js";
17
- export { many } from "./vocabulary/many.js";
18
- export { optional } from "./vocabulary/optional.js";
19
- export { nullable } from "./vocabulary/nullable.js";
20
- export { immutable } from "./vocabulary/immutable.js";
21
- export { unique } from "./vocabulary/unique.js";
22
- export { indexed } from "./vocabulary/indexed.js";
23
- export { readOnly } from "./vocabulary/readOnly.js";
24
- export { writeOnly } from "./vocabulary/writeOnly.js";
25
- export { json } from "./vocabulary/json.js";
26
- export { applyCreate, applyUpdate } from "./projections/lifecycle.js";
27
- export { encodeFields } from "./projections/encode.js";
28
- export { inputFields, outputFields } from "./projections/io.js";
29
- export { registrationKeyOf } from "./name.js";
30
- export { describe, describeSet, sourceNameOf } from "./projections/describe.js";
31
- export { reconstruct, reconstructSet } from "./projections/reconstruct.js";
32
- export { entitySourceOf, facadeTypeSourceOf, type TypeSourceOptions, type OpDescriptor, } from "./projections/typescript.js";
33
- export { type SchemaBundle, type SchemaDescriptor, type FieldDescriptor, type FieldExtension, type RoleDescriptor, type RelationDescriptor, } from "./projections/card.js";
34
- export { type SchemaSource, schemaOf, fieldsOf, } from "./projections/source.js";
35
- export type { StandardSchemaV1 } from "./projections/standard.js";
36
- export { entity } from "./entity.js";
37
- export { Judge, type ValidateOptions, type ValidationError, type ValidationResult, type Checked } from "./validation/index.js";
1
+ export { Field, type Fields } from './fields/Field.js';
2
+ export { FieldSet } from './fields/FieldSet.js';
3
+ export { type Shape, Anatomy } from './axis/shape/Shape.js';
4
+ export { type StringFormat, type FormatPredicate, Formats } from './axis/shape/Formats.js';
5
+ export { Role, type RoleRules } from './axis/role/Role.js';
6
+ export { type Relation, type EntityConstructor } from './axis/role/Relation.js';
7
+ export { Lifecycle, type LifecycleRules } from './axis/lifecycle/Lifecycle.js';
8
+ export { type GeneratorRef, Generators } from './axis/lifecycle/Generators.js';
9
+ export { Clock } from './axis/lifecycle/Clock.js';
10
+ export { Boundary, type BoundaryRules, type BoundaryRef } from './axis/boundary/Boundary.js';
11
+ export { type Decoder, type Encoder, Boundaries } from './axis/boundary/Boundaries.js';
12
+ export { type Meta } from './axis/Meta.js';
13
+ export { FieldGroup } from './constraint/FieldGroup.js';
14
+ export { Unique } from './constraint/Unique.js';
15
+ export { Schema, ANONYMOUS_SCHEMA_NAME, type SchemaConstructor } from './schema/Schema.js';
16
+ export { SchemaDerivation } from './schema/SchemaDerivation.js';
17
+ export { isObject } from './judge/ValueForm.js';
18
+ export { Cases, type Case } from './judge/Cases.js';
19
+ export { RowRefusal } from './judge/RowRefusal.js';
20
+ export { type SchemaView, type Row, type PartialRow } from './schema/SchemaView.js';
21
+ export { type FougereEntityAdapters, type EntityAdapters } from './EntityAdapters.js';
22
+ export { lowerFirst, upperFirst } from './utils.js';
23
+ export { primary } from './vocabulary/primary.js';
24
+ export { text } from './vocabulary/text.js';
25
+ export { email } from './vocabulary/email.js';
26
+ export { url } from './vocabulary/url.js';
27
+ export { list } from './vocabulary/list.js';
28
+ export { number } from './vocabulary/number.js';
29
+ export { bool } from './vocabulary/bool.js';
30
+ export { date } from './vocabulary/date.js';
31
+ export { created } from './vocabulary/created.js';
32
+ export { updated } from './vocabulary/updated.js';
33
+ export { oneOf } from './vocabulary/oneOf.js';
34
+ export { ref } from './vocabulary/ref.js';
35
+ export { many } from './vocabulary/many.js';
36
+ export { optional } from './vocabulary/optional.js';
37
+ export { nullable } from './vocabulary/nullable.js';
38
+ export { immutable } from './vocabulary/immutable.js';
39
+ export { unique } from './vocabulary/unique.js';
40
+ export { indexed } from './vocabulary/indexed.js';
41
+ export { readOnly } from './vocabulary/readOnly.js';
42
+ export { writeOnly } from './vocabulary/writeOnly.js';
43
+ export { json } from './vocabulary/json.js';
44
+ export { applyCreate, applyUpdate } from './axis/lifecycle/apply.js';
45
+ export { Visibility } from './projection/Visibility.js';
46
+ export { Card } from './card/Card.js';
47
+ export { Bundle } from './card/Bundle.js';
48
+ export type { Change, Diff, DiffOptions, SetDiff, SetDiffOptions, RenameCandidate, TypeSet } from './card/diff.js';
49
+ export { EntityTypeSource, type EntityTypeSourceOptions } from './card/EntityTypeSource.js';
50
+ export { FacadeTypeSource, type FacadeTypeSourceOptions, type OpDescriptor } from './card/FacadeTypeSource.js';
51
+ export { type SchemaBundle, type SchemaDescriptor, type FieldDescriptor, type FieldExtension, type RoleDescriptor, type RelationDescriptor } from './card/Descriptor.js';
52
+ export { type SchemaOrCard, schemaOf, fieldsOf } from './projection/SchemaOrCard.js';
53
+ export type { StandardSchemaV1 } from './projection/standard.js';
54
+ export { entity } from './entity.js';
55
+ export { FieldJudge } from './judge/FieldJudge.js';
56
+ export { ValueJudge } from './judge/ValueJudge.js';
57
+ export { RowJudge } from './judge/RowJudge.js';
58
+ export { type ValidateOptions } from './judge/options.js';
59
+ export { type ValidationError, type ValidationResult, type Checked } from './judge/result.js';
38
60
  //# sourceMappingURL=index.d.ts.map