@strictly/define 0.0.1 → 0.0.2

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
@@ -1,62 +1,88 @@
1
1
  import { type IsFieldReadonly } from '@strictly/base';
2
- import { type ListTypeDef, type LiteralTypeDef, type ObjectFieldKey, type ObjectTypeDef, type RecordKeyType, type RecordTypeDef, type Type, type TypeDef, TypeDefType, type UnionKey, type UnionTypeDef } from './definitions';
3
- declare class TypeDefBuilder<T extends TypeDef> implements Type<T> {
2
+ import { type ObjectFieldKey, type RecordKeyType, type Type, type TypeDef, TypeDefType, type UnionKey } from './definitions';
3
+ import { type TypeOfType } from './type_of_type';
4
+ import { type Rule, type ValidatingListTypeDef, type ValidatingLiteralTypeDef, type ValidatingObjectTypeDef, type ValidatingRecordTypeDef, type ValidatingType, type ValidatingTypeDef, type ValidatingUnionTypeDef } from './validating_definitions';
5
+ import { type ValidatingTypeDefWithError } from './validating_type_def_with_error';
6
+ import { type ValueOfType, type ValueOfTypeDef } from './value_of_type';
7
+ declare class TypeDefBuilder<T extends ValidatingTypeDef> implements ValidatingType<T> {
4
8
  readonly definition: T;
5
9
  constructor(definition: T);
6
- get narrow(): Type<T>;
10
+ enforce<E2>(rule: Rule<E2, ValueOfType<Type<T>>>): TypeDefBuilder<ValidatingTypeDefWithError<T, E2>>;
11
+ required(): TypeDefBuilder<ValidatingTypeDefWithError<T, never>>;
12
+ required<RequiredError>(rule: Rule<RequiredError, ValueOfType<typeof this.narrow>>): TypeDefBuilder<ValidatingTypeDefWithError<T, RequiredError>>;
13
+ readonly(): TypeDefBuilder<T>;
14
+ get _type(): TypeOfType<Type<T>>;
15
+ get narrow(): ValidatingType<T>;
7
16
  }
8
- declare class LiteralTypeDefBuilder<T> extends TypeDefBuilder<LiteralTypeDef<T>> {
9
- }
10
- declare class ListTypeDefBuilder<T extends ListTypeDef> extends TypeDefBuilder<T> {
11
- readonly(): ListTypeDefBuilder<{
17
+ declare class ListTypeDefBuilder<T extends ValidatingListTypeDef> extends TypeDefBuilder<T> {
18
+ readonlyElements(): ListTypeDefBuilder<{
12
19
  readonly type: TypeDefType.List;
13
20
  readonly elements: T['elements'];
21
+ readonly rule: T['rule'];
22
+ readonly required: boolean;
23
+ readonly readonly: boolean;
14
24
  }>;
15
25
  }
16
- declare class RecordTypeDefBuilder<T extends RecordTypeDef> extends TypeDefBuilder<T> {
17
- partial(): IsFieldReadonly<T, 'valueTypeDef'> extends true ? RecordTypeDefBuilder<{
26
+ declare class RecordTypeDefBuilder<T extends ValidatingRecordTypeDef> extends TypeDefBuilder<T> {
27
+ partialKeys(): IsFieldReadonly<T, 'valueTypeDef'> extends true ? RecordTypeDefBuilder<{
18
28
  readonly type: TypeDefType.Record;
19
29
  readonly keyPrototype: T['keyPrototype'];
20
30
  readonly valueTypeDef: T['valueTypeDef'] | undefined;
31
+ readonly rule: T['rule'];
32
+ readonly required: boolean;
33
+ readonly readonly: boolean;
21
34
  }> : RecordTypeDefBuilder<{
22
35
  readonly type: TypeDefType.Record;
23
36
  readonly keyPrototype: T['keyPrototype'];
24
37
  valueTypeDef: T['valueTypeDef'] | undefined;
38
+ readonly rule: T['rule'];
39
+ readonly required: boolean;
40
+ readonly readonly: boolean;
25
41
  }>;
26
- readonly(): RecordTypeDefBuilder<{
42
+ readonlyKeys(): RecordTypeDefBuilder<{
27
43
  readonly type: TypeDefType.Record;
28
44
  readonly keyPrototype: T['keyPrototype'];
29
45
  readonly valueTypeDef: T['valueTypeDef'];
46
+ readonly rule: T['rule'];
47
+ readonly required: boolean;
48
+ readonly readonly: boolean;
30
49
  }>;
31
50
  }
32
- declare class ObjectTypeDefBuilder<Fields extends Readonly<Record<ObjectFieldKey, TypeDef>> = {}> extends TypeDefBuilder<ObjectTypeDef<Fields>> {
33
- set<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Record<Name, T>>;
34
- setReadonly<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Readonly<Record<Name, T>>>;
35
- setOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Record<Name, T>>>;
36
- setReadonlyOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Readonly<Record<Name, T>>>>;
51
+ declare class ObjectTypeDefBuilder<E, Fields extends Readonly<Record<ObjectFieldKey, ValidatingTypeDef>> = {}> extends TypeDefBuilder<ValidatingObjectTypeDef<E, Fields>> {
52
+ field<Name extends string, T extends ValidatingTypeDef>(name: Name, { definition }: Type<T>): ObjectTypeDefBuilder<E, Fields & Record<Name, T>>;
53
+ 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>>>;
54
+ readonlyField<Name extends string, T extends ValidatingTypeDef>(name: Name, { definition }: Type<T>): ObjectTypeDefBuilder<E, Fields & Readonly<Record<Name, T>>>;
55
+ optionalField<Name extends string, T extends ValidatingTypeDef>(name: Name, { definition }: Type<T>): ObjectTypeDefBuilder<E, Fields & Partial<Record<Name, T>>>;
56
+ readonlyOptionalField<Name extends string, T extends TypeDef>(name: Name, { definition }: Type<T>): ObjectTypeDefBuilder<E, Fields & Partial<Readonly<Record<Name, T>>>>;
37
57
  }
38
- declare class UnionTypeDefBuilder<D extends string | null, U extends Record<UnionKey, TypeDef>> extends TypeDefBuilder<UnionTypeDef<D, U>> {
39
- add<K extends Exclude<UnionKey, keyof U>, T extends TypeDef>(k: K, { definition: typeDef, }: Type<T>): UnionTypeDefBuilder<D, Readonly<Record<K, T>> & U>;
58
+ declare class UnionTypeDefBuilder<E, D extends string | null, U extends Record<UnionKey, TypeDef>> extends TypeDefBuilder<ValidatingUnionTypeDef<E, D, U>> {
59
+ or<K extends Exclude<UnionKey, keyof U>, T extends TypeDef>(k: K, { definition: typeDef, }: Type<T>): UnionTypeDefBuilder<E, D, Readonly<Record<K, T>> & U>;
40
60
  }
41
- export declare function literal<T>(value?: [T]): LiteralTypeDefBuilder<T>;
42
- export declare const stringType: LiteralTypeDefBuilder<string>;
43
- export declare const numberType: LiteralTypeDefBuilder<number>;
44
- export declare const booleanType: LiteralTypeDefBuilder<boolean>;
45
- export declare const nullType: LiteralTypeDefBuilder<null>;
46
- export declare function nullable<T extends TypeDef>(nonNullable: Type<T>): UnionTypeDefBuilder<null, {
61
+ export declare function literal<T>(value?: [T]): TypeDefBuilder<ValidatingLiteralTypeDef<never, T>>;
62
+ export declare const stringType: TypeDefBuilder<ValidatingLiteralTypeDef<never, string>>;
63
+ export declare const numberType: TypeDefBuilder<ValidatingLiteralTypeDef<never, number>>;
64
+ export declare const booleanType: TypeDefBuilder<ValidatingLiteralTypeDef<never, boolean>>;
65
+ export declare const nullType: TypeDefBuilder<ValidatingLiteralTypeDef<never, null>>;
66
+ export declare function nullable<T extends ValidatingTypeDef>(nonNullable: ValidatingType<T>): UnionTypeDefBuilder<never, null, {
47
67
  readonly ['0']: T;
48
- readonly ['1']: LiteralTypeDef<null>;
68
+ readonly ['1']: ValidatingLiteralTypeDef<never, null>;
49
69
  }>;
50
- export declare function list<T extends TypeDef>(elements: Type<T>): ListTypeDefBuilder<{
70
+ export declare function list<T extends ValidatingTypeDef>(elements: ValidatingType<T>): ListTypeDefBuilder<{
51
71
  readonly type: TypeDefType.List;
52
72
  elements: T;
73
+ readonly rule: Rule<never>;
74
+ readonly readonly: boolean;
75
+ readonly required: boolean;
53
76
  }>;
54
- export declare function record<V extends Type, K extends RecordKeyType>({ definition: typeDef }: V): RecordTypeDefBuilder<{
77
+ export declare function record<V extends ValidatingType, K extends RecordKeyType>({ definition: valueTypeDef }: V): RecordTypeDefBuilder<{
55
78
  readonly type: TypeDefType.Record;
56
79
  readonly keyPrototype: K;
57
80
  valueTypeDef: V["definition"];
81
+ readonly rule: Rule<never>;
82
+ readonly readonly: boolean;
83
+ readonly required: boolean;
58
84
  }>;
59
- export declare function object(): ObjectTypeDefBuilder<{}>;
60
- export declare function union<D extends null>(): UnionTypeDefBuilder<D, {}>;
61
- export declare function union<D extends string>(discriminator: D): UnionTypeDefBuilder<D, {}>;
85
+ export declare function object(): ObjectTypeDefBuilder<never, {}>;
86
+ export declare function union<D extends null>(): UnionTypeDefBuilder<never, D, {}>;
87
+ export declare function union<D extends string>(discriminator: D): UnionTypeDefBuilder<never, D, {}>;
62
88
  export {};
@@ -1,79 +1,146 @@
1
1
  import { TypeDefType, } from './definitions';
2
+ import { typeOfType, } from './type_of_type';
3
+ function emptyRule() {
4
+ return null;
5
+ }
2
6
  class TypeDefBuilder {
3
7
  definition;
4
8
  constructor(definition) {
5
9
  this.definition = definition;
6
10
  }
7
- // returns just the relevant types, which can help typescript
8
- // from complaining about infinitely deep data structures
11
+ enforce(rule) {
12
+ return new TypeDefBuilder(
13
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
14
+ {
15
+ ...this.definition,
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ rule: (value) => {
18
+ return this.definition.rule(value) || rule(value);
19
+ },
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ });
22
+ }
23
+ required(rule) {
24
+ return new TypeDefBuilder(
25
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
26
+ {
27
+ ...this.definition,
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ rule: (v) => {
30
+ return this.definition.rule(v) || rule?.(v);
31
+ },
32
+ required: true,
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
+ });
35
+ }
36
+ readonly() {
37
+ return new TypeDefBuilder(
38
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
39
+ {
40
+ ...this.definition,
41
+ readonly: true,
42
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
+ });
44
+ }
45
+ // should only be used in tests requiring Types, client code should be happy with validating types
46
+ // eslint-disable-next-line @typescript-eslint/naming-convention
47
+ get _type() {
48
+ return typeOfType(this);
49
+ }
9
50
  get narrow() {
51
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
10
52
  return {
11
53
  definition: this.definition,
54
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
55
  };
13
56
  }
14
57
  }
15
- class LiteralTypeDefBuilder extends TypeDefBuilder {
16
- }
17
58
  class ListTypeDefBuilder extends TypeDefBuilder {
18
- readonly() {
19
- return this;
59
+ readonlyElements() {
60
+ return new ListTypeDefBuilder({
61
+ ...this.definition,
62
+ elements: {
63
+ ...this.definition.elements,
64
+ readonly: true,
65
+ },
66
+ });
20
67
  }
21
68
  }
22
69
  class RecordTypeDefBuilder extends TypeDefBuilder {
23
- partial() {
70
+ partialKeys() {
24
71
  return this;
25
72
  }
26
- readonly() {
27
- return this;
73
+ readonlyKeys() {
74
+ return new RecordTypeDefBuilder({
75
+ ...this.definition,
76
+ valueTypeDef: {
77
+ ...this.definition.valueTypeDef,
78
+ readonly: true,
79
+ },
80
+ });
28
81
  }
29
82
  }
30
83
  class ObjectTypeDefBuilder extends TypeDefBuilder {
31
- set(name, { definition: typeDef }) {
32
- const newFields = {
33
- [name]: typeDef,
34
- };
84
+ field(name, { definition }, rule) {
35
85
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
36
86
  return new ObjectTypeDefBuilder({
37
- type: TypeDefType.Object,
87
+ ...this.definition,
88
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
38
89
  fields: {
39
90
  ...this.definition.fields,
40
- ...newFields,
91
+ [name]: {
92
+ ...definition,
93
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
+ rule: function (v) {
95
+ return definition.rule(v) || rule?.(v);
96
+ },
97
+ required: true,
98
+ },
41
99
  },
42
100
  });
43
101
  }
44
- setReadonly(name, { definition: typeDef }) {
102
+ readonlyField(name, { definition }) {
45
103
  const newFields = {
46
- [name]: typeDef,
104
+ [name]: {
105
+ ...definition,
106
+ required: true,
107
+ readonly: true,
108
+ },
47
109
  };
48
110
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
49
111
  return new ObjectTypeDefBuilder({
50
- type: TypeDefType.Object,
112
+ ...this.definition,
51
113
  fields: {
52
114
  ...this.definition.fields,
53
115
  ...newFields,
54
116
  },
55
117
  });
56
118
  }
57
- setOptional(name, { definition: typeDef }) {
119
+ optionalField(name, { definition }) {
58
120
  const newFields = {
59
- [name]: typeDef,
121
+ [name]: {
122
+ ...definition,
123
+ },
60
124
  };
61
125
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
62
126
  return new ObjectTypeDefBuilder({
63
- type: TypeDefType.Object,
127
+ ...this.definition,
64
128
  fields: {
65
129
  ...this.definition.fields,
66
130
  ...newFields,
67
131
  },
68
132
  });
69
133
  }
70
- setReadonlyOptional(name, { definition: typeDef }) {
134
+ readonlyOptionalField(name, { definition }) {
71
135
  const newFields = {
72
- [name]: typeDef,
136
+ [name]: {
137
+ ...definition,
138
+ readonly: true,
139
+ },
73
140
  };
74
141
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
75
142
  return new ObjectTypeDefBuilder({
76
- type: TypeDefType.Object,
143
+ ...this.definition,
77
144
  fields: {
78
145
  ...this.definition.fields,
79
146
  ...newFields,
@@ -82,11 +149,10 @@ class ObjectTypeDefBuilder extends TypeDefBuilder {
82
149
  }
83
150
  }
84
151
  class UnionTypeDefBuilder extends TypeDefBuilder {
85
- add(k, { definition: typeDef, }) {
86
- const { discriminator, unions, } = this.definition;
152
+ or(k, { definition: typeDef, }) {
153
+ const { unions, } = this.definition;
87
154
  return new UnionTypeDefBuilder({
88
- type: TypeDefType.Union,
89
- discriminator: discriminator,
155
+ ...this.definition,
90
156
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
91
157
  unions: {
92
158
  ...unions,
@@ -96,9 +162,12 @@ class UnionTypeDefBuilder extends TypeDefBuilder {
96
162
  }
97
163
  }
98
164
  export function literal(value) {
99
- return new LiteralTypeDefBuilder({
165
+ return new TypeDefBuilder({
100
166
  type: TypeDefType.Literal,
101
167
  valuePrototype: value,
168
+ rule: emptyRule,
169
+ readonly: false,
170
+ required: false,
102
171
  });
103
172
  }
104
173
  export const stringType = literal();
@@ -113,6 +182,10 @@ export function nullable(nonNullable) {
113
182
  ['0']: nonNullable.definition,
114
183
  ['1']: nullType.definition,
115
184
  },
185
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
186
+ rule: emptyRule,
187
+ readonly: false,
188
+ required: false,
116
189
  });
117
190
  }
118
191
  export function list(elements) {
@@ -120,14 +193,19 @@ export function list(elements) {
120
193
  return new ListTypeDefBuilder({
121
194
  type: TypeDefType.List,
122
195
  elements: elements.definition,
196
+ rule: emptyRule,
197
+ readonly: false,
198
+ required: false,
123
199
  });
124
200
  }
125
- export function record({ definition: typeDef }) {
201
+ export function record({ definition: valueTypeDef }) {
126
202
  return new RecordTypeDefBuilder({
127
203
  type: TypeDefType.Record,
128
- // eslint-disable-next-line no-undefined
129
204
  keyPrototype: undefined,
130
- valueTypeDef: typeDef,
205
+ valueTypeDef,
206
+ rule: emptyRule,
207
+ readonly: false,
208
+ required: false,
131
209
  });
132
210
  }
133
211
  export function object() {
@@ -135,6 +213,9 @@ export function object() {
135
213
  return new ObjectTypeDefBuilder({
136
214
  type: TypeDefType.Object,
137
215
  fields: {},
216
+ rule: emptyRule,
217
+ readonly: false,
218
+ required: false,
138
219
  });
139
220
  }
140
221
  export function union(discriminator) {
@@ -144,5 +225,8 @@ export function union(discriminator) {
144
225
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
145
226
  discriminator: (discriminator ?? null),
146
227
  unions: {},
228
+ rule: emptyRule,
229
+ readonly: false,
230
+ required: false,
147
231
  });
148
232
  }
@@ -24,7 +24,7 @@ export type RecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends Typ
24
24
  readonly keyPrototype: K;
25
25
  readonly valueTypeDef: V;
26
26
  };
27
- export type ObjectFieldKey = string | number;
27
+ export type ObjectFieldKey = string;
28
28
  export type ObjectTypeDefFields = {
29
29
  [Key: ObjectFieldKey]: AnyTypeDef;
30
30
  };
@@ -0,0 +1,9 @@
1
+ import { type Type } from './definitions';
2
+ import { type FlattenedValuesOfType } from './flattened_values_of_type';
3
+ export type Accessor<T = any> = {
4
+ readonly value: T;
5
+ set(v: T): void;
6
+ };
7
+ export type FlattenedAccessorsOfType<T extends Type, Flattened extends Readonly<Record<string, Accessor>> = FlattenedValuesOfType<T>> = {
8
+ readonly [K in keyof Flattened]: Accessor<Flattened[K]>;
9
+ };
@@ -1,17 +1,20 @@
1
1
  import { type UnionToIntersection } from 'type-fest';
2
2
  import { type ListTypeDef, type LiteralTypeDef, type ObjectTypeDef, type RecordTypeDef, type Type, type TypeDef, type UnionTypeDef } from './definitions';
3
3
  import { type Depths, type StartingDepth } from './flattened';
4
- import { type JsonPathOf } from './json_path_of';
5
- export type FlattenedTypeDefsOf<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path, '', Depth>;
4
+ import { type PathOf } from './path_of';
5
+ export type FlattenedTypesOfType<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path, '', Depth>;
6
6
  type InternalFlattenedTypeDefsOf<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = {
7
7
  readonly [K in Path]: Type<T>;
8
8
  } & InternalFlattenedTypeDefsOfChildren<T, SegmentOverride, Path, Qualifier, Depth>;
9
9
  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;
10
10
  type InternalFlattenedTypeDefsOfLiteralChildren = {};
11
- type InternalFlattenedTypeDefsOfListChildren<T extends ListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, JsonPathOf<Path, number, SegmentOverride>, '', Depth>;
12
- 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>;
13
- 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<{
14
- readonly [K in keyof Fields]-?: InternalFlattenedTypeDefsOf<Exclude<Fields[K], undefined>, SegmentOverride, JsonPathOf<Path, `${Qualifier}${K}`, null>, '', Depth>;
11
+ type InternalFlattenedTypeDefsOfListChildren<T extends ListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, PathOf<Path, number, SegmentOverride>, '', Depth>;
12
+ type InternalFlattenedTypeDefsOfRecordChildren<T extends RecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['valueTypeDef'], SegmentOverride, PathOf<Path, T['keyPrototype'], SegmentOverride>, '', Depth>;
13
+ type InternalFlattenedTypeDefsOfObjectChildren<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<{
14
+ readonly [K in keyof Fields]-?: undefined extends Fields[K] ? InternalFlattenedTypeDefsOf<UnionTypeDef<null, {
15
+ readonly '0': Exclude<Fields[K], undefined>;
16
+ readonly '1': LiteralTypeDef<undefined>;
17
+ }>, SegmentOverride, PathOf<Path, `${Qualifier}${K}`, null>, '', Depth> : InternalFlattenedTypeDefsOf<Exclude<Fields[K], undefined>, SegmentOverride, PathOf<Path, `${Qualifier}${K}`, null>, '', Depth>;
15
18
  }[keyof Fields]> : never : never;
16
19
  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<{
17
20
  readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, '', Depth>;
@@ -0,0 +1,25 @@
1
+ import { type UnionToIntersection } from 'type-fest';
2
+ import { type Type, type TypeDef } from './definitions';
3
+ import { type Depths, type StartingDepth } from './flattened';
4
+ import { type PathOf } from './path_of';
5
+ import { type ErrorOfValidatingTypeDef, type ValidatingListTypeDef, type ValidatingLiteralTypeDef, type ValidatingObjectTypeDef, type ValidatingRecordTypeDef, type ValidatingUnionTypeDef } from './validating_definitions';
6
+ export type FlattenedTypesOfValidatingType<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path, '', Depth>;
7
+ type InternalFlattenedTypeDefsOf<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = {
8
+ readonly [K in Path]: Type<T>;
9
+ } & InternalFlattenedTypeDefsOfChildren<T, SegmentOverride, Path, Qualifier, Depth>;
10
+ 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;
11
+ type InternalFlattenedTypeDefsOfLiteralChildren = {};
12
+ type InternalFlattenedTypeDefsOfListChildren<T extends ValidatingListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, PathOf<Path, number, SegmentOverride>, '', Depth>;
13
+ 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>;
14
+ 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<{
15
+ readonly [K in keyof Fields]-?: undefined extends Fields[K] ? InternalFlattenedTypeDefsOf<ValidatingUnionTypeDef<ErrorOfValidatingTypeDef<Exclude<Fields[K], undefined>>, null, {
16
+ readonly '0': Exclude<Fields[K], undefined>;
17
+ readonly '1': ValidatingLiteralTypeDef<undefined>;
18
+ }>, SegmentOverride, PathOf<Path, `${Qualifier}${K}`, null>, '', Depth> : InternalFlattenedTypeDefsOf<Exclude<Fields[K], undefined>, SegmentOverride, PathOf<Path, `${Qualifier}${K}`, null>, '', Depth>;
19
+ }[keyof Fields]> : never : never;
20
+ 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<{
21
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, '', Depth>;
22
+ }[keyof Unions]> : UnionToIntersection<{
23
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, `${Qualifier}${K}:`, Depth>;
24
+ }[keyof Unions]> : never : never;
25
+ export {};
@@ -0,0 +1,10 @@
1
+ import { type Validator } from 'validation/validator';
2
+ import { type FlattenedTypesOfType } from './flattened_types_of_type';
3
+ import { type ReadonlyOfTypeDef, type ReadonlyTypeOfType } from './readonly_type_of_type';
4
+ import { type ErrorOfValidatingTypeDef, type ValidatingType, type ValidatingTypeDef } from './validating_definitions';
5
+ import { type ValueOfType, type ValueOfTypeDef } from './value_of_type';
6
+ type ValidatorOfValidatingType<T extends ValidatingTypeDef, ValuePath extends string, Context> = T extends ValidatingTypeDef<infer E> ? Validator<ValueOfTypeDef<ReadonlyOfTypeDef<T>>, E, ValuePath, Context> : never;
7
+ export type FlattenedValidatorsOfValidatingType<T extends ValidatingType, TypePathsToValuePaths extends Readonly<Record<keyof FlattenedTypes, string>>, FlattenedTypes extends Readonly<Record<string, ValidatingType>> = FlattenedTypesOfType<T, '*'>, Context = ValueOfType<ReadonlyTypeOfType<T>>> = {
8
+ [K in keyof FlattenedTypes as ErrorOfValidatingTypeDef<FlattenedTypes[K]['definition']> extends never ? never : K]: ValidatorOfValidatingType<FlattenedTypes[K]['definition'], TypePathsToValuePaths[K], Context>;
9
+ };
10
+ export {};
@@ -0,0 +1,6 @@
1
+ import { type Type } from './definitions';
2
+ import { type FlattenedTypesOfType } from './flattened_types_of_type';
3
+ import { type ValueOfType } from './value_of_type';
4
+ export type FlattenedValuesOfType<T extends Type, SegmentOverride extends string | null = null, Flattened extends Readonly<Record<string, Type>> = FlattenedTypesOfType<T, SegmentOverride>> = {
5
+ [K in keyof Flattened]: ValueOfType<Flattened[K], {}>;
6
+ };
@@ -1,5 +1,5 @@
1
1
  import { type Type } from './definitions';
2
- import { type ValueTypeOf } from './value_type_of';
2
+ import { type ValueOfType } from './value_of_type';
3
3
  declare const MOBX_OBSERVABLE_KEY = "___mobx_observable";
4
4
  export type MobxObservable<T = {}> = {
5
5
  [MOBX_OBSERVABLE_KEY]: true;
@@ -7,5 +7,5 @@ export type MobxObservable<T = {}> = {
7
7
  export type NonMobxObservable<T = {}> = {
8
8
  [MOBX_OBSERVABLE_KEY]?: never;
9
9
  } & T;
10
- export type MobxValueTypeOf<T extends Type> = ValueTypeOf<T, MobxObservable>;
10
+ export type MobxValueOfType<T extends Type> = ValueOfType<T, MobxObservable>;
11
11
  export {};
@@ -1,5 +1,5 @@
1
1
  import { type ListTypeDef, type LiteralTypeDef, type ObjectTypeDef, type RecordTypeDef, type Type, type TypeDef, type TypeDefType, type UnionTypeDef } from './definitions';
2
- export type PartialTypeDefOf<T extends Type> = {
2
+ export type PartialTypeOfType<T extends Type> = {
3
3
  readonly typeDef: InternalPartialAndNullableOf<T['definition']>;
4
4
  };
5
5
  type InternalPartialAndNullableOf<T extends TypeDef> = {
@@ -0,0 +1 @@
1
+ export 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;
@@ -1,14 +1,14 @@
1
1
  import { type ListTypeDef, type LiteralTypeDef, type ObjectTypeDef, type RecordTypeDef, type Type, type TypeDef, type UnionTypeDef } from './definitions';
2
2
  import { type Depths, type StartingDepth } from './flattened';
3
- import { type JsonPathOf } from './json_path_of';
4
- export type JsonPathsOf<T extends Type, SegmentOverride extends string | null = null, Prefix extends string = '$'> = InternalJsonPathsOf<T['definition'], Prefix, SegmentOverride, StartingDepth>;
3
+ import { type PathOf } from './path_of';
4
+ export type PathsOfType<T extends Type, SegmentOverride extends string | null = null, Prefix extends string = '$'> = InternalJsonPathsOf<T['definition'], Prefix, SegmentOverride, StartingDepth>;
5
5
  export 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;
6
6
  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;
7
7
  type InternalJsonPathsOfLiteralChildren = never;
8
- type InternalJsonPathsOfListChildren<F extends ListTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['elements'], JsonPathOf<Prefix, number, SegmentOverride>, SegmentOverride, Depth>;
9
- 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>;
8
+ type InternalJsonPathsOfListChildren<F extends ListTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['elements'], PathOf<Prefix, number, SegmentOverride>, SegmentOverride, Depth>;
9
+ 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>;
10
10
  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 ? {
11
- [K in keyof Fields]: InternalJsonPathsOf<Fields[K], JsonPathOf<Prefix, `${Qualifier}${K}`, null>, SegmentOverride, Depth>;
11
+ [K in keyof Fields]: InternalJsonPathsOf<Fields[K], PathOf<Prefix, `${Qualifier}${K}`, null>, SegmentOverride, Depth>;
12
12
  }[keyof Fields] : never : never;
13
13
  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 ? {
14
14
  readonly [K in keyof Unions]: InternalJsonPathsOfChildren<Unions[K], Prefix, SegmentOverride, D extends null ? Qualifier : `${Qualifier}${K}:`, Depth>;
@@ -0,0 +1,29 @@
1
+ import { type ListTypeDef, type LiteralTypeDef, type ObjectTypeDef, type RecordTypeDef, type Type, type TypeDef, type UnionTypeDef } from './definitions';
2
+ export type ReadonlyTypeOfType<T extends Type> = {
3
+ readonly definition: ReadonlyOfTypeDef<T['definition']>;
4
+ };
5
+ export 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;
6
+ type ReadonlyOfLiteralTypeDef<T extends LiteralTypeDef> = T;
7
+ type ReadonlyOfListTypeDef<T extends ListTypeDef> = {
8
+ readonly type: T['type'];
9
+ readonly elements: ReadonlyOfTypeDef<T['elements']>;
10
+ };
11
+ type ReadonlyOfRecordTypeDef<T extends RecordTypeDef> = {
12
+ readonly type: T['type'];
13
+ readonly keyPrototype: T['keyPrototype'];
14
+ readonly valueTypeDef: undefined extends T['valueTypeDef'] ? ReadonlyOfTypeDef<Exclude<T['valueTypeDef'], undefined>> | undefined : ReadonlyOfTypeDef<T['valueTypeDef']>;
15
+ };
16
+ type ReadonlyOfObjectTypeDef<T extends ObjectTypeDef> = T extends ObjectTypeDef<infer Fields> ? {
17
+ readonly type: T['type'];
18
+ readonly fields: {
19
+ readonly [K in keyof Fields]: ReadonlyOfTypeDef<Fields[K]>;
20
+ };
21
+ } : never;
22
+ type ReadonlyOfUnionTypeDef<T extends UnionTypeDef> = T extends UnionTypeDef<infer D, infer Unions> ? {
23
+ readonly type: T['type'];
24
+ readonly discriminator: D;
25
+ readonly unions: {
26
+ readonly [K in keyof Unions]: ReadonlyOfTypeDef<Unions[K]>;
27
+ };
28
+ } : never;
29
+ export {};