@strictly/define 0.0.1 → 0.0.3

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 (199) hide show
  1. package/.out/index.d.ts +17 -11
  2. package/.out/index.js +17 -11
  3. package/.out/transformers/copies/copy.d.ts +3 -3
  4. package/.out/transformers/copies/copy_to.d.ts +3 -3
  5. package/.out/transformers/copies/copy_to.js +4 -0
  6. package/.out/transformers/copies/mobx_copy.d.ts +4 -4
  7. package/.out/transformers/copies/mobx_copy.js +1 -1
  8. package/.out/transformers/copies/specs/copy_to.tests.js +8 -8
  9. package/.out/transformers/copies/specs/mobx_copy.tests.js +1 -1
  10. package/.out/transformers/flatteners/flatten_accessors_of_type.d.ts +5 -0
  11. package/.out/transformers/flatteners/flatten_accessors_of_type.js +11 -0
  12. package/.out/transformers/flatteners/flatten_json_value_to_type_paths_of.d.ts +2 -2
  13. package/.out/transformers/flatteners/flatten_json_value_to_type_paths_of.js +2 -2
  14. package/.out/transformers/flatteners/{flatten_type_def_to.d.ts → flatten_type_to.d.ts} +1 -1
  15. package/.out/transformers/flatteners/{flatten_type_def_to.js → flatten_type_to.js} +1 -1
  16. package/.out/transformers/flatteners/{flatten_type_defs_of.d.ts → flatten_types_of_type.d.ts} +1 -1
  17. package/.out/transformers/flatteners/flatten_types_of_type.js +7 -0
  18. package/.out/transformers/flatteners/flatten_validation_errors_of_type.d.ts +22 -0
  19. package/.out/transformers/flatteners/flatten_validation_errors_of_type.js +10 -0
  20. package/.out/transformers/flatteners/flatten_validators_of_validating_type.d.ts +4 -0
  21. package/.out/transformers/flatteners/flatten_validators_of_validating_type.js +17 -0
  22. package/.out/transformers/flatteners/{flatten_value_type_to.d.ts → flatten_value_to.d.ts} +4 -4
  23. package/.out/transformers/flatteners/{flatten_value_type_to.js → flatten_value_to.js} +7 -2
  24. package/.out/transformers/flatteners/flatten_values_of_type.d.ts +3 -0
  25. package/.out/transformers/flatteners/flatten_values_of_type.js +7 -0
  26. package/.out/transformers/flatteners/specs/{flatten_accessors_of.tests.js → flatten_accessors_of_type.tests.js} +5 -6
  27. package/.out/transformers/flatteners/specs/flatten_json_value_to_type_paths_of.tests.js +6 -6
  28. package/.out/transformers/flatteners/specs/{flatten_type_def_to.tests.js → flatten_type_to.tests.js} +15 -13
  29. package/.out/transformers/flatteners/specs/flatten_types_of_type.tests.js +18 -0
  30. package/.out/transformers/flatteners/specs/flatten_validation_errors_of_type.tests.js +25 -0
  31. package/.out/transformers/flatteners/specs/{flatten_value_type_to.tests.js → flatten_value_to.tests.js} +81 -58
  32. package/.out/transformers/flatteners/specs/{flatten_value_types_of.tests.js → flatten_values_of_type.tests.js} +4 -4
  33. package/.out/transformers/flatteners/specs/value_path_to_type_path.tests.js +5 -3
  34. package/.out/transformers/flatteners/value_path_to_type_path.d.ts +1 -1
  35. package/.out/tsconfig.tsbuildinfo +1 -1
  36. package/.out/types/builders.d.ts +55 -29
  37. package/.out/types/builders.js +116 -32
  38. package/.out/types/definitions.d.ts +1 -1
  39. package/.out/types/flattened_accessors_of_type.d.ts +9 -0
  40. package/.out/types/{flattened_type_defs_of.d.ts → flattened_types_of_type.d.ts} +9 -6
  41. package/.out/types/flattened_types_of_validating_type.d.ts +25 -0
  42. package/.out/types/flattened_validators_of_validating_type.d.ts +10 -0
  43. package/.out/types/flattened_values_of_type.d.ts +6 -0
  44. package/.out/types/{mobx_value_type_of.d.ts → mobx_value_of_type.d.ts} +2 -2
  45. package/.out/types/{partial_type_def_of.d.ts → partial_type_of_type.d.ts} +1 -1
  46. package/.out/types/path_of.d.ts +1 -0
  47. package/.out/types/{json_paths_of.d.ts → paths_of_type.d.ts} +5 -5
  48. package/.out/types/readonly_type_of_type.d.ts +29 -0
  49. package/.out/types/specs/builder.tests.js +73 -23
  50. package/.out/types/specs/{flattened_accessors_of.tests.js → flattened_accessors_of_type.tests.js} +1 -1
  51. package/.out/types/specs/{flattened_type_defs_of.tests.js → flattened_types_of_type.tests.js} +22 -15
  52. package/.out/types/specs/flattened_validators_of_validating_type.tests.js +24 -0
  53. package/.out/types/specs/flattened_values_of_type.tests.js +18 -0
  54. package/.out/types/specs/{partial_type_def_of.tests.js → partial_type_of_type.tests.js} +4 -4
  55. package/.out/types/specs/{json_paths_of.tests.js → paths_of_type.tests.js} +19 -19
  56. package/.out/types/specs/{readonly_type_def_of.tests.js → readonly_type_of_type.tests.js} +6 -6
  57. package/.out/types/specs/type_of_type.tests.d.ts +1 -0
  58. package/.out/types/specs/type_of_type.tests.js +27 -0
  59. package/.out/types/specs/value_of_type.tests.d.ts +1 -0
  60. package/.out/types/specs/{value_type_of.tests.js → value_of_type.tests.js} +1 -1
  61. package/.out/types/specs/value_to_type_paths_of_type.tests.d.ts +1 -0
  62. package/.out/types/specs/{value_to_type_paths_of.tests.js → value_to_type_paths_of_type.tests.js} +9 -9
  63. package/.out/types/specs/value_types_of_discriminated_union.tests.js +2 -2
  64. package/.out/types/strict_definitions.d.ts +2 -2
  65. package/.out/types/type_of_type.d.ts +49 -0
  66. package/.out/types/type_of_type.js +70 -0
  67. package/.out/types/validating_definitions.d.ts +49 -0
  68. package/.out/types/validating_definitions.js +1 -0
  69. package/.out/types/validating_type_def_with_error.d.ts +55 -0
  70. package/.out/types/validating_type_def_with_error.js +1 -0
  71. package/.out/types/value_of_type.d.ts +24 -0
  72. package/.out/types/value_of_type.js +1 -0
  73. package/.out/types/{value_to_type_paths_of.d.ts → value_to_type_paths_of_type.d.ts} +13 -13
  74. package/.out/types/value_to_type_paths_of_type.js +1 -0
  75. package/.out/types/value_types_of_discriminated_union.d.ts +5 -4
  76. package/.out/validation/errors_of_validators.d.ts +4 -0
  77. package/.out/validation/errors_of_validators.js +1 -0
  78. package/.out/validation/specs/errors_of_validators.tests.d.ts +1 -0
  79. package/.out/validation/specs/errors_of_validators.tests.js +9 -0
  80. package/.out/validation/specs/validators_of_values.tests.d.ts +1 -0
  81. package/.out/validation/specs/validators_of_values.tests.js +21 -0
  82. package/.out/validation/validator.d.ts +21 -0
  83. package/.out/validation/validator.js +26 -0
  84. package/.out/validation/validators/defined_validator.d.ts +10 -0
  85. package/.out/validation/validators/defined_validator.js +18 -0
  86. package/.out/validation/validators/minimum_string_length_validator.d.ts +16 -0
  87. package/.out/validation/validators/minimum_string_length_validator.js +23 -0
  88. package/.out/validation/validators_of_values.d.ts +4 -0
  89. package/.out/validation/validators_of_values.js +1 -0
  90. package/.turbo/turbo-build.log +9 -9
  91. package/.turbo/turbo-check-types.log +1 -1
  92. package/.turbo/turbo-release$colon$exports.log +1 -1
  93. package/README.md +16 -2
  94. package/dist/index.cjs +364 -76
  95. package/dist/index.d.cts +365 -114
  96. package/dist/index.d.ts +365 -114
  97. package/dist/index.js +355 -73
  98. package/index.ts +17 -11
  99. package/package.json +11 -3
  100. package/transformers/copies/copy.ts +4 -4
  101. package/transformers/copies/copy_to.ts +11 -7
  102. package/transformers/copies/mobx_copy.ts +6 -6
  103. package/transformers/copies/specs/copy_to.tests.ts +8 -8
  104. package/transformers/copies/specs/mobx_copy.tests.ts +3 -3
  105. package/transformers/flatteners/{flatten_accessors_of.ts → flatten_accessors_of_type.ts} +10 -10
  106. package/transformers/flatteners/flatten_json_value_to_type_paths_of.ts +5 -5
  107. package/transformers/flatteners/{flatten_type_def_to.ts → flatten_type_to.ts} +1 -1
  108. package/transformers/flatteners/{flatten_type_defs_of.ts → flatten_types_of_type.ts} +3 -3
  109. package/transformers/flatteners/flatten_validation_errors_of_type.ts +93 -0
  110. package/transformers/flatteners/flatten_validators_of_validating_type.ts +32 -0
  111. package/transformers/flatteners/{flatten_value_type_to.ts → flatten_value_to.ts} +12 -7
  112. package/transformers/flatteners/{flatten_value_types_of.ts → flatten_values_of_type.ts} +6 -6
  113. package/transformers/flatteners/specs/{flatten_accessors_of.tests.ts → flatten_accessors_of_type.tests.ts} +10 -11
  114. package/transformers/flatteners/specs/flatten_json_value_to_type_paths_of.tests.ts +6 -6
  115. package/transformers/flatteners/specs/{flatten_type_def_to.tests.ts → flatten_type_to.tests.ts} +15 -13
  116. package/transformers/flatteners/specs/flatten_types_of_type.tests.ts +27 -0
  117. package/transformers/flatteners/specs/flatten_validation_errors_of_type.tests.ts +48 -0
  118. package/transformers/flatteners/specs/{flatten_value_type_to.tests.ts → flatten_value_to.tests.ts} +124 -91
  119. package/transformers/flatteners/specs/{flatten_value_types_of.tests.ts → flatten_values_of_type.tests.ts} +4 -4
  120. package/transformers/flatteners/specs/value_path_to_type_path.tests.ts +20 -18
  121. package/transformers/flatteners/value_path_to_type_path.ts +4 -4
  122. package/types/builders.ts +239 -71
  123. package/types/definitions.ts +2 -2
  124. package/types/{flattened_accessors_of.ts → flattened_accessors_of_type.ts} +3 -3
  125. package/types/{flattened_type_defs_of.ts → flattened_types_of_type.ts} +22 -12
  126. package/types/flattened_types_of_validating_type.ts +152 -0
  127. package/types/flattened_validators_of_validating_type.ts +33 -0
  128. package/types/flattened_values_of_type.ts +11 -0
  129. package/types/{mobx_value_type_of.ts → mobx_value_of_type.ts} +2 -2
  130. package/types/{partial_type_def_of.ts → partial_type_of_type.ts} +3 -1
  131. package/types/{json_path_of.ts → path_of.ts} +1 -1
  132. package/types/{json_paths_of.ts → paths_of_type.ts} +5 -5
  133. package/types/readonly_type_of_type.ts +54 -0
  134. package/types/specs/builder.tests.ts +205 -54
  135. package/types/specs/{flattened_accessors_of.tests.ts → flattened_accessors_of_type.tests.ts} +3 -3
  136. package/types/specs/{flattened_type_defs_of.tests.ts → flattened_types_of_type.tests.ts} +82 -34
  137. package/types/specs/flattened_validators_of_validating_type.tests.ts +47 -0
  138. package/types/specs/flattened_values_of_type.tests.ts +39 -0
  139. package/types/specs/{partial_type_def_of.tests.ts → partial_type_of_type.tests.ts} +11 -11
  140. package/types/specs/{json_paths_of.tests.ts → paths_of_type.tests.ts} +47 -47
  141. package/types/specs/{readonly_type_def_of.tests.ts → readonly_type_of_type.tests.ts} +14 -14
  142. package/types/specs/type_of_type.tests.ts +60 -0
  143. package/types/specs/{value_type_of.tests.ts → value_of_type.tests.ts} +15 -15
  144. package/types/specs/{value_to_type_paths_of.tests.ts → value_to_type_paths_of_type.tests.ts} +26 -25
  145. package/types/specs/value_types_of_discriminated_union.tests.ts +6 -6
  146. package/types/strict_definitions.ts +3 -3
  147. package/types/type_of_type.ts +178 -0
  148. package/types/validating_definitions.ts +109 -0
  149. package/types/validating_type_def_with_error.ts +93 -0
  150. package/types/value_of_type.ts +84 -0
  151. package/types/{value_to_type_paths_of.ts → value_to_type_paths_of_type.ts} +30 -29
  152. package/types/value_types_of_discriminated_union.ts +4 -3
  153. package/validation/errors_of_validators.ts +10 -0
  154. package/validation/specs/errors_of_validators.tests.ts +20 -0
  155. package/validation/specs/validators_of_values.tests.ts +68 -0
  156. package/validation/validator.ts +103 -0
  157. package/validation/validators/defined_validator.ts +22 -0
  158. package/validation/validators/minimum_string_length_validator.ts +36 -0
  159. package/validation/validators_of_values.ts +17 -0
  160. package/.out/transformers/flatteners/flatten_accessors_of.d.ts +0 -5
  161. package/.out/transformers/flatteners/flatten_accessors_of.js +0 -11
  162. package/.out/transformers/flatteners/flatten_type_defs_of.js +0 -7
  163. package/.out/transformers/flatteners/flatten_value_types_of.d.ts +0 -3
  164. package/.out/transformers/flatteners/flatten_value_types_of.js +0 -7
  165. package/.out/transformers/flatteners/specs/flatten_type_defs_of.tests.js +0 -17
  166. package/.out/types/flattened_accessors_of.d.ts +0 -9
  167. package/.out/types/flattened_value_types_of.d.ts +0 -6
  168. package/.out/types/json_path_of.d.ts +0 -1
  169. package/.out/types/readonly_type_def_of.d.ts +0 -29
  170. package/.out/types/specs/flattened_value_types_of.tests.js +0 -11
  171. package/.out/types/value_type_of.d.ts +0 -24
  172. package/transformers/flatteners/specs/flatten_type_defs_of.tests.ts +0 -26
  173. package/types/flattened_value_types_of.ts +0 -11
  174. package/types/readonly_type_def_of.ts +0 -53
  175. package/types/specs/flattened_value_types_of.tests.ts +0 -21
  176. package/types/value_type_of.ts +0 -84
  177. /package/.out/transformers/flatteners/specs/{flatten_accessors_of.tests.d.ts → flatten_accessors_of_type.tests.d.ts} +0 -0
  178. /package/.out/transformers/flatteners/specs/{flatten_type_def_to.tests.d.ts → flatten_type_to.tests.d.ts} +0 -0
  179. /package/.out/transformers/flatteners/specs/{flatten_type_defs_of.tests.d.ts → flatten_types_of_type.tests.d.ts} +0 -0
  180. /package/.out/transformers/flatteners/specs/{flatten_value_type_to.tests.d.ts → flatten_validation_errors_of_type.tests.d.ts} +0 -0
  181. /package/.out/transformers/flatteners/specs/{flatten_value_types_of.tests.d.ts → flatten_value_to.tests.d.ts} +0 -0
  182. /package/.out/{types/flattened_accessors_of.js → transformers/flatteners/specs/flatten_values_of_type.tests.d.ts} +0 -0
  183. /package/.out/types/{flattened_type_defs_of.js → flattened_accessors_of_type.js} +0 -0
  184. /package/.out/types/{flattened_value_types_of.js → flattened_types_of_type.js} +0 -0
  185. /package/.out/types/{json_path_of.js → flattened_types_of_validating_type.js} +0 -0
  186. /package/.out/types/{json_paths_of.js → flattened_validators_of_validating_type.js} +0 -0
  187. /package/.out/types/{partial_type_def_of.js → flattened_values_of_type.js} +0 -0
  188. /package/.out/types/{mobx_value_type_of.js → mobx_value_of_type.js} +0 -0
  189. /package/.out/types/{readonly_type_def_of.js → partial_type_of_type.js} +0 -0
  190. /package/.out/types/{specs/flattened_accessors_of.tests.d.ts → path_of.js} +0 -0
  191. /package/.out/types/{specs/flattened_type_defs_of.tests.d.ts → paths_of_type.js} +0 -0
  192. /package/.out/types/{specs/flattened_value_types_of.tests.d.ts → readonly_type_of_type.js} +0 -0
  193. /package/.out/types/specs/{json_paths_of.tests.d.ts → flattened_accessors_of_type.tests.d.ts} +0 -0
  194. /package/.out/types/specs/{partial_type_def_of.tests.d.ts → flattened_types_of_type.tests.d.ts} +0 -0
  195. /package/.out/types/specs/{readonly_type_def_of.tests.d.ts → flattened_validators_of_validating_type.tests.d.ts} +0 -0
  196. /package/.out/types/specs/{value_to_type_paths_of.tests.d.ts → flattened_values_of_type.tests.d.ts} +0 -0
  197. /package/.out/types/specs/{value_type_of.tests.d.ts → partial_type_of_type.tests.d.ts} +0 -0
  198. /package/.out/types/{value_to_type_paths_of.js → specs/paths_of_type.tests.d.ts} +0 -0
  199. /package/.out/types/{value_type_of.js → specs/readonly_type_of_type.tests.d.ts} +0 -0
