@fougere/schema 0.2.0-alpha.2 → 0.3.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 (343) hide show
  1. package/dist/EntityDeclarations.d.ts +22 -0
  2. package/dist/EntityDeclarations.d.ts.map +1 -0
  3. package/dist/{hints.js → EntityDeclarations.js} +1 -5
  4. package/dist/EntityDeclarations.js.map +1 -0
  5. package/dist/Field.d.ts +21 -0
  6. package/dist/Field.d.ts.map +1 -0
  7. package/dist/Field.js +50 -0
  8. package/dist/Field.js.map +1 -0
  9. package/dist/{schema/schema.d.ts → Schema.d.ts} +27 -34
  10. package/dist/Schema.d.ts.map +1 -0
  11. package/dist/{schema/schema.js → Schema.js} +49 -59
  12. package/dist/Schema.js.map +1 -0
  13. package/dist/SchemaView.d.ts +18 -0
  14. package/dist/SchemaView.d.ts.map +1 -0
  15. package/dist/SchemaView.js +2 -0
  16. package/dist/SchemaView.js.map +1 -0
  17. package/dist/axis/Axis.d.ts +10 -0
  18. package/dist/axis/Axis.d.ts.map +1 -0
  19. package/dist/axis/Axis.js +9 -0
  20. package/dist/axis/Axis.js.map +1 -0
  21. package/dist/axis/Meta.d.ts +4 -0
  22. package/dist/axis/Meta.d.ts.map +1 -0
  23. package/dist/axis/Meta.js +2 -0
  24. package/dist/axis/Meta.js.map +1 -0
  25. package/dist/axis/boundary/Boundaries.d.ts +20 -0
  26. package/dist/axis/boundary/Boundaries.d.ts.map +1 -0
  27. package/dist/axis/boundary/Boundaries.js +31 -0
  28. package/dist/axis/boundary/Boundaries.js.map +1 -0
  29. package/dist/axis/boundary/Boundary.d.ts +26 -0
  30. package/dist/axis/boundary/Boundary.d.ts.map +1 -0
  31. package/dist/axis/boundary/Boundary.js +53 -0
  32. package/dist/axis/boundary/Boundary.js.map +1 -0
  33. package/dist/axis/boundary/axis.d.ts +4 -0
  34. package/dist/axis/boundary/axis.d.ts.map +1 -0
  35. package/dist/axis/boundary/axis.js +29 -0
  36. package/dist/axis/boundary/axis.js.map +1 -0
  37. package/dist/axis/lifecycle/Generators.d.ts +4 -0
  38. package/dist/axis/lifecycle/Generators.d.ts.map +1 -0
  39. package/dist/axis/lifecycle/Generators.js +8 -0
  40. package/dist/axis/lifecycle/Generators.js.map +1 -0
  41. package/dist/axis/lifecycle/Lifecycle.d.ts +28 -0
  42. package/dist/axis/lifecycle/Lifecycle.d.ts.map +1 -0
  43. package/dist/axis/lifecycle/Lifecycle.js +38 -0
  44. package/dist/axis/lifecycle/Lifecycle.js.map +1 -0
  45. package/dist/axis/lifecycle/apply.d.ts +8 -0
  46. package/dist/axis/lifecycle/apply.d.ts.map +1 -0
  47. package/dist/axis/lifecycle/apply.js +72 -0
  48. package/dist/axis/lifecycle/apply.js.map +1 -0
  49. package/dist/axis/lifecycle/axis.d.ts +4 -0
  50. package/dist/axis/lifecycle/axis.d.ts.map +1 -0
  51. package/dist/axis/lifecycle/axis.js +46 -0
  52. package/dist/axis/lifecycle/axis.js.map +1 -0
  53. package/dist/axis/role/Relation.d.ts +10 -0
  54. package/dist/axis/role/Relation.d.ts.map +1 -0
  55. package/dist/axis/role/Relation.js +6 -0
  56. package/dist/axis/role/Relation.js.map +1 -0
  57. package/dist/axis/role/Role.d.ts +38 -0
  58. package/dist/axis/role/Role.d.ts.map +1 -0
  59. package/dist/axis/role/Role.js +50 -0
  60. package/dist/axis/role/Role.js.map +1 -0
  61. package/dist/axis/role/axis.d.ts +5 -0
  62. package/dist/axis/role/axis.d.ts.map +1 -0
  63. package/dist/axis/role/axis.js +101 -0
  64. package/dist/axis/role/axis.js.map +1 -0
  65. package/dist/axis/shape/Formats.d.ts +8 -0
  66. package/dist/axis/shape/Formats.d.ts.map +1 -0
  67. package/dist/axis/shape/Formats.js +10 -0
  68. package/dist/axis/shape/Formats.js.map +1 -0
  69. package/dist/axis/shape/Shape.d.ts +58 -0
  70. package/dist/axis/shape/Shape.d.ts.map +1 -0
  71. package/dist/{field/shape.js → axis/shape/Shape.js} +10 -25
  72. package/dist/axis/shape/Shape.js.map +1 -0
  73. package/dist/card/Descriptor.d.ts +55 -0
  74. package/dist/card/Descriptor.d.ts.map +1 -0
  75. package/dist/card/Descriptor.js +2 -0
  76. package/dist/card/Descriptor.js.map +1 -0
  77. package/dist/card/describe.d.ts +12 -0
  78. package/dist/card/describe.d.ts.map +1 -0
  79. package/dist/card/describe.js +83 -0
  80. package/dist/card/describe.js.map +1 -0
  81. package/dist/card/diff.d.ts +140 -0
  82. package/dist/card/diff.d.ts.map +1 -0
  83. package/dist/card/diff.js +123 -0
  84. package/dist/card/diff.js.map +1 -0
  85. package/dist/card/reconstruct.d.ts +11 -0
  86. package/dist/card/reconstruct.d.ts.map +1 -0
  87. package/dist/card/reconstruct.js +83 -0
  88. package/dist/card/reconstruct.js.map +1 -0
  89. package/dist/card/typescript.d.ts +17 -0
  90. package/dist/card/typescript.d.ts.map +1 -0
  91. package/dist/card/typescript.js +93 -0
  92. package/dist/card/typescript.js.map +1 -0
  93. package/dist/clean.d.ts +2 -0
  94. package/dist/clean.d.ts.map +1 -0
  95. package/dist/{projections/card.js → clean.js} +1 -2
  96. package/dist/clean.js.map +1 -0
  97. package/dist/constraint/FieldGroup.d.ts +21 -0
  98. package/dist/constraint/FieldGroup.d.ts.map +1 -0
  99. package/dist/constraint/FieldGroup.js +65 -0
  100. package/dist/constraint/FieldGroup.js.map +1 -0
  101. package/dist/constraint/Unique.d.ts +4 -0
  102. package/dist/constraint/Unique.d.ts.map +1 -0
  103. package/dist/constraint/Unique.js +4 -0
  104. package/dist/constraint/Unique.js.map +1 -0
  105. package/dist/entity.d.ts +4 -19
  106. package/dist/entity.d.ts.map +1 -1
  107. package/dist/entity.js +13 -39
  108. package/dist/entity.js.map +1 -1
  109. package/dist/index.d.ts +54 -37
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +46 -48
  112. package/dist/index.js.map +1 -1
  113. package/dist/judge/Judge.d.ts +14 -0
  114. package/dist/judge/Judge.d.ts.map +1 -0
  115. package/dist/judge/Judge.js +161 -0
  116. package/dist/judge/Judge.js.map +1 -0
  117. package/dist/judge/cases.d.ts +50 -0
  118. package/dist/judge/cases.d.ts.map +1 -0
  119. package/dist/judge/cases.js +100 -0
  120. package/dist/judge/cases.js.map +1 -0
  121. package/dist/judge/form.d.ts +11 -0
  122. package/dist/judge/form.d.ts.map +1 -0
  123. package/dist/judge/form.js +18 -0
  124. package/dist/judge/form.js.map +1 -0
  125. package/dist/judge/options.d.ts +4 -0
  126. package/dist/judge/options.d.ts.map +1 -0
  127. package/dist/judge/options.js +2 -0
  128. package/dist/judge/options.js.map +1 -0
  129. package/dist/judge/result.d.ts +17 -0
  130. package/dist/judge/result.d.ts.map +1 -0
  131. package/dist/judge/result.js +2 -0
  132. package/dist/judge/result.js.map +1 -0
  133. package/dist/name.d.ts +1 -6
  134. package/dist/name.d.ts.map +1 -1
  135. package/dist/name.js +3 -6
  136. package/dist/name.js.map +1 -1
  137. package/dist/projection/encode.d.ts +3 -0
  138. package/dist/projection/encode.d.ts.map +1 -0
  139. package/dist/projection/encode.js +19 -0
  140. package/dist/projection/encode.js.map +1 -0
  141. package/dist/projection/io.d.ts +4 -0
  142. package/dist/projection/io.d.ts.map +1 -0
  143. package/dist/projection/io.js +29 -0
  144. package/dist/projection/io.js.map +1 -0
  145. package/dist/projection/source.d.ts +7 -0
  146. package/dist/projection/source.d.ts.map +1 -0
  147. package/dist/projection/source.js +11 -0
  148. package/dist/projection/source.js.map +1 -0
  149. package/dist/{projections → projection}/standard.d.ts +0 -8
  150. package/dist/projection/standard.d.ts.map +1 -0
  151. package/dist/projection/standard.js +2 -0
  152. package/dist/projection/standard.js.map +1 -0
  153. package/dist/same.d.ts +6 -0
  154. package/dist/same.d.ts.map +1 -0
  155. package/dist/same.js +35 -0
  156. package/dist/same.js.map +1 -0
  157. package/dist/vocabulary/bool.d.ts +1 -1
  158. package/dist/vocabulary/bool.d.ts.map +1 -1
  159. package/dist/vocabulary/bool.js +1 -1
  160. package/dist/vocabulary/bool.js.map +1 -1
  161. package/dist/vocabulary/created.d.ts +1 -5
  162. package/dist/vocabulary/created.d.ts.map +1 -1
  163. package/dist/vocabulary/created.js +1 -5
  164. package/dist/vocabulary/created.js.map +1 -1
  165. package/dist/vocabulary/date.d.ts +1 -1
  166. package/dist/vocabulary/date.d.ts.map +1 -1
  167. package/dist/vocabulary/date.js +1 -1
  168. package/dist/vocabulary/date.js.map +1 -1
  169. package/dist/vocabulary/email.d.ts +1 -2
  170. package/dist/vocabulary/email.d.ts.map +1 -1
  171. package/dist/vocabulary/email.js +0 -1
  172. package/dist/vocabulary/email.js.map +1 -1
  173. package/dist/vocabulary/immutable.d.ts +2 -6
  174. package/dist/vocabulary/immutable.d.ts.map +1 -1
  175. package/dist/vocabulary/immutable.js +4 -7
  176. package/dist/vocabulary/immutable.js.map +1 -1
  177. package/dist/vocabulary/indexed.d.ts +2 -7
  178. package/dist/vocabulary/indexed.d.ts.map +1 -1
  179. package/dist/vocabulary/indexed.js +2 -8
  180. package/dist/vocabulary/indexed.js.map +1 -1
  181. package/dist/vocabulary/json.d.ts +2 -10
  182. package/dist/vocabulary/json.d.ts.map +1 -1
  183. package/dist/vocabulary/json.js +10 -7
  184. package/dist/vocabulary/json.js.map +1 -1
  185. package/dist/vocabulary/list.d.ts +1 -12
  186. package/dist/vocabulary/list.d.ts.map +1 -1
  187. package/dist/vocabulary/list.js +1 -14
  188. package/dist/vocabulary/list.js.map +1 -1
  189. package/dist/vocabulary/many.d.ts +2 -5
  190. package/dist/vocabulary/many.d.ts.map +1 -1
  191. package/dist/vocabulary/many.js +2 -5
  192. package/dist/vocabulary/many.js.map +1 -1
  193. package/dist/vocabulary/nullable.d.ts +2 -6
  194. package/dist/vocabulary/nullable.d.ts.map +1 -1
  195. package/dist/vocabulary/nullable.js +5 -8
  196. package/dist/vocabulary/nullable.js.map +1 -1
  197. package/dist/vocabulary/number.d.ts +1 -1
  198. package/dist/vocabulary/number.d.ts.map +1 -1
  199. package/dist/vocabulary/number.js +1 -1
  200. package/dist/vocabulary/number.js.map +1 -1
  201. package/dist/vocabulary/oneOf.d.ts +1 -8
  202. package/dist/vocabulary/oneOf.d.ts.map +1 -1
  203. package/dist/vocabulary/oneOf.js +1 -1
  204. package/dist/vocabulary/oneOf.js.map +1 -1
  205. package/dist/vocabulary/optional.d.ts +2 -9
  206. package/dist/vocabulary/optional.d.ts.map +1 -1
  207. package/dist/vocabulary/optional.js +6 -14
  208. package/dist/vocabulary/optional.js.map +1 -1
  209. package/dist/vocabulary/primary.d.ts +2 -15
  210. package/dist/vocabulary/primary.d.ts.map +1 -1
  211. package/dist/vocabulary/primary.js +3 -9
  212. package/dist/vocabulary/primary.js.map +1 -1
  213. package/dist/vocabulary/readOnly.d.ts +2 -6
  214. package/dist/vocabulary/readOnly.d.ts.map +1 -1
  215. package/dist/vocabulary/readOnly.js +5 -8
  216. package/dist/vocabulary/readOnly.js.map +1 -1
  217. package/dist/vocabulary/ref.d.ts +2 -7
  218. package/dist/vocabulary/ref.d.ts.map +1 -1
  219. package/dist/vocabulary/ref.js +2 -7
  220. package/dist/vocabulary/ref.js.map +1 -1
  221. package/dist/vocabulary/text.d.ts +2 -2
  222. package/dist/vocabulary/text.d.ts.map +1 -1
  223. package/dist/vocabulary/text.js +1 -1
  224. package/dist/vocabulary/text.js.map +1 -1
  225. package/dist/vocabulary/unique.d.ts +2 -12
  226. package/dist/vocabulary/unique.d.ts.map +1 -1
  227. package/dist/vocabulary/unique.js +5 -13
  228. package/dist/vocabulary/unique.js.map +1 -1
  229. package/dist/vocabulary/updated.d.ts +1 -6
  230. package/dist/vocabulary/updated.d.ts.map +1 -1
  231. package/dist/vocabulary/updated.js +0 -5
  232. package/dist/vocabulary/updated.js.map +1 -1
  233. package/dist/vocabulary/url.d.ts +1 -2
  234. package/dist/vocabulary/url.d.ts.map +1 -1
  235. package/dist/vocabulary/url.js +0 -1
  236. package/dist/vocabulary/url.js.map +1 -1
  237. package/dist/vocabulary/vocabulary.d.ts +5 -0
  238. package/dist/vocabulary/vocabulary.d.ts.map +1 -0
  239. package/dist/vocabulary/vocabulary.js +31 -0
  240. package/dist/vocabulary/vocabulary.js.map +1 -0
  241. package/dist/vocabulary/writeOnly.d.ts +2 -6
  242. package/dist/vocabulary/writeOnly.d.ts.map +1 -1
  243. package/dist/vocabulary/writeOnly.js +5 -8
  244. package/dist/vocabulary/writeOnly.js.map +1 -1
  245. package/package.json +1 -1
  246. package/dist/field/boundary.d.ts +0 -69
  247. package/dist/field/boundary.d.ts.map +0 -1
  248. package/dist/field/boundary.js +0 -82
  249. package/dist/field/boundary.js.map +0 -1
  250. package/dist/field/field.d.ts +0 -21
  251. package/dist/field/field.d.ts.map +0 -1
  252. package/dist/field/field.js +0 -24
  253. package/dist/field/field.js.map +0 -1
  254. package/dist/field/format.d.ts +0 -29
  255. package/dist/field/format.d.ts.map +0 -1
  256. package/dist/field/format.js +0 -24
  257. package/dist/field/format.js.map +0 -1
  258. package/dist/field/index.d.ts +0 -8
  259. package/dist/field/index.d.ts.map +0 -1
  260. package/dist/field/index.js +0 -10
  261. package/dist/field/index.js.map +0 -1
  262. package/dist/field/lifecycle.d.ts +0 -31
  263. package/dist/field/lifecycle.d.ts.map +0 -1
  264. package/dist/field/lifecycle.js +0 -20
  265. package/dist/field/lifecycle.js.map +0 -1
  266. package/dist/field/meta.d.ts +0 -5
  267. package/dist/field/meta.d.ts.map +0 -1
  268. package/dist/field/meta.js +0 -5
  269. package/dist/field/meta.js.map +0 -1
  270. package/dist/field/role.d.ts +0 -47
  271. package/dist/field/role.d.ts.map +0 -1
  272. package/dist/field/role.js +0 -35
  273. package/dist/field/role.js.map +0 -1
  274. package/dist/field/shape.d.ts +0 -89
  275. package/dist/field/shape.d.ts.map +0 -1
  276. package/dist/field/shape.js.map +0 -1
  277. package/dist/hints.d.ts +0 -28
  278. package/dist/hints.d.ts.map +0 -1
  279. package/dist/hints.js.map +0 -1
  280. package/dist/projections/card.d.ts +0 -98
  281. package/dist/projections/card.d.ts.map +0 -1
  282. package/dist/projections/card.js.map +0 -1
  283. package/dist/projections/describe.d.ts +0 -25
  284. package/dist/projections/describe.d.ts.map +0 -1
  285. package/dist/projections/describe.js +0 -131
  286. package/dist/projections/describe.js.map +0 -1
  287. package/dist/projections/encode.d.ts +0 -11
  288. package/dist/projections/encode.d.ts.map +0 -1
  289. package/dist/projections/encode.js +0 -26
  290. package/dist/projections/encode.js.map +0 -1
  291. package/dist/projections/io.d.ts +0 -24
  292. package/dist/projections/io.d.ts.map +0 -1
  293. package/dist/projections/io.js +0 -46
  294. package/dist/projections/io.js.map +0 -1
  295. package/dist/projections/lifecycle.d.ts +0 -29
  296. package/dist/projections/lifecycle.d.ts.map +0 -1
  297. package/dist/projections/lifecycle.js +0 -93
  298. package/dist/projections/lifecycle.js.map +0 -1
  299. package/dist/projections/reconstruct.d.ts +0 -31
  300. package/dist/projections/reconstruct.d.ts.map +0 -1
  301. package/dist/projections/reconstruct.js +0 -146
  302. package/dist/projections/reconstruct.js.map +0 -1
  303. package/dist/projections/source.d.ts +0 -18
  304. package/dist/projections/source.d.ts.map +0 -1
  305. package/dist/projections/source.js +0 -18
  306. package/dist/projections/source.js.map +0 -1
  307. package/dist/projections/standard.d.ts.map +0 -1
  308. package/dist/projections/standard.js +0 -10
  309. package/dist/projections/standard.js.map +0 -1
  310. package/dist/projections/typescript.d.ts +0 -37
  311. package/dist/projections/typescript.d.ts.map +0 -1
  312. package/dist/projections/typescript.js +0 -157
  313. package/dist/projections/typescript.js.map +0 -1
  314. package/dist/schema/index.d.ts +0 -3
  315. package/dist/schema/index.d.ts.map +0 -1
  316. package/dist/schema/index.js +0 -2
  317. package/dist/schema/index.js.map +0 -1
  318. package/dist/schema/schema.d.ts.map +0 -1
  319. package/dist/schema/schema.js.map +0 -1
  320. package/dist/schema/view.d.ts +0 -26
  321. package/dist/schema/view.d.ts.map +0 -1
  322. package/dist/schema/view.js +0 -2
  323. package/dist/schema/view.js.map +0 -1
  324. package/dist/unique.d.ts +0 -40
  325. package/dist/unique.d.ts.map +0 -1
  326. package/dist/unique.js +0 -57
  327. package/dist/unique.js.map +0 -1
  328. package/dist/validation/index.d.ts +0 -4
  329. package/dist/validation/index.d.ts.map +0 -1
  330. package/dist/validation/index.js +0 -2
  331. package/dist/validation/index.js.map +0 -1
  332. package/dist/validation/judge.d.ts +0 -55
  333. package/dist/validation/judge.d.ts.map +0 -1
  334. package/dist/validation/judge.js +0 -351
  335. package/dist/validation/judge.js.map +0 -1
  336. package/dist/validation/options.d.ts +0 -6
  337. package/dist/validation/options.d.ts.map +0 -1
  338. package/dist/validation/options.js +0 -3
  339. package/dist/validation/options.js.map +0 -1
  340. package/dist/validation/result.d.ts +0 -20
  341. package/dist/validation/result.d.ts.map +0 -1
  342. package/dist/validation/result.js +0 -3
  343. package/dist/validation/result.js.map +0 -1
