@cleverbrush/schema 0.0.17 → 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +213 -163
  2. package/dist/builders/AliasSchemaBuilder.d.ts +14 -0
  3. package/dist/builders/AliasSchemaBuilder.js +91 -0
  4. package/dist/builders/ArraySchemaBuilder.d.ts +15 -0
  5. package/dist/builders/ArraySchemaBuilder.js +141 -0
  6. package/dist/builders/BooleanSchemaBuilder.d.ts +31 -0
  7. package/dist/builders/BooleanSchemaBuilder.js +90 -0
  8. package/dist/builders/FunctionSchemaBuilder.d.ts +25 -0
  9. package/dist/builders/FunctionSchemaBuilder.js +66 -0
  10. package/dist/builders/NumberSchemaBuilder.d.ts +61 -0
  11. package/dist/builders/NumberSchemaBuilder.js +206 -0
  12. package/dist/builders/ObjectSchemaBuilder.d.ts +83 -0
  13. package/dist/builders/ObjectSchemaBuilder.js +344 -0
  14. package/dist/builders/SchemaBuilder.d.ts +36 -0
  15. package/dist/builders/SchemaBuilder.js +88 -0
  16. package/dist/builders/StringSchemaBuilder.d.ts +14 -0
  17. package/dist/builders/StringSchemaBuilder.js +140 -0
  18. package/dist/builders/UnionSchemaBuilder.d.ts +10 -0
  19. package/dist/builders/UnionSchemaBuilder.js +100 -0
  20. package/dist/defaultSchemas.d.ts +4 -0
  21. package/dist/defaultSchemas.js +45 -0
  22. package/dist/index.d.ts +38 -90
  23. package/dist/index.js +30 -4
  24. package/dist/schema.d.ts +242 -0
  25. package/dist/schema.js +2 -0
  26. package/dist/schemaRegistry.d.ts +54 -0
  27. package/dist/schemaRegistry.js +301 -0
  28. package/dist/validators/validateArray.d.ts +3 -2
  29. package/dist/validators/validateBoolean.d.ts +2 -2
  30. package/dist/validators/validateBoolean.js +1 -4
  31. package/dist/validators/validateFunction.d.ts +2 -0
  32. package/dist/validators/validateFunction.js +21 -0
  33. package/dist/validators/validateNumber.d.ts +2 -2
  34. package/dist/validators/validateNumber.js +1 -1
  35. package/dist/validators/validateObject.d.ts +3 -2
  36. package/dist/validators/validateObject.js +33 -11
  37. package/dist/validators/validateString.d.ts +2 -2
  38. package/dist/validators/validateString.js +1 -1
  39. package/dist/validators/validateUnion.d.ts +3 -0
  40. package/dist/validators/validateUnion.js +30 -0
  41. package/package.json +3 -3
  42. package/src/builders/AliasSchemaBuilder.test.ts +124 -0
  43. package/src/builders/AliasSchemaBuilder.ts +250 -0
  44. package/src/builders/ArraySchemaBuilder.test.ts +270 -0
  45. package/src/builders/ArraySchemaBuilder.ts +381 -0
  46. package/src/builders/BooleanSchemaBuilder.test.ts +196 -0
  47. package/src/builders/BooleanSchemaBuilder.ts +155 -0
  48. package/src/builders/FunctionSchemaBuilder.test.ts +134 -0
  49. package/src/builders/FunctionSchemaBuilder.ts +109 -0
  50. package/src/builders/NumberSchemaBuilder.test.ts +493 -0
  51. package/src/builders/NumberSchemaBuilder.ts +789 -0
  52. package/src/builders/ObjectSchemaBuilder.test.ts +657 -0
  53. package/src/builders/ObjectSchemaBuilder.ts +794 -0
  54. package/src/builders/SchemaBuilder.test.ts +73 -0
  55. package/src/builders/SchemaBuilder.ts +135 -0
  56. package/src/builders/StringSchemaBuilder.test.ts +318 -0
  57. package/src/builders/StringSchemaBuilder.ts +392 -0
  58. package/src/builders/UnionSchemaBuilder.test.ts +162 -0
  59. package/src/builders/UnionSchemaBuilder.ts +159 -0
  60. package/src/defaultSchemas.ts +44 -0
  61. package/src/index.ts +70 -190
  62. package/src/schema.ts +922 -0
  63. package/src/schemaRegistry.builders.test.ts +1438 -0
  64. package/src/{schemaValidator.test.ts → schemaRegistry.test.ts} +561 -185
  65. package/src/schemaRegistry.ts +532 -0
  66. package/src/validators/validateArray.ts +4 -7
  67. package/src/validators/validateBoolean.ts +2 -11
  68. package/src/validators/validateFunction.ts +25 -0
  69. package/src/validators/validateNumber.ts +2 -7
  70. package/src/validators/validateObject.ts +32 -21
  71. package/src/validators/validateString.ts +2 -7
  72. package/src/validators/validateUnion.ts +36 -0
  73. package/dist/schemaValidator.d.ts +0 -16
  74. package/dist/schemaValidator.js +0 -234
  75. package/src/schemaValidator.ts +0 -367
