@fougere/schema 0.12.1-alpha.0 → 0.12.2-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 (246) hide show
  1. package/dist/FougereFieldAxes.d.ts.map +1 -0
  2. package/dist/FougereFieldAxes.js.map +1 -0
  3. package/dist/Schema.d.ts +4 -3
  4. package/dist/Schema.d.ts.map +1 -1
  5. package/dist/Schema.js +3 -0
  6. package/dist/Schema.js.map +1 -1
  7. package/dist/SchemaConstraints.d.ts +13 -10
  8. package/dist/SchemaConstraints.d.ts.map +1 -1
  9. package/dist/SchemaConstraints.js +32 -20
  10. package/dist/SchemaConstraints.js.map +1 -1
  11. package/dist/SchemaDefinition.d.ts.map +1 -1
  12. package/dist/SchemaDefinition.js +6 -5
  13. package/dist/SchemaDefinition.js.map +1 -1
  14. package/dist/SchemaError.d.ts +4 -1
  15. package/dist/SchemaError.d.ts.map +1 -1
  16. package/dist/SchemaError.js +5 -2
  17. package/dist/SchemaError.js.map +1 -1
  18. package/dist/SchemaView.d.ts +3 -2
  19. package/dist/SchemaView.d.ts.map +1 -1
  20. package/dist/axis/Axes.d.ts +1 -1
  21. package/dist/axis/Axes.js +3 -3
  22. package/dist/axis/Axis.d.ts +12 -2
  23. package/dist/axis/Axis.d.ts.map +1 -1
  24. package/dist/axis/boundary/Boundary.d.ts +9 -2
  25. package/dist/axis/boundary/Boundary.d.ts.map +1 -1
  26. package/dist/axis/boundary/Boundary.js +6 -2
  27. package/dist/axis/boundary/Boundary.js.map +1 -1
  28. package/dist/axis/boundary/Decoder.js.map +1 -1
  29. package/dist/axis/lifecycle/Lifecycle.d.ts +13 -4
  30. package/dist/axis/lifecycle/Lifecycle.d.ts.map +1 -1
  31. package/dist/axis/lifecycle/Lifecycle.js +8 -4
  32. package/dist/axis/lifecycle/Lifecycle.js.map +1 -1
  33. package/dist/axis/lifecycle/apply.js +1 -1
  34. package/dist/axis/lifecycle/apply.js.map +1 -1
  35. package/dist/axis/role/Role.d.ts +17 -10
  36. package/dist/axis/role/Role.d.ts.map +1 -1
  37. package/dist/axis/role/Role.js +30 -10
  38. package/dist/axis/role/Role.js.map +1 -1
  39. package/dist/axis/shape/Shape.d.ts +32 -9
  40. package/dist/axis/shape/Shape.d.ts.map +1 -1
  41. package/dist/axis/shape/Shape.js +43 -12
  42. package/dist/axis/shape/Shape.js.map +1 -1
  43. package/dist/axis/shape/ShapeFormat.d.ts +10 -0
  44. package/dist/axis/shape/ShapeFormat.d.ts.map +1 -0
  45. package/dist/axis/shape/ShapeFormat.js +32 -0
  46. package/dist/axis/shape/ShapeFormat.js.map +1 -0
  47. package/dist/entity/EntityDeclarations.d.ts +3 -2
  48. package/dist/entity/EntityDeclarations.d.ts.map +1 -1
  49. package/dist/entity/FieldGroups.d.ts +9 -0
  50. package/dist/entity/FieldGroups.d.ts.map +1 -0
  51. package/dist/entity/FieldGroups.js +2 -0
  52. package/dist/entity/FieldGroups.js.map +1 -0
  53. package/dist/field/Field.d.ts +35 -16
  54. package/dist/field/Field.d.ts.map +1 -1
  55. package/dist/field/Field.js +53 -8
  56. package/dist/field/Field.js.map +1 -1
  57. package/dist/field/FieldFormat.d.ts +1 -1
  58. package/dist/field/FieldFormat.js +4 -4
  59. package/dist/field/FieldFormat.js.map +1 -1
  60. package/dist/field/FieldSet.d.ts +12 -3
  61. package/dist/field/FieldSet.d.ts.map +1 -1
  62. package/dist/field/FieldSet.js +22 -15
  63. package/dist/field/FieldSet.js.map +1 -1
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/lib/Format.d.ts +21 -2
  68. package/dist/lib/Format.d.ts.map +1 -1
  69. package/dist/lib/Format.js +31 -3
  70. package/dist/lib/Format.js.map +1 -1
  71. package/dist/lib/UnionToIntersection.d.ts +7 -0
  72. package/dist/lib/UnionToIntersection.d.ts.map +1 -0
  73. package/dist/lib/UnionToIntersection.js +2 -0
  74. package/dist/lib/UnionToIntersection.js.map +1 -0
  75. package/dist/lib/utils.d.ts +1 -1
  76. package/dist/lib/utils.d.ts.map +1 -1
  77. package/dist/lib/utils.js +1 -1
  78. package/dist/lib/utils.js.map +1 -1
  79. package/dist/projection/Cases.d.ts +1 -1
  80. package/dist/projection/Cases.d.ts.map +1 -1
  81. package/dist/projection/Cases.js +20 -8
  82. package/dist/projection/Cases.js.map +1 -1
  83. package/dist/projection/Visibility.d.ts.map +1 -1
  84. package/dist/projection/Visibility.js +6 -6
  85. package/dist/projection/Visibility.js.map +1 -1
  86. package/dist/projection/card/Bundle.d.ts.map +1 -1
  87. package/dist/projection/card/Bundle.js.map +1 -1
  88. package/dist/projection/card/Card.d.ts.map +1 -1
  89. package/dist/projection/card/Card.js +21 -30
  90. package/dist/projection/card/Card.js.map +1 -1
  91. package/dist/projection/card/CardForms.js +1 -1
  92. package/dist/projection/card/Diff.js.map +1 -1
  93. package/dist/projection/card/FieldExtension.d.ts +2 -2
  94. package/dist/projection/card/FieldExtension.d.ts.map +1 -1
  95. package/dist/projection/card/RoleDescriptor.d.ts +7 -2
  96. package/dist/projection/card/RoleDescriptor.d.ts.map +1 -1
  97. package/dist/projection/card/RoleDescriptor.js +2 -2
  98. package/dist/projection/card/RoleDescriptor.js.map +1 -1
  99. package/dist/projection/card/ShapeKeywords.d.ts +1 -1
  100. package/dist/projection/card/ShapeKeywords.d.ts.map +1 -1
  101. package/dist/validator/FieldDeclarationValidator.d.ts.map +1 -1
  102. package/dist/validator/FieldDeclarationValidator.js +7 -10
  103. package/dist/validator/FieldDeclarationValidator.js.map +1 -1
  104. package/dist/validator/FieldValueValidator.d.ts.map +1 -1
  105. package/dist/validator/FieldValueValidator.js +0 -2
  106. package/dist/validator/FieldValueValidator.js.map +1 -1
  107. package/dist/validator/InputValidator.d.ts +7 -1
  108. package/dist/validator/InputValidator.d.ts.map +1 -1
  109. package/dist/validator/InputValidator.js +15 -14
  110. package/dist/validator/InputValidator.js.map +1 -1
  111. package/dist/vocabulary/preset/created.d.ts +2 -2
  112. package/dist/vocabulary/preset/created.d.ts.map +1 -1
  113. package/dist/vocabulary/preset/created.js +2 -2
  114. package/dist/vocabulary/preset/created.js.map +1 -1
  115. package/dist/vocabulary/preset/updated.d.ts +2 -2
  116. package/dist/vocabulary/preset/updated.d.ts.map +1 -1
  117. package/dist/vocabulary/preset/updated.js +2 -2
  118. package/dist/vocabulary/preset/updated.js.map +1 -1
  119. package/dist/vocabulary/primitive/bool.d.ts +2 -5
  120. package/dist/vocabulary/primitive/bool.d.ts.map +1 -1
  121. package/dist/vocabulary/primitive/bool.js +1 -5
  122. package/dist/vocabulary/primitive/bool.js.map +1 -1
  123. package/dist/vocabulary/primitive/date.d.ts +2 -3
  124. package/dist/vocabulary/primitive/date.d.ts.map +1 -1
  125. package/dist/vocabulary/primitive/date.js +2 -3
  126. package/dist/vocabulary/primitive/date.js.map +1 -1
  127. package/dist/vocabulary/primitive/json.d.ts +3 -3
  128. package/dist/vocabulary/primitive/json.d.ts.map +1 -1
  129. package/dist/vocabulary/primitive/json.js +11 -11
  130. package/dist/vocabulary/primitive/json.js.map +1 -1
  131. package/dist/vocabulary/primitive/list.d.ts +6 -5
  132. package/dist/vocabulary/primitive/list.d.ts.map +1 -1
  133. package/dist/vocabulary/primitive/list.js +13 -7
  134. package/dist/vocabulary/primitive/list.js.map +1 -1
  135. package/dist/vocabulary/primitive/many.d.ts +2 -4
  136. package/dist/vocabulary/primitive/many.d.ts.map +1 -1
  137. package/dist/vocabulary/primitive/many.js +2 -4
  138. package/dist/vocabulary/primitive/many.js.map +1 -1
  139. package/dist/vocabulary/primitive/number.d.ts +2 -4
  140. package/dist/vocabulary/primitive/number.d.ts.map +1 -1
  141. package/dist/vocabulary/primitive/number.js +1 -3
  142. package/dist/vocabulary/primitive/number.js.map +1 -1
  143. package/dist/vocabulary/primitive/oneOf.d.ts +4 -7
  144. package/dist/vocabulary/primitive/oneOf.d.ts.map +1 -1
  145. package/dist/vocabulary/primitive/oneOf.js +19 -11
  146. package/dist/vocabulary/primitive/oneOf.js.map +1 -1
  147. package/dist/vocabulary/primitive/primary.d.ts +2 -2
  148. package/dist/vocabulary/primitive/primary.d.ts.map +1 -1
  149. package/dist/vocabulary/primitive/primary.js +2 -3
  150. package/dist/vocabulary/primitive/primary.js.map +1 -1
  151. package/dist/vocabulary/primitive/ref.d.ts +2 -6
  152. package/dist/vocabulary/primitive/ref.d.ts.map +1 -1
  153. package/dist/vocabulary/primitive/ref.js +1 -1
  154. package/dist/vocabulary/primitive/ref.js.map +1 -1
  155. package/dist/vocabulary/primitive/text.d.ts +2 -4
  156. package/dist/vocabulary/primitive/text.d.ts.map +1 -1
  157. package/dist/vocabulary/primitive/text.js +1 -3
  158. package/dist/vocabulary/primitive/text.js.map +1 -1
  159. package/dist/vocabulary/rule/nullable.d.ts +0 -1
  160. package/dist/vocabulary/rule/nullable.d.ts.map +1 -1
  161. package/dist/vocabulary/rule/nullable.js +0 -1
  162. package/dist/vocabulary/rule/nullable.js.map +1 -1
  163. package/dist/vocabulary/rule/optional.d.ts +0 -1
  164. package/dist/vocabulary/rule/optional.d.ts.map +1 -1
  165. package/dist/vocabulary/rule/optional.js +0 -1
  166. package/dist/vocabulary/rule/optional.js.map +1 -1
  167. package/dist/vocabulary/rule/readOnly.d.ts +0 -2
  168. package/dist/vocabulary/rule/readOnly.d.ts.map +1 -1
  169. package/dist/vocabulary/rule/readOnly.js +0 -2
  170. package/dist/vocabulary/rule/readOnly.js.map +1 -1
  171. package/dist/vocabulary/rule/writeOnly.d.ts +0 -2
  172. package/dist/vocabulary/rule/writeOnly.d.ts.map +1 -1
  173. package/dist/vocabulary/rule/writeOnly.js +0 -2
  174. package/dist/vocabulary/rule/writeOnly.js.map +1 -1
  175. package/dist/vocabulary/vocabulary.d.ts +2 -3
  176. package/dist/vocabulary/vocabulary.d.ts.map +1 -1
  177. package/dist/vocabulary/vocabulary.js +17 -21
  178. package/dist/vocabulary/vocabulary.js.map +1 -1
  179. package/package.json +1 -1
  180. package/src/Schema.ts +11 -8
  181. package/src/SchemaConstraints.ts +40 -22
  182. package/src/SchemaDefinition.ts +7 -5
  183. package/src/SchemaError.ts +8 -2
  184. package/src/SchemaView.ts +3 -2
  185. package/src/axis/Axes.ts +3 -3
  186. package/src/axis/Axis.ts +13 -2
  187. package/src/axis/boundary/Boundary.ts +16 -2
  188. package/src/axis/boundary/Decoder.ts +2 -0
  189. package/src/axis/lifecycle/Lifecycle.ts +15 -4
  190. package/src/axis/lifecycle/apply.ts +1 -1
  191. package/src/axis/role/Role.ts +41 -9
  192. package/src/axis/shape/Shape.ts +89 -23
  193. package/src/axis/shape/ShapeFormat.ts +37 -0
  194. package/src/entity/EntityDeclarations.ts +3 -2
  195. package/src/entity/FieldGroups.ts +9 -0
  196. package/src/field/Field.ts +84 -21
  197. package/src/field/FieldFormat.ts +5 -5
  198. package/src/field/FieldSet.ts +27 -19
  199. package/src/index.ts +1 -0
  200. package/src/lib/Format.ts +36 -3
  201. package/src/lib/UnionToIntersection.ts +10 -0
  202. package/src/lib/utils.ts +5 -1
  203. package/src/projection/Cases.ts +25 -8
  204. package/src/projection/Visibility.ts +9 -6
  205. package/src/projection/card/Bundle.ts +2 -0
  206. package/src/projection/card/Card.ts +26 -27
  207. package/src/projection/card/CardForms.ts +1 -1
  208. package/src/projection/card/Diff.ts +4 -0
  209. package/src/projection/card/FieldExtension.ts +2 -2
  210. package/src/projection/card/RoleDescriptor.ts +9 -4
  211. package/src/projection/card/ShapeKeywords.ts +1 -1
  212. package/src/validator/FieldDeclarationValidator.ts +7 -10
  213. package/src/validator/FieldValueValidator.ts +3 -1
  214. package/src/validator/InputValidator.ts +17 -12
  215. package/src/vocabulary/preset/created.ts +3 -3
  216. package/src/vocabulary/preset/updated.ts +4 -3
  217. package/src/vocabulary/primitive/bool.ts +3 -8
  218. package/src/vocabulary/primitive/date.ts +5 -4
  219. package/src/vocabulary/primitive/json.ts +27 -12
  220. package/src/vocabulary/primitive/list.ts +16 -9
  221. package/src/vocabulary/primitive/many.ts +3 -4
  222. package/src/vocabulary/primitive/number.ts +3 -8
  223. package/src/vocabulary/primitive/oneOf.ts +40 -24
  224. package/src/vocabulary/primitive/primary.ts +9 -5
  225. package/src/vocabulary/primitive/ref.ts +3 -7
  226. package/src/vocabulary/primitive/text.ts +3 -8
  227. package/src/vocabulary/rule/nullable.ts +0 -1
  228. package/src/vocabulary/rule/optional.ts +0 -1
  229. package/src/vocabulary/rule/readOnly.ts +0 -2
  230. package/src/vocabulary/rule/writeOnly.ts +0 -2
  231. package/src/vocabulary/vocabulary.ts +18 -22
  232. package/dist/entity/CompositeUnique.d.ts +0 -4
  233. package/dist/entity/CompositeUnique.d.ts.map +0 -1
  234. package/dist/entity/CompositeUnique.js +0 -2
  235. package/dist/entity/CompositeUnique.js.map +0 -1
  236. package/dist/field/FougereFieldAxes.d.ts.map +0 -1
  237. package/dist/field/FougereFieldAxes.js.map +0 -1
  238. package/dist/field/Meta.d.ts +0 -6
  239. package/dist/field/Meta.d.ts.map +0 -1
  240. package/dist/field/Meta.js +0 -3
  241. package/dist/field/Meta.js.map +0 -1
  242. package/src/entity/CompositeUnique.ts +0 -6
  243. package/src/field/Meta.ts +0 -5
  244. /package/dist/{field/FougereFieldAxes.d.ts → FougereFieldAxes.d.ts} +0 -0
  245. /package/dist/{field/FougereFieldAxes.js → FougereFieldAxes.js} +0 -0
  246. /package/src/{field/FougereFieldAxes.ts → FougereFieldAxes.ts} +0 -0
