@strictly/define 0.0.13 → 0.0.15

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 (31) hide show
  1. package/.out/tsconfig.tsbuildinfo +1 -1
  2. package/.out/types/builders.d.ts +21 -20
  3. package/.out/types/builders.js +8 -5
  4. package/.out/types/flattened_types_of_validating_type.d.ts +4 -4
  5. package/.out/types/flattened_validators_of_validating_type.d.ts +7 -6
  6. package/.out/types/specs/flattened_validators_of_validating_type.tests.js +2 -2
  7. package/.out/types/validating_definitions.d.ts +14 -12
  8. package/.out/types/validating_type_def_with_error.d.ts +13 -13
  9. package/.out/validation/validator.d.ts +1 -0
  10. package/.out/validation/validator.js +4 -0
  11. package/.out/validation/validators/composite_validator.d.ts +7 -0
  12. package/.out/validation/validators/composite_validator.js +32 -0
  13. package/.out/validation/validators/minimum_string_length_validator.d.ts +1 -1
  14. package/.turbo/turbo-build.log +8 -8
  15. package/.turbo/turbo-check-types.log +1 -1
  16. package/.turbo/turbo-release$colon$exports.log +1 -1
  17. package/dist/index.cjs +45 -5
  18. package/dist/index.d.cts +80 -77
  19. package/dist/index.d.ts +80 -77
  20. package/dist/index.js +44 -5
  21. package/package.json +1 -1
  22. package/types/builders.ts +46 -26
  23. package/types/flattened_types_of_validating_type.ts +5 -2
  24. package/types/flattened_validators_of_validating_type.ts +7 -9
  25. package/types/specs/builder.tests.ts +31 -31
  26. package/types/specs/flattened_validators_of_validating_type.tests.ts +7 -7
  27. package/types/validating_definitions.ts +27 -15
  28. package/types/validating_type_def_with_error.ts +23 -23
  29. package/validation/validator.ts +16 -0
  30. package/validation/validators/composite_validator.ts +42 -0
  31. package/validation/validators/minimum_string_length_validator.ts +1 -1
package/dist/index.js CHANGED
@@ -672,6 +672,40 @@ function internalJsonValuePathToTypePath(typeDef, valueSteps, allowMissingPaths,
672
672
  }
673
673
  }
674
674
 
675
+ // validation/validators/composite_validator.ts
676
+ var CompositeValidator = class {
677
+ constructor(...validators) {
678
+ __publicField(this, "validators");
679
+ this.validators = validators;
680
+ }
681
+ validate(v, valuePath, context) {
682
+ return this.validators.reduce((error, validator) => {
683
+ if (error != null) {
684
+ return error;
685
+ }
686
+ return validate(validator, v, valuePath, context);
687
+ }, null);
688
+ }
689
+ annotations(valuePath, context) {
690
+ return this.validators.reduce(({
691
+ required,
692
+ readonly
693
+ }, validator) => {
694
+ const {
695
+ readonly: validatorReadonly,
696
+ required: validatorRequired
697
+ } = annotations(validator, valuePath, context);
698
+ return {
699
+ required: required || validatorRequired,
700
+ readonly: readonly || validatorReadonly
701
+ };
702
+ }, {
703
+ required: false,
704
+ readonly: false
705
+ });
706
+ }
707
+ };
708
+
675
709
  // validation/validator.ts
676
710
  function isFunctionalValidator(v) {
677
711
  return typeof v === "function";
@@ -686,6 +720,9 @@ function validate(validator, v, valuePath, context) {
686
720
  return validator(v, valuePath, context);
687
721
  }
688
722
  }
