@fougere/schema 0.3.0-alpha.0 → 0.5.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 (335) hide show
  1. package/README.md +1 -1
  2. package/dist/EntityAdapters.d.ts +28 -0
  3. package/dist/EntityAdapters.d.ts.map +1 -0
  4. package/dist/EntityAdapters.js +75 -0
  5. package/dist/EntityAdapters.js.map +1 -0
  6. package/dist/EntityDeclarations.d.ts +7 -14
  7. package/dist/EntityDeclarations.d.ts.map +1 -1
  8. package/dist/EntityDeclarations.js +1 -18
  9. package/dist/EntityDeclarations.js.map +1 -1
  10. package/dist/axis/Axis.d.ts +2 -0
  11. package/dist/axis/Axis.d.ts.map +1 -1
  12. package/dist/axis/Axis.js +5 -3
  13. package/dist/axis/Axis.js.map +1 -1
  14. package/dist/axis/boundary/Boundary.d.ts +1 -1
  15. package/dist/axis/boundary/Boundary.d.ts.map +1 -1
  16. package/dist/axis/boundary/{axis.d.ts → BoundaryAxis.d.ts} +1 -1
  17. package/dist/axis/boundary/BoundaryAxis.d.ts.map +1 -0
  18. package/dist/axis/boundary/{axis.js → BoundaryAxis.js} +3 -2
  19. package/dist/axis/boundary/BoundaryAxis.js.map +1 -0
  20. package/dist/axis/lifecycle/Clock.d.ts +18 -0
  21. package/dist/axis/lifecycle/Clock.d.ts.map +1 -0
  22. package/dist/axis/lifecycle/Clock.js +25 -0
  23. package/dist/axis/lifecycle/Clock.js.map +1 -0
  24. package/dist/axis/lifecycle/Generators.d.ts +16 -2
  25. package/dist/axis/lifecycle/Generators.d.ts.map +1 -1
  26. package/dist/axis/lifecycle/Generators.js +35 -5
  27. package/dist/axis/lifecycle/Generators.js.map +1 -1
  28. package/dist/axis/lifecycle/{axis.d.ts → LifecycleAxis.d.ts} +1 -1
  29. package/dist/axis/lifecycle/LifecycleAxis.d.ts.map +1 -0
  30. package/dist/axis/lifecycle/{axis.js → LifecycleAxis.js} +3 -2
  31. package/dist/axis/lifecycle/LifecycleAxis.js.map +1 -0
  32. package/dist/axis/lifecycle/apply.d.ts +1 -3
  33. package/dist/axis/lifecycle/apply.d.ts.map +1 -1
  34. package/dist/axis/lifecycle/apply.js +5 -43
  35. package/dist/axis/lifecycle/apply.js.map +1 -1
  36. package/dist/axis/role/Relation.d.ts +11 -1
  37. package/dist/axis/role/Relation.d.ts.map +1 -1
  38. package/dist/axis/role/Relation.js +18 -3
  39. package/dist/axis/role/Relation.js.map +1 -1
  40. package/dist/axis/role/Role.d.ts +5 -17
  41. package/dist/axis/role/Role.d.ts.map +1 -1
  42. package/dist/axis/role/Role.js +9 -19
  43. package/dist/axis/role/Role.js.map +1 -1
  44. package/dist/axis/role/{axis.d.ts → RoleAxis.d.ts} +1 -1
  45. package/dist/axis/role/RoleAxis.d.ts.map +1 -0
  46. package/dist/axis/role/{axis.js → RoleAxis.js} +5 -4
  47. package/dist/axis/role/RoleAxis.js.map +1 -0
  48. package/dist/card/Bundle.d.ts +15 -0
  49. package/dist/card/Bundle.d.ts.map +1 -0
  50. package/dist/card/Bundle.js +67 -0
  51. package/dist/card/Bundle.js.map +1 -0
  52. package/dist/card/Card.d.ts +27 -0
  53. package/dist/card/Card.d.ts.map +1 -0
  54. package/dist/card/Card.js +230 -0
  55. package/dist/card/Card.js.map +1 -0
  56. package/dist/card/EntityTypeSource.d.ts +12 -0
  57. package/dist/card/EntityTypeSource.d.ts.map +1 -0
  58. package/dist/card/{typescript.js → EntityTypeSource.js} +20 -35
  59. package/dist/card/EntityTypeSource.js.map +1 -0
  60. package/dist/card/FacadeTypeSource.d.ts +19 -0
  61. package/dist/card/FacadeTypeSource.d.ts.map +1 -0
  62. package/dist/card/FacadeTypeSource.js +40 -0
  63. package/dist/card/FacadeTypeSource.js.map +1 -0
  64. package/dist/{judge/form.d.ts → card/admission.d.ts} +2 -4
  65. package/dist/card/admission.d.ts.map +1 -0
  66. package/dist/{judge/form.js → card/admission.js} +1 -3
  67. package/dist/card/admission.js.map +1 -0
  68. package/dist/card/diff.d.ts +11 -55
  69. package/dist/card/diff.d.ts.map +1 -1
  70. package/dist/card/diff.js +1 -122
  71. package/dist/card/diff.js.map +1 -1
  72. package/dist/constraint/FieldGroup.d.ts +2 -2
  73. package/dist/constraint/FieldGroup.d.ts.map +1 -1
  74. package/dist/constraint/FieldGroup.js.map +1 -1
  75. package/dist/entity.d.ts +3 -3
  76. package/dist/entity.d.ts.map +1 -1
  77. package/dist/entity.js +3 -13
  78. package/dist/entity.js.map +1 -1
  79. package/dist/fields/Field.d.ts +24 -0
  80. package/dist/fields/Field.d.ts.map +1 -0
  81. package/dist/{Field.js → fields/Field.js} +17 -15
  82. package/dist/fields/Field.js.map +1 -0
  83. package/dist/fields/FieldSet.d.ts +28 -0
  84. package/dist/fields/FieldSet.d.ts.map +1 -0
  85. package/dist/fields/FieldSet.js +55 -0
  86. package/dist/fields/FieldSet.js.map +1 -0
  87. package/dist/index.d.ts +24 -18
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +21 -17
  90. package/dist/index.js.map +1 -1
  91. package/dist/judge/{cases.d.ts → Cases.d.ts} +22 -22
  92. package/dist/judge/Cases.d.ts.map +1 -0
  93. package/dist/judge/{cases.js → Cases.js} +35 -27
  94. package/dist/judge/Cases.js.map +1 -0
  95. package/dist/judge/FieldJudge.d.ts +9 -0
  96. package/dist/judge/FieldJudge.d.ts.map +1 -0
  97. package/dist/judge/FieldJudge.js +54 -0
  98. package/dist/judge/FieldJudge.js.map +1 -0
  99. package/dist/judge/RowJudge.d.ts +12 -0
  100. package/dist/judge/RowJudge.d.ts.map +1 -0
  101. package/dist/judge/RowJudge.js +81 -0
  102. package/dist/judge/RowJudge.js.map +1 -0
  103. package/dist/judge/RowRefusal.d.ts +17 -0
  104. package/dist/judge/RowRefusal.d.ts.map +1 -0
  105. package/dist/judge/RowRefusal.js +16 -0
  106. package/dist/judge/RowRefusal.js.map +1 -0
  107. package/dist/judge/ValueForm.d.ts +3 -0
  108. package/dist/judge/ValueForm.d.ts.map +1 -0
  109. package/dist/judge/ValueForm.js +3 -0
  110. package/dist/judge/ValueForm.js.map +1 -0
  111. package/dist/judge/ValueJudge.d.ts +12 -0
  112. package/dist/judge/ValueJudge.d.ts.map +1 -0
  113. package/dist/judge/ValueJudge.js +60 -0
  114. package/dist/judge/ValueJudge.js.map +1 -0
  115. package/dist/projection/SchemaOrCard.d.ts +7 -0
  116. package/dist/projection/SchemaOrCard.d.ts.map +1 -0
  117. package/dist/projection/{source.js → SchemaOrCard.js} +3 -3
  118. package/dist/projection/SchemaOrCard.js.map +1 -0
  119. package/dist/projection/Visibility.d.ts +10 -0
  120. package/dist/projection/Visibility.d.ts.map +1 -0
  121. package/dist/projection/Visibility.js +55 -0
  122. package/dist/projection/Visibility.js.map +1 -0
  123. package/dist/projection/standard.d.ts +11 -32
  124. package/dist/projection/standard.d.ts.map +1 -1
  125. package/dist/schema/Schema.d.ts +80 -0
  126. package/dist/schema/Schema.d.ts.map +1 -0
  127. package/dist/{Schema.js → schema/Schema.js} +46 -48
  128. package/dist/schema/Schema.js.map +1 -0
  129. package/dist/schema/SchemaDefinition.d.ts +60 -0
  130. package/dist/schema/SchemaDefinition.d.ts.map +1 -0
  131. package/dist/schema/SchemaDefinition.js +85 -0
  132. package/dist/schema/SchemaDefinition.js.map +1 -0
  133. package/dist/schema/SchemaDerivation.d.ts +34 -0
  134. package/dist/schema/SchemaDerivation.d.ts.map +1 -0
  135. package/dist/schema/SchemaDerivation.js +46 -0
  136. package/dist/schema/SchemaDerivation.js.map +1 -0
  137. package/dist/schema/SchemaView.d.ts +25 -0
  138. package/dist/schema/SchemaView.d.ts.map +1 -0
  139. package/dist/{SchemaView.js.map → schema/SchemaView.js.map} +1 -1
  140. package/dist/utils.d.ts +4 -0
  141. package/dist/utils.d.ts.map +1 -0
  142. package/dist/utils.js +13 -0
  143. package/dist/utils.js.map +1 -0
  144. package/dist/vocabulary/bool.d.ts +1 -1
  145. package/dist/vocabulary/bool.d.ts.map +1 -1
  146. package/dist/vocabulary/bool.js +1 -1
  147. package/dist/vocabulary/bool.js.map +1 -1
  148. package/dist/vocabulary/created.d.ts +1 -1
  149. package/dist/vocabulary/created.d.ts.map +1 -1
  150. package/dist/vocabulary/date.d.ts +1 -1
  151. package/dist/vocabulary/date.d.ts.map +1 -1
  152. package/dist/vocabulary/date.js +1 -1
  153. package/dist/vocabulary/date.js.map +1 -1
  154. package/dist/vocabulary/email.d.ts +1 -1
  155. package/dist/vocabulary/email.d.ts.map +1 -1
  156. package/dist/vocabulary/immutable.d.ts +1 -1
  157. package/dist/vocabulary/immutable.d.ts.map +1 -1
  158. package/dist/vocabulary/indexed.d.ts +1 -1
  159. package/dist/vocabulary/indexed.d.ts.map +1 -1
  160. package/dist/vocabulary/json.d.ts +2 -2
  161. package/dist/vocabulary/json.d.ts.map +1 -1
  162. package/dist/vocabulary/json.js +6 -4
  163. package/dist/vocabulary/json.js.map +1 -1
  164. package/dist/vocabulary/list.d.ts +1 -1
  165. package/dist/vocabulary/list.d.ts.map +1 -1
  166. package/dist/vocabulary/list.js +1 -1
  167. package/dist/vocabulary/list.js.map +1 -1
  168. package/dist/vocabulary/many.d.ts +1 -1
  169. package/dist/vocabulary/many.d.ts.map +1 -1
  170. package/dist/vocabulary/many.js +3 -3
  171. package/dist/vocabulary/many.js.map +1 -1
  172. package/dist/vocabulary/nullable.d.ts +1 -1
  173. package/dist/vocabulary/nullable.d.ts.map +1 -1
  174. package/dist/vocabulary/number.d.ts +1 -1
  175. package/dist/vocabulary/number.d.ts.map +1 -1
  176. package/dist/vocabulary/number.js +1 -1
  177. package/dist/vocabulary/number.js.map +1 -1
  178. package/dist/vocabulary/oneOf.d.ts +1 -1
  179. package/dist/vocabulary/oneOf.d.ts.map +1 -1
  180. package/dist/vocabulary/oneOf.js +1 -1
  181. package/dist/vocabulary/oneOf.js.map +1 -1
  182. package/dist/vocabulary/optional.d.ts +1 -1
  183. package/dist/vocabulary/optional.d.ts.map +1 -1
  184. package/dist/vocabulary/primary.d.ts +1 -1
  185. package/dist/vocabulary/primary.d.ts.map +1 -1
  186. package/dist/vocabulary/primary.js +4 -5
  187. package/dist/vocabulary/primary.js.map +1 -1
  188. package/dist/vocabulary/readOnly.d.ts +1 -1
  189. package/dist/vocabulary/readOnly.d.ts.map +1 -1
  190. package/dist/vocabulary/ref.d.ts +1 -1
  191. package/dist/vocabulary/ref.d.ts.map +1 -1
  192. package/dist/vocabulary/ref.js +3 -9
  193. package/dist/vocabulary/ref.js.map +1 -1
  194. package/dist/vocabulary/text.d.ts +1 -1
  195. package/dist/vocabulary/text.d.ts.map +1 -1
  196. package/dist/vocabulary/text.js +1 -1
  197. package/dist/vocabulary/text.js.map +1 -1
  198. package/dist/vocabulary/unique.d.ts +1 -1
  199. package/dist/vocabulary/unique.d.ts.map +1 -1
  200. package/dist/vocabulary/updated.d.ts +1 -1
  201. package/dist/vocabulary/updated.d.ts.map +1 -1
  202. package/dist/vocabulary/url.d.ts +1 -1
  203. package/dist/vocabulary/url.d.ts.map +1 -1
  204. package/dist/vocabulary/vocabulary.d.ts +2 -3
  205. package/dist/vocabulary/vocabulary.d.ts.map +1 -1
  206. package/dist/vocabulary/vocabulary.js +4 -4
  207. package/dist/vocabulary/vocabulary.js.map +1 -1
  208. package/dist/vocabulary/writeOnly.d.ts +1 -1
  209. package/dist/vocabulary/writeOnly.d.ts.map +1 -1
  210. package/package.json +9 -4
  211. package/src/EntityAdapters.ts +100 -0
  212. package/src/EntityDeclarations.ts +19 -0
  213. package/src/axis/Axis.ts +25 -0
  214. package/src/axis/Meta.ts +3 -0
  215. package/src/axis/boundary/Boundaries.ts +44 -0
  216. package/src/axis/boundary/Boundary.ts +69 -0
  217. package/src/axis/boundary/BoundaryAxis.ts +32 -0
  218. package/src/axis/lifecycle/Clock.ts +26 -0
  219. package/src/axis/lifecycle/Generators.ts +46 -0
  220. package/src/axis/lifecycle/Lifecycle.ts +53 -0
  221. package/src/axis/lifecycle/LifecycleAxis.ts +49 -0
  222. package/src/axis/lifecycle/apply.ts +38 -0
  223. package/src/axis/role/Relation.ts +31 -0
  224. package/src/axis/role/Role.ts +56 -0
  225. package/src/axis/role/RoleAxis.ts +115 -0
  226. package/src/axis/shape/Formats.ts +22 -0
  227. package/src/axis/shape/Shape.ts +91 -0
  228. package/src/card/Bundle.ts +80 -0
  229. package/src/card/Card.ts +256 -0
  230. package/src/card/Descriptor.ts +68 -0
  231. package/src/card/EntityTypeSource.ts +90 -0
  232. package/src/card/FacadeTypeSource.ts +55 -0
  233. package/src/card/admission.ts +25 -0
  234. package/src/card/diff.ts +56 -0
  235. package/src/constraint/FieldGroup.ts +91 -0
  236. package/src/constraint/Unique.ts +3 -0
  237. package/src/entity.ts +10 -0
  238. package/src/fields/Field.ts +80 -0
  239. package/src/fields/FieldSet.ts +62 -0
  240. package/src/index.ts +69 -0
  241. package/src/judge/Cases.ts +139 -0
  242. package/src/judge/FieldJudge.ts +61 -0
  243. package/src/judge/RowJudge.ts +84 -0
  244. package/src/judge/RowRefusal.ts +17 -0
  245. package/src/judge/ValueForm.ts +7 -0
  246. package/src/judge/ValueJudge.ts +72 -0
  247. package/src/judge/options.ts +3 -0
  248. package/src/judge/result.ts +10 -0
  249. package/src/projection/SchemaOrCard.ts +18 -0
  250. package/src/projection/Visibility.ts +47 -0
  251. package/src/projection/standard.ts +11 -0
  252. package/src/schema/Schema.ts +197 -0
  253. package/src/schema/SchemaDefinition.ts +120 -0
  254. package/src/schema/SchemaDerivation.ts +57 -0
  255. package/src/schema/SchemaView.ts +27 -0
  256. package/src/utils.ts +13 -0
  257. package/src/vocabulary/bool.ts +9 -0
  258. package/src/vocabulary/created.ts +8 -0
  259. package/src/vocabulary/date.ts +5 -0
  260. package/src/vocabulary/email.ts +6 -0
  261. package/src/vocabulary/immutable.ts +6 -0
  262. package/src/vocabulary/indexed.ts +4 -0
  263. package/src/vocabulary/json.ts +22 -0
  264. package/src/vocabulary/list.ts +13 -0
  265. package/src/vocabulary/many.ts +9 -0
  266. package/src/vocabulary/nullable.ts +7 -0
  267. package/src/vocabulary/number.ts +17 -0
  268. package/src/vocabulary/oneOf.ts +24 -0
  269. package/src/vocabulary/optional.ts +8 -0
  270. package/src/vocabulary/primary.ts +33 -0
  271. package/src/vocabulary/readOnly.ts +7 -0
  272. package/src/vocabulary/ref.ts +13 -0
  273. package/src/vocabulary/text.ts +19 -0
  274. package/src/vocabulary/unique.ts +10 -0
  275. package/src/vocabulary/updated.ts +7 -0
  276. package/src/vocabulary/url.ts +6 -0
  277. package/src/vocabulary/vocabulary.ts +40 -0
  278. package/src/vocabulary/writeOnly.ts +7 -0
  279. package/dist/Field.d.ts +0 -21
  280. package/dist/Field.d.ts.map +0 -1
  281. package/dist/Field.js.map +0 -1
  282. package/dist/Schema.d.ts +0 -67
  283. package/dist/Schema.d.ts.map +0 -1
  284. package/dist/Schema.js.map +0 -1
  285. package/dist/SchemaView.d.ts +0 -18
  286. package/dist/SchemaView.d.ts.map +0 -1
  287. package/dist/axis/boundary/axis.d.ts.map +0 -1
  288. package/dist/axis/boundary/axis.js.map +0 -1
  289. package/dist/axis/lifecycle/axis.d.ts.map +0 -1
  290. package/dist/axis/lifecycle/axis.js.map +0 -1
  291. package/dist/axis/role/axis.d.ts.map +0 -1
  292. package/dist/axis/role/axis.js.map +0 -1
  293. package/dist/card/describe.d.ts +0 -12
  294. package/dist/card/describe.d.ts.map +0 -1
  295. package/dist/card/describe.js +0 -83
  296. package/dist/card/describe.js.map +0 -1
  297. package/dist/card/reconstruct.d.ts +0 -11
  298. package/dist/card/reconstruct.d.ts.map +0 -1
  299. package/dist/card/reconstruct.js +0 -83
  300. package/dist/card/reconstruct.js.map +0 -1
  301. package/dist/card/typescript.d.ts +0 -17
  302. package/dist/card/typescript.d.ts.map +0 -1
  303. package/dist/card/typescript.js.map +0 -1
  304. package/dist/clean.d.ts +0 -2
  305. package/dist/clean.d.ts.map +0 -1
  306. package/dist/clean.js +0 -7
  307. package/dist/clean.js.map +0 -1
  308. package/dist/judge/Judge.d.ts +0 -14
  309. package/dist/judge/Judge.d.ts.map +0 -1
  310. package/dist/judge/Judge.js +0 -161
  311. package/dist/judge/Judge.js.map +0 -1
  312. package/dist/judge/cases.d.ts.map +0 -1
  313. package/dist/judge/cases.js.map +0 -1
  314. package/dist/judge/form.d.ts.map +0 -1
  315. package/dist/judge/form.js.map +0 -1
  316. package/dist/name.d.ts +0 -3
  317. package/dist/name.d.ts.map +0 -1
  318. package/dist/name.js +0 -7
  319. package/dist/name.js.map +0 -1
  320. package/dist/projection/encode.d.ts +0 -3
  321. package/dist/projection/encode.d.ts.map +0 -1
  322. package/dist/projection/encode.js +0 -19
  323. package/dist/projection/encode.js.map +0 -1
  324. package/dist/projection/io.d.ts +0 -4
  325. package/dist/projection/io.d.ts.map +0 -1
  326. package/dist/projection/io.js +0 -29
  327. package/dist/projection/io.js.map +0 -1
  328. package/dist/projection/source.d.ts +0 -7
  329. package/dist/projection/source.d.ts.map +0 -1
  330. package/dist/projection/source.js.map +0 -1
  331. package/dist/same.d.ts +0 -6
  332. package/dist/same.d.ts.map +0 -1
  333. package/dist/same.js +0 -35
  334. package/dist/same.js.map +0 -1
  335. /package/dist/{SchemaView.js → schema/SchemaView.js} +0 -0