@@ -1,5 +1,6 @@
1
1
  import type { Relation } from './Relation.js';
2
2
  import type { EntityConstructor } from './EntityConstructor.js';
3
+ import type { ValidationError } from '../../lib/ValidationError.js';
3
4
  import { Format, type Accepted } from '../../lib/Format.js';
4
5
  export declare class Role {
5
6
  private readonly rules;
@@ -13,25 +14,31 @@ export declare class Role {
13
14
  } | undefined;
14
15
  unique?: boolean | undefined;
15
16
  }>;
16
- static refusals(value: unknown): {
17
- path: string[];
18
- message: string;
19
- }[];
17
+ static refusals(value: unknown, declaration?: Record<string, unknown>): ValidationError[];
20
18
  private constructor();
19
+ /** A collection has no column: the far side of the relation carries the key. */
20
+ static admitsAbsence(field: {
21
+ role?: RoleRules;
22
+ }): boolean;
21
23
  static of(field: {
22
24
  role?: RoleRules;
23
25
  }): Role;
24
- get isPrimary(): boolean;
25
- get isIndexed(): boolean;
26
+ isPrimary(): boolean;
27
+ isIndexed(): boolean;
26
28
  /** A field unique on its own. A group spanning several belongs to the schema. */
27
- get isUnique(): boolean;
28
- get isCollection(): boolean;
29
- get isReference(): boolean;
29
+ isUnique(): boolean;
30
+ isCollection(): boolean;
31
+ isReference(): boolean;
30
32
  /** Either kind — what a CLI flag and a GraphQL selection both leave out. */