723
+ function mergeValidators(v1, v2) {
724
+ return new CompositeValidator(v1, v2);
725
+ }
689
726
  function annotations(validator, valuePath, context) {
690
727
  if (isAnnotatedValidator(validator)) {
691
728
  return validator.annotations(valuePath, context);
@@ -794,11 +831,11 @@ var TypeDefBuilder = class _TypeDefBuilder {
794
831
  enforce(rule) {
795
832
  return new _TypeDefBuilder(
796
833
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
797
- __spreadProps(__spreadValues(__spreadValues({}, this.definition), isAnnotatedValidator(rule) ? mergeAnnotations(rule.annotations(null, null), this.definition) : {}), {
834
+ __spreadProps(__spreadValues(__spreadValues({}, this.definition), rule != null && isAnnotatedValidator(rule) ? mergeAnnotations(rule.annotations(null, null), this.definition) : {}), {
798
835
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
799
- rule: (value) => {
836
+ rule: (value, valuePath, context) => {
800
837
  var _a;
801
- return (_a = this.definition.rule(value)) != null ? _a : validate(rule, value, null, null);
838
+ return (_a = this.definition.rule(value, valuePath, context)) != null ? _a : rule && validate(rule, value, valuePath, context);
802
839
  }
803
840
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
804
841
  })
@@ -862,8 +899,9 @@ var ObjectTypeDefBuilder = class _ObjectTypeDefBuilder extends TypeDefBuilder {
862
899
  fields: __spreadProps(__spreadValues({}, this.definition.fields), {
863
900
  [name]: __spreadProps(__spreadValues({}, definition), {
864
901
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
865
- rule: function(v) {
866
- return definition.rule(v) || (rule == null ? void 0 : rule(v));
902
+ rule: function(v, valuePath, context) {
903
+ var _a;
904
+ return (_a = definition.rule(v, valuePath, context)) != null ? _a : rule && validate(rule, v, valuePath, context);
867
905
  }
868
906
  })
869
907
  })
@@ -1124,6 +1162,7 @@ export {
1124
1162
  list,
1125
1163
  literal,
1126
1164
  mergeAnnotations,
1165
+ mergeValidators,
1127
1166
  mobxCopy,
1128
1167
  nullType,
1129
1168
  nullable,
package/package.json CHANGED
@@ -35,7 +35,7 @@
35
35
  "test:watch": "vitest"
36
36
  },
37
37
  "type": "module",
38
- "version": "0.0.13",
38
+ "version": "0.0.15",
39
39
  "exports": {
40
40
  ".": {
41
41
  "import": {
package/types/builders.ts CHANGED
@@ -43,15 +43,20 @@ class TypeDefBuilder<T extends ValidatingTypeDef> implements ValidatingType<T> {
43
43
  constructor(readonly definition: T) {
44
44
  }
45
45
 
46
- enforce<E2>(rule: Rule<E2, ValueOfType<Type<T>>> | Validator<ValueOfType<Type<T>>, E2, never, never>) {
47
- return new TypeDefBuilder<ValidatingTypeDefWithError<T, E2>>(
46
+ enforce<E2, C2>(): TypeDefBuilder<ValidatingTypeDefWithError<T, E2, C2>>
47
+ enforce<E2,
48
+ C2>(rule: Validator<ValueOfType<Type<T>>, E2, string, C2>): TypeDefBuilder<ValidatingTypeDefWithError<T, E2, C2>>
49
+ enforce<E2, C2>(rule?: Validator<ValueOfType<Type<T>>, E2, string, C2>) {
50
+ return new TypeDefBuilder<ValidatingTypeDefWithError<T, E2, C2>>(
48
51
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
49
52
  {
50
53
  ...this.definition,
51
- ...(isAnnotatedValidator(rule) ? mergeAnnotations(rule.annotations(null!, null!), this.definition) : {}),
54
+ ...(rule != null && isAnnotatedValidator(rule)
55
+ ? mergeAnnotations(rule.annotations(null!, null!), this.definition)
56
+ : {}),
52
57
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
- rule: (value: any) => {
54
- return this.definition.rule(value) ?? validate(rule, value, null!, null!)
58
+ rule: (value: any, valuePath: string, context: any) => {
59
+ return this.definition.rule(value, valuePath, context) ?? (rule && validate(rule, value, valuePath, context))
55
60
  },
56
61
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
62
  } as any,
@@ -153,12 +158,12 @@ class RecordTypeDefBuilder<T extends ValidatingRecordTypeDef> extends TypeDefBui
153
158
  })
154
159
  }
155
160
  }
156
-
157
161
  class ObjectTypeDefBuilder<
158
162
  E,
163
+ C,
159
164
  Fields extends Readonly<Record<ObjectFieldKey, ValidatingTypeDef>> = {},
160
165
  > extends TypeDefBuilder<
161
- ValidatingObjectTypeDef<E, Fields>
166
+ ValidatingObjectTypeDef<E, C, Fields>
162
167
  > {
163
168
  field<
164
169
  Name extends string,
@@ -168,36 +173,42 @@ class ObjectTypeDefBuilder<
168
173
  { definition }: Type<T>,
169
174
  ): ObjectTypeDefBuilder<
170
175
  E,
176
+ C,
171
177
  Fields & Record<Name, T>
172
178
  >
173
179
  field<
174
180
  Name extends string,
175
181
  T extends ValidatingTypeDef,
176
182
  RequiredError,
183
+ C2,
177
184
  >(
178
185
  name: Name,
179
186
  { definition }: Type<T>,
180
187
  rule: Rule<RequiredError, ValueOfTypeDef<T>>,
181
188
  ): ObjectTypeDefBuilder<
182
189
  E,
183
- Fields & Record<Name, ValidatingTypeDefWithError<T, RequiredError>>
190
+ C & C2,
191
+ Fields & Record<Name, ValidatingTypeDefWithError<T, RequiredError, C & C2>>
184
192
  >
185
193
  field<
186
194
  Name extends string,
187
195
  T extends ValidatingTypeDef,
188
196
  RequiredError = never,
197
+ C2 = {},
189
198
  >(
190
199
  name: Name,
191
200
  { definition }: Type<T>,
192
- rule?: Rule<RequiredError, ValueOfTypeDef<T>>,
201
+ rule?: Rule<RequiredError, C2, ValueOfTypeDef<T>>,
193
202
  ): ObjectTypeDefBuilder<
194
203
  E,
195
- Fields & Record<Name, ValidatingTypeDefWithError<T, RequiredError>>
204
+ C & C2,
205
+ Fields & Record<Name, ValidatingTypeDefWithError<T, RequiredError, C2>>
196
206
  > {
197
207
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
198
208
  return new ObjectTypeDefBuilder<
199
209
  E,
200
- Fields & Record<Name, ValidatingTypeDefWithError<T, RequiredError>>
210
+ C & C2,
211
+ Fields & Record<Name, ValidatingTypeDefWithError<T, RequiredError, C2>>
201
212
  >({
202
213
  ...this.definition,
203
214
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
@@ -206,11 +217,11 @@ class ObjectTypeDefBuilder<
206
217
  [name]: {
207
218
  ...definition,
208
219
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
- rule: function (v: any) {
210
- return definition.rule(v) || rule?.(v)
220
+ rule: function (v: any, valuePath: string, context: C2) {
221
+ return definition.rule(v, valuePath, context) ?? (rule && validate(rule, v, valuePath, context))
211
222
  },
212
223
  },
213
- } as Fields & Record<Name, ValidatingTypeDefWithError<T, RequiredError>>,
224
+ } as Fields & Record<Name, ValidatingTypeDefWithError<T, RequiredError, C2>>,
214
225
  })
215
226
  }
216
227
 
@@ -222,6 +233,7 @@ class ObjectTypeDefBuilder<
222
233
  { definition }: Type<T>,
223
234
  ): ObjectTypeDefBuilder<
224
235
  E,
236
+ C,
225
237
  Fields & Readonly<Record<Name, T>>
226
238
  > {
227
239
  const newFields = {
@@ -233,6 +245,7 @@ class ObjectTypeDefBuilder<
233
245
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
234
246
  return new ObjectTypeDefBuilder<
235
247
  E,
248
+ C,
236
249
  Fields & Readonly<Record<Name, T>>
237
250
  >({
238
251
  ...this.definition,
@@ -251,6 +264,7 @@ class ObjectTypeDefBuilder<
251
264
  { definition }: Type<T>,
252
265
  ): ObjectTypeDefBuilder<
253
266
  E,
267
+ C,
254
268
  Fields & Partial<Record<Name, T>>
255
269
  > {
256
270
  const newFields = {
@@ -261,6 +275,7 @@ class ObjectTypeDefBuilder<
261
275
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
262
276
  return new ObjectTypeDefBuilder<
263
277
  E,
278
+ C,
264
279
  Fields & Partial<Record<Name, T>>
265
280
  >({
266
281
  ...this.definition,
@@ -279,6 +294,7 @@ class ObjectTypeDefBuilder<
279
294
  { definition }: Type<T>,
280
295
  ): ObjectTypeDefBuilder<
281
296
  E,
297
+ C,
282
298
  Fields & Partial<Readonly<Record<Name, T>>>
283
299
  > {
284
300
  const newFields = {
@@ -290,6 +306,7 @@ class ObjectTypeDefBuilder<
290
306
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
291
307
  return new ObjectTypeDefBuilder<
292
308
  E,
309
+ C,
293
310
  Fields & Partial<Readonly<Record<Name, T>>>
294
311
  >({
295
312
  ...this.definition,
@@ -303,11 +320,13 @@ class ObjectTypeDefBuilder<
303
320
 
304
321
  class UnionTypeDefBuilder<
305
322
  E,
323
+ C,
306
324
  D extends string | null,
307
325
  U extends Record<UnionKey, TypeDef>,
308
326
  > extends TypeDefBuilder<
309
327
  ValidatingUnionTypeDef<
310
328
  E,
329
+ C,
311
330
  D,
312
331
  U
313
332
  >
@@ -320,11 +339,11 @@ class UnionTypeDefBuilder<
320
339
  {
321
340
  definition: typeDef,
322
341
  }: Type<T>,
323
- ): UnionTypeDefBuilder<E, D, Readonly<Record<K, T>> & U> {
342
+ ): UnionTypeDefBuilder<E, C, D, Readonly<Record<K, T>> & U> {
324
343
  const {
325
344
  unions,
326
345
  } = this.definition
327
- return new UnionTypeDefBuilder<E, D, Readonly<Record<K, T>> & U>(
346
+ return new UnionTypeDefBuilder<E, C, D, Readonly<Record<K, T>> & U>(
328
347
  {
329
348
  ...this.definition,
330
349
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
@@ -337,7 +356,7 @@ class UnionTypeDefBuilder<
337
356
  }
338
357
  }
339
358
 
340
- export function literal<T>(value?: [T]): TypeDefBuilder<ValidatingLiteralTypeDef<never, T>> {
359
+ export function literal<T>(value?: [T]): TypeDefBuilder<ValidatingLiteralTypeDef<never, {}, T>> {
341
360
  return new TypeDefBuilder({
342
361
  type: TypeDefType.Literal,
343
362
  valuePrototype: value!,
@@ -356,10 +375,11 @@ export function nullable<
356
375
  T extends ValidatingTypeDef,
357
376
  >(nonNullable: ValidatingType<T>): UnionTypeDefBuilder<
358
377
  never,
378
+ {},
359
379
  null,
360
380
  {
361
381
  readonly ['0']: T,
362
- readonly ['1']: ValidatingLiteralTypeDef<never, null>,
382
+ readonly ['1']: ValidatingLiteralTypeDef<never, {}, null>,
363
383
  }
364
384
  > {
365
385
  return new UnionTypeDefBuilder(
@@ -371,7 +391,7 @@ export function nullable<
371
391
  ['1']: nullType.definition,
372
392
  },
373
393
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
374
- rule: emptyRule as Rule<never>,
394
+ rule: emptyRule as Rule<never, {}>,
375
395
  readonly: false,
376
396
  required: false,
377
397
  },
@@ -381,12 +401,12 @@ export function nullable<
381
401
  export function list<T extends ValidatingTypeDef>(elements: ValidatingType<T>): ListTypeDefBuilder<{
382
402
  readonly type: TypeDefType.List,
383
403
  elements: T,
384
- readonly rule: Rule<never>,
404
+ readonly rule: Rule<never, {}>,
385
405
  readonly readonly: boolean,
386
406
  readonly required: boolean,
387
407
  }> {
388
408
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
389
- return new ListTypeDefBuilder<ValidatingListTypeDef<never, T>>({
409
+ return new ListTypeDefBuilder<ValidatingListTypeDef<never, {}, T>>({
390
410
  type: TypeDefType.List,
391
411
  elements: elements.definition,
392
412
  rule: emptyRule,
@@ -405,7 +425,7 @@ export function record<
405
425
  readonly type: TypeDefType.Record,
406
426
  readonly keyPrototype: K,
407
427
  valueTypeDef: V['definition'],
408
- readonly rule: Rule<never>,
428
+ readonly rule: Rule<never, {}>,
409
429
  readonly readonly: boolean,
410
430
  readonly required: boolean,
411
431
  }>({
@@ -429,11 +449,11 @@ export function object(): ObjectTypeDefBuilder<never, {}> {
429
449
  })
430
450
  }
431
451
 
432
- export function union<D extends null>(): UnionTypeDefBuilder<never, D, {}>
433
- export function union<D extends string>(discriminator: D): UnionTypeDefBuilder<never, D, {}>
434
- export function union<D extends string | null>(discriminator?: D): UnionTypeDefBuilder<never, D, {}> {
452
+ export function union<D extends null>(): UnionTypeDefBuilder<never, {}, D, {}>
453
+ export function union<D extends string>(discriminator: D): UnionTypeDefBuilder<never, {}, D, {}>
454
+ export function union<D extends string | null>(discriminator?: D): UnionTypeDefBuilder<never, {}, D, {}> {
435
455
  // have to explicitly supply types as TS will infinitely recurse trying to infer them!
436
- return new UnionTypeDefBuilder<never, D, {}>(
456
+ return new UnionTypeDefBuilder<never, {}, D, {}>(
437
457
  {
438
458
  type: TypeDefType.Union,
439
459
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
@@ -11,6 +11,7 @@ import {
11
11
  } from './flattened'
12
12
  import { type PathOf } from './path_of'
13
13
  import {
14
+ type ContextOfValidatingTypeDef,
14
15
  type ErrorOfValidatingTypeDef,
15
16
  type ValidatingListTypeDef,
16
17
  type ValidatingLiteralTypeDef,
@@ -93,7 +94,8 @@ type InternalFlattenedTypeDefsOfObjectChildren<
93
94
  Path extends string,
94
95
  Qualifier extends string,
95
96
  Depth extends number,
96
- > = T extends ValidatingObjectTypeDef<infer _E, infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
97
+ > = T extends ValidatingObjectTypeDef<infer _E, infer _C, infer Fields>
98
+ ? keyof Fields extends string ? UnionToIntersection<{
97
99
  readonly [
98
100
  K in keyof Fields
99
101
  ]-?: undefined extends Fields[K]
@@ -101,6 +103,7 @@ type InternalFlattenedTypeDefsOfObjectChildren<
101
103
  ? InternalFlattenedTypeDefsOf<
102
104
  ValidatingUnionTypeDef<
103
105
  ErrorOfValidatingTypeDef<Exclude<Fields[K], undefined>>,
106
+ ContextOfValidatingTypeDef<Exclude<Fields[K], undefined>>,
104
107
  null,
105
108
  {
106
109
  readonly '0': Exclude<Fields[K], undefined>,
@@ -129,7 +132,7 @@ type InternalFlattenedTypeDefsOfUnionChildren<
129
132
  Path extends string,
130
133
  Qualifier extends string,
131
134
  Depth extends number,
132
- > = T extends ValidatingUnionTypeDef<infer _E, infer D, infer Unions>
135
+ > = T extends ValidatingUnionTypeDef<infer _E, infer _C, infer D, infer Unions>
133
136
  ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
134
137
  readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<
135
138
  Unions[K],
@@ -1,8 +1,8 @@
1
+ import { type Simplify } from 'type-fest'
1
2
  import { type Validator } from 'validation/validator'
2
3
  import { type FlattenedTypesOfType } from './flattened_types_of_type'
3
4
  import {
4
5
  type ReadonlyOfTypeDef,
5
- type ReadonlyTypeOfType,
6
6
  } from './readonly_type_of_type'
7
7
  import {
8
8
  type ErrorOfValidatingTypeDef,
@@ -10,24 +10,22 @@ import {
10
10
  type ValidatingTypeDef,
11
11
  } from './validating_definitions'
12
12
  import {
13
- type ValueOfType,
14
13
  type ValueOfTypeDef,
15
14
  } from './value_of_type'
16
15
 
17
- type ValidatorOfValidatingType<T extends ValidatingTypeDef, ValuePath extends string, Context> = T extends
18
- ValidatingTypeDef<infer E> ? Validator<ValueOfTypeDef<ReadonlyOfTypeDef<T>>, E, ValuePath, Context>
16
+ type ValidatorOfValidatingType<T extends ValidatingTypeDef, ValuePath extends string> = T extends
17
+ ValidatingTypeDef<infer E, infer C> ? Validator<ValueOfTypeDef<ReadonlyOfTypeDef<T>>, E, ValuePath, C>
19
18
  : never
20
19
 
21
20
  export type FlattenedValidatorsOfValidatingType<
22
21
  T extends ValidatingType,
23
22
  TypePathsToValuePaths extends Readonly<Record<keyof FlattenedTypes, string>>,
24
23
  FlattenedTypes extends Readonly<Record<string, ValidatingType>> = FlattenedTypesOfType<T, '*'>,
25
- Context = ValueOfType<ReadonlyTypeOfType<T>>,
26
- > = {
24
+ > // needs to simplify otherwise TS compiler dies
25
+ = Simplify<{
27
26
  [K in keyof FlattenedTypes as ErrorOfValidatingTypeDef<FlattenedTypes[K]['definition']> extends never ? never : K]:
28
27
  ValidatorOfValidatingType<
29
28
  FlattenedTypes[K]['definition'],
30
- TypePathsToValuePaths[K],
31
- Context
29
+ TypePathsToValuePaths[K]
32
30
  >
33
- }
31
+ }>
@@ -21,7 +21,7 @@ describe('builder', function () {
21
21
  type C = {
22
22
  readonly type: TypeDefType.Literal,
23
23
  readonly valuePrototype: [number],
24
- readonly rule: Rule<never>,
24
+ readonly rule: Rule<never, {}>,
25
25
  readonly required: boolean,
26
26
  readonly readonly: boolean,
27
27
  }
@@ -49,19 +49,19 @@ describe('builder', function () {
49
49
  readonly [0]: {
50
50
  readonly type: TypeDefType.Literal,
51
51
  readonly valuePrototype: [number],
52
- readonly rule: Rule<never>,
52
+ readonly rule: Rule<never, {}>,
53
53
  readonly required: boolean,
54
54
  readonly readonly: boolean,
55
55
  },
56
56
  readonly [1]: {
57
57
  readonly type: TypeDefType.Literal,
58
58
  readonly valuePrototype: [null],
59
- readonly rule: Rule<never>,
59
+ readonly rule: Rule<never, {}>,
60
60
  readonly required: boolean,
61
61
  readonly readonly: boolean,
62
62
  },
63
63
  },
64
- readonly rule: Rule<never>,
64
+ readonly rule: Rule<never, {}>,
65
65
  readonly required: boolean,
66
66
  readonly readonly: boolean,
67
67
  }
@@ -125,11 +125,11 @@ describe('builder', function () {
125
125
  elements: {
126
126
  readonly type: TypeDefType.Literal,
127
127
  readonly valuePrototype: [number],
128
- readonly rule: Rule<never>,
128
+ readonly rule: Rule<never, {}>,
129
129
  readonly required: boolean,
130
130
  readonly readonly: boolean,
131
131
  },
132
- readonly rule: Rule<never>,
132
+ readonly rule: Rule<never, {}>,
133
133
  readonly required: boolean,
134
134
  readonly readonly: boolean,
135
135
  }
@@ -147,11 +147,11 @@ describe('builder', function () {
147
147
  readonly elements: {
148
148
  readonly type: TypeDefType.Literal,
149
149
  readonly valuePrototype: [number],
150
- readonly rule: Rule<never>,
150
+ readonly rule: Rule<never, {}>,
151
151
  readonly required: boolean,
152
152
  readonly readonly: boolean,
153
153
  },
154
- readonly rule: Rule<never>,
154
+ readonly rule: Rule<never, {}>,
155
155
  readonly required: boolean,
156
156
  readonly readonly: boolean,
157
157
  }
@@ -173,11 +173,11 @@ describe('builder', function () {
173
173
  valueTypeDef: {
174
174
  readonly type: TypeDefType.Literal,
175
175
  readonly valuePrototype: [number],
176
- readonly rule: Rule<never>,
176
+ readonly rule: Rule<never, {}>,
177
177
  readonly required: boolean,
178
178
  readonly readonly: boolean,
179
179
  },
180
- readonly rule: Rule<never>,
180
+ readonly rule: Rule<never, {}>,
181
181
  readonly required: boolean,
182
182
  readonly readonly: boolean,
183
183
  }
@@ -196,11 +196,11 @@ describe('builder', function () {
196
196
  readonly valueTypeDef: {
197
197
  readonly type: TypeDefType.Literal,
198
198
  readonly valuePrototype: [number],
199
- readonly rule: Rule<never>,
199
+ readonly rule: Rule<never, {}>,
200
200
  readonly required: boolean,
201
201
  readonly readonly: boolean,
202
202
  },
203
- readonly rule: Rule<never>,
203
+ readonly rule: Rule<never, {}>,
204
204
  readonly required: boolean,
205
205
  readonly readonly: boolean,
206
206
  }
@@ -218,11 +218,11 @@ describe('builder', function () {
218
218
  valueTypeDef: {
219
219
  readonly type: TypeDefType.Literal,
220
220
  readonly valuePrototype: [number],
221
- readonly rule: Rule<never>,
221
+ readonly rule: Rule<never, {}>,
222
222
  readonly required: boolean,
223
223
  readonly readonly: boolean,
224
224
  } | undefined,
225
- readonly rule: Rule<never>,
225
+ readonly rule: Rule<never, {}>,
226
226
  readonly required: boolean,
227
227
  readonly readonly: boolean,
228
228
  }
@@ -241,11 +241,11 @@ describe('builder', function () {
241
241
  readonly valueTypeDef: {
242
242
  readonly type: TypeDefType.Literal,
243
243
  readonly valuePrototype: [number],
244
- readonly rule: Rule<never>,
244
+ readonly rule: Rule<never, {}>,
245
245
  readonly required: boolean,
246
246
  readonly readonly: boolean,
247
247
  } | undefined,
248
- readonly rule: Rule<never>,
248
+ readonly rule: Rule<never, {}>,
249
249
  readonly required: boolean,
250
250
  readonly readonly: boolean,
251
251
  }
@@ -265,11 +265,11 @@ describe('builder', function () {
265
265
  readonly valueTypeDef: {
266
266
  readonly type: TypeDefType.Literal,
267
267
  readonly valuePrototype: [number],
268
- readonly rule: Rule<never>,
268
+ readonly rule: Rule<never, {}>,
269
269
  readonly required: boolean,
270
270
  readonly readonly: boolean,
271
271
  } | undefined,
272
- readonly rule: Rule<never>,
272
+ readonly rule: Rule<never, {}>,
273
273
  readonly required: boolean,
274
274
  readonly readonly: boolean,
275
275
  }
@@ -295,7 +295,7 @@ describe('builder', function () {
295
295
  a: {
296
296
  readonly type: TypeDefType.Literal,
297
297
  readonly valuePrototype: [number],
298
- readonly rule: Rule<never>,
298
+ readonly rule: Rule<never, {}>,
299
299
  readonly required: boolean,
300
300
  readonly readonly: boolean,
301
301
  },
@@ -304,7 +304,7 @@ describe('builder', function () {
304
304
  readonly b: {
305
305
  readonly type: TypeDefType.Literal,
306
306
  readonly valuePrototype: [boolean],
307
- readonly rule: Rule<never>,
307
+ readonly rule: Rule<never, {}>,
308
308
  readonly required: boolean,
309
309
  readonly readonly: boolean,
310
310
  },
@@ -313,7 +313,7 @@ describe('builder', function () {
313
313
  c?: {
314
314
  readonly type: TypeDefType.Literal,
315
315
  readonly valuePrototype: [string],
316
- readonly rule: Rule<never>,
316
+ readonly rule: Rule<never, {}>,
317
317
  readonly required: boolean,
318
318
  readonly readonly: boolean,
319
319
  },
@@ -322,12 +322,12 @@ describe('builder', function () {
322
322
  readonly d?: {
323
323
  readonly type: TypeDefType.Literal,
324
324
  readonly valuePrototype: [number],
325
- readonly rule: Rule<never>,
325
+ readonly rule: Rule<never, {}>,
326
326
  readonly required: boolean,
327
327
  readonly readonly: boolean,
328
328
  },
329
329
  },
330
- readonly rule: Rule<never>,
330
+ readonly rule: Rule<never, {}>,
331
331
  readonly required: boolean,
332
332
  readonly readonly: boolean,
333
333
  }
@@ -359,7 +359,7 @@ describe('builder', function () {
359
359
  readonly [1]: {
360
360
  readonly type: TypeDefType.Literal,
361
361
  readonly valuePrototype: [number],
362
- readonly rule: Rule<never>,
362
+ readonly rule: Rule<never, {}>,
363
363
  readonly required: boolean,
364
364
  readonly readonly: boolean,
365
365
  },
@@ -368,12 +368,12 @@ describe('builder', function () {
368
368
  readonly [2]: {
369
369
  readonly type: TypeDefType.Literal,
370
370
  readonly valuePrototype: [string],
371
- readonly rule: Rule<never>,
371
+ readonly rule: Rule<never, {}>,
372
372
  readonly required: boolean,
373
373
  readonly readonly: boolean,
374
374
  },
375
375
  },
376
- readonly rule: Rule<never>,
376
+ readonly rule: Rule<never, {}>,
377
377
  readonly required: boolean,
378
378
  readonly readonly: boolean,
379
379
  }
@@ -407,12 +407,12 @@ describe('builder', function () {
407
407
  a: {
408
408
  readonly type: TypeDefType.Literal,
409
409
  readonly valuePrototype: [boolean],
410
- readonly rule: Rule<never>,
410
+ readonly rule: Rule<never, {}>,
411
411
  readonly required: boolean,
412
412
  readonly readonly: boolean,
413
413
  },
414
414
  },
415
- readonly rule: Rule<never>,
415
+ readonly rule: Rule<never, {}>,
416
416
  readonly required: boolean,
417
417
  readonly readonly: boolean,
418
418
  },
@@ -424,17 +424,17 @@ describe('builder', function () {
424
424
  b: {
425
425
  readonly type: TypeDefType.Literal,
426
426
  readonly valuePrototype: [number],
427
- readonly rule: Rule<never>,
427
+ readonly rule: Rule<never, {}>,
428
428
  readonly required: boolean,
429
429
  readonly readonly: boolean,
430
430
  },
431
431
  },
432
- readonly rule: Rule<never>,
432
+ readonly rule: Rule<never, {}>,
433
433
  readonly required: boolean,
434
434
  readonly readonly: boolean,
435
435
  },
436
436
  },
437
- readonly rule: Rule<never>,
437
+ readonly rule: Rule<never, {}>,
438
438
  readonly required: boolean,
439
439
  readonly readonly: boolean,
440
440
  }
@@ -9,7 +9,7 @@ import { type Validator } from 'validation/validator'
9
9
 
10
10
  describe('FlattenedValidatorsOfValidatingType', function () {
11
11
  describe('literal', function () {
12
- const literalType = numberType.enforce(function (): 'a' {
12
+ const literalType = numberType.enforce<'a', number>(function (): 'a' {
13
13
  return 'a'
14
14
  })
15
15
  type T = FlattenedValidatorsOfValidatingType<
@@ -27,17 +27,17 @@ describe('FlattenedValidatorsOfValidatingType', function () {
27
27
  })
28
28
 
29
29
  describe('list', function () {
30
- const literalType = numberType.enforce(function (): 'x' {
31
- return 'x'
30
+ const literalType = numberType.enforce<'Y', { b: boolean }>(function (): 'Y' {
31
+ return 'Y'
32
32
  })
33
- const listType = list(literalType.narrow).enforce(function (): 'y' {
34
- return 'y'
33
+ const listType = list(literalType.narrow).enforce<'X', { a: number }>(function (): 'X' {
34
+ return 'X'
35
35
  })
36
36
  type T = FlattenedValidatorsOfValidatingType<typeof listType, Reverse<ValueToTypePathsOfType<typeof listType>>>
37
37
 
38
38
  type C = {
39
- readonly $: Validator<readonly number[], 'y', '$', readonly number[]>,
40
- readonly '$.*': Validator<number, 'x', `$.${number}`, readonly number[]>,
39
+ readonly $: Validator<readonly number[], 'X', '$', { a: number }>,
40
+ readonly '$.*': Validator<number, 'Y', `$.${number}`, { b: boolean }>,
41
41
  }
42
42
 
43
43
  it('equals expected type', function () {