@@ -0,0 +1,53 @@
1
+ import { Boundaries } from './Boundaries.js';
2
+ import { Anatomy } from '../shape/Shape.js';
3
+ const identityDecoder = (value) => ({ value });
4
+ const identityEncoder = (value) => value;
5
+ export class Boundary {
6
+ in;
7
+ out;
8
+ decode;
9
+ encode;
10
+ constructor(rules = {}, codecs) {
11
+ this.in = rules.in;
12
+ this.out = rules.out;
13
+ this.decode = codecs?.decode ?? identityDecoder;
14
+ this.encode = codecs?.encode ?? identityEncoder;
15
+ }
16
+ static declared(field) {
17
+ const ref = field.boundary;
18
+ if (ref === undefined)
19
+ return new Boundary();
20
+ if (typeof ref !== 'string')
21
+ return new Boundary(ref);
22
+ const alias = Boundaries.alias(ref);
23
+ if (!alias)
24
+ throw new Error(`Unknown boundary alias: '${ref}'`);
25
+ return new Boundary(alias);
26
+ }
27
+ static of(field) {
28
+ const declared = Boundary.declared(field);
29
+ const derived = Boundary.forShape(field.shape);
30
+ const rules = { in: declared.in ?? derived.in, out: declared.out ?? derived.out };
31
+ return new Boundary(rules, {
32
+ decode: typeof rules.in === 'object' ? Boundaries.decoder(rules.in.decode) : identityDecoder,
33
+ encode: typeof rules.out === 'object' ? Boundaries.encoder(rules.out.encode) : identityEncoder,
34
+ });
35
+ }
36
+ static forShape(shape) {
37
+ const base = Anatomy.of(shape).base;
38
+ if (base?.type === 'string' && base.format === 'date-time') {
39
+ return new Boundary(Boundaries.alias('isoDate'));
40
+ }
41
+ return new Boundary();
42
+ }
43
+ with(overrides) {
44
+ return new Boundary({ in: overrides.in ?? this.in, out: overrides.out ?? this.out });
45
+ }
46
+ get readOnly() {
47
+ return this.in === 'closed';
48
+ }
49
+ get writeOnly() {
50
+ return this.out === 'closed';
51
+ }
52
+ }
53
+ //# sourceMappingURL=Boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Boundary.js","sourceRoot":"","sources":["../../../src/axis/boundary/Boundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Axis } from '../Axis.js';
2
+ import type { BoundaryRef } from './Boundary.js';
3
+ export declare const boundaryAxis: Axis<BoundaryRef, BoundaryRef>;
4
+ //# sourceMappingURL=axis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis.d.ts","sourceRoot":"","sources":["../../../src/axis/boundary/axis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CA0BvD,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { admitWire, isObject } from '../../judge/form.js';
2
+ export const boundaryAxis = {
3
+ slot: 'boundary',
4
+ judge(value, errors) {
5
+ if (typeof value === 'string')
6
+ return;
7
+ if (!isObject(value)) {
8
+ errors.push({
9
+ path: 'boundary',
10
+ message: `Expected an alias name or { in, out } — got ${JSON.stringify(value)}`,
11
+ });
12
+ return;
13
+ }
14
+ for (const [side, verb] of [['in', 'decode'], ['out', 'encode']]) {
15
+ const rule = value[side];
16
+ if (rule === undefined || rule === 'closed')
17
+ continue;
18
+ if (!isObject(rule) || typeof rule[verb] !== 'string') {
19
+ errors.push({ path: `boundary.${side}`, message: `Expected 'closed' or { ${verb}: <name> }` });
20
+ }
21
+ }
22
+ },
23
+ describe: (value) => value,
24
+ reconstruct: (wire) => {
25
+ admitWire(boundaryAxis.judge, wire, 'boundary');
26
+ return wire;
27
+ },
28
+ };
29
+ //# sourceMappingURL=axis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis.js","sourceRoot":"","sources":["../../../src/axis/boundary/axis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG1D,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,4 @@
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;
4
+ //# sourceMappingURL=Generators.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ const generators = new Map();
2
+ export function registerGenerator(name, fn) {
3
+ generators.set(name, fn);
4
+ }
5
+ export function resolveCustomGenerator(ref) {
6
+ return generators.get(ref);
7
+ }
8
+ //# sourceMappingURL=Generators.js.map
@@ -0,0 +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"}
@@ -0,0 +1,28 @@
1
+ import type { GeneratorRef } from './Generators.js';
2
+ export declare const CREATE_TOKENS: readonly ['now', 'optional'];
3
+ export declare const UPDATE_TOKENS: readonly ['now', 'forbidden'];
4
+ export interface LifecycleRules {
5
+ create?: {
6
+ value: unknown;
7
+ } | {
8
+ generate: GeneratorRef;
9
+ } | (typeof CREATE_TOKENS)[number];
10
+ update?: (typeof UPDATE_TOKENS)[number];
11
+ }
12
+ export declare class Lifecycle implements LifecycleRules {
13
+ readonly create?: LifecycleRules['create'];
14
+ readonly update?: LifecycleRules['update'];
15
+ private constructor();
16
+ static of(field: {
17
+ lifecycle?: LifecycleRules;
18
+ }): Lifecycle;
19
+ get requiredAtCreate(): boolean;
20
+ get stampedOnce(): boolean;
21
+ get immutable(): boolean;
22
+ get stampedOnUpdate(): boolean;
23
+ get literal(): {
24
+ value: unknown;
25
+ } | undefined;
26
+ get generator(): GeneratorRef | undefined;
27
+ }
28
+ //# sourceMappingURL=Lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lifecycle.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/Lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,eAAO,MAAM,aAAa,YAAI,KAAK,EAAE,UAAU,CAAU,CAAC;AAC1D,eAAO,MAAM,aAAa,YAAI,KAAK,EAAE,WAAW,CAAU,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,QAAQ,EAAE,YAAY,CAAA;KAAE,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,CAAC,EAAE,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,qBAAa,SAAU,YAAW,cAAc;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,eAGN;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,SAAS,CAE1D;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,OAAO,IAAI;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAK5C;IAED,IAAI,SAAS,IAAI,YAAY,GAAG,SAAS,CAKxC;CACF"}
@@ -0,0 +1,38 @@
1
+ export const CREATE_TOKENS = ['now', 'optional'];
2
+ export const UPDATE_TOKENS = ['now', 'forbidden'];
3
+ export class Lifecycle {
4
+ create;
5
+ update;
6
+ constructor(rules = {}) {
7
+ this.create = rules.create;
8
+ this.update = rules.update;
9
+ }
10
+ static of(field) {
11
+ return new Lifecycle(field.lifecycle);
12
+ }
13
+ get requiredAtCreate() {
14
+ return this.create === undefined;
15
+ }
16
+ get stampedOnce() {
17
+ return this.create === 'now' && this.update !== 'now';
18
+ }
19
+ get immutable() {
20
+ return this.update === 'forbidden';
21
+ }
22
+ get stampedOnUpdate() {
23
+ return this.update === 'now';
24
+ }
25
+ get literal() {
26
+ const rule = this.create;
27
+ return typeof rule === 'object' && rule !== null && 'value' in rule
28
+ ? { value: rule.value }
29
+ : undefined;
30
+ }
31
+ get generator() {
32
+ const rule = this.create;
33
+ return typeof rule === 'object' && rule !== null && 'generate' in rule
34
+ ? rule.generate
35
+ : undefined;
36
+ }
37
+ }
38
+ //# sourceMappingURL=Lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lifecycle.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/Lifecycle.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,CAAU,CAAC;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,CAAU,CAAC;AAO3D,MAAM,OAAO,SAAS;IACX,MAAM,CAA4B;IAClC,MAAM,CAA4B;IAE3C,YAAoB,KAAK,GAAmB,EAAE;QAC5C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,KAAqC;QAC7C,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IACnC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;IACxD,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;IACrC,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;IAC/B,CAAC;IAED,IAAI,OAAO;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,IAAI;YACjE,CAAC,CAAC,EAAE,KAAK,EAAG,IAA2B,CAAC,KAAK,EAAE;YAC/C,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,IAAI,SAAS;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,UAAU,IAAI,IAAI;YACpE,CAAC,CAAE,IAAmC,CAAC,QAAQ;YAC/C,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { type Fields } from '../../Field.js';
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
+ export declare function applyCreate(fields: Fields, input: Row): Row;
6
+ export declare function applyUpdate(fields: Fields, patch: Row): Row;
7
+ export {};
8
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,72 @@
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
+ }
42
+ export function applyCreate(fields, input) {
43
+ const out = { ...input };
44
+ const instant = clock();
45
+ for (const [name, field] of Object.entries(fields)) {
46
+ if (name in out)
47
+ continue;
48
+ const rule = Lifecycle.of(field);
49
+ if (rule.create === 'now')
50
+ out[name] = new Date(instant);
51
+ else if (rule.literal)
52
+ out[name] = freshValue(rule.literal.value);
53
+ else if (rule.generator)
54
+ out[name] = generatorFor(rule.generator)();
55
+ }
56
+ return out;
57
+ }
58
+ function freshValue(value) {
59
+ if (value === null || typeof value !== 'object')
60
+ return value;
61
+ return structuredClone(value);
62
+ }
63
+ export function applyUpdate(fields, patch) {
64
+ const out = { ...patch };
65
+ const instant = clock();
66
+ for (const [name, field] of Object.entries(fields)) {
67
+ if (Lifecycle.of(field).stampedOnUpdate && !(name in out))
68
+ out[name] = new Date(instant);
69
+ }
70
+ return out;
71
+ }
72
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Axis } from '../Axis.js';
2
+ import { type LifecycleRules } from './Lifecycle.js';
3
+ export declare const lifecycleAxis: Axis<LifecycleRules, LifecycleRules>;
4
+ //# sourceMappingURL=axis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis.d.ts","sourceRoot":"","sources":["../../../src/axis/lifecycle/axis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnF,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAsB9D,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { admitWire, isObject, oneOfTokens } from '../../judge/form.js';
2
+ import { CREATE_TOKENS, UPDATE_TOKENS } from './Lifecycle.js';
3
+ export const lifecycleAxis = {
4
+ slot: 'lifecycle',
5
+ judge(value, errors) {
6
+ if (!isObject(value)) {
7
+ errors.push({ path: 'lifecycle', message: `Expected an object — got ${JSON.stringify(value)}` });
8
+ return;
9
+ }
10
+ if (value.create !== undefined)
11
+ judgeCreate(value.create, errors);
12
+ if (value.update !== undefined && !oneOfTokens(value.update, UPDATE_TOKENS)) {
13
+ errors.push({
14
+ path: 'lifecycle.update',
15
+ message: `Expected 'now' or 'forbidden' — got ${JSON.stringify(value.update)}`,
16
+ });
17
+ }
18
+ },
19
+ describe: (value) => value,
20
+ reconstruct: (wire) => {
21
+ admitWire(lifecycleAxis.judge, wire, 'lifecycle');
22
+ return wire;
23
+ },
24
+ };
25
+ function judgeCreate(rule, errors) {
26
+ if (oneOfTokens(rule, CREATE_TOKENS))
27
+ return;
28
+ if (isObject(rule)) {
29
+ if ('value' in rule)
30
+ return;
31
+ if ('generate' in rule) {
32
+ if (typeof rule.generate !== 'string') {
33
+ errors.push({
34
+ path: 'lifecycle.create.generate',
35
+ message: `Expected a generator name — got ${JSON.stringify(rule.generate)}`,
36
+ });
37
+ }
38
+ return;
39
+ }
40
+ }
41
+ errors.push({
42
+ path: 'lifecycle.create',
43
+ message: `Expected 'now', 'optional', { value } or { generate } — got ${JSON.stringify(rule)}`,
44
+ });
45
+ }
46
+ //# sourceMappingURL=axis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis.js","sourceRoot":"","sources":["../../../src/axis/lifecycle/axis.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAuB,MAAM,gBAAgB,CAAC;AAEnF,MAAM,CAAC,MAAM,aAAa,GAAyC;IACjE,IAAI,EAAE,WAAW;IAEjB,KAAK,CAAC,KAAK,EAAE,MAAM;QACjB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACjG,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,uCAAuC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;aAC/E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IAC1B,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;QACpB,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,SAAS,WAAW,CAAC,IAAa,EAAE,MAAyB;IAC3D,IAAI,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;QAAE,OAAO;IAC7C,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO;QAC5B,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,2BAA2B;oBACjC,OAAO,EAAE,mCAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;iBAC5E,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,+DAA+D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;KAC/F,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type EntityConstructor = abstract new (...args: any[]) => any;
2
+ export declare function toTargetThunk<E extends EntityConstructor>(target: E | (() => E)): () => E;
3
+ export declare const RELATION_KINDS: readonly ['one', 'many'];
4
+ export declare const ON_DELETE: readonly ['cascade', 'restrict', 'set null'];
5
+ export interface Relation {
6
+ to: () => EntityConstructor;
7
+ kind: (typeof RELATION_KINDS)[number];
8
+ onDelete?: (typeof ON_DELETE)[number];
9
+ }
10
+ //# sourceMappingURL=Relation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Relation.d.ts","sourceRoot":"","sources":["../../../src/axis/role/Relation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAErE,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"}
@@ -0,0 +1,6 @@
1
+ export function toTargetThunk(target) {
2
+ return 'getFields' in target ? () => target : target;
3
+ }
4
+ export const RELATION_KINDS = ['one', 'many'];
5
+ export const ON_DELETE = ['cascade', 'restrict', 'set null'];
6
+ //# sourceMappingURL=Relation.js.map
@@ -0,0 +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"}
@@ -0,0 +1,38 @@
1
+ import type { FieldGroup } from "../../constraint/FieldGroup.js";
2
+ import type { Fields } from "../../Field.js";
3
+ import type { EntityConstructor, Relation } from "./Relation.js";
4
+ export interface RoleRules {
5
+ primary?: boolean;
6
+ index?: boolean;
7
+ relation?: Relation;
8
+ rules?: ReadonlyArray<FieldGroup>;
9
+ }
10
+ export declare class Role implements RoleRules {
11
+ readonly primary?: boolean;
12
+ readonly index?: boolean;
13
+ readonly relation?: Relation;
14
+ readonly rules?: ReadonlyArray<FieldGroup>;
15
+ private constructor();
16
+ static of(field: {
17
+ role?: RoleRules;
18
+ }): Role;
19
+ get isPrimary(): boolean;
20
+ get isIndexed(): boolean;
21
+ get isCollection(): boolean;
22
+ get isReference(): boolean;
23
+ get target(): EntityConstructor | undefined;
24
+ }
25
+ /**
26
+ * The name of the field that carries `primary`, or `undefined` when none does.
27
+ *
28
+ * `Role.of(field).isPrimary` answers about ONE field; this answers about a shape, which
29
+ * is the question every reader actually had. It was the same three lines spelled five
30
+ * times — a mirror's key, a form's row identity, GraphQL's node id, the DDL's primary
31
+ * key and the ORM's `findById` column — so a shape with two primaries meant whichever
32
+ * one that loop happened to see first, five times over.
33
+ *
34
+ * The absence is answered and not defaulted: `'id'` is a fine fallback for a form and a
35
+ * lie for a DDL, so the caller decides.
36
+ */
37
+ export declare function primaryFieldOf(fields: Fields): string | undefined;
38
+ //# sourceMappingURL=Role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Role.d.ts","sourceRoot":"","sources":["../../../src/axis/role/Role.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEjE,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CACnC;AAED,qBAAa,IAAK,YAAW,SAAS;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAE3C,OAAO,eAKN;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAE3C;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,MAAM,IAAI,iBAAiB,GAAG,SAAS,CAE1C;CACF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKjE"}
@@ -0,0 +1,50 @@
1
+ export class Role {
2
+ primary;
3
+ index;
4
+ relation;
5
+ rules;
6
+ constructor(declared = {}) {
7
+ this.primary = declared.primary;
8
+ this.index = declared.index;
9
+ this.relation = declared.relation;
10
+ this.rules = declared.rules;
11
+ }
12
+ static of(field) {
13
+ return new Role(field.role);
14
+ }
15
+ get isPrimary() {
16
+ return this.primary === true;
17
+ }
18
+ get isIndexed() {
19
+ return this.index === true;
20
+ }
21
+ get isCollection() {
22
+ return this.relation?.kind === "many";
23
+ }
24
+ get isReference() {
25
+ return this.relation?.kind === "one";
26
+ }
27
+ get target() {
28
+ return this.relation?.to();
29
+ }
30
+ }
31
+ /**
32
+ * The name of the field that carries `primary`, or `undefined` when none does.
33
+ *
34
+ * `Role.of(field).isPrimary` answers about ONE field; this answers about a shape, which
35
+ * is the question every reader actually had. It was the same three lines spelled five
36
+ * times — a mirror's key, a form's row identity, GraphQL's node id, the DDL's primary
37
+ * key and the ORM's `findById` column — so a shape with two primaries meant whichever
38
+ * one that loop happened to see first, five times over.
39
+ *
40
+ * The absence is answered and not defaulted: `'id'` is a fine fallback for a form and a
41
+ * lie for a DDL, so the caller decides.
42
+ */
43
+ export function primaryFieldOf(fields) {
44
+ for (const [name, field] of Object.entries(fields)) {
45
+ if (Role.of(field).isPrimary)
46
+ return name;
47
+ }
48
+ return undefined;
49
+ }
50
+ //# sourceMappingURL=Role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Role.js","sourceRoot":"","sources":["../../../src/axis/role/Role.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,IAAI;IACN,OAAO,CAAW;IAClB,KAAK,CAAW;IAChB,QAAQ,CAAY;IACpB,KAAK,CAA6B;IAE3C,YAAoB,QAAQ,GAAc,EAAE;QAC1C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,KAA2B;QACnC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IAC/B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IAC7B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC;IACxC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC;IACvC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7B,CAAC;CACF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Axis } from '../Axis.js';
2
+ import { type RoleRules } from './Role.js';
3
+ import type { RoleDescriptor } from '../../card/Descriptor.js';
4
+ export declare const roleAxis: Axis<RoleRules, RoleDescriptor>;
5
+ //# sourceMappingURL=axis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis.d.ts","sourceRoot":"","sources":["../../../src/axis/role/axis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,YAAY,CAAC;AAIjD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CA+EpD,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { isObject, oneOfTokens, refuse } from '../../judge/form.js';
2
+ import { ON_DELETE, RELATION_KINDS } from './Relation.js';
3
+ import { FieldGroup } from '../../constraint/FieldGroup.js';
4
+ import { Unique } from '../../constraint/Unique.js';
5
+ import { registrationKeyOf } from '../../name.js';
6
+ export const roleAxis = {
7
+ slot: 'role',
8
+ judge(value, errors) {
9
+ if (!isObject(value)) {
10
+ errors.push({ path: 'role', message: `Expected an object — got ${JSON.stringify(value)}` });
11
+ return;
12
+ }
13
+ for (const flag of ['primary', 'index']) {
14
+ if (value[flag] !== undefined && typeof value[flag] !== 'boolean') {
15
+ errors.push({
16
+ path: `role.${flag}`,
17
+ message: `Expected a boolean — got ${JSON.stringify(value[flag])}`,
18
+ });
19
+ }
20
+ }
21
+ if (value.rules !== undefined) {
22
+ const legal = Array.isArray(value.rules) &&
23
+ value.rules.every((rule) => rule instanceof FieldGroup ||
24
+ (Array.isArray(rule) && rule.every((member) => typeof member === 'string')));
25
+ if (!legal) {
26
+ errors.push({
27
+ path: 'role.rules',
28
+ message: 'Expected field groups, or the member lists they denote — string[][]',
29
+ });
30
+ }
31
+ }
32
+ if (value.relation !== undefined)
33
+ judgeRelation(value.relation, errors);
34
+ },
35
+ describe(role, key) {
36
+ const out = {};
37
+ if (role.primary)
38
+ out.primary = true;
39
+ const unique = (role.rules ?? []).filter((rule) => rule instanceof Unique);
40
+ if (unique.length)
41
+ out.unique = unique.map((rule) => [...rule.resolvedOn(key).members]);
42
+ if (role.index)
43
+ out.index = true;
44
+ if (role.relation) {
45
+ const target = role.relation.to();
46
+ out.relation = {
47
+ to: registrationKeyOf(target.name ?? ''),
48
+ kind: role.relation.kind,
49
+ ...(role.relation.onDelete ? { onDelete: role.relation.onDelete } : {}),
50
+ };
51
+ }
52
+ return Object.keys(out).length ? out : undefined;
53
+ },
54
+ reconstruct(wire, resolve) {
55
+ const out = {};
56
+ if (wire.primary)
57
+ out.primary = true;
58
+ if (wire.unique?.length)
59
+ out.rules = wire.unique.map((group) => new Unique(group));
60
+ if (wire.index)
61
+ out.index = true;
62
+ if (wire.relation) {
63
+ // `judge` cannot serve here: it demands a thunk where a card carries a name.
64
+ if (!oneOfTokens(wire.relation.kind, RELATION_KINDS)) {
65
+ refuse(`role.relation.kind is ${JSON.stringify(wire.relation.kind)}`, `Expected one of ${RELATION_KINDS.join(', ')}.`);
66
+ }
67
+ if (wire.relation.onDelete !== undefined && !oneOfTokens(wire.relation.onDelete, ON_DELETE)) {
68
+ refuse(`role.relation.onDelete is ${JSON.stringify(wire.relation.onDelete)}`, `Expected one of ${ON_DELETE.join(', ')}.`);
69
+ }
70
+ const name = wire.relation.to;
71
+ out.relation = {
72
+ to: () => (resolve?.(name) ?? { name }),
73
+ kind: wire.relation.kind,
74
+ ...(wire.relation.onDelete ? { onDelete: wire.relation.onDelete } : {}),
75
+ };
76
+ }
77
+ return out;
78
+ },
79
+ };
80
+ function judgeRelation(relation, errors) {
81
+ if (!isObject(relation)) {
82
+ errors.push({ path: 'role.relation', message: `Expected an object — got ${JSON.stringify(relation)}` });
83
+ return;
84
+ }
85
+ if (!oneOfTokens(relation.kind, RELATION_KINDS)) {
86
+ errors.push({
87
+ path: 'role.relation.kind',
88
+ message: `Expected 'one' or 'many' — got ${JSON.stringify(relation.kind)}`,
89
+ });
90
+ }
91
+ if (typeof relation.to !== 'function') {
92
+ errors.push({ path: 'role.relation.to', message: 'Expected a thunk returning the target entity' });
93
+ }
94
+ if (relation.onDelete !== undefined && !oneOfTokens(relation.onDelete, ON_DELETE)) {
95
+ errors.push({
96
+ path: 'role.relation.onDelete',
97
+ message: `Expected 'cascade', 'restrict' or 'set null' — got ${JSON.stringify(relation.onDelete)}`,
98
+ });
99
+ }
100
+ }
101
+ //# sourceMappingURL=axis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis.js","sourceRoot":"","sources":["../../../src/axis/role/axis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type StringFormat = 'date-time' | 'date' | 'time' | 'email' | 'uuid' | 'uri' | (string & {});
2
+ export type FormatPredicate = (value: string) => boolean;
3
+ export declare class Formats {
4
+ private static readonly registry;
5
+ static register(name: string, predicate: FormatPredicate): void;
6
+ static resolve(name: string): FormatPredicate | undefined;
7
+ }
8
+ //# sourceMappingURL=Formats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Formats.d.ts","sourceRoot":"","sources":["../../../src/axis/shape/Formats.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,GACL,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAEzD,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAEtE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,IAAI,CAE9D;IAED,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAExD;CACF"}