31
- get isRelation(): boolean;
33
+ isRelation(): boolean;
32
34
  /** Calls `() => Post` so no caller has to. */
33
35
  get target(): EntityConstructor | undefined;
34
36
  get onDelete(): Relation['onDelete'];
35
37
  }
36
38
  export type RoleRules = Accepted<typeof Role.format>;
39
+ declare module '../../FougereFieldAxes.js' {
40
+ interface FougereFieldAxes {
41
+ readonly role?: RoleRules;
42
+ }
43
+ }
37
44
  //# sourceMappingURL=Role.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Role.d.ts","sourceRoot":"","sources":["../../../src/axis/role/Role.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG5D,qBAAa,IAAI;IAuBK,OAAO,CAAC,QAAQ,CAAC,KAAK;IAtB1C,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;sBAOoB,iBAAiB;;;OAM/C;IAEZ,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO;;;QAK7B;IAED,OAAO,eAAuD;IAE9D,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,iFAAiF;IACjF,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,4EAA4E;IAC5E,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,8CAA8C;IAC9C,IAAI,MAAM,IAAI,iBAAiB,GAAG,SAAS,CAE1C;IAED,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,CAEnC;CACF;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"Role.d.ts","sourceRoot":"","sources":["../../../src/axis/role/Role.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG5D,qBAAa,IAAI;IA0CK,OAAO,CAAC,QAAQ,CAAC,KAAK;IAzC1C,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;sBAOoB,iBAAiB;;;OAM/C;IAEZ,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,eAAe,EAAE,CAwB5F;IAED,OAAO,eAAuD;IAE9D,gFAAgF;IAChF,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAEzD;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAE3C;IAED,SAAS,IAAI,OAAO,CAEnB;IAED,SAAS,IAAI,OAAO,CAEnB;IAED,iFAAiF;IACjF,QAAQ,IAAI,OAAO,CAElB;IAED,YAAY,IAAI,OAAO,CAEtB;IAED,WAAW,IAAI,OAAO,CAErB;IAED,4EAA4E;IAC5E,UAAU,IAAI,OAAO,CAEpB;IAED,8CAA8C;IAC9C,IAAI,MAAM,IAAI,iBAAiB,GAAG,SAAS,CAE1C;IAED,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,CAEnC;CACF;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AAErD,OAAO,QAAQ,2BAA2B,CAAC;IACzC,UAAU,gBAAgB;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;KAC3B;CACF"}