package/README.md CHANGED
@@ -52,4 +52,4 @@ pnpm add @fougere/schema
52
52
 
53
53
  Part of [Fougere](https://github.com/chok/fougere) — one schema, a gradient from
54
54
  monolith to distributed, the same user code.
55
- Reference documentation: [the site](https://chok.github.io/fougere/) (en/fr).
55
+ Reference documentation: [the site](https://fougere.dev/) (en/fr).
@@ -0,0 +1,28 @@
1
+ import type { FieldName, Fields } from './fields/Field.js';
2
+ export interface FougereEntityAdapters<K extends string> {
3
+ }
4
+ export type EntityAdapters<TFields extends Fields> = Readonly<Partial<FougereEntityAdapters<FieldName<TFields>>>>;
5
+ /**
6
+ * What one schema states per adapter: an adapter name, a field name, then that adapter's own value.
7
+ */
8
+ export declare class EntityAdapterSet {
9
+ private readonly byAdapter;
10
+ private constructor();
11
+ static of(declared: EntityAdapters<Fields> | undefined): EntityAdapterSet | undefined;
12
+ /** Several schemas folded into one set; a later source wins, per adapter and per field. */
13
+ static merged(sources: readonly (EntityAdapters<Fields> | undefined)[]): EntityAdapterSet | undefined;
14
+ /** Every field name these entries address — what a caller checks against its own shape. */
15
+ get fieldNames(): string[];
16
+ /** The plain object, which is what a reader outside this package receives. */
17
+ get stated(): EntityAdapters<Fields>;
18
+ /**
19
+ * The entries whose field survives a cut, re-addressed by that field's new name.
20
+ *
21
+ * The adapter name is not a field and does not move; only the level below it does. An
22
+ * entry left on the old name is not an error anywhere downstream — `adapter/sql` looks
23
+ * it up by the field it is iterating and simply finds nothing.
24
+ */
25
+ cut(survives: (key: string) => string | undefined): EntityAdapterSet | undefined;
26
+ private static made;
27
+ }
28
+ //# sourceMappingURL=EntityAdapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityAdapters.d.ts","sourceRoot":"","sources":["../src/EntityAdapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3D,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,MAAM;CAAI;AAE3D,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAOlH;;GAEG;AACH,qBAAa,gBAAgB;IACP,OAAO,CAAC,QAAQ,CAAC,SAAS;IAA9C,OAAO,eAA2D;IAElE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAyBpF;IAED,2FAA2F;IAC3F,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,gBAAgB,GAAG,SAAS,CAapG;IAED,2FAA2F;IAC3F,IAAI,UAAU,IAAI,MAAM,EAAE,CAEzB;IAED,8EAA8E;IAC9E,IAAI,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAEnC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAe/E;IAED,OAAO,CAAC,MAAM,CAAC,IAAI;CAGpB"}
@@ -0,0 +1,75 @@
1
+ import { isObject } from './judge/ValueForm.js';
2
+ /**
3
+ * What one schema states per adapter: an adapter name, a field name, then that adapter's own value.
4
+ */
5
+ export class EntityAdapterSet {
6
+ byAdapter;
7
+ constructor(byAdapter) {
8
+ this.byAdapter = byAdapter;
9
+ }
10
+ static of(declared) {
11
+ if (declared === undefined)
12
+ return undefined;
13
+ if (!isObject(declared)) {
14
+ throw new Error(`adapters: expected an object keyed by adapter name, got ${typeof declared}.`);
15
+ }
16
+ const byAdapter = {};
17
+ for (const [adapter, perField] of Object.entries(declared)) {
18
+ if (perField === undefined)
19
+ continue;
20
+ if (!isObject(perField)) {
21
+ throw new Error(`adapters.${adapter}: expected an object keyed by field name, got ${typeof perField}. ` +
22
+ `What an adapter is handed is addressed by the field it applies to.`);
23
+ }
24
+ if (Object.keys(perField).length)
25
+ byAdapter[adapter] = perField;
26
+ }
27
+ return EntityAdapterSet.made(byAdapter);
28
+ }
29
+ /** Several schemas folded into one set; a later source wins, per adapter and per field. */
30
+ static merged(sources) {
31
+ const out = {};
32
+ for (const source of sources) {
33
+ const set = EntityAdapterSet.of(source);
34
+ if (!set)
35
+ continue;
36
+ for (const [adapter, perField] of Object.entries(set.byAdapter)) {
37
+ out[adapter] = { ...out[adapter], ...perField };
38
+ }
39
+ }
40
+ return EntityAdapterSet.made(out);
41
+ }
42
+ /** Every field name these entries address — what a caller checks against its own shape. */
43
+ get fieldNames() {
44
+ return [...new Set(Object.values(this.byAdapter).flatMap((perField) => Object.keys(perField)))];
45
+ }
46
+ /** The plain object, which is what a reader outside this package receives. */
47
+ get stated() {
48
+ return this.byAdapter;
49
+ }
50
+ /**
51
+ * The entries whose field survives a cut, re-addressed by that field's new name.
52
+ *
53
+ * The adapter name is not a field and does not move; only the level below it does. An
54
+ * entry left on the old name is not an error anywhere downstream — `adapter/sql` looks
55
+ * it up by the field it is iterating and simply finds nothing.
56
+ */
57
+ cut(survives) {
58
+ const out = {};
59
+ for (const [adapter, perField] of Object.entries(this.byAdapter)) {
60
+ const mapped = {};
61
+ for (const [key, entry] of Object.entries(perField)) {
62
+ const next = survives(key);
63
+ if (next !== undefined)
64
+ mapped[next] = entry;
65
+ }
66
+ if (Object.keys(mapped).length)
67
+ out[adapter] = mapped;
68
+ }
69
+ return EntityAdapterSet.made(out);
70
+ }
71
+ static made(byAdapter) {
72
+ return Object.keys(byAdapter).length ? new EntityAdapterSet(byAdapter) : undefined;
73
+ }
74
+ }
75
+ //# sourceMappingURL=EntityAdapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityAdapters.js","sourceRoot":"","sources":["../src/EntityAdapters.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,15 @@
1
- import type { Fields } from './Field.js';
2
- export type CompositeUnique<TFields extends Fields> = ReadonlyArray<ReadonlyArray<Extract<keyof TFields, string>>>;
1
+ import type { FieldName, Fields } from './fields/Field.js';
2
+ import type { EntityAdapters } from './EntityAdapters.js';
3
+ export type CompositeUnique<TFields extends Fields> = readonly (readonly FieldName<TFields>[])[];
4
+ /** New name to old name: the field states what it WAS, which is how a human writes it. */
5
+ export type PreviousNames<TFields extends Fields> = Readonly<Partial<Record<FieldName<TFields>, string>>>;
3
6
  export interface EntityDeclarations<TFields extends Fields> {
4
7
  unique?: CompositeUnique<TFields>;
5
- hints?: Hints<TFields>;
8
+ adapters?: EntityAdapters<TFields>;
6
9
  /**
7
10
  * What a field used to be called — read by `fougere freeze` and by nothing else.
8
11
  * It answers the one question two shapes cannot, and is meant to be deleted after.
9
12
  */
10
- previous?: Previous<TFields>;
11
- }
12
- /** New name to old name: the field states what it WAS, which is how a human writes it. */
13
- export type Previous<TFields extends Fields> = {
14
- readonly [K in Extract<keyof TFields, string>]?: string;
15
- };
16
- export interface FougereHints<K extends string> {
13
+ previous?: PreviousNames<TFields>;
17
14
  }
18
- export type Hints<TFields extends Fields> = {
19
- [A in keyof FougereHints<Extract<keyof TFields, string>>]?: FougereHints<Extract<keyof TFields, string>>[A];
20
- };
21
- export declare function deriveHints(hints: Hints<Fields> | undefined, transform: (key: string) => string | undefined): Hints<Fields> | undefined;
22
15
  //# sourceMappingURL=EntityDeclarations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDeclarations.d.ts","sourceRoot":"","sources":["../src/EntityDeclarations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,MAAM,IAAI,aAAa,CACjE,aAAa,CAAC,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,CAAC,CAC9C,CAAC;AAEF,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,MAAM;IACxD,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CAC9B;AAED,0FAA0F;AAC1F,MAAM,MAAM,QAAQ,CAAC,OAAO,SAAS,MAAM,IAAI;IAC7C,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM;CACxD,CAAC;AAGF,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM;CAAI;AAElD,MAAM,MAAM,KAAK,CAAC,OAAO,SAAS,MAAM,IAAI;KACzC,CAAC,IAAI,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CACtE,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,CAC/B,CAAC,CAAC,CAAC;CACL,CAAC;AAEF,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,EAChC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAC7C,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,CAa3B"}
1
+ {"version":3,"file":"EntityDeclarations.d.ts","sourceRoot":"","sources":["../src/EntityDeclarations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,MAAM,IAAI,SAAS,CAAC,SAAS,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAEjG,0FAA0F;AAC1F,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,MAAM,IAAI,QAAQ,CAC1D,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAC5C,CAAC;AAEF,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,MAAM;IACxD,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CACnC"}
@@ -1,19 +1,2 @@
1
- export function deriveHints(hints, transform) {
2
- if (!hints)
3
- return undefined;
4
- const out = {};
5
- for (const [adapter, perField] of Object.entries(hints)) {
6
- if (!perField || typeof perField !== 'object')
7
- continue;
8
- const mapped = {};
9
- for (const [key, hint] of Object.entries(perField)) {
10
- const next = transform(key);
11
- if (next !== undefined)
12
- mapped[next] = hint;
13
- }
14
- if (Object.keys(mapped).length)
15
- out[adapter] = mapped;
16
- }
17
- return Object.keys(out).length ? out : undefined;
18
- }
1
+ export {};
19
2
  //# sourceMappingURL=EntityDeclarations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDeclarations.js","sourceRoot":"","sources":["../src/EntityDeclarations.ts"],"names":[],"mappings":"AA8BA,MAAM,UAAU,WAAW,CACzB,KAAgC,EAChC,SAA8C;IAE9C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,GAAG,GAA4C,EAAE,CAAC;IACxD,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAA4D,CAAC,EAAE,CAAC;QAC/G,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,SAAS;QACxD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC9C,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM;YAAE,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,GAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"EntityDeclarations.js","sourceRoot":"","sources":["../src/EntityDeclarations.ts"],"names":[],"mappings":""}
@@ -7,4 +7,6 @@ export interface Axis<Declared = unknown, Wire = unknown> {
7
7
  }
8
8
  export type Resolver = (name: string) => (abstract new (...args: never[]) => unknown) | undefined;
9
9
  export declare const EXTENSION_AXES: readonly Axis[];
10
+ /** The slots they occupy: the keys of `x-fougere` on a field descriptor. */
11
+ export declare const EXTENSION_SLOTS: ("boundary" | "lifecycle" | "role")[];
10
12
  //# sourceMappingURL=Axis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Axis.d.ts","sourceRoot":"","sources":["../../src/axis/Axis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,IAAI,GAAG,OAAO;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAEjD,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAEvD,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAEzD,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACvD;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,QAAQ,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;AAElG,eAAO,MAAM,cAAc,EAAE,SAAS,IAAI,EAIzC,CAAC"}
1
+ {"version":3,"file":"Axis.d.ts","sourceRoot":"","sources":["../../src/axis/Axis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,IAAI,GAAG,OAAO;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAEjD,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAEvD,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAEzD,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACvD;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,QAAQ,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;AAElG,eAAO,MAAM,cAAc,EAAE,SAAS,IAAI,EAIzC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,eAAe,uCAA0C,CAAC"}
package/dist/axis/Axis.js CHANGED
@@ -1,9 +1,11 @@
1
- import { roleAxis } from './role/axis.js';
2
- import { lifecycleAxis } from './lifecycle/axis.js';
3
- import { boundaryAxis } from './boundary/axis.js';
1
+ import { roleAxis } from './role/RoleAxis.js';
2
+ import { lifecycleAxis } from './lifecycle/LifecycleAxis.js';
3
+ import { boundaryAxis } from './boundary/BoundaryAxis.js';
4
4
  export const EXTENSION_AXES = [
5
5
  roleAxis,
6
6
  lifecycleAxis,
7
7
  boundaryAxis,
8
8
  ];
9
+ /** The slots they occupy: the keys of `x-fougere` on a field descriptor. */
10
+ export const EXTENSION_SLOTS = EXTENSION_AXES.map((axis) => axis.slot);
9
11
  //# sourceMappingURL=Axis.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Axis.js","sourceRoot":"","sources":["../../src/axis/Axis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAelD,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,QAAQ;IACR,aAAa;IACb,YAAY;CACb,CAAC"}
1
+ {"version":3,"file":"Axis.js","sourceRoot":"","sources":["../../src/axis/Axis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAe1D,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,QAAQ;IACR,aAAa;IACb,YAAY;CACb,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { Decoder, Encoder } from './Boundaries.js';
2
- import type { Field } from '../../Field.js';
2
+ import type { Field } from '../../fields/Field.js';
3
3
  import { type Shape } from '../shape/Shape.js';
4
4
  export interface BoundaryRules {
5
5
  in?: 'closed' | {
@@ -1 +1 @@
1
- {"version":3,"file":"Boundary.d.ts","sourceRoot":"","sources":["../../../src/axis/boundary/Boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,GAAG,CAAC,EAAE,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACrC;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,aAAa,CAAC;AAKpE,qBAAa,QAAS,YAAW,aAAa;IAC5C,QAAQ,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,OAAO,eAKN;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAQtC;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAQhC;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAMlD;IAED,IAAI,CAAC,SAAS,EAAE,aAAa,GAAG,QAAQ,CAEvC;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;CAEF"}
1
+ {"version":3,"file":"Boundary.d.ts","sourceRoot":"","sources":["../../../src/axis/boundary/Boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,GAAG,CAAC,EAAE,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACrC;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,aAAa,CAAC;AAKpE,qBAAa,QAAS,YAAW,aAAa;IAC5C,QAAQ,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,OAAO,eAKN;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAQtC;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAQhC;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAMlD;IAED,IAAI,CAAC,SAAS,EAAE,aAAa,GAAG,QAAQ,CAEvC;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;CAEF"}
@@ -1,4 +1,4 @@
1
1
  import type { Axis } from '../Axis.js';
2
2
  import type { BoundaryRef } from './Boundary.js';
3
3
  export declare const boundaryAxis: Axis<BoundaryRef, BoundaryRef>;
4
- //# sourceMappingURL=axis.d.ts.map
4
+ //# sourceMappingURL=BoundaryAxis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoundaryAxis.d.ts","sourceRoot":"","sources":["../../../src/axis/boundary/BoundaryAxis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CA0BvD,CAAC"}
@@ -1,4 +1,5 @@
1
- import { admitWire, isObject } from '../../judge/form.js';
1
+ import { admitWire } from '../../card/admission.js';
2
+ import { isObject } from '../../judge/ValueForm.js';
2
3
  export const boundaryAxis = {
3
4
  slot: 'boundary',
4
5
  judge(value, errors) {
@@ -26,4 +27,4 @@ export const boundaryAxis = {
26
27
  return wire;
27
28
  },
28
29
  };
29
- //# sourceMappingURL=axis.js.map
30
+ //# sourceMappingURL=BoundaryAxis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoundaryAxis.js","sourceRoot":"","sources":["../../../src/axis/boundary/BoundaryAxis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD,MAAM,CAAC,MAAM,YAAY,GAAmC;IAC1D,IAAI,EAAE,UAAU;IAEhB,KAAK,CAAC,KAAK,EAAE,MAAM;QACjB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO;QACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,+CAA+C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;aAChF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAU,EAAE,CAAC;YAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACtD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,IAAI,EAAE,EAAE,OAAO,EAAE,0BAA0B,IAAI,YAAY,EAAE,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IAC1B,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;QACpB,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * What "now" means, for the two functions that stamp it.
3
+ *
4
+ * The ONE place either of them reads the time, which is what makes it substitutable at
5
+ * all: `created()`, `updated()` and `create: 'now'` are realized through this and nowhere
6
+ * else, so a test that needs a stable instant sets it here instead of intercepting `Date`
7
+ * globally — where Rails had to build `travel_to` over the language.
8
+ *
9
+ * A value rather than a mock: nothing here is a channel, and a frozen clock is a fact
10
+ * about the run, not an interception of a call.
11
+ */
12
+ export declare class Clock {
13
+ private static reading;
14
+ static now(): number;
15
+ /** Freeze the instant this clock reads. Returns the gesture that restores it. */
16
+ static freeze(at: number | Date): () => void;
17
+ }
18
+ //# sourceMappingURL=Clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Clock.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/Clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,OAAO,CAA0B;IAEhD,MAAM,CAAC,GAAG,IAAI,MAAM,CAEnB;IAED,iFAAiF;IACjF,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,IAAI,CAK3C;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * What "now" means, for the two functions that stamp it.
3
+ *
4
+ * The ONE place either of them reads the time, which is what makes it substitutable at
5
+ * all: `created()`, `updated()` and `create: 'now'` are realized through this and nowhere
6
+ * else, so a test that needs a stable instant sets it here instead of intercepting `Date`
7
+ * globally — where Rails had to build `travel_to` over the language.
8
+ *
9
+ * A value rather than a mock: nothing here is a channel, and a frozen clock is a fact
10
+ * about the run, not an interception of a call.
11
+ */
12
+ export class Clock {
13
+ static reading = Date.now;
14
+ static now() {
15
+ return this.reading();
16
+ }
17
+ /** Freeze the instant this clock reads. Returns the gesture that restores it. */
18
+ static freeze(at) {
19
+ const previous = this.reading;
20
+ const instant = at instanceof Date ? at.getTime() : at;
21
+ this.reading = () => instant;
22
+ return () => { this.reading = previous; };
23
+ }
24
+ }
25
+ //# sourceMappingURL=Clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Clock.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/Clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,KAAK;IACR,MAAM,CAAC,OAAO,GAAiB,IAAI,CAAC,GAAG,CAAC;IAEhD,MAAM,CAAC,GAAG;QACR,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,iFAAiF;IACjF,MAAM,CAAC,MAAM,CAAC,EAAiB;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;QAC7B,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -1,4 +1,18 @@
1
1
  export type GeneratorRef = 'cuid2' | 'uuid' | 'nanoid' | (string & {});
2
- export declare function registerGenerator(name: string, fn: () => string): void;
3
- export declare function resolveCustomGenerator(ref: GeneratorRef): (() => string) | undefined;
2
+ /**
3
+ * Who answers a `generate` by name one registry per process, like `Formats` and
4
+ * `Boundaries`.
5
+ *
6
+ * The three builtins are REGISTERED rather than switched on, which is what brings the
7
+ * refusal back inside: a registry whose unknown name is refused by a `default:` branch in
8
+ * its caller does not know what it holds, so it cannot say so.
9
+ */
10
+ export declare class Generators {
11
+ private static readonly registry;
12
+ static register(name: string, fn: () => string): void;
13
+ /** The generator this name stands for, refused by name when nothing does. */
14
+ static resolve(ref: GeneratorRef): () => string;
15
+ /** Whether a name is answered, for a caller that must not throw to find out. */
16
+ static answers(ref: GeneratorRef): boolean;
17
+ }
4
18
  //# sourceMappingURL=Generators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Generators.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/Generators.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAIvE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,MAAM,GAAG,IAAI,CAEtE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAEpF"}
1
+ {"version":3,"file":"Generators.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/Generators.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAUvE;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAI7B;IAEH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,MAAM,GAAG,IAAI,CAEpD;IAED,6EAA6E;IAC7E,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,MAAM,CAO9C;IAED,gFAAgF;IAChF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAEzC;CACF"}
@@ -1,8 +1,38 @@
1
- const generators = new Map();
2
- export function registerGenerator(name, fn) {
3
- generators.set(name, fn);
1
+ import { createId } from '@paralleldrive/cuid2';
2
+ const NANOID_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
3
+ function nanoid() {
4
+ const bytes = new Uint8Array(21);
5
+ globalThis.crypto.getRandomValues(bytes);
6
+ return Array.from(bytes, (byte) => NANOID_ALPHABET[byte & 63]).join('');
4
7
  }
5
- export function resolveCustomGenerator(ref) {
6
- return generators.get(ref);
8
+ /**
9
+ * Who answers a `generate` by name — one registry per process, like `Formats` and
10
+ * `Boundaries`.
11
+ *
12
+ * The three builtins are REGISTERED rather than switched on, which is what brings the
13
+ * refusal back inside: a registry whose unknown name is refused by a `default:` branch in
14
+ * its caller does not know what it holds, so it cannot say so.
15
+ */
16
+ export class Generators {
17
+ static registry = new Map([
18
+ ['cuid2', createId],
19
+ ['uuid', () => globalThis.crypto.randomUUID()],
20
+ ['nanoid', nanoid],
21
+ ]);
22
+ static register(name, fn) {
23
+ this.registry.set(name, fn);
24
+ }
25
+ /** The generator this name stands for, refused by name when nothing does. */
26
+ static resolve(ref) {
27
+ const found = this.registry.get(ref);
28
+ if (found)
29
+ return found;
30
+ throw new Error(`Unknown generator '${ref}' — register it with Generators.register('${ref}', fn). ` +
31
+ `This process answers ${[...this.registry.keys()].join(', ')}.`);
32
+ }
33
+ /** Whether a name is answered, for a caller that must not throw to find out. */
34
+ static answers(ref) {
35
+ return this.registry.has(ref);
36
+ }
7
37
  }
8
38
  //# sourceMappingURL=Generators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Generators.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/Generators.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEnD,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,EAAgB;IAC9D,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAiB;IACtD,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"Generators.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/Generators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD,MAAM,eAAe,GAAG,kEAAkE,CAAC;AAE3F,SAAS,MAAM;IACb,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,CAAU,QAAQ,GAAG,IAAI,GAAG,CAAuB;QAC/D,CAAC,OAAO,EAAE,QAAQ,CAAC;QACnB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,CAAC,QAAQ,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IAEH,MAAM,CAAC,QAAQ,CAAC,IAAY,EAAE,EAAgB;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,OAAO,CAAC,GAAiB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,sBAAsB,GAAG,6CAA6C,GAAG,UAAU;YACnF,wBAAwB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAChE,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,MAAM,CAAC,OAAO,CAAC,GAAiB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
1
  import type { Axis } from '../Axis.js';
2
2
  import { type LifecycleRules } from './Lifecycle.js';
3
3
  export declare const lifecycleAxis: Axis<LifecycleRules, LifecycleRules>;
4
- //# sourceMappingURL=axis.d.ts.map
4
+ //# sourceMappingURL=LifecycleAxis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LifecycleAxis.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/LifecycleAxis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnF,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAsB9D,CAAC"}
@@ -1,4 +1,5 @@
1
- import { admitWire, isObject, oneOfTokens } from '../../judge/form.js';
1
+ import { admitWire } from '../../card/admission.js';
2
+ import { isObject, oneOfTokens } from '../../judge/ValueForm.js';
2
3
  import { CREATE_TOKENS, UPDATE_TOKENS } from './Lifecycle.js';
3
4
  export const lifecycleAxis = {
4
5
  slot: 'lifecycle',
@@ -43,4 +44,4 @@ function judgeCreate(rule, errors) {
43
44
  message: `Expected 'now', 'optional', { value } or { generate } — got ${JSON.stringify(rule)}`,
44
45
  });
45
46
  }
46
- //# sourceMappingURL=axis.js.map
47
+ //# sourceMappingURL=LifecycleAxis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LifecycleAxis.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/LifecycleAxis.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAuB,MAAM,gBAAgB,CAAC;AAEnF,MAAM,CAAC,MAAM,aAAa,GAAyC;IACjE,IAAI,EAAE,WAAW;IAEjB,KAAK,CAAC,KAAK,EAAE,MAAM;QACjB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACjG,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,uCAAuC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;aAC/E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IAC1B,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;QACpB,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,SAAS,WAAW,CAAC,IAAa,EAAE,MAAyB;IAC3D,IAAI,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;QAAE,OAAO;IAC7C,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO;QAC5B,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,2BAA2B;oBACjC,OAAO,EAAE,mCAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;iBAC5E,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,+DAA+D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;KAC/F,CAAC,CAAC;AACL,CAAC"}
@@ -1,7 +1,5 @@
1
- import { type Fields } from '../../Field.js';
1
+ import { type Fields } from '../../fields/Field.js';
2
2
  type Row = Record<string, unknown>;
3
- /** Freeze the instant these two functions stamp. Returns the gesture that restores it. */
4
- export declare function freezeClock(at: number | Date): () => void;
5
3
  export declare function applyCreate(fields: Fields, input: Row): Row;
6
4
  export declare function applyUpdate(fields: Fields, patch: Row): Row;
7
5
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/apply.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGzD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAkCnC,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,IAAI,CAKzD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAc3D;AAOD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAS3D"}
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/apply.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEhE,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnC,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAc3D;AAOD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAS3D"}
@@ -1,47 +1,9 @@
1
1
  import { Lifecycle } from './Lifecycle.js';
2
- import { resolveCustomGenerator } from './Generators.js';
3
- import { createId } from '@paralleldrive/cuid2';
4
- function generatorFor(ref) {
5
- const custom = resolveCustomGenerator(ref);
6
- if (custom)
7
- return custom;
8
- switch (ref) {
9
- case 'cuid2': return createId;
10
- case 'uuid': return () => globalThis.crypto.randomUUID();
11
- case 'nanoid': {
12
- return () => {
13
- const bytes = new Uint8Array(21);
14
- globalThis.crypto.getRandomValues(bytes);
15
- const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
16
- return Array.from(bytes, (b) => alphabet[b & 63]).join('');
17
- };
18
- }
19
- default:
20
- throw new Error(`Unknown generator '${ref}' — register it with registerGenerator('${ref}', fn)`);
21
- }
22
- }
23
- /**
24
- * What "now" means, for the two functions that stamp it.
25
- *
26
- * The ONE place either of them reads the clock, which is what makes it substitutable at
27
- * all: `created()`, `updated()` and `create: 'now'` are realized here and nowhere else, so
28
- * a test that needs a stable instant sets this instead of intercepting `Date` globally —
29
- * where Rails had to build `travel_to` over the language.
30
- *
31
- * A value rather than a mock: nothing here is a channel, and a frozen clock is a fact
32
- * about the run, not an interception of a call.
33
- */
34
- let clock = Date.now;
35
- /** Freeze the instant these two functions stamp. Returns the gesture that restores it. */
36
- export function freezeClock(at) {
37
- const previous = clock;
38
- const instant = at instanceof Date ? at.getTime() : at;
39
- clock = () => instant;
40
- return () => { clock = previous; };
41
- }
2
+ import { Generators } from './Generators.js';
3
+ import { Clock } from './Clock.js';
42
4
  export function applyCreate(fields, input) {
43
5
  const out = { ...input };
44
- const instant = clock();
6
+ const instant = Clock.now();
45
7
  for (const [name, field] of Object.entries(fields)) {
46
8
  if (name in out)
47
9
  continue;
@@ -51,7 +13,7 @@ export function applyCreate(fields, input) {
51
13
  else if (rule.literal)
52
14
  out[name] = freshValue(rule.literal.value);
53
15
  else if (rule.generator)
54
- out[name] = generatorFor(rule.generator)();
16
+ out[name] = Generators.resolve(rule.generator)();
55
17
  }
56
18
  return out;
57
19
  }
@@ -62,7 +24,7 @@ function freshValue(value) {
62
24
  }
63
25
  export function applyUpdate(fields, patch) {
64
26
  const out = { ...patch };
65
- const instant = clock();
27
+ const instant = Clock.now();
66
28
  for (const [name, field] of Object.entries(fields)) {
67
29
  if (Lifecycle.of(field).stampedOnUpdate && !(name in out))
68
30
  out[name] = new Date(instant);
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/apply.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,KAAU;IACpD,MAAM,GAAG,GAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAsB,EAAE,CAAC;QACxE,IAAI,IAAI,IAAI,GAAG;YAAE,SAAS;QAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;aACpD,IAAI,IAAI,CAAC,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAC7D,IAAI,IAAI,CAAC,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC5E,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,KAAU;IACpD,MAAM,GAAG,GAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAsB,EAAE,CAAC;QACxE,IAAI,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,5 +1,4 @@
1
1
  export type EntityConstructor = abstract new (...args: any[]) => any;
2
- export declare function toTargetThunk<E extends EntityConstructor>(target: E | (() => E)): () => E;
3
2
  export declare const RELATION_KINDS: readonly ['one', 'many'];
4
3
  export declare const ON_DELETE: readonly ['cascade', 'restrict', 'set null'];
5
4
  export interface Relation {
@@ -7,4 +6,15 @@ export interface Relation {
7
6
  kind: (typeof RELATION_KINDS)[number];
8
7
  onDelete?: (typeof ON_DELETE)[number];
9
8
  }
9
+ /**
10
+ * How a relation is built — the one place a target becomes a thunk.
11
+ *
12
+ * A target arrives as the class or as a function returning it, because a cycle between two
13
+ * entities can only be written the second way. Recognised by FORM, `getFields` on the
14
+ * value: a class answers it, a thunk does not.
15
+ */
16
+ export declare const Relation: {
17
+ one(target: EntityConstructor | (() => EntityConstructor), cascade?: boolean): Relation;
18
+ many(target: EntityConstructor | (() => EntityConstructor)): Relation;
19
+ };
10
20
  //# sourceMappingURL=Relation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Relation.d.ts","sourceRoot":"","sources":["../../../src/axis/role/Relation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAErE,wBAAgB,aAAa,CAAC,CAAC,SAAS,iBAAiB,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAEzF;AAED,eAAO,MAAM,cAAc,YAAI,KAAK,EAAE,MAAM,CAAU,CAAC;AACvD,eAAO,MAAM,SAAS,YAAI,SAAS,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,iBAAiB,CAAC;IAC5B,IAAI,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;CACvC"}
1
+ {"version":3,"file":"Relation.d.ts","sourceRoot":"","sources":["../../../src/axis/role/Relation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAErE,eAAO,MAAM,cAAc,YAAI,KAAK,EAAE,MAAM,CAAU,CAAC;AACvD,eAAO,MAAM,SAAS,YAAI,SAAS,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,iBAAiB,CAAC;IAC5B,IAAI,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;CACvC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ;IACnB,GAAG,SAAS,iBAAiB,GAAG,CAAC,MAAM,iBAAiB,CAAC,YAAY,OAAO,GAAG,QAAQ;IAIvF,IAAI,SAAS,iBAAiB,GAAG,CAAC,MAAM,iBAAiB,CAAC,GAAG,QAAQ;CAGtE,CAAC"}
@@ -1,6 +1,21 @@
1
- export function toTargetThunk(target) {
2
- return 'getFields' in target ? () => target : target;
3
- }
4
1
  export const RELATION_KINDS = ['one', 'many'];
5
2
  export const ON_DELETE = ['cascade', 'restrict', 'set null'];
3
+ /**
4
+ * How a relation is built — the one place a target becomes a thunk.
5
+ *
6
+ * A target arrives as the class or as a function returning it, because a cycle between two
7
+ * entities can only be written the second way. Recognised by FORM, `getFields` on the
8
+ * value: a class answers it, a thunk does not.
9
+ */
10
+ export const Relation = {
11
+ one(target, cascade) {
12
+ return { to: thunk(target), kind: 'one', onDelete: cascade ? 'cascade' : undefined };
13
+ },
14
+ many(target) {
15
+ return { to: thunk(target), kind: 'many' };
16
+ },
17
+ };
18
+ function thunk(target) {
19
+ return 'getFields' in target ? () => target : target;
20
+ }
6
21
  //# sourceMappingURL=Relation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Relation.js","sourceRoot":"","sources":["../../../src/axis/role/Relation.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAA8B,MAAqB;IAC9E,OAAO,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAW,CAAC,CAAC,CAAE,MAAkB,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAC;AACvD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC"}
1
+ {"version":3,"file":"Relation.js","sourceRoot":"","sources":["../../../src/axis/role/Relation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAC;AACvD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAQtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,CAAC,MAAqD,EAAE,OAAiB;QAC1E,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACvF,CAAC;IAED,IAAI,CAAC,MAAqD;QACxD,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC7C,CAAC;CACF,CAAC;AAEF,SAAS,KAAK,CAA8B,MAAqB;IAC/D,OAAO,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAW,CAAC,CAAC,CAAE,MAAkB,CAAC;AACzE,CAAC"}