package/src/schema.ts ADDED
@@ -0,0 +1,922 @@
1
+ import { ISchemaBuilder } from './builders/SchemaBuilder.js';
2
+ import { IAliasSchemaBuilder } from './builders/AliasSchemaBuilder.js';
3
+ import { IUnionSchemaBuilder } from './builders/UnionSchemaBuilder.js';
4
+ import { IStringSchemaBuilder } from './builders/StringSchemaBuilder.js';
5
+ import { IObjectSchemaBuilder } from './builders/ObjectSchemaBuilder.js';
6
+ import { INumberSchemaBuilder } from './builders/NumberSchemaBuilder.js';
7
+ import { IArraySchemaBuilder } from './builders/ArraySchemaBuilder.js';
8
+ import { IBooleanSchemaBuilder } from './builders/BooleanSchemaBuilder.js';
9
+ import { IFunctionSchemaBuilder } from './builders/FunctionSchemaBuilder.js';
10
+ import { ISchemaRegistry } from './index.js';
11
+
12
+ export type DefaultSchemaType =
13
+ | 'alias'
14
+ | 'boolean'
15
+ | 'number'
16
+ | 'string'
17
+ | 'array'
18
+ | 'object'
19
+ | 'union'
20
+ | 'function';
21
+
22
+ export type KeysWithNoNever<T> = {
23
+ [k in keyof T]: T[k] extends never ? never : k;
24
+ }[keyof T];
25
+
26
+ export type OmitNever<T> = {
27
+ [k in KeysWithNoNever<T>]: T[k];
28
+ };
29
+
30
+ type MakePropOptional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
31
+
32
+ export type Union<T1, T2> = {
33
+ [k in keyof Omit<T1, keyof T2>]: T1[k];
34
+ } & T2;
35
+
36
+ export type DefaultCommonSchema = {
37
+ isRequired: true;
38
+ isNullable: false;
39
+ };
40
+
41
+ export type DefaultBooleanSchema = DefaultCommonSchema & {
42
+ type: 'boolean';
43
+ };
44
+ export type DefaultNumberSchema = DefaultCommonSchema & {
45
+ type: 'number';
46
+ ensureNotNaN: true;
47
+ ensureIsFinite: true;
48
+ };
49
+
50
+ export type DefaultStringSchema = DefaultCommonSchema & {
51
+ type: 'string';
52
+ };
53
+
54
+ export type DefaultArraySchema = DefaultCommonSchema & {
55
+ type: 'array';
56
+ };
57
+
58
+ export type DefaultUnionSchema = DefaultCommonSchema & {
59
+ type: 'union';
60
+ };
61
+
62
+ export type DefaultObjectSchema = DefaultCommonSchema & {
63
+ type: 'object';
64
+ noUnknownProperties: true;
65
+ };
66
+
67
+ export type DefaultFunctionSchema = DefaultCommonSchema & {
68
+ type: 'function';
69
+ };
70
+
71
+ export type ValidationResultRaw = {
72
+ valid: boolean;
73
+ errors?: Array<string>;
74
+ };
75
+
76
+ export type ValidationResult =
77
+ | ValidationResultRaw
78
+ | Promise<ValidationResultRaw>;
79
+
80
+ export type ValidationResultWithObject<T> = {
81
+ valid: boolean;
82
+ errors?: Array<string>;
83
+ object?: T;
84
+ };
85
+ export type Validator = (value: any) => ValidationResult;
86
+
87
+ export type CommonSchemaSpecification<
88
+ TRequired extends boolean = true,
89
+ TNullable extends boolean = false
90
+ > = {
91
+ isRequired?: TRequired;
92
+ isNullable?: TNullable;
93
+ validators?: Array<Validator>;
94
+ };
95
+ export type BooleanSchema = CommonSchemaSpecification<any, any> & {
96
+ type: 'boolean';
97
+ equals?: boolean;
98
+ };
99
+
100
+ export type NumberSchema = CommonSchemaSpecification<any, any> & {
101
+ type: 'number';
102
+ min?: number;
103
+ max?: number;
104
+ equals?: number;
105
+ isInteger?: boolean;
106
+ ensureNotNaN?: boolean;
107
+ ensureIsFinite?: boolean;
108
+ };
109
+
110
+ export type ArraySchema<T> = CommonSchemaSpecification<any, any> & {
111
+ type: 'array';
112
+ preprocessor?: ((value: unknown) => unknown | Promise<unknown>) | string;
113
+ ofType?: T;
114
+ minLength?: number;
115
+ maxLength?: number;
116
+ };
117
+
118
+ export type ObjectSchema<T extends Record<string, Schema> = never> =
119
+ CommonSchemaSpecification<any, any> & {
120
+ type: 'object';
121
+ noUnknownProperties?: boolean;
122
+ properties?: T;
123
+ preprocessors?: {
124
+ [S in keyof T | '*']?: S extends keyof T
125
+ ?
126
+ | ((
127
+ value: any
128
+ ) =>
129
+ | undefined
130
+ | InferType<T[S]>
131
+ | Promise<InferType<T[S]>>)
132
+ | string
133
+ : (value: InferType<T>) => void | Promise<void>;
134
+ };
135
+ };
136
+
137
+ export type AliasSchema = CommonSchemaSpecification<any, any> & {
138
+ type: 'alias';
139
+ schemaName: string;
140
+ externalRegistry?: ISchemaRegistry<any>;
141
+ };
142
+
143
+ export type UnionSchema<T extends any[]> = CommonSchemaSpecification<
144
+ any,
145
+ any
146
+ > & {
147
+ type: 'union';
148
+ variants: T;
149
+ };
150
+
151
+ export type StringSchema = CommonSchemaSpecification<any, any> & {
152
+ type: 'string';
153
+ equals?: string;
154
+ minLength?: number;
155
+ maxLength?: number;
156
+ };
157
+
158
+ export type FunctionSchema = CommonSchemaSpecification<any, any> & {
159
+ type: 'function';
160
+ };
161
+
162
+ export type SchemaSpecification =
163
+ | ObjectSchema
164
+ | BooleanSchema
165
+ | NumberSchema
166
+ | ArraySchema<any>
167
+ | AliasSchema
168
+ | UnionSchema<any>
169
+ | StringSchema
170
+ | FunctionSchema;
171
+
172
+ export type Schema<T = any> = T extends Record<string, any>
173
+ ? any
174
+ : T extends number
175
+ ? NumberSchema | number | 'number'
176
+ : T extends string
177
+ ? StringSchema | string | 'string'
178
+ : T extends boolean
179
+ ? BooleanSchema | boolean
180
+ : number | DefaultSchemaType | SchemaSpecification | Schema[];
181
+
182
+ export type MakeOptional<T> = T extends IAliasSchemaBuilder<
183
+ infer TSchemaName,
184
+ infer TRequired,
185
+ infer TNullable,
186
+ infer TAliases,
187
+ infer TAliasesCompiledType
188
+ >
189
+ ? IAliasSchemaBuilder<
190
+ TSchemaName,
191
+ false,
192
+ TNullable,
193
+ TAliases,
194
+ TAliasesCompiledType
195
+ >
196
+ : T extends IUnionSchemaBuilder<
197
+ infer TRequired,
198
+ infer TNullable,
199
+ infer TVariants
200
+ >
201
+ ? IUnionSchemaBuilder<false, TNullable, TVariants>
202
+ : T extends IStringSchemaBuilder<
203
+ infer TRequired,
204
+ infer TNullable,
205
+ infer TMinLength,
206
+ infer TMaxLength,
207
+ infer TEqualsTo
208
+ >
209
+ ? IStringSchemaBuilder<false, TNullable, TMinLength, TMaxLength, TEqualsTo>
210
+ : T extends IObjectSchemaBuilder<
211
+ infer TRequired,
212
+ infer TNullable,
213
+ infer TNoUnknownProperties,
214
+ infer TProperties,
215
+ infer TMapToType
216
+ >
217
+ ? IObjectSchemaBuilder<
218
+ false,
219
+ TNullable,
220
+ TNoUnknownProperties,
221
+ TProperties,
222
+ TMapToType
223
+ >
224
+ : T extends INumberSchemaBuilder<
225
+ infer TRequired,
226
+ infer TNullable,
227
+ infer TMin,
228
+ infer TMax,
229
+ infer TIsInteger,
230
+ infer TEnsureNotNaN,
231
+ infer TEnsureIsFinite,
232
+ infer TEqualsTo
233
+ >
234
+ ? INumberSchemaBuilder<
235
+ false,
236
+ TNullable,
237
+ TMin,
238
+ TMax,
239
+ TIsInteger,
240
+ TEnsureNotNaN,
241
+ TEnsureIsFinite,
242
+ TEqualsTo
243
+ >
244
+ : T extends IArraySchemaBuilder<
245
+ infer TRequired,
246
+ infer TNullable,
247
+ infer TOfType,
248
+ infer TMaxLength,
249
+ infer TMinLength
250
+ >
251
+ ? IArraySchemaBuilder<false, TNullable, TOfType, TMaxLength, TMinLength>
252
+ : T extends IBooleanSchemaBuilder<
253
+ infer TRequired,
254
+ infer TNullable,
255
+ infer TEqualsTo
256
+ >
257
+ ? IBooleanSchemaBuilder<false, TNullable, TEqualsTo>
258
+ : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable>
259
+ ? IFunctionSchemaBuilder<false, TNullable>
260
+ : T & { isRequired: false };
261
+
262
+ export type MakeRequired<T> = T extends IAliasSchemaBuilder<
263
+ infer TSchemaName,
264
+ infer TRequired,
265
+ infer TNullable,
266
+ infer TAliases,
267
+ infer TAliasesCompiledType
268
+ >
269
+ ? IAliasSchemaBuilder<
270
+ TSchemaName,
271
+ true,
272
+ TNullable,
273
+ TAliases,
274
+ TAliasesCompiledType
275
+ >
276
+ : T extends IUnionSchemaBuilder<
277
+ infer TRequired,
278
+ infer TNullable,
279
+ infer TVariants
280
+ >
281
+ ? IUnionSchemaBuilder<true, TNullable, TVariants>
282
+ : T extends IStringSchemaBuilder<
283
+ infer TRequired,
284
+ infer TNullable,
285
+ infer TMinLength,
286
+ infer TMaxLength,
287
+ infer TEqualsTo
288
+ >
289
+ ? IStringSchemaBuilder<true, TNullable, TMinLength, TMaxLength, TEqualsTo>
290
+ : T extends IObjectSchemaBuilder<
291
+ infer TRequired,
292
+ infer TNullable,
293
+ infer TNoUnknownProperties,
294
+ infer TProperties,
295
+ infer TMapToType
296
+ >
297
+ ? IObjectSchemaBuilder<
298
+ true,
299
+ TNullable,
300
+ TNoUnknownProperties,
301
+ TProperties,
302
+ TMapToType
303
+ >
304
+ : T extends INumberSchemaBuilder<
305
+ infer TRequired,
306
+ infer TNullable,
307
+ infer TMin,
308
+ infer TMax,
309
+ infer TIsInteger,
310
+ infer TEnsureNotNaN,
311
+ infer TEnsureIsFinite,
312
+ infer TEqualsTo
313
+ >
314
+ ? INumberSchemaBuilder<
315
+ true,
316
+ TNullable,
317
+ TMin,
318
+ TMax,
319
+ TIsInteger,
320
+ TEnsureNotNaN,
321
+ TEnsureIsFinite,
322
+ TEqualsTo
323
+ >
324
+ : T extends IArraySchemaBuilder<
325
+ infer TRequired,
326
+ infer TNullable,
327
+ infer TOfType,
328
+ infer TMaxLength,
329
+ infer TMinLength
330
+ >
331
+ ? IArraySchemaBuilder<true, TNullable, TOfType, TMaxLength, TMinLength>
332
+ : T extends IBooleanSchemaBuilder<
333
+ infer TRequired,
334
+ infer TNullable,
335
+ infer TEqualsTo
336
+ >
337
+ ? IBooleanSchemaBuilder<true, TNullable, TEqualsTo>
338
+ : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable>
339
+ ? IFunctionSchemaBuilder<true, TNullable>
340
+ : T & { isRequired: true };
341
+
342
+ export type MakeNullable<T> = T extends IAliasSchemaBuilder<
343
+ infer TSchemaName,
344
+ infer TRequired,
345
+ infer TNullable,
346
+ infer TAliases,
347
+ infer TAliasesCompiledType
348
+ >
349
+ ? IAliasSchemaBuilder<
350
+ TSchemaName,
351
+ TRequired,
352
+ true,
353
+ TAliases,
354
+ TAliasesCompiledType
355
+ >
356
+ : T extends IUnionSchemaBuilder<
357
+ infer TRequired,
358
+ infer TNullable,
359
+ infer TVariants
360
+ >
361
+ ? IUnionSchemaBuilder<TRequired, true, TVariants>
362
+ : T extends IStringSchemaBuilder<
363
+ infer TRequired,
364
+ infer TNullable,
365
+ infer TMinLength,
366
+ infer TMaxLength,
367
+ infer TEqualsTo
368
+ >
369
+ ? IStringSchemaBuilder<TRequired, true, TMinLength, TMaxLength, TEqualsTo>
370
+ : T extends IObjectSchemaBuilder<
371
+ infer TRequired,
372
+ infer TNullable,
373
+ infer TNoUnknownProperties,
374
+ infer TProperties,
375
+ infer TMapToType
376
+ >
377
+ ? IObjectSchemaBuilder<
378
+ TRequired,
379
+ true,
380
+ TNoUnknownProperties,
381
+ TProperties,
382
+ TMapToType
383
+ >
384
+ : T extends INumberSchemaBuilder<
385
+ infer TRequired,
386
+ infer TNullable,
387
+ infer TMin,
388
+ infer TMax,
389
+ infer TIsInteger,
390
+ infer TEnsureNotNaN,
391
+ infer TEnsureIsFinite,
392
+ infer TEqualsTo
393
+ >
394
+ ? INumberSchemaBuilder<
395
+ TRequired,
396
+ true,
397
+ TMin,
398
+ TMax,
399
+ TIsInteger,
400
+ TEnsureNotNaN,
401
+ TEnsureIsFinite,
402
+ TEqualsTo
403
+ >
404
+ : T extends IArraySchemaBuilder<
405
+ infer TRequired,
406
+ infer TNullable,
407
+ infer TOfType,
408
+ infer TMaxLength,
409
+ infer TMinLength
410
+ >
411
+ ? IArraySchemaBuilder<TRequired, true, TOfType, TMaxLength, TMinLength>
412
+ : T extends IBooleanSchemaBuilder<
413
+ infer TRequired,
414
+ infer TNullable,
415
+ infer TEqualsTo
416
+ >
417
+ ? IBooleanSchemaBuilder<TRequired, true, TEqualsTo>
418
+ : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable>
419
+ ? IFunctionSchemaBuilder<TRequired, true>
420
+ : T & { isNullable: true };
421
+
422
+ export type MakeNotNullable<T> = T extends IAliasSchemaBuilder<
423
+ infer TSchemaName,
424
+ infer TRequired,
425
+ infer TNullable,
426
+ infer TAliases,
427
+ infer TAliasesCompiledType
428
+ >
429
+ ? IAliasSchemaBuilder<
430
+ TSchemaName,
431
+ TRequired,
432
+ false,
433
+ TAliases,
434
+ TAliasesCompiledType
435
+ >
436
+ : T extends IUnionSchemaBuilder<
437
+ infer TRequired,
438
+ infer TNullable,
439
+ infer TVariants
440
+ >
441
+ ? IUnionSchemaBuilder<TRequired, false, TVariants>
442
+ : T extends IStringSchemaBuilder<
443
+ infer TRequired,
444
+ infer TNullable,
445
+ infer TMinLength,
446
+ infer TMaxLength,
447
+ infer TEqualsTo
448
+ >
449
+ ? IStringSchemaBuilder<TRequired, false, TMinLength, TMaxLength, TEqualsTo>
450
+ : T extends IObjectSchemaBuilder<
451
+ infer TRequired,
452
+ infer TNullable,
453
+ infer TNoUnknownProperties,
454
+ infer TProperties,
455
+ infer TMapToType
456
+ >
457
+ ? IObjectSchemaBuilder<
458
+ TRequired,
459
+ false,
460
+ TNoUnknownProperties,
461
+ TProperties,
462
+ TMapToType
463
+ >
464
+ : T extends INumberSchemaBuilder<
465
+ infer TRequired,
466
+ infer TNullable,
467
+ infer TMin,
468
+ infer TMax,
469
+ infer TIsInteger,
470
+ infer TEnsureNotNaN,
471
+ infer TEnsureIsFinite,
472
+ infer TEqualsTo
473
+ >
474
+ ? INumberSchemaBuilder<
475
+ TRequired,
476
+ false,
477
+ TMin,
478
+ TMax,
479
+ TIsInteger,
480
+ TEnsureNotNaN,
481
+ TEnsureIsFinite,
482
+ TEqualsTo
483
+ >
484
+ : T extends IArraySchemaBuilder<
485
+ infer TRequired,
486
+ infer TNullable,
487
+ infer TOfType,
488
+ infer TMaxLength,
489
+ infer TMinLength
490
+ >
491
+ ? IArraySchemaBuilder<TRequired, false, TOfType, TMaxLength, TMinLength>
492
+ : T extends IBooleanSchemaBuilder<
493
+ infer TRequired,
494
+ infer TNullable,
495
+ infer TEqualsTo
496
+ >
497
+ ? IBooleanSchemaBuilder<TRequired, false, TEqualsTo>
498
+ : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable>
499
+ ? IFunctionSchemaBuilder<TRequired, false>
500
+ : T & { isNullable: false };
501
+
502
+ export type ExpandUnionVariants<TVariants extends any[]> = TVariants extends [
503
+ infer T
504
+ ]
505
+ ? [ExpandSchemaBuilder<T>]
506
+ : TVariants extends [infer T, ...infer Rest]
507
+ ? [ExpandSchemaBuilder<T>, ExpandUnionVariants<[...Rest]>]
508
+ : never;
509
+
510
+ export type ExpandSchemaBuilder<TSchema> = TSchema extends [
511
+ infer TType,
512
+ ...infer TParams
513
+ ]
514
+ ? TType extends 'object'
515
+ ? TParams extends [
516
+ infer TRequired extends boolean,
517
+ infer TNullable extends boolean,
518
+ infer TNoUnknownProperties extends boolean | undefined,
519
+ infer TProperties,
520
+ infer TMapToType
521
+ ]
522
+ ? IObjectSchemaBuilder<
523
+ TRequired,
524
+ TNullable,
525
+ TNoUnknownProperties,
526
+ {
527
+ [k in keyof TProperties]: ExpandSchemaBuilder<
528
+ TProperties[k]
529
+ >;
530
+ },
531
+ TMapToType
532
+ >
533
+ : IObjectSchemaBuilder
534
+ : TType extends 'string'
535
+ ? TParams extends [
536
+ infer TRequired extends boolean,
537
+ infer TNullable extends boolean,
538
+ infer TMinLength extends number | undefined,
539
+ infer TMaxLength extends number | undefined,
540
+ infer TEqualsTo extends string | undefined
541
+ ]
542
+ ? TEqualsTo extends undefined
543
+ ? IStringSchemaBuilder<
544
+ TRequired,
545
+ TNullable,
546
+ TMinLength,
547
+ TMaxLength,
548
+ undefined
549
+ >
550
+ : IStringSchemaBuilder<
551
+ TRequired,
552
+ TNullable,
553
+ TMinLength,
554
+ TMaxLength,
555
+ TEqualsTo
556
+ >
557
+ : IStringSchemaBuilder
558
+ : TType extends 'number'
559
+ ? TParams extends [
560
+ infer TRequired extends boolean,
561
+ infer TNullable extends boolean,
562
+ infer TMin extends number | undefined,
563
+ infer TMax extends number | undefined,
564
+ infer TIsInteger extends boolean | undefined,
565
+ infer TEnsureNotNaN extends boolean | undefined,
566
+ infer TEnsureIsFinite extends boolean | undefined,
567
+ infer TEqualsTo extends number | undefined
568
+ ]
569
+ ? TEqualsTo extends undefined
570
+ ? INumberSchemaBuilder<
571
+ TRequired,
572
+ TNullable,
573
+ TMin,
574
+ TMax,
575
+ TIsInteger,
576
+ TEnsureNotNaN,
577
+ TEnsureIsFinite,
578
+ TEqualsTo
579
+ >
580
+ : INumberSchemaBuilder<
581
+ TRequired,
582
+ TNullable,
583
+ TMin,
584
+ TMax,
585
+ TIsInteger,
586
+ TEnsureNotNaN,
587
+ TEnsureIsFinite,
588
+ undefined
589
+ >
590
+ : INumberSchemaBuilder
591
+ : TType extends 'alias'
592
+ ? TParams extends [
593
+ infer TSchemaName extends string,
594
+ infer TRequired extends boolean,
595
+ infer TNullable extends boolean,
596
+ infer TAliasesCompiledType
597
+ ]
598
+ ? IAliasSchemaBuilder<
599
+ TSchemaName,
600
+ TRequired,
601
+ TNullable,
602
+ any,
603
+ TAliasesCompiledType
604
+ >
605
+ : IAliasSchemaBuilder<any>
606
+ : TType extends 'array'
607
+ ? TParams extends [
608
+ infer TRequired extends boolean,
609
+ infer TNullable extends boolean,
610
+ infer TOfType,
611
+ infer TMaxLength extends number | undefined,
612
+ infer TMinLength extends number | undefined
613
+ ]
614
+ ? IArraySchemaBuilder<
615
+ TRequired,
616
+ TNullable,
617
+ ExpandSchemaBuilder<TOfType>,
618
+ TMaxLength,
619
+ TMinLength
620
+ >
621
+ : IArraySchemaBuilder
622
+ : TType extends 'union'
623
+ ? TParams extends [
624
+ infer TRequired extends boolean,
625
+ infer TNullable extends boolean,
626
+ infer TVariants extends any[]
627
+ ]
628
+ ? IUnionSchemaBuilder<
629
+ TRequired,
630
+ TNullable,
631
+ ExpandUnionVariants<TVariants>
632
+ >
633
+ : IUnionSchemaBuilder
634
+ : TType extends 'boolean'
635
+ ? TParams extends [
636
+ infer TRequired extends boolean,
637
+ infer TNullable extends boolean,
638
+ infer TEqualsTo extends boolean | undefined
639
+ ]
640
+ ? IBooleanSchemaBuilder<
641
+ TRequired,
642
+ TNullable,
643
+ TEqualsTo extends undefined ? undefined : boolean
644
+ >
645
+ : IBooleanSchemaBuilder
646
+ : TType extends 'function'
647
+ ? TParams extends [
648
+ infer TRequired extends boolean,
649
+ infer TNullable extends boolean
650
+ ]
651
+ ? IFunctionSchemaBuilder<TRequired, TNullable>
652
+ : IFunctionSchemaBuilder
653
+ : TSchema
654
+ : TSchema;
655
+
656
+ export type ReduceSchemaBuilder<TBuilder> =
657
+ TBuilder extends IObjectSchemaBuilder<
658
+ infer TRequired,
659
+ infer TNullable,
660
+ infer TNoUnknownProperties,
661
+ infer TProperties,
662
+ infer TMapToType
663
+ >
664
+ ? [
665
+ 'object',
666
+ TRequired,
667
+ TNullable,
668
+ TNoUnknownProperties,
669
+ {
670
+ [k in keyof TProperties]: ReduceSchemaBuilder<TProperties[k]>;
671
+ },
672
+ TMapToType
673
+ ]
674
+ : TBuilder extends IStringSchemaBuilder<
675
+ infer TRequired,
676
+ infer TNullable,
677
+ infer TMinLength,
678
+ infer TMaxLength,
679
+ infer TEqualsTo
680
+ >
681
+ ? ['string', TRequired, TNullable, TMinLength, TMaxLength, TEqualsTo]
682
+ : TBuilder extends INumberSchemaBuilder<
683
+ infer TRequired,
684
+ infer TNullable,
685
+ infer TMin,
686
+ infer TMax,
687
+ infer TIsInteger,
688
+ infer TEnsureNotNaN,
689
+ infer TEnsureIsFinite,
690
+ infer TEqualsTo
691
+ >
692
+ ? [
693
+ 'number',
694
+ TRequired,
695
+ TNullable,
696
+ TMin,
697
+ TMax,
698
+ TIsInteger,
699
+ TEnsureNotNaN,
700
+ TEnsureIsFinite,
701
+ TEqualsTo
702
+ ]
703
+ : TBuilder extends IAliasSchemaBuilder<
704
+ infer TSchemaName,
705
+ infer TRequired,
706
+ infer TNullable,
707
+ infer TAliases
708
+ >
709
+ ? [
710
+ 'alias',
711
+ TSchemaName,
712
+ TRequired,
713
+ TNullable,
714
+ InferType<ExpandSchemaBuilder<TAliases[TSchemaName]>>
715
+ ]
716
+ : TBuilder extends IArraySchemaBuilder<
717
+ infer TRequired,
718
+ infer TNullable,
719
+ infer TOfType,
720
+ infer TMaxLength,
721
+ infer TMinLength
722
+ >
723
+ ? [
724
+ 'array',
725
+ TRequired,
726
+ TNullable,
727
+ ReduceSchemaBuilder<TOfType>,
728
+ TMaxLength,
729
+ TMinLength
730
+ ]
731
+ : TBuilder extends IUnionSchemaBuilder<
732
+ infer TRequired,
733
+ infer TNullable,
734
+ infer TVariants
735
+ >
736
+ ? ['union', TRequired, TNullable, ReduceSchemaBuilder<TVariants>]
737
+ : TBuilder extends IBooleanSchemaBuilder<
738
+ infer TRequired,
739
+ infer TNullable,
740
+ infer TEqualsTo
741
+ >
742
+ ? ['boolean', TRequired, TNullable, TEqualsTo]
743
+ : TBuilder extends IFunctionSchemaBuilder<
744
+ infer TRequired,
745
+ infer TNullable
746
+ >
747
+ ? ['function', TRequired, TNullable]
748
+ : TBuilder extends [infer F]
749
+ ? [ReduceSchemaBuilder<F>]
750
+ : TBuilder extends [infer F, ...infer Rest]
751
+ ? [ReduceSchemaBuilder<F>, ...ReduceSchemaBuilder<Rest>]
752
+ : TBuilder;
753
+
754
+ export type InferType<S> = S extends DefaultSchemaType
755
+ ? S extends 'string'
756
+ ? string
757
+ : S extends 'boolean'
758
+ ? boolean
759
+ : S extends 'number'
760
+ ? number
761
+ : S extends 'array'
762
+ ? Array<any>
763
+ : S extends 'object'
764
+ ? Record<string, never>
765
+ : S extends 'function'
766
+ ? Function
767
+ : never
768
+ : S extends number
769
+ ? S
770
+ : S extends BooleanSchema
771
+ ? S['equals'] extends undefined
772
+ ? boolean
773
+ : S['equals']
774
+ : S extends UnionSchema<infer K>
775
+ ? InferType<K>
776
+ : S extends { type: 'union'; variants: infer K }
777
+ ? K extends any[]
778
+ ? InferType<K>
779
+ : any
780
+ : S extends IObjectSchemaBuilder<
781
+ infer TRequired,
782
+ infer TNullable,
783
+ infer TNoUnknownProperties,
784
+ infer TProperties,
785
+ infer TMapToType
786
+ >
787
+ ? TMapToType extends undefined
788
+ ? InferType<
789
+ CommonSchemaSpecification<TRequired, TNullable> & {
790
+ type: 'object';
791
+ } & (TNoUnknownProperties extends true
792
+ ? { noUnknownProperties: true }
793
+ : { noUnknownProperties: false }) &
794
+ (TProperties extends Record<string, any>
795
+ ? {
796
+ properties: TProperties;
797
+ }
798
+ : {})
799
+ >
800
+ : TMapToType
801
+ : S extends INumberSchemaBuilder<
802
+ infer TRequired,
803
+ infer TNullable,
804
+ infer TMin,
805
+ infer TMax,
806
+ infer TIsInteger,
807
+ infer TEnsureNotNaN,
808
+ infer TEnsureIsFinite,
809
+ infer TEqualsTo
810
+ >
811
+ ? TRequired extends true
812
+ ? TEqualsTo extends undefined
813
+ ? number
814
+ : TEqualsTo
815
+ : TEqualsTo extends undefined
816
+ ? number | undefined
817
+ : TEqualsTo | undefined
818
+ : S extends IBooleanSchemaBuilder<
819
+ infer TRequired,
820
+ infer TNullable,
821
+ infer TEqualsTo
822
+ >
823
+ ? TRequired extends true
824
+ ? TEqualsTo extends undefined
825
+ ? boolean
826
+ : TEqualsTo
827
+ : TEqualsTo extends undefined
828
+ ? boolean | undefined
829
+ : TEqualsTo | undefined
830
+ : S extends IStringSchemaBuilder<
831
+ infer TRequired,
832
+ infer TNullable,
833
+ infer TMinLength,
834
+ infer TMaxLength,
835
+ infer TEqualsTo
836
+ >
837
+ ? TRequired extends true
838
+ ? TEqualsTo extends undefined
839
+ ? string
840
+ : TEqualsTo
841
+ : TEqualsTo extends undefined
842
+ ? string | undefined
843
+ : TEqualsTo | undefined
844
+ : S extends IUnionSchemaBuilder<
845
+ infer TRequired,
846
+ infer TNullable,
847
+ infer TVariants
848
+ >
849
+ ? TRequired extends true
850
+ ? InferType<TVariants>
851
+ : InferType<TVariants> | undefined
852
+ : S extends IAliasSchemaBuilder<
853
+ infer TSchemaName,
854
+ infer TRequired,
855
+ infer TNullable,
856
+ infer TAliases,
857
+ infer TAliasesCompiledType
858
+ >
859
+ ? TRequired extends true
860
+ ? TAliasesCompiledType
861
+ : TAliasesCompiledType | undefined
862
+ : S extends IArraySchemaBuilder<
863
+ infer TRequired,
864
+ infer TNullable,
865
+ infer TOfType,
866
+ infer TMaxLength,
867
+ infer TMinLength
868
+ >
869
+ ? TRequired extends true
870
+ ? TOfType extends undefined
871
+ ? any[]
872
+ : InferType<TOfType>[]
873
+ : TOfType extends undefined
874
+ ? any[] | undefined
875
+ : InferType<TOfType>[] | undefined
876
+ : S extends IFunctionSchemaBuilder<infer TRequired, infer TNullable>
877
+ ? TRequired extends true
878
+ ? Function
879
+ : Function | undefined
880
+ : S extends StringSchema
881
+ ? S['equals'] extends undefined
882
+ ? string
883
+ : S['equals']
884
+ : S extends NumberSchema
885
+ ? S['equals'] extends undefined
886
+ ? number
887
+ : S['equals']
888
+ : S extends ObjectSchema<infer K>
889
+ ? OptionalPropertiesOf<K> extends never
890
+ ? { [k in keyof K]: InferType<K[k]> }
891
+ : MakePropOptional<
892
+ { [k in keyof K]: InferType<K[k]> },
893
+ OptionalPropertiesOf<K>
894
+ >
895
+ : S extends { type: 'object'; properties: infer K }
896
+ ? OptionalPropertiesOf<K> extends never
897
+ ? { [k in keyof K]: InferType<K[k]> }
898
+ : MakePropOptional<
899
+ { [k in keyof K]: InferType<K[k]> },
900
+ OptionalPropertiesOf<K>
901
+ >
902
+ : S extends [infer F]
903
+ ? InferType<F>
904
+ : S extends [infer F, ...infer Rest]
905
+ ? InferType<F> | InferType<Rest>
906
+ : S extends ArraySchema<infer L>
907
+ ? InferType<L> extends never
908
+ ? Array<any>
909
+ : InferType<L>[]
910
+ : S extends { type: 'array'; ofType: infer L }
911
+ ? InferType<L>[]
912
+ : S extends { type: 'array' }
913
+ ? Array<any>
914
+ : any;
915
+
916
+ type OptionalPropertiesOf<T> = {
917
+ [k in keyof T]: T[k] extends ISchemaBuilder<infer TRequired, any>
918
+ ? TRequired extends false
919
+ ? k
920
+ : never
921
+ : never;
922
+ }[keyof T];