@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.
- package/README.md +213 -163
- package/dist/builders/AliasSchemaBuilder.d.ts +14 -0
- package/dist/builders/AliasSchemaBuilder.js +91 -0
- package/dist/builders/ArraySchemaBuilder.d.ts +15 -0
- package/dist/builders/ArraySchemaBuilder.js +141 -0
- package/dist/builders/BooleanSchemaBuilder.d.ts +31 -0
- package/dist/builders/BooleanSchemaBuilder.js +90 -0
- package/dist/builders/FunctionSchemaBuilder.d.ts +25 -0
- package/dist/builders/FunctionSchemaBuilder.js +66 -0
- package/dist/builders/NumberSchemaBuilder.d.ts +61 -0
- package/dist/builders/NumberSchemaBuilder.js +206 -0
- package/dist/builders/ObjectSchemaBuilder.d.ts +83 -0
- package/dist/builders/ObjectSchemaBuilder.js +344 -0
- package/dist/builders/SchemaBuilder.d.ts +36 -0
- package/dist/builders/SchemaBuilder.js +88 -0
- package/dist/builders/StringSchemaBuilder.d.ts +14 -0
- package/dist/builders/StringSchemaBuilder.js +140 -0
- package/dist/builders/UnionSchemaBuilder.d.ts +10 -0
- package/dist/builders/UnionSchemaBuilder.js +100 -0
- package/dist/defaultSchemas.d.ts +4 -0
- package/dist/defaultSchemas.js +45 -0
- package/dist/index.d.ts +38 -90
- package/dist/index.js +30 -4
- package/dist/schema.d.ts +242 -0
- package/dist/schema.js +2 -0
- package/dist/schemaRegistry.d.ts +54 -0
- package/dist/schemaRegistry.js +301 -0
- package/dist/validators/validateArray.d.ts +3 -2
- package/dist/validators/validateBoolean.d.ts +2 -2
- package/dist/validators/validateBoolean.js +1 -4
- package/dist/validators/validateFunction.d.ts +2 -0
- package/dist/validators/validateFunction.js +21 -0
- package/dist/validators/validateNumber.d.ts +2 -2
- package/dist/validators/validateNumber.js +1 -1
- package/dist/validators/validateObject.d.ts +3 -2
- package/dist/validators/validateObject.js +33 -11
- package/dist/validators/validateString.d.ts +2 -2
- package/dist/validators/validateString.js +1 -1
- package/dist/validators/validateUnion.d.ts +3 -0
- package/dist/validators/validateUnion.js +30 -0
- package/package.json +3 -3
- package/src/builders/AliasSchemaBuilder.test.ts +124 -0
- package/src/builders/AliasSchemaBuilder.ts +250 -0
- package/src/builders/ArraySchemaBuilder.test.ts +270 -0
- package/src/builders/ArraySchemaBuilder.ts +381 -0
- package/src/builders/BooleanSchemaBuilder.test.ts +196 -0
- package/src/builders/BooleanSchemaBuilder.ts +155 -0
- package/src/builders/FunctionSchemaBuilder.test.ts +134 -0
- package/src/builders/FunctionSchemaBuilder.ts +109 -0
- package/src/builders/NumberSchemaBuilder.test.ts +493 -0
- package/src/builders/NumberSchemaBuilder.ts +789 -0
- package/src/builders/ObjectSchemaBuilder.test.ts +657 -0
- package/src/builders/ObjectSchemaBuilder.ts +794 -0
- package/src/builders/SchemaBuilder.test.ts +73 -0
- package/src/builders/SchemaBuilder.ts +135 -0
- package/src/builders/StringSchemaBuilder.test.ts +318 -0
- package/src/builders/StringSchemaBuilder.ts +392 -0
- package/src/builders/UnionSchemaBuilder.test.ts +162 -0
- package/src/builders/UnionSchemaBuilder.ts +159 -0
- package/src/defaultSchemas.ts +44 -0
- package/src/index.ts +70 -190
- package/src/schema.ts +922 -0
- package/src/schemaRegistry.builders.test.ts +1438 -0
- package/src/{schemaValidator.test.ts → schemaRegistry.test.ts} +561 -185
- package/src/schemaRegistry.ts +532 -0
- package/src/validators/validateArray.ts +4 -7
- package/src/validators/validateBoolean.ts +2 -11
- package/src/validators/validateFunction.ts +25 -0
- package/src/validators/validateNumber.ts +2 -7
- package/src/validators/validateObject.ts +32 -21
- package/src/validators/validateString.ts +2 -7
- package/src/validators/validateUnion.ts +36 -0
- package/dist/schemaValidator.d.ts +0 -16
- package/dist/schemaValidator.js +0 -234
- package/src/schemaValidator.ts +0 -367
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
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
|
+
export declare type DefaultSchemaType = 'alias' | 'boolean' | 'number' | 'string' | 'array' | 'object' | 'union' | 'function';
|
|
12
|
+
export declare type KeysWithNoNever<T> = {
|
|
13
|
+
[k in keyof T]: T[k] extends never ? never : k;
|
|
14
|
+
}[keyof T];
|
|
15
|
+
export declare type OmitNever<T> = {
|
|
16
|
+
[k in KeysWithNoNever<T>]: T[k];
|
|
17
|
+
};
|
|
18
|
+
declare type MakePropOptional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
|
|
19
|
+
export declare type Union<T1, T2> = {
|
|
20
|
+
[k in keyof Omit<T1, keyof T2>]: T1[k];
|
|
21
|
+
} & T2;
|
|
22
|
+
export declare type DefaultCommonSchema = {
|
|
23
|
+
isRequired: true;
|
|
24
|
+
isNullable: false;
|
|
25
|
+
};
|
|
26
|
+
export declare type DefaultBooleanSchema = DefaultCommonSchema & {
|
|
27
|
+
type: 'boolean';
|
|
28
|
+
};
|
|
29
|
+
export declare type DefaultNumberSchema = DefaultCommonSchema & {
|
|
30
|
+
type: 'number';
|
|
31
|
+
ensureNotNaN: true;
|
|
32
|
+
ensureIsFinite: true;
|
|
33
|
+
};
|
|
34
|
+
export declare type DefaultStringSchema = DefaultCommonSchema & {
|
|
35
|
+
type: 'string';
|
|
36
|
+
};
|
|
37
|
+
export declare type DefaultArraySchema = DefaultCommonSchema & {
|
|
38
|
+
type: 'array';
|
|
39
|
+
};
|
|
40
|
+
export declare type DefaultUnionSchema = DefaultCommonSchema & {
|
|
41
|
+
type: 'union';
|
|
42
|
+
};
|
|
43
|
+
export declare type DefaultObjectSchema = DefaultCommonSchema & {
|
|
44
|
+
type: 'object';
|
|
45
|
+
noUnknownProperties: true;
|
|
46
|
+
};
|
|
47
|
+
export declare type DefaultFunctionSchema = DefaultCommonSchema & {
|
|
48
|
+
type: 'function';
|
|
49
|
+
};
|
|
50
|
+
export declare type ValidationResultRaw = {
|
|
51
|
+
valid: boolean;
|
|
52
|
+
errors?: Array<string>;
|
|
53
|
+
};
|
|
54
|
+
export declare type ValidationResult = ValidationResultRaw | Promise<ValidationResultRaw>;
|
|
55
|
+
export declare type ValidationResultWithObject<T> = {
|
|
56
|
+
valid: boolean;
|
|
57
|
+
errors?: Array<string>;
|
|
58
|
+
object?: T;
|
|
59
|
+
};
|
|
60
|
+
export declare type Validator = (value: any) => ValidationResult;
|
|
61
|
+
export declare type CommonSchemaSpecification<TRequired extends boolean = true, TNullable extends boolean = false> = {
|
|
62
|
+
isRequired?: TRequired;
|
|
63
|
+
isNullable?: TNullable;
|
|
64
|
+
validators?: Array<Validator>;
|
|
65
|
+
};
|
|
66
|
+
export declare type BooleanSchema = CommonSchemaSpecification<any, any> & {
|
|
67
|
+
type: 'boolean';
|
|
68
|
+
equals?: boolean;
|
|
69
|
+
};
|
|
70
|
+
export declare type NumberSchema = CommonSchemaSpecification<any, any> & {
|
|
71
|
+
type: 'number';
|
|
72
|
+
min?: number;
|
|
73
|
+
max?: number;
|
|
74
|
+
equals?: number;
|
|
75
|
+
isInteger?: boolean;
|
|
76
|
+
ensureNotNaN?: boolean;
|
|
77
|
+
ensureIsFinite?: boolean;
|
|
78
|
+
};
|
|
79
|
+
export declare type ArraySchema<T> = CommonSchemaSpecification<any, any> & {
|
|
80
|
+
type: 'array';
|
|
81
|
+
preprocessor?: ((value: unknown) => unknown | Promise<unknown>) | string;
|
|
82
|
+
ofType?: T;
|
|
83
|
+
minLength?: number;
|
|
84
|
+
maxLength?: number;
|
|
85
|
+
};
|
|
86
|
+
export declare type ObjectSchema<T extends Record<string, Schema> = never> = CommonSchemaSpecification<any, any> & {
|
|
87
|
+
type: 'object';
|
|
88
|
+
noUnknownProperties?: boolean;
|
|
89
|
+
properties?: T;
|
|
90
|
+
preprocessors?: {
|
|
91
|
+
[S in keyof T | '*']?: S extends keyof T ? ((value: any) => undefined | InferType<T[S]> | Promise<InferType<T[S]>>) | string : (value: InferType<T>) => void | Promise<void>;
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
export declare type AliasSchema = CommonSchemaSpecification<any, any> & {
|
|
95
|
+
type: 'alias';
|
|
96
|
+
schemaName: string;
|
|
97
|
+
externalRegistry?: ISchemaRegistry<any>;
|
|
98
|
+
};
|
|
99
|
+
export declare type UnionSchema<T extends any[]> = CommonSchemaSpecification<any, any> & {
|
|
100
|
+
type: 'union';
|
|
101
|
+
variants: T;
|
|
102
|
+
};
|
|
103
|
+
export declare type StringSchema = CommonSchemaSpecification<any, any> & {
|
|
104
|
+
type: 'string';
|
|
105
|
+
equals?: string;
|
|
106
|
+
minLength?: number;
|
|
107
|
+
maxLength?: number;
|
|
108
|
+
};
|
|
109
|
+
export declare type FunctionSchema = CommonSchemaSpecification<any, any> & {
|
|
110
|
+
type: 'function';
|
|
111
|
+
};
|
|
112
|
+
export declare type SchemaSpecification = ObjectSchema | BooleanSchema | NumberSchema | ArraySchema<any> | AliasSchema | UnionSchema<any> | StringSchema | FunctionSchema;
|
|
113
|
+
export declare type Schema<T = any> = T extends Record<string, any> ? any : T extends number ? NumberSchema | number | 'number' : T extends string ? StringSchema | string | 'string' : T extends boolean ? BooleanSchema | boolean : number | DefaultSchemaType | SchemaSpecification | Schema[];
|
|
114
|
+
export declare type MakeOptional<T> = T extends IAliasSchemaBuilder<infer TSchemaName, infer TRequired, infer TNullable, infer TAliases, infer TAliasesCompiledType> ? IAliasSchemaBuilder<TSchemaName, false, TNullable, TAliases, TAliasesCompiledType> : T extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? IUnionSchemaBuilder<false, TNullable, TVariants> : T extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? IStringSchemaBuilder<false, TNullable, TMinLength, TMaxLength, TEqualsTo> : T extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? IObjectSchemaBuilder<false, TNullable, TNoUnknownProperties, TProperties, TMapToType> : T extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? INumberSchemaBuilder<false, TNullable, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : T extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? IArraySchemaBuilder<false, TNullable, TOfType, TMaxLength, TMinLength> : T extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? IBooleanSchemaBuilder<false, TNullable, TEqualsTo> : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? IFunctionSchemaBuilder<false, TNullable> : T & {
|
|
115
|
+
isRequired: false;
|
|
116
|
+
};
|
|
117
|
+
export declare type MakeRequired<T> = T extends IAliasSchemaBuilder<infer TSchemaName, infer TRequired, infer TNullable, infer TAliases, infer TAliasesCompiledType> ? IAliasSchemaBuilder<TSchemaName, true, TNullable, TAliases, TAliasesCompiledType> : T extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? IUnionSchemaBuilder<true, TNullable, TVariants> : T extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? IStringSchemaBuilder<true, TNullable, TMinLength, TMaxLength, TEqualsTo> : T extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? IObjectSchemaBuilder<true, TNullable, TNoUnknownProperties, TProperties, TMapToType> : T extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? INumberSchemaBuilder<true, TNullable, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : T extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? IArraySchemaBuilder<true, TNullable, TOfType, TMaxLength, TMinLength> : T extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? IBooleanSchemaBuilder<true, TNullable, TEqualsTo> : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? IFunctionSchemaBuilder<true, TNullable> : T & {
|
|
118
|
+
isRequired: true;
|
|
119
|
+
};
|
|
120
|
+
export declare type MakeNullable<T> = T extends IAliasSchemaBuilder<infer TSchemaName, infer TRequired, infer TNullable, infer TAliases, infer TAliasesCompiledType> ? IAliasSchemaBuilder<TSchemaName, TRequired, true, TAliases, TAliasesCompiledType> : T extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? IUnionSchemaBuilder<TRequired, true, TVariants> : T extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? IStringSchemaBuilder<TRequired, true, TMinLength, TMaxLength, TEqualsTo> : T extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? IObjectSchemaBuilder<TRequired, true, TNoUnknownProperties, TProperties, TMapToType> : T extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? INumberSchemaBuilder<TRequired, true, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : T extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? IArraySchemaBuilder<TRequired, true, TOfType, TMaxLength, TMinLength> : T extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? IBooleanSchemaBuilder<TRequired, true, TEqualsTo> : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? IFunctionSchemaBuilder<TRequired, true> : T & {
|
|
121
|
+
isNullable: true;
|
|
122
|
+
};
|
|
123
|
+
export declare type MakeNotNullable<T> = T extends IAliasSchemaBuilder<infer TSchemaName, infer TRequired, infer TNullable, infer TAliases, infer TAliasesCompiledType> ? IAliasSchemaBuilder<TSchemaName, TRequired, false, TAliases, TAliasesCompiledType> : T extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? IUnionSchemaBuilder<TRequired, false, TVariants> : T extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? IStringSchemaBuilder<TRequired, false, TMinLength, TMaxLength, TEqualsTo> : T extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? IObjectSchemaBuilder<TRequired, false, TNoUnknownProperties, TProperties, TMapToType> : T extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? INumberSchemaBuilder<TRequired, false, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : T extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? IArraySchemaBuilder<TRequired, false, TOfType, TMaxLength, TMinLength> : T extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? IBooleanSchemaBuilder<TRequired, false, TEqualsTo> : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? IFunctionSchemaBuilder<TRequired, false> : T & {
|
|
124
|
+
isNullable: false;
|
|
125
|
+
};
|
|
126
|
+
export declare type ExpandUnionVariants<TVariants extends any[]> = TVariants extends [
|
|
127
|
+
infer T
|
|
128
|
+
] ? [ExpandSchemaBuilder<T>] : TVariants extends [infer T, ...infer Rest] ? [ExpandSchemaBuilder<T>, ExpandUnionVariants<[...Rest]>] : never;
|
|
129
|
+
export declare type ExpandSchemaBuilder<TSchema> = TSchema extends [
|
|
130
|
+
infer TType,
|
|
131
|
+
...infer TParams
|
|
132
|
+
] ? TType extends 'object' ? TParams extends [
|
|
133
|
+
infer TRequired extends boolean,
|
|
134
|
+
infer TNullable extends boolean,
|
|
135
|
+
infer TNoUnknownProperties extends boolean | undefined,
|
|
136
|
+
infer TProperties,
|
|
137
|
+
infer TMapToType
|
|
138
|
+
] ? IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, {
|
|
139
|
+
[k in keyof TProperties]: ExpandSchemaBuilder<TProperties[k]>;
|
|
140
|
+
}, TMapToType> : IObjectSchemaBuilder : TType extends 'string' ? TParams extends [
|
|
141
|
+
infer TRequired extends boolean,
|
|
142
|
+
infer TNullable extends boolean,
|
|
143
|
+
infer TMinLength extends number | undefined,
|
|
144
|
+
infer TMaxLength extends number | undefined,
|
|
145
|
+
infer TEqualsTo extends string | undefined
|
|
146
|
+
] ? TEqualsTo extends undefined ? IStringSchemaBuilder<TRequired, TNullable, TMinLength, TMaxLength, undefined> : IStringSchemaBuilder<TRequired, TNullable, TMinLength, TMaxLength, TEqualsTo> : IStringSchemaBuilder : TType extends 'number' ? TParams extends [
|
|
147
|
+
infer TRequired extends boolean,
|
|
148
|
+
infer TNullable extends boolean,
|
|
149
|
+
infer TMin extends number | undefined,
|
|
150
|
+
infer TMax extends number | undefined,
|
|
151
|
+
infer TIsInteger extends boolean | undefined,
|
|
152
|
+
infer TEnsureNotNaN extends boolean | undefined,
|
|
153
|
+
infer TEnsureIsFinite extends boolean | undefined,
|
|
154
|
+
infer TEqualsTo extends number | undefined
|
|
155
|
+
] ? TEqualsTo extends undefined ? INumberSchemaBuilder<TRequired, TNullable, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : INumberSchemaBuilder<TRequired, TNullable, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, undefined> : INumberSchemaBuilder : TType extends 'alias' ? TParams extends [
|
|
156
|
+
infer TSchemaName extends string,
|
|
157
|
+
infer TRequired extends boolean,
|
|
158
|
+
infer TNullable extends boolean,
|
|
159
|
+
infer TAliasesCompiledType
|
|
160
|
+
] ? IAliasSchemaBuilder<TSchemaName, TRequired, TNullable, any, TAliasesCompiledType> : IAliasSchemaBuilder<any> : TType extends 'array' ? TParams extends [
|
|
161
|
+
infer TRequired extends boolean,
|
|
162
|
+
infer TNullable extends boolean,
|
|
163
|
+
infer TOfType,
|
|
164
|
+
infer TMaxLength extends number | undefined,
|
|
165
|
+
infer TMinLength extends number | undefined
|
|
166
|
+
] ? IArraySchemaBuilder<TRequired, TNullable, ExpandSchemaBuilder<TOfType>, TMaxLength, TMinLength> : IArraySchemaBuilder : TType extends 'union' ? TParams extends [
|
|
167
|
+
infer TRequired extends boolean,
|
|
168
|
+
infer TNullable extends boolean,
|
|
169
|
+
infer TVariants extends any[]
|
|
170
|
+
] ? IUnionSchemaBuilder<TRequired, TNullable, ExpandUnionVariants<TVariants>> : IUnionSchemaBuilder : TType extends 'boolean' ? TParams extends [
|
|
171
|
+
infer TRequired extends boolean,
|
|
172
|
+
infer TNullable extends boolean,
|
|
173
|
+
infer TEqualsTo extends boolean | undefined
|
|
174
|
+
] ? IBooleanSchemaBuilder<TRequired, TNullable, TEqualsTo extends undefined ? undefined : boolean> : IBooleanSchemaBuilder : TType extends 'function' ? TParams extends [
|
|
175
|
+
infer TRequired extends boolean,
|
|
176
|
+
infer TNullable extends boolean
|
|
177
|
+
] ? IFunctionSchemaBuilder<TRequired, TNullable> : IFunctionSchemaBuilder : TSchema : TSchema;
|
|
178
|
+
export declare type ReduceSchemaBuilder<TBuilder> = TBuilder extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? [
|
|
179
|
+
'object',
|
|
180
|
+
TRequired,
|
|
181
|
+
TNullable,
|
|
182
|
+
TNoUnknownProperties,
|
|
183
|
+
{
|
|
184
|
+
[k in keyof TProperties]: ReduceSchemaBuilder<TProperties[k]>;
|
|
185
|
+
},
|
|
186
|
+
TMapToType
|
|
187
|
+
] : TBuilder extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? ['string', TRequired, TNullable, TMinLength, TMaxLength, TEqualsTo] : TBuilder extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? [
|
|
188
|
+
'number',
|
|
189
|
+
TRequired,
|
|
190
|
+
TNullable,
|
|
191
|
+
TMin,
|
|
192
|
+
TMax,
|
|
193
|
+
TIsInteger,
|
|
194
|
+
TEnsureNotNaN,
|
|
195
|
+
TEnsureIsFinite,
|
|
196
|
+
TEqualsTo
|
|
197
|
+
] : TBuilder extends IAliasSchemaBuilder<infer TSchemaName, infer TRequired, infer TNullable, infer TAliases> ? [
|
|
198
|
+
'alias',
|
|
199
|
+
TSchemaName,
|
|
200
|
+
TRequired,
|
|
201
|
+
TNullable,
|
|
202
|
+
InferType<ExpandSchemaBuilder<TAliases[TSchemaName]>>
|
|
203
|
+
] : TBuilder extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? [
|
|
204
|
+
'array',
|
|
205
|
+
TRequired,
|
|
206
|
+
TNullable,
|
|
207
|
+
ReduceSchemaBuilder<TOfType>,
|
|
208
|
+
TMaxLength,
|
|
209
|
+
TMinLength
|
|
210
|
+
] : TBuilder extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? ['union', TRequired, TNullable, ReduceSchemaBuilder<TVariants>] : TBuilder extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? ['boolean', TRequired, TNullable, TEqualsTo] : TBuilder extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? ['function', TRequired, TNullable] : TBuilder extends [infer F] ? [ReduceSchemaBuilder<F>] : TBuilder extends [infer F, ...infer Rest] ? [ReduceSchemaBuilder<F>, ...ReduceSchemaBuilder<Rest>] : TBuilder;
|
|
211
|
+
export declare type InferType<S> = S extends DefaultSchemaType ? S extends 'string' ? string : S extends 'boolean' ? boolean : S extends 'number' ? number : S extends 'array' ? Array<any> : S extends 'object' ? Record<string, never> : S extends 'function' ? Function : never : S extends number ? S : S extends BooleanSchema ? S['equals'] extends undefined ? boolean : S['equals'] : S extends UnionSchema<infer K> ? InferType<K> : S extends {
|
|
212
|
+
type: 'union';
|
|
213
|
+
variants: infer K;
|
|
214
|
+
} ? K extends any[] ? InferType<K> : any : S extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? TMapToType extends undefined ? InferType<CommonSchemaSpecification<TRequired, TNullable> & {
|
|
215
|
+
type: 'object';
|
|
216
|
+
} & (TNoUnknownProperties extends true ? {
|
|
217
|
+
noUnknownProperties: true;
|
|
218
|
+
} : {
|
|
219
|
+
noUnknownProperties: false;
|
|
220
|
+
}) & (TProperties extends Record<string, any> ? {
|
|
221
|
+
properties: TProperties;
|
|
222
|
+
} : {})> : TMapToType : S extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? TRequired extends true ? TEqualsTo extends undefined ? number : TEqualsTo : TEqualsTo extends undefined ? number | undefined : TEqualsTo | undefined : S extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? TRequired extends true ? TEqualsTo extends undefined ? boolean : TEqualsTo : TEqualsTo extends undefined ? boolean | undefined : TEqualsTo | undefined : S extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? TRequired extends true ? TEqualsTo extends undefined ? string : TEqualsTo : TEqualsTo extends undefined ? string | undefined : TEqualsTo | undefined : S extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? TRequired extends true ? InferType<TVariants> : InferType<TVariants> | undefined : S extends IAliasSchemaBuilder<infer TSchemaName, infer TRequired, infer TNullable, infer TAliases, infer TAliasesCompiledType> ? TRequired extends true ? TAliasesCompiledType : TAliasesCompiledType | undefined : S extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? TRequired extends true ? TOfType extends undefined ? any[] : InferType<TOfType>[] : TOfType extends undefined ? any[] | undefined : InferType<TOfType>[] | undefined : S extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? TRequired extends true ? Function : Function | undefined : S extends StringSchema ? S['equals'] extends undefined ? string : S['equals'] : S extends NumberSchema ? S['equals'] extends undefined ? number : S['equals'] : S extends ObjectSchema<infer K> ? OptionalPropertiesOf<K> extends never ? {
|
|
223
|
+
[k in keyof K]: InferType<K[k]>;
|
|
224
|
+
} : MakePropOptional<{
|
|
225
|
+
[k in keyof K]: InferType<K[k]>;
|
|
226
|
+
}, OptionalPropertiesOf<K>> : S extends {
|
|
227
|
+
type: 'object';
|
|
228
|
+
properties: infer K;
|
|
229
|
+
} ? OptionalPropertiesOf<K> extends never ? {
|
|
230
|
+
[k in keyof K]: InferType<K[k]>;
|
|
231
|
+
} : MakePropOptional<{
|
|
232
|
+
[k in keyof K]: InferType<K[k]>;
|
|
233
|
+
}, OptionalPropertiesOf<K>> : S extends [infer F] ? InferType<F> : S extends [infer F, ...infer Rest] ? InferType<F> | InferType<Rest> : S extends ArraySchema<infer L> ? InferType<L> extends never ? Array<any> : InferType<L>[] : S extends {
|
|
234
|
+
type: 'array';
|
|
235
|
+
ofType: infer L;
|
|
236
|
+
} ? InferType<L>[] : S extends {
|
|
237
|
+
type: 'array';
|
|
238
|
+
} ? Array<any> : any;
|
|
239
|
+
declare type OptionalPropertiesOf<T> = {
|
|
240
|
+
[k in keyof T]: T[k] extends ISchemaBuilder<infer TRequired, any> ? TRequired extends false ? k : never : never;
|
|
241
|
+
}[keyof T];
|
|
242
|
+
export {};
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ISchemaRegistry as ISchemaRegistry, Unfold } from './index.js';
|
|
2
|
+
import { Schema, ReduceSchemaBuilder, ValidationResult, InferType, ExpandSchemaBuilder } from './schema.js';
|
|
3
|
+
import { number } from './builders/NumberSchemaBuilder.js';
|
|
4
|
+
import { union } from './builders/UnionSchemaBuilder.js';
|
|
5
|
+
import { object } from './builders/ObjectSchemaBuilder.js';
|
|
6
|
+
import { string } from './builders/StringSchemaBuilder.js';
|
|
7
|
+
import { boolean } from './builders/BooleanSchemaBuilder.js';
|
|
8
|
+
import { array } from './builders/ArraySchemaBuilder.js';
|
|
9
|
+
import { IAliasSchemaBuilder } from './builders/AliasSchemaBuilder.js';
|
|
10
|
+
import { func } from './builders/FunctionSchemaBuilder.js';
|
|
11
|
+
import { ISchemaBuilder } from './builders/SchemaBuilder.js';
|
|
12
|
+
export default class SchemaRegistry<T extends Record<string, Schema> = {}> implements ISchemaRegistry<T> {
|
|
13
|
+
private _schemasMap;
|
|
14
|
+
private _schemasCache;
|
|
15
|
+
private _preprocessorsMap;
|
|
16
|
+
get preprocessors(): Map<string, (value: unknown) => unknown>;
|
|
17
|
+
addPreprocessor(name: string, preprocessor: (value: unknown) => unknown | Promise<unknown>): SchemaRegistry<T>;
|
|
18
|
+
addSchemaFrom<TOldName extends keyof T, TName extends string, TParam extends Record<string, any> | ((params: {
|
|
19
|
+
schema: ExpandSchemaBuilder<T[TOldName]>;
|
|
20
|
+
boolean: typeof boolean;
|
|
21
|
+
func: typeof func;
|
|
22
|
+
array: typeof array;
|
|
23
|
+
string: typeof string;
|
|
24
|
+
number: typeof number;
|
|
25
|
+
union: typeof union;
|
|
26
|
+
object: typeof object;
|
|
27
|
+
alias: <TSchemaName extends keyof T, TCompiledType = InferType<ExpandSchemaBuilder<T[TSchemaName]>>>(schemaName: TSchemaName) => IAliasSchemaBuilder<TSchemaName, true, false, {
|
|
28
|
+
[k in keyof T]: TSchemaName extends k ? T[k] : never;
|
|
29
|
+
}, TCompiledType>;
|
|
30
|
+
}) => TSchema), TSchema extends Schema | ISchemaBuilder>(oldName: TOldName, name: TName, param: TParam): SchemaRegistry<T & {
|
|
31
|
+
[key in TName]: TParam extends (...args: any[]) => any ? ReduceSchemaBuilder<ReturnType<TParam>> : TParam;
|
|
32
|
+
}>;
|
|
33
|
+
addSchema<TName extends string, TParam extends Record<string, any> | ((params: {
|
|
34
|
+
boolean: typeof boolean;
|
|
35
|
+
array: typeof array;
|
|
36
|
+
string: typeof string;
|
|
37
|
+
number: typeof number;
|
|
38
|
+
union: typeof union;
|
|
39
|
+
object: typeof object;
|
|
40
|
+
func: typeof func;
|
|
41
|
+
alias: <TSchemaName extends keyof T, TCompiledType = InferType<ExpandSchemaBuilder<T[TSchemaName]>>>(schemaName: TSchemaName) => IAliasSchemaBuilder<TSchemaName, true, false, {
|
|
42
|
+
[k in keyof T]: TSchemaName extends k ? T[k] : never;
|
|
43
|
+
}, TCompiledType>;
|
|
44
|
+
external: <TRegistryKeys extends Record<string, any>, TSchemaName extends keyof TRegistryKeys, TCompiledType = InferType<ExpandSchemaBuilder<TRegistryKeys[TSchemaName]>>>(registry: ISchemaRegistry<TRegistryKeys>, schemaName: TSchemaName) => IAliasSchemaBuilder<TSchemaName, true, false, {
|
|
45
|
+
[k in keyof TRegistryKeys]: TSchemaName extends k ? TRegistryKeys[k] : never;
|
|
46
|
+
}, TCompiledType>;
|
|
47
|
+
}) => TSchema), TSchema extends Schema | ISchemaBuilder>(name: TName, param: TParam): SchemaRegistry<T & {
|
|
48
|
+
[key in TName]: TParam extends (...args: any[]) => any ? ReduceSchemaBuilder<ReturnType<TParam>> : TParam;
|
|
49
|
+
}>;
|
|
50
|
+
get schemas(): Unfold<T>;
|
|
51
|
+
private validateDefaultType;
|
|
52
|
+
private checkValidators;
|
|
53
|
+
validate(schemaToValidate: keyof T | Schema, obj: any): Promise<ValidationResult>;
|
|
54
|
+
}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const validateNumber_js_1 = require("./validators/validateNumber.js");
|
|
4
|
+
const validateBoolean_js_1 = require("./validators/validateBoolean.js");
|
|
5
|
+
const validateString_js_1 = require("./validators/validateString.js");
|
|
6
|
+
const validateArray_js_1 = require("./validators/validateArray.js");
|
|
7
|
+
const validateObject_js_1 = require("./validators/validateObject.js");
|
|
8
|
+
const validateUnion_js_1 = require("./validators/validateUnion.js");
|
|
9
|
+
const validateFunction_js_1 = require("./validators/validateFunction.js");
|
|
10
|
+
const NumberSchemaBuilder_js_1 = require("./builders/NumberSchemaBuilder.js");
|
|
11
|
+
const UnionSchemaBuilder_js_1 = require("./builders/UnionSchemaBuilder.js");
|
|
12
|
+
const ObjectSchemaBuilder_js_1 = require("./builders/ObjectSchemaBuilder.js");
|
|
13
|
+
const StringSchemaBuilder_js_1 = require("./builders/StringSchemaBuilder.js");
|
|
14
|
+
const BooleanSchemaBuilder_js_1 = require("./builders/BooleanSchemaBuilder.js");
|
|
15
|
+
const ArraySchemaBuilder_js_1 = require("./builders/ArraySchemaBuilder.js");
|
|
16
|
+
const AliasSchemaBuilder_js_1 = require("./builders/AliasSchemaBuilder.js");
|
|
17
|
+
const FunctionSchemaBuilder_js_1 = require("./builders/FunctionSchemaBuilder.js");
|
|
18
|
+
const defaultSchemas_js_1 = require("./defaultSchemas.js");
|
|
19
|
+
const SchemaBuilder_js_1 = require("./builders/SchemaBuilder.js");
|
|
20
|
+
const defaultSchemaNames = ['string', 'boolean', 'number', 'array', 'function'];
|
|
21
|
+
const defaultSchemasValidationStrategies = {
|
|
22
|
+
number: (obj, schema) => (0, validateNumber_js_1.validateNumber)(obj, schema),
|
|
23
|
+
boolean: (obj, schema) => (0, validateBoolean_js_1.validateBoolean)(obj, schema),
|
|
24
|
+
string: (obj, schema) => (0, validateString_js_1.validateString)(obj, schema),
|
|
25
|
+
array: (obj, schema, validator) => (0, validateArray_js_1.validateArray)(obj, schema, validator),
|
|
26
|
+
function: (obj, schema) => (0, validateFunction_js_1.validateFunction)(obj, schema)
|
|
27
|
+
};
|
|
28
|
+
const isDefaultType = (name) => defaultSchemaNames.indexOf(name) !== -1;
|
|
29
|
+
class SchemaRegistry {
|
|
30
|
+
_schemasMap = new Map();
|
|
31
|
+
_schemasCache = null;
|
|
32
|
+
_preprocessorsMap = new Map();
|
|
33
|
+
get preprocessors() {
|
|
34
|
+
return this._preprocessorsMap;
|
|
35
|
+
}
|
|
36
|
+
addPreprocessor(name, preprocessor) {
|
|
37
|
+
if (this._preprocessorsMap.has(name))
|
|
38
|
+
throw new Error(`Preprocessor '${name}' is already registered`);
|
|
39
|
+
if (typeof preprocessor !== 'function') {
|
|
40
|
+
throw new Error('preprocessor must be a function');
|
|
41
|
+
}
|
|
42
|
+
this._preprocessorsMap.set(name, preprocessor);
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
addSchemaFrom(oldName, name, param) {
|
|
46
|
+
if (!this._schemasMap.has(oldName.toString())) {
|
|
47
|
+
throw new Error(`unknown schema name ${oldName.toString()}`);
|
|
48
|
+
}
|
|
49
|
+
const oldSchema = this._schemasMap.get(oldName.toString());
|
|
50
|
+
const schema = typeof param === 'function'
|
|
51
|
+
? param({
|
|
52
|
+
schema: oldSchema,
|
|
53
|
+
alias: AliasSchemaBuilder_js_1.alias,
|
|
54
|
+
array: ArraySchemaBuilder_js_1.array,
|
|
55
|
+
boolean: BooleanSchemaBuilder_js_1.boolean,
|
|
56
|
+
func: FunctionSchemaBuilder_js_1.func,
|
|
57
|
+
number: NumberSchemaBuilder_js_1.number,
|
|
58
|
+
object: ObjectSchemaBuilder_js_1.object,
|
|
59
|
+
string: StringSchemaBuilder_js_1.string,
|
|
60
|
+
union: UnionSchemaBuilder_js_1.union
|
|
61
|
+
})
|
|
62
|
+
: param;
|
|
63
|
+
if (Array.isArray(schema)) {
|
|
64
|
+
this._schemasMap.set(name.toString(), schema);
|
|
65
|
+
this._schemasCache = null;
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
if (typeof schema !== 'object')
|
|
69
|
+
throw new Error('Array or Object is required');
|
|
70
|
+
this._schemasMap.set(name.toString(), {
|
|
71
|
+
...(schema instanceof SchemaBuilder_js_1.SchemaBuilder
|
|
72
|
+
? schema._schema
|
|
73
|
+
: schema)
|
|
74
|
+
});
|
|
75
|
+
this._schemasCache = null;
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
addSchema(name, param) {
|
|
79
|
+
if (typeof name !== 'string' || !name)
|
|
80
|
+
throw new Error('Name is required');
|
|
81
|
+
if (isDefaultType(name.toString()))
|
|
82
|
+
throw new Error(`You can't add a schema named "${name}" because it's a name of a default schema, please consider another name to be used`);
|
|
83
|
+
if (this._schemasMap.has(name.toString())) {
|
|
84
|
+
throw new Error(`Schema "${name}" already exists`);
|
|
85
|
+
}
|
|
86
|
+
const schema = typeof param === 'function'
|
|
87
|
+
? param({
|
|
88
|
+
alias: AliasSchemaBuilder_js_1.alias,
|
|
89
|
+
external: AliasSchemaBuilder_js_1.externalAlias,
|
|
90
|
+
array: ArraySchemaBuilder_js_1.array,
|
|
91
|
+
boolean: BooleanSchemaBuilder_js_1.boolean,
|
|
92
|
+
number: NumberSchemaBuilder_js_1.number,
|
|
93
|
+
object: ObjectSchemaBuilder_js_1.object,
|
|
94
|
+
string: StringSchemaBuilder_js_1.string,
|
|
95
|
+
union: UnionSchemaBuilder_js_1.union,
|
|
96
|
+
func: FunctionSchemaBuilder_js_1.func
|
|
97
|
+
})
|
|
98
|
+
: param;
|
|
99
|
+
if (Array.isArray(schema)) {
|
|
100
|
+
this._schemasMap.set(name.toString(), schema);
|
|
101
|
+
this._schemasCache = null;
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
if (typeof schema !== 'object')
|
|
105
|
+
throw new Error('Array or Object is required');
|
|
106
|
+
this._schemasMap.set(name.toString(), schema instanceof SchemaBuilder_js_1.SchemaBuilder ? schema.clone() : schema);
|
|
107
|
+
this._schemasCache = null;
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
get schemas() {
|
|
111
|
+
if (this._schemasCache)
|
|
112
|
+
return this._schemasCache;
|
|
113
|
+
const res = {};
|
|
114
|
+
for (const key of this._schemasMap.keys()) {
|
|
115
|
+
const parts = key.split('.');
|
|
116
|
+
let curr = res;
|
|
117
|
+
for (let i = 0; i < parts.length; i++) {
|
|
118
|
+
if (i === parts.length - 1) {
|
|
119
|
+
curr[parts[i]] = {
|
|
120
|
+
validate: async (value) => {
|
|
121
|
+
const result = await this.validate(this._schemasMap.get(key), value);
|
|
122
|
+
if (!result.valid) {
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
...result,
|
|
127
|
+
object: value
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
schema: this._schemasMap.get(key)
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
if (typeof curr[parts[i]] === 'undefined') {
|
|
135
|
+
curr[parts[i]] = {};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
curr = curr[parts[i]];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
this._schemasCache = res;
|
|
142
|
+
return this._schemasCache;
|
|
143
|
+
}
|
|
144
|
+
async validateDefaultType(name, value, mergeSchema) {
|
|
145
|
+
const strategy = defaultSchemasValidationStrategies[name];
|
|
146
|
+
let finalSchema = defaultSchemas_js_1.defaultSchemas[name];
|
|
147
|
+
if (strategy) {
|
|
148
|
+
if (typeof mergeSchema === 'object' && mergeSchema) {
|
|
149
|
+
finalSchema = Object.assign({}, finalSchema, mergeSchema);
|
|
150
|
+
}
|
|
151
|
+
if (typeof mergeSchema === 'number') {
|
|
152
|
+
finalSchema = {
|
|
153
|
+
...finalSchema,
|
|
154
|
+
equals: mergeSchema
|
|
155
|
+
};
|
|
156
|
+
mergeSchema;
|
|
157
|
+
}
|
|
158
|
+
let preliminaryResult = await strategy(value, finalSchema, this);
|
|
159
|
+
if (!preliminaryResult.valid)
|
|
160
|
+
return preliminaryResult;
|
|
161
|
+
preliminaryResult = await this.checkValidators(finalSchema, value);
|
|
162
|
+
return preliminaryResult;
|
|
163
|
+
}
|
|
164
|
+
throw new Error('not implemented');
|
|
165
|
+
}
|
|
166
|
+
async checkValidators(schema, value) {
|
|
167
|
+
if (!schema.isRequired && typeof value === 'undefined') {
|
|
168
|
+
return {
|
|
169
|
+
valid: true
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
if (Array.isArray(schema.validators)) {
|
|
173
|
+
const validatorsResults = await Promise.allSettled(schema.validators.map((v) => Promise.resolve(v(value))));
|
|
174
|
+
const rejections = validatorsResults
|
|
175
|
+
.filter((f) => f.status === 'rejected')
|
|
176
|
+
.map((f) => f.reason);
|
|
177
|
+
const errors = validatorsResults
|
|
178
|
+
.filter((f) => f.status === 'fulfilled' &&
|
|
179
|
+
typeof f.value !== 'boolean' &&
|
|
180
|
+
f.value.valid === false)
|
|
181
|
+
.map((f) => f.value)
|
|
182
|
+
.map((f) => f.errors);
|
|
183
|
+
if (rejections.length === 0 && errors.length === 0) {
|
|
184
|
+
return {
|
|
185
|
+
valid: true
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
valid: false,
|
|
190
|
+
errors: [...rejections, ...errors]
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
valid: true
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
async validate(schemaToValidate, obj) {
|
|
198
|
+
if (!schemaToValidate)
|
|
199
|
+
throw new Error('schemaName is required');
|
|
200
|
+
const schema = schemaToValidate instanceof SchemaBuilder_js_1.SchemaBuilder
|
|
201
|
+
? schemaToValidate._schema
|
|
202
|
+
: schemaToValidate;
|
|
203
|
+
if (typeof schema === 'string') {
|
|
204
|
+
if (isDefaultType(schema)) {
|
|
205
|
+
return await this.validateDefaultType(schema, obj);
|
|
206
|
+
}
|
|
207
|
+
else if (typeof this._schemasMap.get(schema) !== 'undefined') {
|
|
208
|
+
if (Array.isArray(this._schemasMap.get(schema))) {
|
|
209
|
+
return this.validate(this._schemasMap.get(schema), obj);
|
|
210
|
+
}
|
|
211
|
+
const objSchema = Object.assign({}, defaultSchemas_js_1.defaultSchemas.object, this._schemasMap.get(schema));
|
|
212
|
+
const res = await (0, validateObject_js_1.validateObject)(obj, objSchema, this);
|
|
213
|
+
if (!res.valid)
|
|
214
|
+
return res;
|
|
215
|
+
return await this.checkValidators(objSchema, obj);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
return await this.validateDefaultType('string', obj, {
|
|
219
|
+
type: 'string',
|
|
220
|
+
equals: schema
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (Array.isArray(schema)) {
|
|
225
|
+
for (let i = 0; i < schema.length; i++) {
|
|
226
|
+
const res = await this.validate(schema[i], obj);
|
|
227
|
+
if (res.valid) {
|
|
228
|
+
return res;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
valid: false,
|
|
233
|
+
errors: ['object does not match any schema']
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
if (typeof schema === 'number') {
|
|
237
|
+
return await this.validateDefaultType('number', obj, schema);
|
|
238
|
+
}
|
|
239
|
+
if (typeof schema === 'object') {
|
|
240
|
+
const spec = schema;
|
|
241
|
+
if (typeof spec.type !== 'string')
|
|
242
|
+
throw new Error('Schema has no type');
|
|
243
|
+
if (isDefaultType(spec.type)) {
|
|
244
|
+
return await this.validateDefaultType(spec.type, obj, schema);
|
|
245
|
+
}
|
|
246
|
+
else if (spec.type === 'alias') {
|
|
247
|
+
if (spec.isRequired === false && typeof obj === 'undefined') {
|
|
248
|
+
return {
|
|
249
|
+
valid: true
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
if (spec.isNullable === true && obj === null) {
|
|
253
|
+
return {
|
|
254
|
+
valid: true
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
const registry = (spec.externalRegistry ||
|
|
258
|
+
this);
|
|
259
|
+
const alias = registry._schemasMap.get(spec.schemaName);
|
|
260
|
+
if (typeof alias === 'undefined') {
|
|
261
|
+
throw new Error(`Unknown schema alias - ${spec.schemaName}`);
|
|
262
|
+
}
|
|
263
|
+
if (Array.isArray(alias)) {
|
|
264
|
+
if ((!spec.isRequired && typeof obj === 'undefined') ||
|
|
265
|
+
(spec.isNullable && obj === null)) {
|
|
266
|
+
return {
|
|
267
|
+
valid: true
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
return await registry.validate(alias, obj);
|
|
271
|
+
}
|
|
272
|
+
if (typeof alias !== 'object')
|
|
273
|
+
throw new Error('it is only possible to use a full schema schema definition as alias');
|
|
274
|
+
let schemaToValidate = alias;
|
|
275
|
+
if (alias instanceof SchemaBuilder_js_1.SchemaBuilder) {
|
|
276
|
+
if (typeof schema.isRequired === 'boolean') {
|
|
277
|
+
schemaToValidate = schemaToValidate[schema.isRequired ? 'required' : 'optional']();
|
|
278
|
+
}
|
|
279
|
+
if (typeof schema.isNullable === 'boolean') {
|
|
280
|
+
schemaToValidate = schemaToValidate[schema.isNullable ? 'nullable' : 'notNullable']();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return await registry.validate(schemaToValidate, obj);
|
|
284
|
+
}
|
|
285
|
+
else if (spec.type === 'union') {
|
|
286
|
+
return await (0, validateUnion_js_1.validateUnion)(obj, spec, this);
|
|
287
|
+
}
|
|
288
|
+
else if (spec.type === 'object') {
|
|
289
|
+
const preliminaryResult = await (0, validateObject_js_1.validateObject)(obj, schema, this);
|
|
290
|
+
if (!preliminaryResult.valid)
|
|
291
|
+
return preliminaryResult;
|
|
292
|
+
return await this.checkValidators(schema, obj);
|
|
293
|
+
}
|
|
294
|
+
else if (spec.type === 'function') {
|
|
295
|
+
return await (0, validateFunction_js_1.validateFunction)(obj, spec);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
throw new Error("Couldn't understand the Schema provided");
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
exports.default = SchemaRegistry;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { ArraySchema, ValidationResult } from '../schema.js';
|
|
2
|
+
import SchemaRegistry from '../schemaRegistry.js';
|
|
3
|
+
export declare const validateArray: (obj: any, schema: ArraySchema<any>, validator: SchemaRegistry<any>) => Promise<ValidationResult>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare const validateBoolean: (obj: any, schema:
|
|
1
|
+
import { BooleanSchema, ValidationResult } from '../schema.js';
|
|
2
|
+
export declare const validateBoolean: (obj: any, schema: BooleanSchema) => Promise<ValidationResult>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateBoolean = void 0;
|
|
4
|
-
const validateBoolean = async (obj, schema
|
|
4
|
+
const validateBoolean = async (obj, schema) => {
|
|
5
5
|
if (typeof obj === 'undefined' &&
|
|
6
6
|
typeof schema === 'object' &&
|
|
7
7
|
schema.isRequired === false) {
|
|
@@ -14,9 +14,6 @@ const validateBoolean = async (obj, schema, validator) => {
|
|
|
14
14
|
valid: false,
|
|
15
15
|
errors: [`expected type boolean, but saw ${typeof obj}`]
|
|
16
16
|
};
|
|
17
|
-
if (typeof schema === 'boolean') {
|
|
18
|
-
return { valid: true };
|
|
19
|
-
}
|
|
20
17
|
const bool = obj;
|
|
21
18
|
if (typeof schema.equals === 'boolean') {
|
|
22
19
|
return schema.equals === bool
|