package/dist/index.d.ts CHANGED
@@ -12,61 +12,61 @@ declare enum TypeDefType {
12
12
  Object = 4,
13
13
  Union = 5
14
14
  }
15
- type AnyTypeDef$1 = any;
15
+ type AnyTypeDef$2 = any;
16
16
  type LiteralTypeDef<V = any> = {
17
17
  readonly type: TypeDefType.Literal;
18
18
  readonly valuePrototype: [V];
19
19
  };
20
- type ListTypeDef<E extends TypeDef = AnyTypeDef$1> = {
20
+ type ListTypeDef<E extends TypeDef = AnyTypeDef$2> = {
21
21
  readonly type: TypeDefType.List;
22
22
  readonly elements: E;
23
23
  };
24
24
  type RecordKeyType = string | number;
25
- type RecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends TypeDef | undefined = AnyTypeDef$1> = {
25
+ type RecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends TypeDef | undefined = AnyTypeDef$2> = {
26
26
  readonly type: TypeDefType.Record;
27
27
  readonly keyPrototype: K;
28
28
  readonly valueTypeDef: V;
29
29
  };
30
- type ObjectFieldKey = string | number;
30
+ type ObjectFieldKey = string;
31
31
  type ObjectTypeDefFields = {
32
- [Key: ObjectFieldKey]: AnyTypeDef$1;
32
+ [Key: ObjectFieldKey]: AnyTypeDef$2;
33
33
  };
34
34
  type ObjectTypeDef<Fields extends ObjectTypeDefFields = ObjectTypeDefFields> = {
35
35
  readonly type: TypeDefType.Object;
36
36
  readonly fields: Fields;
37
37
  };
38
38
  type UnionKey = string;
39
- type UnionTypeDef<D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef$1>> = Readonly<Record<UnionKey, AnyTypeDef$1>>> = {
39
+ type UnionTypeDef<D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef$2>> = Readonly<Record<UnionKey, AnyTypeDef$2>>> = {
40
40
  readonly discriminator: D;
41
41
  readonly type: TypeDefType.Union;
42
42
  readonly unions: U;
43
43
  };
44
44
 
45
- type ReadonlyTypeDefOf<T extends Type> = {
46
- readonly definition: InternalReadonlyTypeDefOf<T['definition']>;
45
+ type ReadonlyTypeOfType<T extends Type> = {
46
+ readonly definition: ReadonlyOfTypeDef<T['definition']>;
47
47
  };
48
- type InternalReadonlyTypeDefOf<T extends TypeDef> = T extends LiteralTypeDef ? InternalReadonlyTypeDefOfLiteral<T> : T extends ListTypeDef ? InternalReadonlyTypeDefOfList<T> : T extends RecordTypeDef ? InternalReadonlyTypeDefOfRecord<T> : T extends ObjectTypeDef ? InternalReadonlyTypeDefOfObject<T> : T extends UnionTypeDef ? InternalReadonlyTypeDefOfUnion<T> : never;
49
- type InternalReadonlyTypeDefOfLiteral<T extends LiteralTypeDef> = T;
50
- type InternalReadonlyTypeDefOfList<T extends ListTypeDef> = {
48
+ type ReadonlyOfTypeDef<T extends TypeDef> = T extends LiteralTypeDef ? ReadonlyOfLiteralTypeDef<T> : T extends ListTypeDef ? ReadonlyOfListTypeDef<T> : T extends RecordTypeDef ? ReadonlyOfRecordTypeDef<T> : T extends ObjectTypeDef ? ReadonlyOfObjectTypeDef<T> : T extends UnionTypeDef ? ReadonlyOfUnionTypeDef<T> : never;
49
+ type ReadonlyOfLiteralTypeDef<T extends LiteralTypeDef> = T;
50
+ type ReadonlyOfListTypeDef<T extends ListTypeDef> = {
51
51
  readonly type: T['type'];
52
- readonly elements: InternalReadonlyTypeDefOf<T['elements']>;
52
+ readonly elements: ReadonlyOfTypeDef<T['elements']>;
53
53
  };
54
- type InternalReadonlyTypeDefOfRecord<T extends RecordTypeDef> = {
54
+ type ReadonlyOfRecordTypeDef<T extends RecordTypeDef> = {
55
55
  readonly type: T['type'];
56
56
  readonly keyPrototype: T['keyPrototype'];
57
- readonly valueTypeDef: undefined extends T['valueTypeDef'] ? InternalReadonlyTypeDefOf<Exclude<T['valueTypeDef'], undefined>> | undefined : InternalReadonlyTypeDefOf<T['valueTypeDef']>;
57
+ readonly valueTypeDef: undefined extends T['valueTypeDef'] ? ReadonlyOfTypeDef<Exclude<T['valueTypeDef'], undefined>> | undefined : ReadonlyOfTypeDef<T['valueTypeDef']>;
58
58
  };
59
- type InternalReadonlyTypeDefOfObject<T extends ObjectTypeDef> = T extends ObjectTypeDef<infer Fields> ? {
59
+ type ReadonlyOfObjectTypeDef<T extends ObjectTypeDef> = T extends ObjectTypeDef<infer Fields> ? {
60
60
  readonly type: T['type'];
61
61
  readonly fields: {
62
- readonly [K in keyof Fields]: InternalReadonlyTypeDefOf<Fields[K]>;
62
+ readonly [K in keyof Fields]: ReadonlyOfTypeDef<Fields[K]>;
63
63
  };
64
64
  } : never;
65
- type InternalReadonlyTypeDefOfUnion<T extends UnionTypeDef> = T extends UnionTypeDef<infer D, infer Unions> ? {
65
+ type ReadonlyOfUnionTypeDef<T extends UnionTypeDef> = T extends UnionTypeDef<infer D, infer Unions> ? {
66
66
  readonly type: T['type'];
67
67
  readonly discriminator: D;
68
68
  readonly unions: {
69
- readonly [K in keyof Unions]: InternalReadonlyTypeDefOf<Unions[K]>;
69
+ readonly [K in keyof Unions]: ReadonlyOfTypeDef<Unions[K]>;
70
70
  };
71
71
  } : never;
72
72
 
@@ -74,28 +74,28 @@ type StrictType<T extends StrictTypeDef = StrictTypeDef> = {
74
74
  readonly definition: T;
75
75
  };
76
76
  type StrictTypeDef = StrictLiteralTypeDef | StrictListTypeDef | StrictRecordTypeDef | StrictObjectTypeDef | StrictUnionTypeDef;
77
- type AnyTypeDef = any;
77
+ type AnyTypeDef$1 = any;
78
78
  type StrictLiteralTypeDef<V = any> = {
79
79
  readonly type: TypeDefType.Literal;
80
80
  readonly valuePrototype: [V];
81
81
  };
82
- type StrictListTypeDef<E extends StrictTypeDef = AnyTypeDef> = {
82
+ type StrictListTypeDef<E extends StrictTypeDef = AnyTypeDef$1> = {
83
83
  readonly type: TypeDefType.List;
84
84
  readonly elements: E;
85
85
  };
86
- type StrictRecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends StrictTypeDef | undefined = AnyTypeDef> = {
86
+ type StrictRecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends StrictTypeDef | undefined = AnyTypeDef$1> = {
87
87
  readonly type: TypeDefType.Record;
88
88
  readonly keyPrototype: K;
89
89
  readonly valueTypeDef: V;
90
90
  };
91
- type StrictStructuredTypeDefFields = {
92
- [Key: ObjectFieldKey]: AnyTypeDef;
91
+ type StrictObjectTypeDefFields = {
92
+ [Key: ObjectFieldKey]: AnyTypeDef$1;
93
93
  };
94
- type StrictObjectTypeDef<Fields extends StrictStructuredTypeDefFields = StrictStructuredTypeDefFields> = {
94
+ type StrictObjectTypeDef<Fields extends StrictObjectTypeDefFields = StrictObjectTypeDefFields> = {
95
95
  readonly type: TypeDefType.Object;
96
96
  readonly fields: Fields;
97
97
  };
98
- type StrictUnionTypeDef<D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef>> = Readonly<Record<UnionKey, AnyTypeDef>>> = D extends null ? IsStrictUnion<U> extends true ? {
98
+ type StrictUnionTypeDef<D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef$1>> = Readonly<Record<UnionKey, AnyTypeDef$1>>> = D extends null ? IsStrictUnion<U> extends true ? {
99
99
  readonly discriminator: null;
100
100
  readonly type: TypeDefType.Union;
101
101
  readonly unions: U;
@@ -104,37 +104,37 @@ type StrictUnionTypeDef<D extends string | null = string | null, U extends Reado
104
104
  readonly type: TypeDefType.Union;
105
105
  readonly unions: U;
106
106
  };
107
- type IsStrictUnion<U extends Readonly<Record<UnionKey, AnyTypeDef>>> = IsEqual<U, Simplify<{
107
+ type IsStrictUnion<U extends Readonly<Record<UnionKey, AnyTypeDef$1>>> = IsEqual<U, Simplify<{
108
108
  readonly [K in keyof Omit<U, '0'> as U[K] extends StrictLiteralTypeDef ? K : never]: U[K];
109
109
  } & (U extends {
110
- readonly ['0']: AnyTypeDef;
110
+ readonly ['0']: AnyTypeDef$1;
111
111
  } ? {
112
112
  readonly ['0']: U['0'];
113
113
  } : {})>>;
114
114
 
115
- type ValueTypeOf<T, Extra = {}> = T extends Type ? InternalValueTypeOf<T['definition'], Extra> : never;
116
- type InternalValueTypeOf<F extends TypeDef, Extra> = F extends LiteralTypeDef ? InternalValueTypeOfLiteral<F> : F extends ListTypeDef ? InternalValueTypeOfList<F, Extra> : F extends RecordTypeDef ? InternalValueTypeOfRecord<F, Extra> : F extends ObjectTypeDef ? InternalValueTypeOfObject<F, Extra> : F extends UnionTypeDef ? InternalValueTypeOfUnion<F, Extra> : never;
117
- type InternalValueTypeOfLiteral<F extends LiteralTypeDef> = F['valuePrototype'][number];
118
- type InternalValueTypeOfList<F extends ListTypeDef, Extra> = IsFieldReadonly<F, 'elements'> extends true ? readonly InternalValueTypeOf<F['elements'], Extra>[] & Extra : InternalValueTypeOf<F['elements'], Extra>[] & Extra;
119
- type InternalValueTypeOfRecord<F extends RecordTypeDef, Extra> = undefined extends F['valueTypeDef'] ? IsFieldReadonly<F, 'valueTypeDef'> extends true ? {
120
- readonly [k in F['keyPrototype']]?: InternalValueTypeOf<F['valueTypeDef'], Extra>;
115
+ type ValueOfType<T, Extra = {}> = T extends Type ? ValueOfTypeDef<T['definition'], Extra> : never;
116
+ type ValueOfTypeDef<F extends TypeDef, Extra = {}> = F extends LiteralTypeDef ? ValueOfLiteralTypeDef<F> : F extends ListTypeDef ? ValueOfListTypeDef<F, Extra> : F extends RecordTypeDef ? ValueOfRecordTypeDef<F, Extra> : F extends ObjectTypeDef ? ValueOfObjectTypeDef<F, Extra> : F extends UnionTypeDef ? ValueOfUnionTypeDef<F, Extra> : never;
117
+ type ValueOfLiteralTypeDef<F extends LiteralTypeDef> = F['valuePrototype'][number];
118
+ type ValueOfListTypeDef<F extends ListTypeDef, Extra> = IsFieldReadonly<F, 'elements'> extends true ? readonly ValueOfTypeDef<F['elements'], Extra>[] & Extra : ValueOfTypeDef<F['elements'], Extra>[] & Extra;
119
+ type ValueOfRecordTypeDef<F extends RecordTypeDef, Extra> = undefined extends F['valueTypeDef'] ? IsFieldReadonly<F, 'valueTypeDef'> extends true ? {
120
+ readonly [k in F['keyPrototype']]?: ValueOfTypeDef<F['valueTypeDef'], Extra>;
121
121
  } : {
122
- [k in F['keyPrototype']]?: InternalValueTypeOf<F['valueTypeDef'], Extra>;
122
+ [k in F['keyPrototype']]?: ValueOfTypeDef<F['valueTypeDef'], Extra>;
123
123
  } : IsFieldReadonly<F, 'valueTypeDef'> extends true ? {
124
- readonly [k in F['keyPrototype']]: InternalValueTypeOf<F['valueTypeDef'], Extra>;
124
+ readonly [k in F['keyPrototype']]: ValueOfTypeDef<F['valueTypeDef'], Extra>;
125
125
  } : {
126
- [k in F['keyPrototype']]: InternalValueTypeOf<F['valueTypeDef'], Extra>;
126
+ [k in F['keyPrototype']]: ValueOfTypeDef<F['valueTypeDef'], Extra>;
127
127
  };
128
- type InternalValueTypeOfObject<F extends ObjectTypeDef, Extra> = F extends ObjectTypeDef<infer Fields> ? {
129
- [K in keyof Fields]: InternalValueTypeOf<Fields[K], Extra>;
128
+ type ValueOfObjectTypeDef<F extends ObjectTypeDef, Extra> = F extends ObjectTypeDef<infer Fields> ? {
129
+ [K in keyof Fields]: ValueOfTypeDef<Fields[K], Extra>;
130
130
  } & Extra : never;
131
- type InternalValueTypeOfUnion<F extends UnionTypeDef, Extra> = F extends UnionTypeDef<infer D, infer U> ? D extends string ? {
132
- [K in keyof U]: InternalValueTypeOf<U[K], Extra> & Readonly<Record<D, K>>;
131
+ type ValueOfUnionTypeDef<F extends UnionTypeDef, Extra> = F extends UnionTypeDef<infer D, infer U> ? D extends string ? {
132
+ [K in keyof U]: ValueOfTypeDef<U[K], Extra> & Readonly<Record<D, K>>;
133
133
  }[keyof U] : {
134
- [K in keyof U]: InternalValueTypeOf<U[K], Extra>;
134
+ [K in keyof U]: ValueOfTypeDef<U[K], Extra>;
135
135
  }[keyof U] : never;
136
136
 
137
- declare function copy<T extends StrictType>(t: T, proto: ValueTypeOf<ReadonlyTypeDefOf<T>>): ValueTypeOf<T>;
137
+ declare function copy<T extends StrictType>(t: T, proto: ValueOfType<ReadonlyTypeOfType<T>>): ValueOfType<T>;
138
138
 
139
139
  declare const MOBX_OBSERVABLE_KEY = "___mobx_observable";
140
140
  type MobxObservable<T = {}> = {
@@ -143,159 +143,410 @@ type MobxObservable<T = {}> = {
143
143
  type NonMobxObservable<T = {}> = {
144
144
  [MOBX_OBSERVABLE_KEY]?: never;
145
145
  } & T;
146
- type MobxValueTypeOf<T extends Type> = ValueTypeOf<T, MobxObservable>;
146
+ type MobxValueOfType<T extends Type> = ValueOfType<T, MobxObservable>;
147
147
 
148
- declare function mobxCopy<T extends StrictType>(t: T, proto: ValueTypeOf<ReadonlyTypeDefOf<T>>): MobxValueTypeOf<T>;
148
+ declare function mobxCopy<T extends StrictType>(t: T, proto: ValueOfType<ReadonlyTypeOfType<T>>): MobxValueOfType<T>;
149
149
 
150
150
  type StartingDepth = 8;
151
151
  type Depths = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
152
152
 
153
- type JsonPathOf<Prefix extends string, Accessor extends string | number | symbol, SegmentOverride extends string | null = null> = SegmentOverride extends string ? `${Prefix}.${SegmentOverride}` : Accessor extends string | number ? `${Prefix}.${Accessor}` : never;
153
+ type PathOf<Prefix extends string, Accessor extends string | number | symbol, SegmentOverride extends string | null = null> = SegmentOverride extends string ? `${Prefix}.${SegmentOverride}` : Accessor extends string | number ? `${Prefix}.${Accessor}` : never;
154
154
 
155
- type FlattenedTypeDefsOf<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path, '', Depth>;
156
- type InternalFlattenedTypeDefsOf<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = {
155
+ type FlattenedTypesOfType<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf$1<T['definition'], SegmentOverride, Path, '', Depth>;
156
+ type InternalFlattenedTypeDefsOf$1<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = {
157
157
  readonly [K in Path]: Type<T>;
158
- } & InternalFlattenedTypeDefsOfChildren<T, SegmentOverride, Path, Qualifier, Depth>;
159
- type InternalFlattenedTypeDefsOfChildren<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedTypeDefsOfLiteralChildren : T extends ListTypeDef ? InternalFlattenedTypeDefsOfListChildren<T, SegmentOverride, Path, NextDepth> : T extends RecordTypeDef ? InternalFlattenedTypeDefsOfRecordChildren<T, SegmentOverride, Path, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedTypeDefsOfObjectChildren<T, SegmentOverride, Path, Qualifier, NextDepth> : T extends UnionTypeDef ? InternalFlattenedTypeDefsOfUnionChildren<T, SegmentOverride, Path, Qualifier, NextDepth> : never;
160
- type InternalFlattenedTypeDefsOfLiteralChildren = {};
161
- type InternalFlattenedTypeDefsOfListChildren<T extends ListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, JsonPathOf<Path, number, SegmentOverride>, '', Depth>;
162
- type InternalFlattenedTypeDefsOfRecordChildren<T extends RecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['valueTypeDef'], SegmentOverride, JsonPathOf<Path, T['keyPrototype'], SegmentOverride>, '', Depth>;
163
- type InternalFlattenedTypeDefsOfObjectChildren<T extends ObjectTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? {} extends Fields ? {} : keyof Fields extends string ? UnionToIntersection<{
164
- readonly [K in keyof Fields]-?: InternalFlattenedTypeDefsOf<Exclude<Fields[K], undefined>, SegmentOverride, JsonPathOf<Path, `${Qualifier}${K}`, null>, '', Depth>;
158
+ } & InternalFlattenedTypeDefsOfChildren$1<T, SegmentOverride, Path, Qualifier, Depth>;
159
+ type InternalFlattenedTypeDefsOfChildren$1<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedTypeDefsOfLiteralChildren$1 : T extends ListTypeDef ? InternalFlattenedTypeDefsOfListChildren$1<T, SegmentOverride, Path, NextDepth> : T extends RecordTypeDef ? InternalFlattenedTypeDefsOfRecordChildren$1<T, SegmentOverride, Path, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedTypeDefsOfObjectChildren$1<T, SegmentOverride, Path, Qualifier, NextDepth> : T extends UnionTypeDef ? InternalFlattenedTypeDefsOfUnionChildren$1<T, SegmentOverride, Path, Qualifier, NextDepth> : never;
160
+ type InternalFlattenedTypeDefsOfLiteralChildren$1 = {};
161
+ type InternalFlattenedTypeDefsOfListChildren$1<T extends ListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf$1<T['elements'], SegmentOverride, PathOf<Path, number, SegmentOverride>, '', Depth>;
162
+ type InternalFlattenedTypeDefsOfRecordChildren$1<T extends RecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf$1<T['valueTypeDef'], SegmentOverride, PathOf<Path, T['keyPrototype'], SegmentOverride>, '', Depth>;
163
+ type InternalFlattenedTypeDefsOfObjectChildren$1<T extends ObjectTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
164
+ readonly [K in keyof Fields]-?: undefined extends Fields[K] ? InternalFlattenedTypeDefsOf$1<UnionTypeDef<null, {
165
+ readonly '0': Exclude<Fields[K], undefined>;
166
+ readonly '1': LiteralTypeDef<undefined>;
167
+ }>, SegmentOverride, PathOf<Path, `${Qualifier}${K}`, null>, '', Depth> : InternalFlattenedTypeDefsOf$1<Exclude<Fields[K], undefined>, SegmentOverride, PathOf<Path, `${Qualifier}${K}`, null>, '', Depth>;
165
168
  }[keyof Fields]> : never : never;
166
- type InternalFlattenedTypeDefsOfUnionChildren<T extends UnionTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
167
- readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, '', Depth>;
169
+ type InternalFlattenedTypeDefsOfUnionChildren$1<T extends UnionTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
170
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren$1<Unions[K], SegmentOverride, Path, '', Depth>;
168
171
  }[keyof Unions]> : UnionToIntersection<{
169
- readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, `${Qualifier}${K}:`, Depth>;
172
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren$1<Unions[K], SegmentOverride, Path, `${Qualifier}${K}:`, Depth>;
170
173
  }[keyof Unions]> : never : never;
171
174
 
172
- type FlattenedValueTypesOf<T extends Type, SegmentOverride extends string | null = null, Flattened extends Readonly<Record<string, Type>> = FlattenedTypeDefsOf<T, SegmentOverride>> = {
173
- [K in keyof Flattened]: ValueTypeOf<Flattened[K], {}>;
175
+ type FlattenedValuesOfType<T extends Type, SegmentOverride extends string | null = null, Flattened extends Readonly<Record<string, Type>> = FlattenedTypesOfType<T, SegmentOverride>> = {
176
+ [K in keyof Flattened]: ValueOfType<Flattened[K], {}>;
174
177
  };
175
178
 
176
179
  type Accessor<T = any> = {
177
180
  readonly value: T;
178
181
  set(v: T): void;
179
182
  };
180
- type FlattenedAccessorsOf<T extends Type, Flattened extends Readonly<Record<string, Accessor>> = FlattenedValueTypesOf<T>> = {
183
+ type FlattenedAccessorsOfType<T extends Type, Flattened extends Readonly<Record<string, Accessor>> = FlattenedValuesOfType<T>> = {
181
184
  readonly [K in keyof Flattened]: Accessor<Flattened[K]>;
182
185
  };
183
186
 
184
187
  type AnyValueType = any;
185
188
  type Setter<V> = (v: V) => void;
186
189
  type Mapper<R> = (t: StrictTypeDef, v: AnyValueType, setter: Setter<AnyValueType>, typePath: string, valuePath: string) => R;
187
- declare function flattenValueTypeTo<T extends StrictType, M, R extends Readonly<Record<string, M>>>({ definition }: T, v: ValueTypeOf<T>, setter: Setter<ValueTypeOf<T>>, mapper: Mapper<M>): R;
188
- declare function getUnionTypeDef<T extends UnionTypeDef>(typeDef: T, v: ValueTypeOf<ReadonlyTypeDefOf<{
190
+ declare function flattenValueTo<T extends StrictType, M, R extends Readonly<Record<string, M>>>({ definition }: T, v: ValueOfType<T>, setter: Setter<ValueOfType<T>>, mapper: Mapper<M>): R;
191
+ declare function getUnionTypeDef<T extends UnionTypeDef>(typeDef: T, v: ValueOfType<ReadonlyTypeOfType<{
189
192
  definition: T;
190
193
  }>>): any;
191
194
 
192
- declare function flattenAccessorsOf<T extends Type, R extends Readonly<Record<string, Accessor<any>>> = FlattenedAccessorsOf<T>>(t: T, value: ValueTypeOf<T>, setValue: Setter<ValueTypeOf<T>>): R;
195
+ declare function flattenAccessorsOfType<T extends Type, R extends Readonly<Record<string, Accessor<any>>> = FlattenedAccessorsOfType<T>>(t: T, value: ValueOfType<T>, setValue: Setter<ValueOfType<T>>): R;
193
196
 
194
- declare function flattenJsonValueToTypePathsOf<T extends Type, R extends Record<string, string | number | symbol>>(t: T, value: ValueTypeOf<T>): R;
197
+ declare function flattenJsonValueToTypePathsOf<T extends Type, R extends Record<string, string | number | symbol>>(t: T, value: ValueOfType<T>): R;
195
198
 
196
- declare function flattenTypeDefsOf<T extends StrictType>(t: T): Record<string, Type>;
199
+ declare function flattenTypesOfType<T extends StrictType>(t: T): Record<string, Type>;
200
+
201
+ type ValidatingType<T extends ValidatingTypeDef = ValidatingTypeDef> = {
202
+ readonly definition: T;
203
+ };
204
+ type Rule<E = any, V = any> = (v: V) => E | null;
205
+ type ErrorOfValidatingTypeDef<T extends ValidatingTypeDef> = T extends ValidatingTypeDef<infer E> ? E : never;
206
+ type ValidatingTypeDef<E = any> = ValidatingLiteralTypeDef<E> | ValidatingListTypeDef<E> | ValidatingRecordTypeDef<E> | ValidatingObjectTypeDef<E> | ValidatingUnionTypeDef<E>;
207
+ type AnyTypeDef = any;
208
+ type ValidatingLiteralTypeDef<E = any, V = any> = {
209
+ readonly type: TypeDefType.Literal;
210
+ readonly valuePrototype: [V];
211
+ readonly rule: Rule<E>;
212
+ readonly required: boolean;
213
+ readonly readonly: boolean;
214
+ };
215
+ type ValidatingListTypeDef<E = any, Ele extends ValidatingTypeDef = AnyTypeDef> = {
216
+ readonly type: TypeDefType.List;
217
+ readonly elements: Ele;
218
+ readonly rule: Rule<E>;
219
+ readonly required: boolean;
220
+ readonly readonly: boolean;
221
+ };
222
+ type ValidatingRecordTypeDef<E = any, K extends RecordKeyType = RecordKeyType, V extends ValidatingTypeDef | undefined = AnyTypeDef> = {
223
+ readonly type: TypeDefType.Record;
224
+ readonly keyPrototype: K;
225
+ readonly valueTypeDef: V;
226
+ readonly rule: Rule<E>;
227
+ readonly required: boolean;
228
+ readonly readonly: boolean;
229
+ };
230
+ type ValidatingObjectTypeDefFields = {
231
+ [Key: ObjectFieldKey]: AnyTypeDef;
232
+ };
233
+ type ValidatingObjectTypeDef<E = any, Fields extends ValidatingObjectTypeDefFields = ValidatingObjectTypeDefFields> = {
234
+ readonly type: TypeDefType.Object;
235
+ readonly fields: Fields;
236
+ readonly rule: Rule<E>;
237
+ readonly required: boolean;
238
+ readonly readonly: boolean;
239
+ };
240
+ type ValidatingUnionTypeDef<E = any, D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef>> = Readonly<Record<UnionKey, AnyTypeDef>>> = {
241
+ readonly discriminator: D;
242
+ readonly type: TypeDefType.Union;
243
+ readonly unions: U;
244
+ readonly rule: Rule<E>;
245
+ readonly required: boolean;
246
+ readonly readonly: boolean;
247
+ };
248
+
249
+ type FlattenedTypesOfValidatingType<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path, '', Depth>;
250
+ type InternalFlattenedTypeDefsOf<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = {
251
+ readonly [K in Path]: Type<T>;
252
+ } & InternalFlattenedTypeDefsOfChildren<T, SegmentOverride, Path, Qualifier, Depth>;
253
+ type InternalFlattenedTypeDefsOfChildren<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends ValidatingLiteralTypeDef ? InternalFlattenedTypeDefsOfLiteralChildren : T extends ValidatingListTypeDef ? InternalFlattenedTypeDefsOfListChildren<T, SegmentOverride, Path, NextDepth> : T extends ValidatingRecordTypeDef ? InternalFlattenedTypeDefsOfRecordChildren<T, SegmentOverride, Path, NextDepth> : T extends ValidatingObjectTypeDef ? InternalFlattenedTypeDefsOfObjectChildren<T, SegmentOverride, Path, Qualifier, NextDepth> : T extends ValidatingUnionTypeDef ? InternalFlattenedTypeDefsOfUnionChildren<T, SegmentOverride, Path, Qualifier, NextDepth> : never;
254
+ type InternalFlattenedTypeDefsOfLiteralChildren = {};
255
+ type InternalFlattenedTypeDefsOfListChildren<T extends ValidatingListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, PathOf<Path, number, SegmentOverride>, '', Depth>;
256
+ type InternalFlattenedTypeDefsOfRecordChildren<T extends ValidatingRecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['valueTypeDef'], SegmentOverride, PathOf<Path, T['keyPrototype'], SegmentOverride>, '', Depth>;
257
+ type InternalFlattenedTypeDefsOfObjectChildren<T extends ValidatingObjectTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends ValidatingObjectTypeDef<infer _E, infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
258
+ readonly [K in keyof Fields]-?: undefined extends Fields[K] ? InternalFlattenedTypeDefsOf<ValidatingUnionTypeDef<ErrorOfValidatingTypeDef<Exclude<Fields[K], undefined>>, null, {
259
+ readonly '0': Exclude<Fields[K], undefined>;
260
+ readonly '1': ValidatingLiteralTypeDef<undefined>;
261
+ }>, SegmentOverride, PathOf<Path, `${Qualifier}${K}`, null>, '', Depth> : InternalFlattenedTypeDefsOf<Exclude<Fields[K], undefined>, SegmentOverride, PathOf<Path, `${Qualifier}${K}`, null>, '', Depth>;
262
+ }[keyof Fields]> : never : never;
263
+ type InternalFlattenedTypeDefsOfUnionChildren<T extends ValidatingUnionTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends ValidatingUnionTypeDef<infer _E, infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
264
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, '', Depth>;
265
+ }[keyof Unions]> : UnionToIntersection<{
266
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, `${Qualifier}${K}:`, Depth>;
267
+ }[keyof Unions]> : never : never;
268
+
269
+ type FunctionalValidator<V = any, E = any, ValuePath extends string = any, Context = any> = (v: V, valuePath: ValuePath, context: Context) => E | null;
270
+ type AnnotatedValidator<V = any, E = any, ValuePath extends string = any, Context = any> = {
271
+ readonly validate: (v: V, valuePath: ValuePath, context: Context) => E | null;
272
+ readonly annotations: (valuePath: ValuePath, context: Context) => {
273
+ readonly required: boolean;
274
+ readonly readonly: boolean;
275
+ };
276
+ };
277
+ type Validator<V = any, E = any, ValuePath extends string = any, Context = any> = FunctionalValidator<V, E, ValuePath, Context> | AnnotatedValidator<V, E, ValuePath, Context>;
278
+ type ErrorOfValidator<V extends Validator> = V extends Validator<infer _V, infer E> ? E : never;
279
+ type ValidationError<Type extends string, Data = {}> = Simplify<{
280
+ type: Type;
281
+ } & Data>;
282
+ declare function isFunctionalValidator(v: Validator): v is FunctionalValidator;
283
+ declare function isAnnotatedValidator(v: Validator): v is AnnotatedValidator;
284
+ declare function validate<V = any, E = any, ValuePath extends string = any, Context = any>(validator: Validator<V, E, ValuePath, Context>, v: V, valuePath: ValuePath, context: Context): E | null;
285
+ declare function annotations<V = any, E = any, ValuePath extends string = any, Context = any>(validator: Validator<V, E, ValuePath, Context>, valuePath: ValuePath, context: Context): {
286
+ readonly required: boolean;
287
+ readonly readonly: boolean;
288
+ };
289
+
290
+ type ValidatorOfValidatingType<T extends ValidatingTypeDef, ValuePath extends string, Context> = T extends ValidatingTypeDef<infer E> ? Validator<ValueOfTypeDef<ReadonlyOfTypeDef<T>>, E, ValuePath, Context> : never;
291
+ type FlattenedValidatorsOfValidatingType<T extends ValidatingType, TypePathsToValuePaths extends Readonly<Record<keyof FlattenedTypes, string>>, FlattenedTypes extends Readonly<Record<string, ValidatingType>> = FlattenedTypesOfType<T, '*'>, Context = ValueOfType<ReadonlyTypeOfType<T>>> = {
292
+ [K in keyof FlattenedTypes as ErrorOfValidatingTypeDef<FlattenedTypes[K]['definition']> extends never ? never : K]: ValidatorOfValidatingType<FlattenedTypes[K]['definition'], TypePathsToValuePaths[K], Context>;
293
+ };
294
+
295
+ declare function flattenValidatorsOfValidatingType<T extends ValidatingType, TypePathsToValuePaths extends Readonly<Record<keyof FlattenedTypes, string>>, FlattenedTypes extends Readonly<Record<string, ValidatingType>> = FlattenedTypesOfValidatingType<T, '*'>>(type: T): FlattenedValidatorsOfValidatingType<T, TypePathsToValuePaths, FlattenedTypes>;
296
+
297
+ declare function flattenValuesOfType<T extends Type>(typeDef: Type, value: ValueOfType<T>): Readonly<Record<string, any>>;
197
298
 
198
299
  declare function jsonPath(prefix: string, segment: number | string, qualifier?: string): string;
199
300
  declare function jsonPathPop(path: string): [string, string] | null;
200
301
 
201
- declare function valuePathToTypePath<JsonPaths extends Record<string, string>, ValuePath extends keyof JsonPaths>({ definition: typeDef }: Type, valuePath: ValuePath, allowMissingPaths?: boolean): JsonPaths[ValuePath];
302
+ declare function valuePathToTypePath<ValuePathsToTypePaths extends Record<string, string>, ValuePath extends keyof ValuePathsToTypePaths>({ definition: typeDef }: Type, valuePath: ValuePath, allowMissingPaths?: boolean): ValuePathsToTypePaths[ValuePath];
202
303
 
203
- declare class TypeDefBuilder<T extends TypeDef> implements Type<T> {
304
+ type TypeOfType<T extends Type> = T extends Type<infer D> ? {
305
+ readonly definition: TypeDefOfTypeDef<D>;
306
+ } : never;
307
+ type TypeDefOfTypeDef<D extends TypeDef> = D extends LiteralTypeDef ? TypeDefOfLiteralTypeDef<D> : D extends ListTypeDef ? TypeDefOfListTypeDef<D> : D extends RecordTypeDef ? TypeDefOfRecordTypeDef<D> : D extends ObjectTypeDef ? TypeDefOfObjectTypeDef<D> : D extends UnionTypeDef ? TypeDefOfUnionTypeDef<D> : never;
308
+ type TypeDefOfLiteralTypeDef<T extends LiteralTypeDef> = T extends LiteralTypeDef<infer V> ? {
309
+ readonly type: TypeDefType.Literal;
310
+ readonly valuePrototype: [V];
311
+ } : never;
312
+ type TypeDefOfListTypeDef<T extends ListTypeDef> = T extends ListTypeDef<infer E> ? IsFieldReadonly<T, 'elements'> extends true ? {
313
+ readonly type: TypeDefType.List;
314
+ readonly elements: TypeDefOfTypeDef<E>;
315
+ } : {
316
+ readonly type: TypeDefType.List;
317
+ elements: TypeDefOfTypeDef<E>;
318
+ } : never;
319
+ type TypeDefOfRecordTypeDef<T extends RecordTypeDef> = T extends RecordTypeDef<infer K, infer V> ? undefined extends V ? IsFieldReadonly<T, 'valueTypeDef'> extends true ? {
320
+ readonly type: TypeDefType.Record;
321
+ readonly keyPrototype: K;
322
+ readonly valueTypeDef: TypeDefOfTypeDef<NonNullable<V>> | undefined;
323
+ } : {
324
+ readonly type: TypeDefType.Record;
325
+ readonly keyPrototype: K;
326
+ valueTypeDef: TypeDefOfTypeDef<NonNullable<V>> | undefined;
327
+ } : IsFieldReadonly<T, 'valueTypeDef'> extends true ? {
328
+ readonly type: TypeDefType.Record;
329
+ readonly keyPrototype: K;
330
+ readonly valueTypeDef: TypeDefOfTypeDef<NonNullable<V>>;
331
+ } : {
332
+ readonly type: TypeDefType.Record;
333
+ readonly keyPrototype: K;
334
+ valueTypeDef: TypeDefOfTypeDef<NonNullable<V>>;
335
+ } : never;
336
+ type TypeDefOfObjectTypeDef<T extends ObjectTypeDef> = T extends ObjectTypeDef<infer Fields> ? {
337
+ readonly type: TypeDefType.Object;
338
+ readonly fields: {
339
+ [K in keyof Fields as K extends ObjectFieldKey ? K : never]: TypeDefOfTypeDef<NonNullable<Fields[K]>>;
340
+ };
341
+ } : never;
342
+ type TypeDefOfUnionTypeDef<T extends UnionTypeDef> = T extends UnionTypeDef<infer D, infer U> ? {
343
+ readonly type: TypeDefType.Union;
344
+ readonly discriminator: D;
345
+ readonly unions: {
346
+ [K in keyof U]: TypeDefOfTypeDef<U[K]>;
347
+ };
348
+ } : never;
349
+
350
+ type ValidatingTypeDefWithError<T extends ValidatingTypeDef, E> = T extends ValidatingLiteralTypeDef ? ValidatingLiteralTypeDefWithError<T, E> : T extends ValidatingListTypeDef ? ValidatingListTypeDefWithError<T, E> : T extends ValidatingRecordTypeDef ? ValidatingRecordTypeDefWithError<T, E> : T extends ValidatingObjectTypeDef ? ValidatingObjectTypeDefWithError<T, E> : T extends ValidatingUnionTypeDef ? ValidatingUnionTypeDefWithError<T, E> : never;
351
+ type ValidatingLiteralTypeDefWithError<T extends ValidatingLiteralTypeDef, E2> = T extends ValidatingLiteralTypeDef<infer E1, infer V> ? {
352
+ readonly type: TypeDefType.Literal;
353
+ readonly valuePrototype: [V];
354
+ readonly rule: Rule<E1 | E2>;
355
+ readonly required: boolean;
356
+ readonly readonly: boolean;
357
+ } : never;
358
+ type ValidatingListTypeDefWithError<T extends ValidatingListTypeDef, E2> = T extends ValidatingListTypeDef<infer E1, infer E> ? IsFieldReadonly<T, 'elements'> extends true ? {
359
+ readonly type: TypeDefType.List;
360
+ readonly elements: E;
361
+ readonly rule: Rule<E1 | E2>;
362
+ readonly required: boolean;
363
+ readonly readonly: boolean;
364
+ } : {
365
+ readonly type: TypeDefType.List;
366
+ elements: E;
367
+ readonly rule: Rule<E1 | E2>;
368
+ readonly required: boolean;
369
+ readonly readonly: boolean;
370
+ } : never;
371
+ type ValidatingRecordTypeDefWithError<T extends ValidatingRecordTypeDef, E2> = T extends ValidatingRecordTypeDef<infer E1, infer K, infer V> ? IsFieldReadonly<T, 'valueTypeDef'> extends true ? {
372
+ readonly type: TypeDefType.Record;
373
+ readonly keyPrototype: K;
374
+ readonly valueTypeDef: V;
375
+ readonly rule: Rule<E1 | E2>;
376
+ readonly required: boolean;
377
+ readonly readonly: boolean;
378
+ } : {
379
+ readonly type: TypeDefType.Record;
380
+ readonly keyPrototype: K;
381
+ valueTypeDef: V;
382
+ readonly rule: Rule<E1 | E2>;
383
+ readonly required: boolean;
384
+ readonly readonly: boolean;
385
+ } : never;
386
+ type ValidatingObjectTypeDefWithError<T extends ValidatingObjectTypeDef, E2> = T extends ValidatingObjectTypeDef<infer E1, infer Fields> ? {
387
+ readonly type: TypeDefType.Object;
388
+ readonly fields: Fields;
389
+ readonly rule: Rule<E1 | E2>;
390
+ readonly required: boolean;
391
+ readonly readonly: boolean;
392
+ } : never;
393
+ type ValidatingUnionTypeDefWithError<T extends ValidatingUnionTypeDef, E2> = T extends ValidatingUnionTypeDef<infer E1, infer D, infer U> ? {
394
+ readonly type: TypeDefType.Union;
395
+ readonly discriminator: D;
396
+ readonly unions: U;
397
+ readonly rule: Rule<E1 | E2>;
398
+ readonly required: boolean;
399
+ readonly readonly: boolean;
400
+ } : never;
401
+
402
+ declare class TypeDefBuilder<T extends ValidatingTypeDef> implements ValidatingType<T> {
204
403
  readonly definition: T;
205
404
  constructor(definition: T);
206
- get narrow(): Type<T>;
405
+ enforce<E2>(rule: Rule<E2, ValueOfType<Type<T>>>): TypeDefBuilder<ValidatingTypeDefWithError<T, E2>>;
406
+ required(): TypeDefBuilder<ValidatingTypeDefWithError<T, never>>;
407
+ required<RequiredError>(rule: Rule<RequiredError, ValueOfType<typeof this.narrow>>): TypeDefBuilder<ValidatingTypeDefWithError<T, RequiredError>>;
408
+ readonly(): TypeDefBuilder<T>;
409
+ get _type(): TypeOfType<Type<T>>;
410
+ get narrow(): ValidatingType<T>;
207
411
  }
208
- declare class LiteralTypeDefBuilder<T> extends TypeDefBuilder<LiteralTypeDef<T>> {
209
- }
210
- declare class ListTypeDefBuilder<T extends ListTypeDef> extends TypeDefBuilder<T> {
211
- readonly(): ListTypeDefBuilder<{
412
+ declare class ListTypeDefBuilder<T extends ValidatingListTypeDef> extends TypeDefBuilder<T> {
413
+ readonlyElements(): ListTypeDefBuilder<{
212
414
  readonly type: TypeDefType.List;
213
415
  readonly elements: T['elements'];
416
+ readonly rule: T['rule'];
417
+ readonly required: boolean;
418
+ readonly readonly: boolean;
214
419
  }>;
215
420
  }
216
- declare class RecordTypeDefBuilder<T extends RecordTypeDef> extends TypeDefBuilder<T> {
217
- partial(): IsFieldReadonly<T, 'valueTypeDef'> extends true ? RecordTypeDefBuilder<{
421
+ declare class RecordTypeDefBuilder<T extends ValidatingRecordTypeDef> extends TypeDefBuilder<T> {
422
+ partialKeys(): IsFieldReadonly<T, 'valueTypeDef'> extends true ? RecordTypeDefBuilder<{
218
423
  readonly type: TypeDefType.Record;
219
424
  readonly keyPrototype: T['keyPrototype'];
220
425
  readonly valueTypeDef: T['valueTypeDef'] | undefined;
426
+ readonly rule: T['rule'];
427
+ readonly required: boolean;
428
+ readonly readonly: boolean;
221
429
  }> : RecordTypeDefBuilder<{
222
430
  readonly type: TypeDefType.Record;
223
431
  readonly keyPrototype: T['keyPrototype'];
224
432
  valueTypeDef: T['valueTypeDef'] | undefined;
433
+ readonly rule: T['rule'];
434
+ readonly required: boolean;
435
+ readonly readonly: boolean;
225
436
  }>;
226
- readonly(): RecordTypeDefBuilder<{
437
+ readonlyKeys(): RecordTypeDefBuilder<{
227
438
  readonly type: TypeDefType.Record;
228
439
  readonly keyPrototype: T['keyPrototype'];
229
440
  readonly valueTypeDef: T['valueTypeDef'];
441
+ readonly rule: T['rule'];
442
+ readonly required: boolean;
443
+ readonly readonly: boolean;
230
444
  }>;
231
445
  }
232
- declare class ObjectTypeDefBuilder<Fields extends Readonly<Record<ObjectFieldKey, TypeDef>> = {}> extends TypeDefBuilder<ObjectTypeDef<Fields>> {
233
- set<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Record<Name, T>>;
234
- setReadonly<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Readonly<Record<Name, T>>>;
235
- setOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Record<Name, T>>>;
236
- setReadonlyOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Readonly<Record<Name, T>>>>;
446
+ declare class ObjectTypeDefBuilder<E, Fields extends Readonly<Record<ObjectFieldKey, ValidatingTypeDef>> = {}> extends TypeDefBuilder<ValidatingObjectTypeDef<E, Fields>> {
447
+ field<Name extends string, T extends ValidatingTypeDef>(name: Name, { definition }: Type<T>): ObjectTypeDefBuilder<E, Fields & Record<Name, T>>;
448
+ field<Name extends string, T extends ValidatingTypeDef, RequiredError>(name: Name, { definition }: Type<T>, rule: Rule<RequiredError, ValueOfTypeDef<T>>): ObjectTypeDefBuilder<E, Fields & Record<Name, ValidatingTypeDefWithError<T, RequiredError>>>;
449
+ readonlyField<Name extends string, T extends ValidatingTypeDef>(name: Name, { definition }: Type<T>): ObjectTypeDefBuilder<E, Fields & Readonly<Record<Name, T>>>;
450
+ optionalField<Name extends string, T extends ValidatingTypeDef>(name: Name, { definition }: Type<T>): ObjectTypeDefBuilder<E, Fields & Partial<Record<Name, T>>>;
451
+ readonlyOptionalField<Name extends string, T extends TypeDef>(name: Name, { definition }: Type<T>): ObjectTypeDefBuilder<E, Fields & Partial<Readonly<Record<Name, T>>>>;
237
452
  }
238
- declare class UnionTypeDefBuilder<D extends string | null, U extends Record<UnionKey, TypeDef>> extends TypeDefBuilder<UnionTypeDef<D, U>> {
239
- add<K extends Exclude<UnionKey, keyof U>, T extends TypeDef>(k: K, { definition: typeDef, }: Type<T>): UnionTypeDefBuilder<D, Readonly<Record<K, T>> & U>;
453
+ declare class UnionTypeDefBuilder<E, D extends string | null, U extends Record<UnionKey, TypeDef>> extends TypeDefBuilder<ValidatingUnionTypeDef<E, D, U>> {
454
+ or<K extends Exclude<UnionKey, keyof U>, T extends TypeDef>(k: K, { definition: typeDef, }: Type<T>): UnionTypeDefBuilder<E, D, Readonly<Record<K, T>> & U>;
240
455
  }
241
- declare function literal<T>(value?: [T]): LiteralTypeDefBuilder<T>;
242
- declare const stringType: LiteralTypeDefBuilder<string>;
243
- declare const numberType: LiteralTypeDefBuilder<number>;
244
- declare const booleanType: LiteralTypeDefBuilder<boolean>;
245
- declare const nullType: LiteralTypeDefBuilder<null>;
246
- declare function nullable<T extends TypeDef>(nonNullable: Type<T>): UnionTypeDefBuilder<null, {
456
+ declare function literal<T>(value?: [T]): TypeDefBuilder<ValidatingLiteralTypeDef<never, T>>;
457
+ declare const stringType: TypeDefBuilder<ValidatingLiteralTypeDef<never, string>>;
458
+ declare const numberType: TypeDefBuilder<ValidatingLiteralTypeDef<never, number>>;
459
+ declare const booleanType: TypeDefBuilder<ValidatingLiteralTypeDef<never, boolean>>;
460
+ declare const nullType: TypeDefBuilder<ValidatingLiteralTypeDef<never, null>>;
461
+ declare function nullable<T extends ValidatingTypeDef>(nonNullable: ValidatingType<T>): UnionTypeDefBuilder<never, null, {
247
462
  readonly ['0']: T;
248
- readonly ['1']: LiteralTypeDef<null>;
463
+ readonly ['1']: ValidatingLiteralTypeDef<never, null>;
249
464
  }>;
250
- declare function list<T extends TypeDef>(elements: Type<T>): ListTypeDefBuilder<{
465
+ declare function list<T extends ValidatingTypeDef>(elements: ValidatingType<T>): ListTypeDefBuilder<{
251
466
  readonly type: TypeDefType.List;
252
467
  elements: T;
468
+ readonly rule: Rule<never>;
469
+ readonly readonly: boolean;
470
+ readonly required: boolean;
253
471
  }>;
254
- declare function record<V extends Type, K extends RecordKeyType>({ definition: typeDef }: V): RecordTypeDefBuilder<{
472
+ declare function record<V extends ValidatingType, K extends RecordKeyType>({ definition: valueTypeDef }: V): RecordTypeDefBuilder<{
255
473
  readonly type: TypeDefType.Record;
256
474
  readonly keyPrototype: K;
257
475
  valueTypeDef: V["definition"];
476
+ readonly rule: Rule<never>;
477
+ readonly readonly: boolean;
478
+ readonly required: boolean;
258
479
  }>;
259
- declare function object(): ObjectTypeDefBuilder<{}>;
260
- declare function union<D extends null>(): UnionTypeDefBuilder<D, {}>;
261
- declare function union<D extends string>(discriminator: D): UnionTypeDefBuilder<D, {}>;
480
+ declare function object(): ObjectTypeDefBuilder<never, {}>;
481
+ declare function union<D extends null>(): UnionTypeDefBuilder<never, D, {}>;
482
+ declare function union<D extends string>(discriminator: D): UnionTypeDefBuilder<never, D, {}>;
262
483
 
263
- type JsonPathsOf<T extends Type, SegmentOverride extends string | null = null, Prefix extends string = '$'> = InternalJsonPathsOf<T['definition'], Prefix, SegmentOverride, StartingDepth>;
484
+ type PathsOfType<T extends Type, SegmentOverride extends string | null = null, Prefix extends string = '$'> = InternalJsonPathsOf<T['definition'], Prefix, SegmentOverride, StartingDepth>;
264
485
  type InternalJsonPathsOf<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number, NextDepth extends number = Depths[Depth]> = InternalJsonPathsOfChildren<F, Prefix, SegmentOverride, '', NextDepth> | Prefix;
265
486
  type InternalJsonPathsOfChildren<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null, Qualifier extends string, Depth extends number> = Depth extends -1 ? never : F extends LiteralTypeDef ? InternalJsonPathsOfLiteralChildren : F extends ListTypeDef ? InternalJsonPathsOfListChildren<F, Prefix, SegmentOverride, Depth> : F extends RecordTypeDef ? InternalJsonPathsOfRecordChildren<F, Prefix, SegmentOverride, Depth> : F extends ObjectTypeDef ? InternalJsonPathsOfObjectChildren<F, Prefix, SegmentOverride, Qualifier, Depth> : F extends UnionTypeDef ? InternalJsonPathsOfUnionChildren<F, Prefix, SegmentOverride, Qualifier, Depth> : never;
266
487
  type InternalJsonPathsOfLiteralChildren = never;
267
- type InternalJsonPathsOfListChildren<F extends ListTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['elements'], JsonPathOf<Prefix, number, SegmentOverride>, SegmentOverride, Depth>;
268
- type InternalJsonPathsOfRecordChildren<F extends RecordTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['valueTypeDef'], JsonPathOf<Prefix, F['keyPrototype'], SegmentOverride>, SegmentOverride, Depth>;
488
+ type InternalJsonPathsOfListChildren<F extends ListTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['elements'], PathOf<Prefix, number, SegmentOverride>, SegmentOverride, Depth>;
489
+ type InternalJsonPathsOfRecordChildren<F extends RecordTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['valueTypeDef'], PathOf<Prefix, F['keyPrototype'], SegmentOverride>, SegmentOverride, Depth>;
269
490
  type InternalJsonPathsOfObjectChildren<F extends ObjectTypeDef, Prefix extends string, SegmentOverride extends string | null, Qualifier extends string, Depth extends number> = F extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? {
270
- [K in keyof Fields]: InternalJsonPathsOf<Fields[K], JsonPathOf<Prefix, `${Qualifier}${K}`, null>, SegmentOverride, Depth>;
491
+ [K in keyof Fields]: InternalJsonPathsOf<Fields[K], PathOf<Prefix, `${Qualifier}${K}`, null>, SegmentOverride, Depth>;
271
492
  }[keyof Fields] : never : never;
272
493
  type InternalJsonPathsOfUnionChildren<F extends UnionTypeDef, Prefix extends string, SegmentOverride extends string | null, Qualifier extends string, Depth extends number> = F extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? {
273
494
  readonly [K in keyof Unions]: InternalJsonPathsOfChildren<Unions[K], Prefix, SegmentOverride, D extends null ? Qualifier : `${Qualifier}${K}:`, Depth>;
274
495
  }[keyof Unions] : never : never;
275
496
 
276
- type ValueToTypePathsOf<T extends StrictType, SegmentOverride extends string = '*', Path extends string = '$'> = SimplifyDeep<InternalFlattenedJsonPathsOf<T['definition'], SegmentOverride, Path, Path, StartingDepth>>;
277
- type InternalFlattenedJsonPathsOf<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = {
497
+ type ValueToTypePathsOfType<T extends StrictType, SegmentOverride extends string = '*', Path extends string = '$'> = SimplifyDeep<InternalFlattenedTypePathsOf<T['definition'], SegmentOverride, Path, Path, StartingDepth>>;
498
+ type InternalFlattenedTypePathsOf<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = {
278
499
  readonly [K in ValuePath]: TypePath;
279
- } & InternalFlattenedJsonPathsOfChildren<T, SegmentOverride, ValuePath, TypePath, '', Depth>;
280
- type InternalFlattenedJsonPathsOfChildren<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedJsonPathsOfLiteralChildren : T extends ListTypeDef ? InternalFlattenedJsonPathsOfListChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends RecordTypeDef ? InternalFlattenedJsonPathsOfRecordChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedJsonPathsOfObjectChildren<T, SegmentOverride, ValuePath, TypePath, Qualifier, NextDepth> : T extends UnionTypeDef ? InternalFlattenedJsonPathsOfUnionChildren<T, SegmentOverride, ValuePath, TypePath, Qualifier, NextDepth> : never;
281
- type InternalFlattenedJsonPathsOfLiteralChildren = {};
282
- type InternalFlattenedJsonPathsOfListChildren<T extends ListTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedJsonPathsOf<T['elements'], SegmentOverride, JsonPathOf<ValuePath, number>, JsonPathOf<TypePath, number, SegmentOverride>, Depth>;
283
- type InternalFlattenedJsonPathsOfRecordChildren<T extends RecordTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedJsonPathsOf<T['valueTypeDef'], SegmentOverride, JsonPathOf<ValuePath, T['keyPrototype']>, JsonPathOf<TypePath, T['keyPrototype'], SegmentOverride>, Depth>;
284
- type InternalFlattenedJsonPathsOfObjectChildren<T extends ObjectTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
285
- readonly [K in keyof Fields]-?: InternalFlattenedJsonPathsOf<Exclude<Fields[K], undefined>, SegmentOverride, JsonPathOf<ValuePath, `${Qualifier}${K}`>, JsonPathOf<TypePath, `${Qualifier}${K}`>, Depth>;
500
+ } & InternalFlattenedTypePathsOfChildren<T, SegmentOverride, ValuePath, TypePath, '', Depth>;
501
+ type InternalFlattenedTypePathsOfChildren<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedTypePathsOfLiteralChildren : T extends ListTypeDef ? InternalFlattenedTypePathsOfListChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends RecordTypeDef ? InternalFlattenedTypePathsOfRecordChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedTypePathsOfObjectChildren<T, SegmentOverride, ValuePath, TypePath, Qualifier, NextDepth> : T extends UnionTypeDef ? InternalFlattenedTypePathsOfUnionChildren<T, SegmentOverride, ValuePath, TypePath, Qualifier, NextDepth> : never;
502
+ type InternalFlattenedTypePathsOfLiteralChildren = {};
503
+ type InternalFlattenedTypePathsOfListChildren<T extends ListTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedTypePathsOf<T['elements'], SegmentOverride, PathOf<ValuePath, number>, PathOf<TypePath, number, SegmentOverride>, Depth>;
504
+ type InternalFlattenedTypePathsOfRecordChildren<T extends RecordTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedTypePathsOf<T['valueTypeDef'], SegmentOverride, PathOf<ValuePath, T['keyPrototype']>, PathOf<TypePath, T['keyPrototype'], SegmentOverride>, Depth>;
505
+ type InternalFlattenedTypePathsOfObjectChildren<T extends ObjectTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
506
+ readonly [K in keyof Fields]-?: InternalFlattenedTypePathsOf<Exclude<Fields[K], undefined>, SegmentOverride, PathOf<ValuePath, `${Qualifier}${K}`>, PathOf<TypePath, `${Qualifier}${K}`>, Depth>;
286
507
  }[keyof Fields]> : never : never;
287
- type InternalFlattenedJsonPathsOfUnionChildren<T extends UnionTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
288
- readonly [K in keyof Unions]: InternalFlattenedJsonPathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath, '', Depth>;
508
+ type InternalFlattenedTypePathsOfUnionChildren<T extends UnionTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
509
+ readonly [K in keyof Unions]: InternalFlattenedTypePathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath, '', Depth>;
289
510
  }[keyof Unions]> : UnionToIntersection<{
290
- readonly [K in keyof Unions]: InternalFlattenedJsonPathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath, `${Qualifier}${K}:`, Depth>;
511
+ readonly [K in keyof Unions]: InternalFlattenedTypePathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath, `${Qualifier}${K}:`, Depth>;
291
512
  }[keyof Unions]> : never : never;
292
513
 
293
514
  type ValueTypesOfDiscriminatedUnion<U extends UnionTypeDef> = U extends UnionTypeDef<infer D, infer Unions> ? D extends string ? {
294
- [K in keyof Unions]: ValueTypeOf<{
515
+ [K in keyof Unions]: ValueOfType<ReadonlyTypeOfType<{
295
516
  definition: Unions[K];
296
- }> & {
297
- [KD in D]: K;
517
+ }>> & {
518
+ readonly [KD in D]: K;
298
519
  };
299
520
  } : never : never;
300
521
 
301
- export { type Accessor, type AnyValueType, type FlattenedAccessorsOf, type FlattenedTypeDefsOf, type FlattenedValueTypesOf, type InternalJsonPathsOf, type InternalValueTypeOf, type IsStrictUnion, type JsonPathsOf, type ListTypeDef, type LiteralTypeDef, type Mapper, type MobxObservable, type MobxValueTypeOf, type NonMobxObservable, type ObjectFieldKey, type ObjectTypeDef, type ObjectTypeDefFields, type ReadonlyTypeDefOf, type RecordKeyType, type RecordTypeDef, type Setter, type StrictListTypeDef, type StrictLiteralTypeDef, type StrictObjectTypeDef, type StrictRecordTypeDef, type StrictStructuredTypeDefFields, type StrictType, type StrictTypeDef, type StrictUnionTypeDef, type Type, type TypeDef, TypeDefType, type UnionKey, type UnionTypeDef, type ValueToTypePathsOf, type ValueTypeOf, type ValueTypesOfDiscriminatedUnion, booleanType, copy, flattenAccessorsOf, flattenJsonValueToTypePathsOf, flattenTypeDefsOf, flattenValueTypeTo, getUnionTypeDef, jsonPath, jsonPathPop, list, literal, mobxCopy, nullType, nullable, numberType, object, record, stringType, union, valuePathToTypePath };
522
+ declare class DefinedValidator<V, E, ValuePath extends string, Context> implements AnnotatedValidator<V | null | undefined, E, ValuePath, Context> {
523
+ private readonly error;
524
+ constructor(error: E);
525
+ validate(v: V | null | undefined): E | null;
526
+ annotations(): {
527
+ required: boolean;
528
+ readonly: boolean;
529
+ };
530
+ }
531
+
532
+ declare const MinimumStringLengthValidationErrorType = "minimum_string_length";
533
+ type MinimumStringLengthValidationError = {
534
+ type: typeof MinimumStringLengthValidationErrorType;
535
+ receivedLength: number;
536
+ minimumLength: number;
537
+ };
538
+ declare class MinimumStringLengthValidator<ValuePath extends string, Context> implements AnnotatedValidator<string, MinimumStringLengthValidationError, ValuePath, Context> {
539
+ private readonly minimumLength;
540
+ constructor(minimumLength: number);
541
+ validate(value: string): MinimumStringLengthValidationError | null;
542
+ annotations(): {
543
+ required: boolean;
544
+ readonly: boolean;
545
+ };
546
+ }
547
+
548
+ type ValidatorsOfValues<FlattenedValues extends Readonly<Record<string, any>>, TypePathsToValuePaths extends Readonly<Record<keyof FlattenedValues, string>> = Readonly<Record<keyof FlattenedValues, any>>, Context = any> = {
549
+ readonly [K in keyof FlattenedValues]: Validator<FlattenedValues[K], any, TypePathsToValuePaths[K], Context>;
550
+ };
551
+
552
+ export { type Accessor, type AnnotatedValidator, type AnyValueType, DefinedValidator, type ErrorOfValidator, type FlattenedAccessorsOfType, type FlattenedTypesOfType, type FlattenedValuesOfType, type FunctionalValidator, type InternalJsonPathsOf, type IsStrictUnion, type ListTypeDef, type LiteralTypeDef, type Mapper, type MinimumStringLengthValidationError, MinimumStringLengthValidationErrorType, MinimumStringLengthValidator, type MobxObservable, type MobxValueOfType, type NonMobxObservable, type ObjectFieldKey, type ObjectTypeDef, type ObjectTypeDefFields, type PathsOfType, type ReadonlyOfTypeDef, type ReadonlyTypeOfType, type RecordKeyType, type RecordTypeDef, type Setter, type StrictListTypeDef, type StrictLiteralTypeDef, type StrictObjectTypeDef, type StrictObjectTypeDefFields, type StrictRecordTypeDef, type StrictType, type StrictTypeDef, type StrictUnionTypeDef, type Type, type TypeDef, TypeDefType, type UnionKey, type UnionTypeDef, type ValidationError, type Validator, type ValidatorsOfValues, type ValueOfType, type ValueOfTypeDef, type ValueToTypePathsOfType, type ValueTypesOfDiscriminatedUnion, annotations, booleanType, copy, flattenAccessorsOfType, flattenJsonValueToTypePathsOf, flattenTypesOfType, flattenValidatorsOfValidatingType, flattenValueTo, flattenValuesOfType, getUnionTypeDef, isAnnotatedValidator, isFunctionalValidator, jsonPath, jsonPathPop, list, literal, mobxCopy, nullType, nullable, numberType, object, record, stringType, union, validate, valuePathToTypePath };