@@ -1,4 +1,5 @@
1
1
  import { isObject } from '../../lib/utils.js';
2
+ import { Shapes } from '../shape/Shape.js';
2
3
  import { Format } from '../../lib/Format.js';
3
4
  import { ON_DELETE, RELATION_KINDS } from './Relation.js';
4
5
  export class Role {
@@ -14,36 +15,55 @@ export class Role {
14
15
  .needs('to', 'kind')
15
16
  .closed())
16
17
  .closed();
17
- static refusals(value) {
18
+ static refusals(value, declaration = {}) {
19
+ const role = Role.of({ role: isObject(value) ? value : undefined });
20
+ const errors = [];
18
21
  const relation = isObject(value) ? value.relation : undefined;
19
- if (!isObject(relation) || !('to' in relation) || typeof relation.to === 'function')
20
- return [];
21
- return [{ path: ['role', 'relation', 'to'], message: 'Expected a function returning the target entity, such as () => Post' }];
22
+ if (isObject(relation) && 'to' in relation && typeof relation.to !== 'function')
23
+ errors.push({
24
+ path: ['role', 'relation', 'to'],
25
+ message: 'Expected a function returning the target entity, such as () => Post',
26
+ });
27
+ if (role.isPrimary() && Shapes.isNullable(declaration.shape))
28
+ errors.push({
29
+ path: ['role', 'primary'],
30
+ message: 'A primary key admits no null — a row is addressed by it',
31
+ });
32
+ if (role.isCollection() && (role.isUnique() || role.isIndexed()))
33
+ errors.push({
34
+ path: ['role', role.isUnique() ? 'unique' : 'index'],
35
+ message: 'A collection has no column of its own, so there is nothing to index',
36
+ });
37
+ return errors;
22
38
  }
23
39
  constructor(rules = {}) {
24
40
  this.rules = rules;
25
41
  }
42
+ /** A collection has no column: the far side of the relation carries the key. */
43
+ static admitsAbsence(field) {
44
+ return this.of(field).isCollection();
45
+ }
26
46
  static of(field) {
27
47
  return new Role(field.role);
28
48
  }
29
- get isPrimary() {
49
+ isPrimary() {
30
50
  return this.rules.primary === true;
31
51
  }
32
- get isIndexed() {
52
+ isIndexed() {
33
53
  return this.rules.index === true;
34
54
  }
35
55
  /** A field unique on its own. A group spanning several belongs to the schema. */
36
- get isUnique() {
56
+ isUnique() {
37
57
  return this.rules.unique === true;
38
58
  }
39
- get isCollection() {
59
+ isCollection() {
40
60
  return this.rules.relation?.kind === 'many';
41
61
  }
42
- get isReference() {
62
+ isReference() {
43
63
  return this.rules.relation?.kind === 'one';
44
64
  }
45
65
  /** Either kind — what a CLI flag and a GraphQL selection both leave out. */
46
- get isRelation() {
66
+ isRelation() {
47
67
  return this.rules.relation !== undefined;
48
68
  }
49
69
  /** Calls `() => Post` so no caller has to. */
@@ -1 +1 @@
1
- {"version":3,"file":"Role.js","sourceRoot":"","sources":["../../../src/axis/role/Role.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAiB,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,OAAO,IAAI;IAuBsB,KAAK;IAtB1C,MAAM,CAAU,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC;SAC5C,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC;SAC3B,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;SACzB,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;SAC1B,GAAG,CACF,UAAU,EACV,MAAM,CAAC,EAAE,EAAE;SACR,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAA2B,CAAC;SACxD,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;SAC1C,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;SACzC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;SACnB,MAAM,EAAE,CACZ;SACA,MAAM,EAAE,CAAC;IAEZ,MAAM,CAAC,QAAQ,CAAC,KAAc;QAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,EAAE,CAAC;QAE/F,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,qEAAqE,EAAE,CAAC,CAAC;IAChI,CAAC;IAED,YAAqC,KAAK,GAAc,EAAE;qBAArB,KAAK;IAAmB,CAAC;IAE9D,MAAM,CAAC,EAAE,CAAC,KAA2B;QACnC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;IACrC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IACnC,CAAC;IAED,iFAAiF;IACjF,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;IACpC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC;IAC9C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC;IAC7C,CAAC;IAED,4EAA4E;IAC5E,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC;IAC3C,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACvC,CAAC;CACF"}
1
+ {"version":3,"file":"Role.js","sourceRoot":"","sources":["../../../src/axis/role/Role.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,28 @@
1
1
  import type { StringFormat } from './StringFormat.js';
2
2
  import type { ShapeType } from './ShapeType.js';
3
3
  type Nullably<T extends string> = T | readonly [T, 'null'];
4
- interface StringConstraints {
4
+ /** The sentence a field carries, where JSON Schema already holds one. */
5
+ interface Documented {
6
+ description?: string;
7
+ }
8
+ interface StringConstraints extends Documented {
5
9
  minLength?: number;
6
10
  maxLength?: number;
7
11
  pattern?: string;
8
12
  enum?: readonly (string | null)[];
9
13
  format?: StringFormat;
10
14
  }
11
- interface NumericConstraints {
15
+ interface NumericConstraints extends Documented {
12
16
  minimum?: number;
13
17
  maximum?: number;
18
+ enum?: readonly (number | null)[];
14
19
  }
15
- interface ArrayConstraints {
20
+ interface ArrayConstraints extends Documented {
16
21
  items?: Shape;
17
22
  minItems?: number;
18
23
  maxItems?: number;
19
24
  }
20
- interface ObjectConstraints {
25
+ interface ObjectConstraints extends Documented {
21
26
  properties?: Record<string, unknown>;
22
27
  required?: readonly string[];
23
28
  additionalProperties?: boolean | Shape;
@@ -27,20 +32,21 @@ export type Shape = ({
27
32
  type: Nullably<'string'>;
28
33
  } & StringConstraints) | ({
29
34
  type: Nullably<'number'> | Nullably<'integer'>;
30
- } & NumericConstraints) | {
35
+ } & NumericConstraints) | ({
31
36
  type: Nullably<'boolean'>;
32
- } | ({
37
+ } & Documented) | ({
33
38
  type: Nullably<'array'>;
34
39
  } & ArrayConstraints) | ({
35
40
  type: Nullably<'object'>;
36
41
  } & ObjectConstraints);
42
+ export declare const SHAPE_TYPES: readonly ['string', 'number', 'integer', 'boolean', 'array', 'object'];
37
43
  type BaseShape = ({
38
44
  type: 'string';
39
45
  } & StringConstraints) | ({
40
46
  type: 'number' | 'integer';
41
- } & NumericConstraints) | {
47
+ } & NumericConstraints) | ({
42
48
  type: 'boolean';
43
- } | ({
49
+ } & Documented) | ({
44
50
  type: 'array';
45
51
  } & ArrayConstraints) | ({
46
52
  type: 'object';
@@ -52,7 +58,6 @@ interface ShapeParts {
52
58
  export declare class Shapes {
53
59
  private static readonly cache;
54
60
  private static readonly none;
55
- static is(value: unknown): value is Shape;
56
61
  /**
57
62
  * Every `pattern` a shape states, the nested ones included — `items`, `properties`.
58
63
  *
@@ -61,9 +66,27 @@ export declare class Shapes {
61
66
  */
62
67
  static patterns(shape: unknown): string[];
63
68
  private static collectPatterns;
69
+ /**
70
+ * `null` enters the grammar, and every constraint stays. It is added when it is ABSENT,
71
+ * read off the shape rather than assumed from its form — a shape already stating it comes
72
+ * back as itself, so `optional(nullable(text()))` does the work once.
73
+ *
74
+ * `enum` is widened TOO, because JSON Schema checks it apart from `type`: a shape saying
75
+ * `['string','null']` and `enum: ['draft','live']` calls null a legal type and not a legal
76
+ * value, and the engine answers `Instance does not match any of ["draft","live"]`.
77
+ *
78
+ * `{ type: 'string', minLength: 3 }` → `{ type: ['string','null'], minLength: 3 }`
79
+ * `{ type: 'string', enum: ['draft'] }` → `{ type: ['string','null'], enum: ['draft', null] }`
80
+ */
64
81
  static nullable(shape: Shape): Shape;
65
82
  static of(shape?: Shape): ShapeParts;
66
83
  static isNullable(shape?: Shape): boolean;
84
+ /**
85
+ * A value that came in as text — a form control, a command-line flag — read as the shape
86
+ * declares it. What does not read that way stays as it came, for the judge to refuse by name.
87
+ * `fromText({ type: 'integer' }, '12')` → `12`, and `fromText({ type: 'integer' }, 'abc')` → `'abc'`
88
+ */
89
+ static fromText(shape: Shape | undefined, value: unknown): unknown;
67
90
  /**
68
91
  * `shape.type` read off the base, except that a `string` answers `date` or `choice`.
69
92
  * FR : `shape.type` lu sur la base, sauf qu'une chaîne répond `date` ou `choice`.
@@ -1 +1 @@
1
- {"version":3,"file":"Shape.d.ts","sourceRoot":"","sources":["../../../src/axis/shape/Shape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Shape.d.ts","sourceRoot":"","sources":["../../../src/axis/shape/Shape.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,16 @@
1
- const SHAPE_TYPES = ['string', 'number', 'integer', 'boolean', 'array', 'object'];
1
+ export const SHAPE_TYPES = [
2
+ 'string',
3
+ 'number',
4
+ 'integer',
5
+ 'boolean',
6
+ 'array',
7
+ 'object',
8
+ ];
9
+ /** Every type name a shape states, whether it states one or a union of them. */
10
+ const typesOf = (shape) => (Array.isArray(shape.type) ? shape.type : [shape.type]);
2
11
  export class Shapes {
3
12
  static cache = new WeakMap();
4
13
  static none = { base: undefined, nullable: false };
5
- static is(value) {
6
- if (typeof value !== 'object' || value === null)
7
- return false;
8
- const type = value.type;
9
- const names = Array.isArray(type) ? type : [type];
10
- return (names.some((name) => SHAPE_TYPES.includes(name)) &&
11
- names.every((name) => name === 'null' || SHAPE_TYPES.includes(name)));
12
- }
13
14
  /**
14
15
  * Every `pattern` a shape states, the nested ones included — `items`, `properties`.
15
16
  *
@@ -35,12 +36,28 @@ export class Shapes {
35
36
  for (const member of Object.values(value))
36
37
  Shapes.collectPatterns(member, found);
37
38
  }
39
+ /**
40
+ * `null` enters the grammar, and every constraint stays. It is added when it is ABSENT,
41
+ * read off the shape rather than assumed from its form — a shape already stating it comes
42
+ * back as itself, so `optional(nullable(text()))` does the work once.
43
+ *
44
+ * `enum` is widened TOO, because JSON Schema checks it apart from `type`: a shape saying
45
+ * `['string','null']` and `enum: ['draft','live']` calls null a legal type and not a legal
46
+ * value, and the engine answers `Instance does not match any of ["draft","live"]`.
47
+ *
48
+ * `{ type: 'string', minLength: 3 }` → `{ type: ['string','null'], minLength: 3 }`
49
+ * `{ type: 'string', enum: ['draft'] }` → `{ type: ['string','null'], enum: ['draft', null] }`
50
+ */
38
51
  static nullable(shape) {
39
- if (Array.isArray(shape.type))
52
+ const types = typesOf(shape);
53
+ if (types.includes('null'))
40
54
  return shape;
41
- const nullable = { ...shape, type: [shape.type, 'null'] };
55
+ const nullable = { ...shape, type: [...types, 'null'] };
42
56
  if ('enum' in nullable && nullable.enum && !nullable.enum.includes(null)) {
43
- nullable.enum = [...nullable.enum, null];
57
+ nullable.enum = [
58
+ ...nullable.enum,
59
+ null,
60
+ ];
44
61
  }
45
62
  return nullable;
46
63
  }
@@ -67,6 +84,20 @@ export class Shapes {
67
84
  static isNullable(shape) {
68
85
  return this.of(shape).nullable;
69
86
  }
87
+ /**
88
+ * A value that came in as text — a form control, a command-line flag — read as the shape
89
+ * declares it. What does not read that way stays as it came, for the judge to refuse by name.
90
+ * `fromText({ type: 'integer' }, '12')` → `12`, and `fromText({ type: 'integer' }, 'abc')` → `'abc'`
91
+ */
92
+ static fromText(shape, value) {
93
+ const type = this.of(shape).base?.type;
94
+ if ((type !== 'number' && type !== 'integer') ||
95
+ typeof value !== 'string' ||
96
+ value === '')
97
+ return value;
98
+ const number = Number(value);
99
+ return Number.isFinite(number) ? number : value;
100
+ }
70
101
  /**
71
102
  * `shape.type` read off the base, except that a `string` answers `date` or `choice`.
72
103
  * FR : `shape.type` lu sur la base, sauf qu'une chaîne répond `date` ou `choice`.
@@ -1 +1 @@
1
- {"version":3,"file":"Shape.js","sourceRoot":"","sources":["../../../src/axis/shape/Shape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Shape.js","sourceRoot":"","sources":["../../../src/axis/shape/Shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Format } from '../../lib/Format.js';
2
+ import { type Shape } from './Shape.js';
3
+ /**
4
+ * What a shape may state — JSON Schema's own keywords, less the ones this package has no word
5
+ * for. `shape` used to be the one key of a field declaration nothing judged, so `minLenght: 1`
6
+ * passed and was dropped where `lifecycle: { craete: 'now' }` had been refused since `Format`.
7
+ * `properties` stays open because a projection folds `meta.description` into it.
8
+ */
9
+ export declare const SHAPE_FORMAT: Format<Shape>;
10
+ //# sourceMappingURL=ShapeFormat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShapeFormat.d.ts","sourceRoot":"","sources":["../../../src/axis/shape/ShapeFormat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAUrD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAmBX,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { Format } from '../../lib/Format.js';
2
+ import { SHAPE_TYPES } from './Shape.js';
3
+ const SHAPE = 'field/shape';
4
+ /** A word, or that word beside `null` — the second place is what makes a shape nullable. */
5
+ const TYPE = Format.either(Format.tokens(SHAPE_TYPES), Format.tuple(Format.tokens(SHAPE_TYPES), Format.tokens(['null'])));
6
+ /**
7
+ * What a shape may state — JSON Schema's own keywords, less the ones this package has no word
8
+ * for. `shape` used to be the one key of a field declaration nothing judged, so `minLenght: 1`
9
+ * passed and was dropped where `lifecycle: { craete: 'now' }` had been refused since `Format`.
10
+ * `properties` stays open because a projection folds `meta.description` into it.
11
+ */
12
+ export const SHAPE_FORMAT = Format.of(SHAPE)
13
+ .key('type', TYPE)
14
+ .key('description', Format.text)
15
+ .key('minLength', Format.count)
16
+ .key('maxLength', Format.count)
17
+ .key('pattern', Format.text)
18
+ .key('format', Format.text)
19
+ .key('enum', Format.listOf(Format.anything))
20
+ .key('minimum', Format.number)
21
+ .key('maximum', Format.number)
22
+ .key('items', Format.ref(SHAPE))
23
+ .key('minItems', Format.count)
24
+ .key('maxItems', Format.count)
25
+ .key('properties', Format.anything)
26
+ .key('required', Format.listOf(Format.text))
27
+ .key('additionalProperties', Format.anything)
28
+ .key('propertyNames', Format.ref(SHAPE))
29
+ .needs('type')
30
+ .closed()
31
+ .as();
32
+ //# sourceMappingURL=ShapeFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShapeFormat.js","sourceRoot":"","sources":["../../../src/axis/shape/ShapeFormat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAErD,MAAM,KAAK,GAAG,aAAa,CAAC;AAE5B,4FAA4F;AAC5F,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CACxB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAC1B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAClE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;KACzC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;KACjB,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC;KAC/B,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC;KAC9B,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC;KAC9B,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC;KAC3B,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;KAC1B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;KAC3C,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;KAC7B,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;KAC7B,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KAC/B,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC;KAC7B,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC;KAC7B,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC;KAClC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KAC3C,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,QAAQ,CAAC;KAC5C,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACvC,KAAK,CAAC,MAAM,CAAC;KACb,MAAM,EAAE;KACR,EAAE,EAAS,CAAC"}
@@ -1,10 +1,11 @@
1
1
  import type { Fields } from '../field/Fields.js';
2
2
  import type { EntityAdapters } from './EntityAdapters.js';
3
- import type { CompositeUnique } from './CompositeUnique.js';
3
+ import type { FieldGroups } from './FieldGroups.js';
4
4
  import type { PreviousNames } from './PreviousNames.js';
5
5
  export interface EntityDeclarations<TFields extends Fields> {
6
6
  adapters?: EntityAdapters<TFields>;
7
7
  previous?: PreviousNames<TFields>;
8
- unique?: CompositeUnique<TFields>;
8
+ unique?: FieldGroups<TFields>;
9
+ index?: FieldGroups<TFields>;
9
10
  }
10
11
  //# sourceMappingURL=EntityDeclarations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDeclarations.d.ts","sourceRoot":"","sources":["../../src/entity/EntityDeclarations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,MAAM;IACxD,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CACnC"}
1
+ {"version":3,"file":"EntityDeclarations.d.ts","sourceRoot":"","sources":["../../src/entity/EntityDeclarations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,MAAM;IACxD,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC9B"}
@@ -0,0 +1,9 @@
1
+ import type { FieldName } from '../field/FieldName.js';
2
+ import type { Fields } from '../field/Fields.js';
3
+ /**
4
+ * Field names grouped, as `unique` and `index` both are — `[['listId', 'docId'], ['slug']]`.
5
+ * The ORDER inside a group counts for both: a unique constraint on `(a, b)` is not the one on
6
+ * `(b, a)`, and an index on `(a, b)` serves a filter on `a` alone and never on `b` alone.
7
+ */
8
+ export type FieldGroups<TFields extends Fields> = readonly (readonly FieldName<TFields>[])[];
9
+ //# sourceMappingURL=FieldGroups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldGroups.d.ts","sourceRoot":"","sources":["../../src/entity/FieldGroups.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,OAAO,SAAS,MAAM,IAAI,SAAS,CAAC,SAAS,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=FieldGroups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldGroups.js","sourceRoot":"","sources":["../../src/entity/FieldGroups.ts"],"names":[],"mappings":""}
@@ -1,26 +1,45 @@
1
1
  import type { Shape } from '../axis/shape/Shape.js';
2
- import type { RoleRules } from '../axis/role/Role.js';
3
- import type { LifecycleRules } from '../axis/lifecycle/Lifecycle.js';
4
- import type { BoundaryRef } from '../axis/boundary/Boundary.js';
5
- import type { Meta } from './Meta.js';
6
- import type { FougereFieldAxes } from './FougereFieldAxes.js';
7
- interface FieldDeclaration extends FougereFieldAxes {
2
+ import type { FougereFieldAxes } from '../FougereFieldAxes.js';
3
+ /** The sentence any word admits, whatever it shapes — a relation and a date carry one too. */
4
+ export interface Described {
5
+ description?: string;
6
+ }
7
+ /** And a value it is born with, for the words that shape one. `many()` has none to hold. */
8
+ export interface Shared<T> extends Described {
9
+ default?: T;
10
+ }
11
+ export interface FieldDeclaration extends FougereFieldAxes {
8
12
  shape: Shape;
9
- role?: RoleRules;
10
- lifecycle?: LifecycleRules;
11
- boundary?: BoundaryRef;
12
- meta?: Meta;
13
+ }
14
+ /**
15
+ * The axes it carries are `FougereFieldAxes`, which each axis writes its own line in — so the
16
+ * three of the core are typed the way a fourth declared outside is, and the class names what
17
+ * the registry decides only once, in the constructor.
18
+ */
19
+ export interface Field<T = unknown> extends FougereFieldAxes {
20
+ readonly _type?: T;
13
21
  }
14
22
  export declare class Field<T = unknown> {
15
23
  readonly shape: Shape;
16
- readonly role?: RoleRules;
17
- readonly lifecycle?: LifecycleRules;
18
- readonly boundary?: BoundaryRef;
19
- readonly meta?: Meta;
20
- readonly _type?: T;
21
24
  constructor(init: FieldDeclaration, key?: string);
22
25
  static is(value: unknown): value is Field;
26
+ /**
27
+ * What this field declares on ONE axis, a fourth one registered outside included. An axis is
28
+ * a member, so it is read by NAME, and three callers reached for it through a cast of their
29
+ * own before this existed.
30
+ */
31
+ axis(name: keyof FieldDeclaration): unknown;
32
+ /** Every axis it declares, and nothing for the ones it says nothing on. */
33
+ get axes(): Record<string, unknown>;
34
+ /** Whether it states anything at all beside its shape. */
35
+ hasAxes(): boolean;
23
36
  with<U = T>(overrides: Partial<FieldDeclaration>): Field<U>;
37
+ /**
38
+ * What a word admits whatever its shape, and where it lands: `description` IS a JSON Schema
39
+ * keyword, `default` IS a lifecycle rule. Stated here alone, so no word writes the conversion.
40
+ * FR : ce que tout mot admet quelle que soit sa forme, et où ça atterrit.
41
+ * `text({ max: 200 }).setShared({ description: 'The title' })` → `shape.description`
42
+ */
43
+ setShared(opts?: Shared<T>): Field<T>;
24
44
  }
25
- export {};
26
45
  //# sourceMappingURL=Field.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/field/Field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM9D,UAAU,gBAAiB,SAAQ,gBAAgB;IACjD,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,qBAAa,KAAK,CAAC,CAAC,GAAG,OAAO;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAErB,SAAiB,KAAK,CAAC,EAAE,CAAC,CAAC;IAE3B,YAAY,IAAI,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,EA4B/C;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAExC;IAED,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAE1D;CACF"}
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/field/Field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO/D,8FAA8F;AAC9F,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,4FAA4F;AAC5F,MAAM,WAAW,MAAM,CAAC,CAAC,CAAE,SAAQ,SAAS;IAC1C,OAAO,CAAC,EAAE,CAAC,CAAC;CACb;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,KAAK,EAAE,KAAK,CAAC;CACd;AAcD;;;;GAIG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,gBAAgB;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;CACpB;AAED,qBAAa,KAAK,CAAC,CAAC,GAAG,OAAO;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB,YAAY,IAAI,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,EA2B/C;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAExC;IAED;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,gBAAgB,GAAG,OAAO,CAE1C;IAED,2EAA2E;IAC3E,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMlC;IAED,0DAA0D;IAC1D,OAAO,IAAI,OAAO,CAEjB;IAED,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAE1D;IAED;;;;;OAKG;IACH,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAepC;CACF"}
@@ -1,14 +1,21 @@
1
1
  import { Axes } from '../axis/Axes.js';
2
2
  import { FieldDeclarationValidator } from '../validator/FieldDeclarationValidator.js';
3
3
  import { FieldValueValidator } from '../validator/FieldValueValidator.js';
4
+ import { isObject } from '../lib/utils.js';
4
5
  import { dotted } from '../lib/ValidationResult.js';
5
6
  import { SchemaError } from '../SchemaError.js';
7
+ /**
8
+ * Every word ends on `setShared`, so the options are read in ONE place and refused there.
9
+ * `text(42)` used to pass for a bare `text()`, and nine of the twelve words took it.
10
+ */
11
+ const refuseLooseOptions = (opts) => {
12
+ if (!isObject(opts))
13
+ throw new SchemaError('Options must go in an object, like { max: 200 }', { received: opts });
14
+ };
15
+ /** The registry answers strings, and a member of a declaration is what they name. */
16
+ const registered = () => Axes.names;
6
17
  export class Field {
7
18
  shape;
8
- role;
9
- lifecycle;
10
- boundary;
11
- meta;
12
19
  constructor(init, key) {
13
20
  const verdict = FieldDeclarationValidator.of(init).verdict;
14
21
  if (!verdict.success) {
@@ -16,10 +23,10 @@ export class Field {
16
23
  verdict.errors.map((e) => `${dotted(e.path)}: ${e.message}`).join('; '));
17
24
  }
18
25
  this.shape = init.shape;
19
- this.meta = init.meta;
20
- const stated = init;
21
- for (const slot of Axes.names) {
22
- this[slot] = stated[slot];
26
+ for (const name of registered()) {
27
+ Object.defineProperty(this, name, {
28
+ value: init[name], writable: true, enumerable: true, configurable: true,
29
+ });
23
30
  }
24
31
  const create = this.lifecycle?.create;
25
32
  if (typeof create === 'object' && create !== null && 'value' in create) {
@@ -32,8 +39,46 @@ export class Field {
32
39
  static is(value) {
33
40
  return FieldDeclarationValidator.of(value).verdict.success;
34
41
  }
42
+ /**
43
+ * What this field declares on ONE axis, a fourth one registered outside included. An axis is
44
+ * a member, so it is read by NAME, and three callers reached for it through a cast of their
45
+ * own before this existed.
46
+ */
47
+ axis(name) {
48
+ return this[name];
49
+ }
50
+ /** Every axis it declares, and nothing for the ones it says nothing on. */
51
+ get axes() {
52
+ return Object.fromEntries(registered()
53
+ .map((name) => [name, this.axis(name)])
54
+ .filter(([, declared]) => declared !== undefined));
55
+ }
56
+ /** Whether it states anything at all beside its shape. */
57
+ hasAxes() {
58
+ return registered().some((name) => this.axis(name) !== undefined);
59
+ }
35
60
  with(overrides) {
36
61
  return new Field({ ...this, ...overrides });
37
62
  }
63
+ /**
64
+ * What a word admits whatever its shape, and where it lands: `description` IS a JSON Schema
65
+ * keyword, `default` IS a lifecycle rule. Stated here alone, so no word writes the conversion.
66
+ * FR : ce que tout mot admet quelle que soit sa forme, et où ça atterrit.
67
+ * `text({ max: 200 }).setShared({ description: 'The title' })` → `shape.description`
68
+ */
69
+ setShared(opts) {
70
+ if (opts === undefined)
71
+ return this;
72
+ refuseLooseOptions(opts);
73
+ const overrides = {
74
+ ...(opts.description !== undefined
75
+ ? { shape: { ...this.shape, description: opts.description } }
76
+ : {}),
77
+ ...(opts.default !== undefined
78
+ ? { lifecycle: { ...this.lifecycle, create: { value: opts.default } } }
79
+ : {}),
80
+ };
81
+ return Object.keys(overrides).length ? this.with(overrides) : this;
82
+ }
38
83
  }
39
84
  //# sourceMappingURL=Field.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Field.js","sourceRoot":"","sources":["../../src/field/Field.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUhD,MAAM,OAAO,KAAK;IACP,KAAK,CAAQ;IACb,IAAI,CAAa;IACjB,SAAS,CAAkB;IAC3B,QAAQ,CAAe;IACvB,IAAI,CAAQ;IAIrB,YAAY,IAAsB,EAAE,GAAY;QAC9C,MAAM,OAAO,GAAG,yBAAyB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;QAE3D,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CACnB,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEtB,MAAM,MAAM,GAAG,IAA0C,CAAC;QAE1D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,IAA2C,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;QACtC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACvE,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpE,IAAI,SAAS,IAAI,OAAO;gBACtB,MAAM,IAAI,WAAW,CACnB,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,wBAAwB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;oBACrF,iCAAiC,OAAO,CAAC,OAAO,GAAG,CACtD,CAAC;QACN,CAAC;IACH,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,KAAc;QACtB,OAAO,yBAAyB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC7D,CAAC;IAED,IAAI,CAAQ,SAAoC;QAC9C,OAAO,IAAI,KAAK,CAAI,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;IACjD,CAAC;CACF"}
1
+ {"version":3,"file":"Field.js","sourceRoot":"","sources":["../../src/field/Field.ts"],"names":[],"mappings":"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"}