@cleverbrush/schema 0.0.16 → 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 +224 -149
- 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
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ISchemaBuilder, SchemaBuilder } from './SchemaBuilder.js';
|
|
2
|
+
import { Schema, Validator, InferType, MakeOptional, MakeRequired, MakeNullable, MakeNotNullable } from '../schema.js';
|
|
3
|
+
export interface IObjectSchemaBuilder<TRequired extends boolean = true, TNullable extends boolean = false, TNoUnknownProperties extends boolean = true, TProperties = {}, TMapToType = undefined> extends ISchemaBuilder<TRequired, TNullable> {
|
|
4
|
+
optional(): IObjectSchemaBuilder<false, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
5
|
+
required(): IObjectSchemaBuilder<true, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
6
|
+
nullable(): IObjectSchemaBuilder<TRequired, true, TNoUnknownProperties, TProperties, TMapToType>;
|
|
7
|
+
notNullable(): IObjectSchemaBuilder<TRequired, false, TNoUnknownProperties, TProperties, TMapToType>;
|
|
8
|
+
addProps<T extends Record<string, any>>(val?: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties & T, TMapToType>;
|
|
9
|
+
removeProp<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T>, TMapToType>;
|
|
10
|
+
canHaveUnknownProps(): IObjectSchemaBuilder<TRequired, TNullable, false, TProperties, TMapToType>;
|
|
11
|
+
noUnknownProps(): IObjectSchemaBuilder<TRequired, TNullable, true, TProperties, TMapToType>;
|
|
12
|
+
setPropPreprocessor<T extends keyof TProperties | '*', S = T extends keyof TProperties ? ((value: any) => undefined | InferType<TProperties[T]> | Promise<InferType<TProperties[T]>>) | string : (value: InferType<this>) => void | Promise<void>>(property: T, validator: S): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
13
|
+
unsetPropPreprocessor<T extends keyof TProperties | '*'>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
14
|
+
clearPropsPreprocessors(): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
15
|
+
makeAllPropsOptional<T extends keyof TProperties>(): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, {
|
|
16
|
+
[k in T]: MakeOptional<TProperties[k]>;
|
|
17
|
+
}, TMapToType>;
|
|
18
|
+
makePropOptional<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T> & {
|
|
19
|
+
[k in T]: MakeOptional<TProperties[k]>;
|
|
20
|
+
}, TMapToType>;
|
|
21
|
+
makePropRequired<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T> & {
|
|
22
|
+
[k in T]: MakeRequired<TProperties[k]>;
|
|
23
|
+
}, TMapToType>;
|
|
24
|
+
makePropNullable<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T> & {
|
|
25
|
+
[k in T]: MakeNullable<TProperties[k]>;
|
|
26
|
+
}, TMapToType>;
|
|
27
|
+
makePropNotNullable<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T> & {
|
|
28
|
+
[k in T]: MakeNotNullable<TProperties[k]>;
|
|
29
|
+
}, TMapToType>;
|
|
30
|
+
mapToType<T>(): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, T>;
|
|
31
|
+
clearMapToType(): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, undefined>;
|
|
32
|
+
}
|
|
33
|
+
export declare class ObjectSchemaBuilder<TRequired extends boolean = true, TNullable extends boolean = false, TNoUnknownProperties extends boolean = true, TProperties = {}, TMapToType = undefined> extends SchemaBuilder<TRequired, TNullable> implements IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, TMapToType> {
|
|
34
|
+
protected readonly type = "object";
|
|
35
|
+
protected noUnknownProperties?: TNoUnknownProperties;
|
|
36
|
+
protected properties?: TProperties;
|
|
37
|
+
protected preprocessors?: {
|
|
38
|
+
[S in keyof TProperties | '*']?: S extends keyof TProperties ? ((value: any) => undefined | InferType<TProperties[S]> | Promise<InferType<TProperties[S]>>) | string : (value: InferType<TProperties>) => void | Promise<void>;
|
|
39
|
+
};
|
|
40
|
+
clone(): this;
|
|
41
|
+
get _schema(): Schema;
|
|
42
|
+
private constructor();
|
|
43
|
+
static create<TCRequired extends boolean = true, TCNullable extends boolean = false, TCNoUnknownProperties extends boolean = false, TCProperties = {}, TMapToType = undefined>(obj?: {
|
|
44
|
+
isRequired: TCRequired;
|
|
45
|
+
isNullable: TCNullable;
|
|
46
|
+
properties: TCProperties;
|
|
47
|
+
noUnknownProperties: TCNoUnknownProperties;
|
|
48
|
+
validators?: Validator[];
|
|
49
|
+
preprocessor?: ((value: unknown) => unknown | Promise<unknown>) | string;
|
|
50
|
+
preprocessors?: {
|
|
51
|
+
[S in keyof TCProperties | '*']?: S extends keyof TCProperties ? ((value: any) => undefined | InferType<TCProperties[S]> | Promise<InferType<TCProperties[S]>>) | string : (value: InferType<TCProperties>) => void | Promise<void>;
|
|
52
|
+
};
|
|
53
|
+
}): IObjectSchemaBuilder<TCRequired, TCNullable, TCNoUnknownProperties, TCProperties, TMapToType>;
|
|
54
|
+
canHaveUnknownProps(): IObjectSchemaBuilder<TRequired, TNullable, false, TProperties, TMapToType>;
|
|
55
|
+
noUnknownProps(): IObjectSchemaBuilder<TRequired, TNullable, true, TProperties, TMapToType>;
|
|
56
|
+
optional(): IObjectSchemaBuilder<false, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
57
|
+
required(): IObjectSchemaBuilder<true, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
58
|
+
nullable(): IObjectSchemaBuilder<TRequired, true, TNoUnknownProperties, TProperties, TMapToType>;
|
|
59
|
+
notNullable(): IObjectSchemaBuilder<TRequired, false, TNoUnknownProperties, TProperties, TMapToType>;
|
|
60
|
+
addProps<T extends Record<string, any>>(val?: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties & T, TMapToType>;
|
|
61
|
+
removeProp<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T>, TMapToType>;
|
|
62
|
+
setPropPreprocessor<T extends keyof TProperties | '*', S = T extends keyof TProperties ? ((value: any) => undefined | InferType<TProperties[T]> | Promise<InferType<TProperties[T]>>) | string : (value: InferType<T>) => void | Promise<void>>(property: T, validator: S): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
63
|
+
unsetPropPreprocessor<T extends keyof TProperties | '*'>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
64
|
+
clearPropsPreprocessors(): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, TMapToType>;
|
|
65
|
+
mapToType<T>(): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, T>;
|
|
66
|
+
clearMapToType(): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, TProperties, undefined>;
|
|
67
|
+
makeAllPropsOptional<T extends keyof TProperties>(): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, {
|
|
68
|
+
[k in T]: MakeOptional<TProperties[k]>;
|
|
69
|
+
}, TMapToType>;
|
|
70
|
+
makePropOptional<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T> & {
|
|
71
|
+
[k in T]: MakeOptional<TProperties[k]>;
|
|
72
|
+
}, TMapToType>;
|
|
73
|
+
makePropRequired<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T> & {
|
|
74
|
+
[k in T]: MakeRequired<TProperties[k]>;
|
|
75
|
+
}, TMapToType>;
|
|
76
|
+
makePropNullable<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T> & {
|
|
77
|
+
[k in T]: MakeNullable<TProperties[k]>;
|
|
78
|
+
}, TMapToType>;
|
|
79
|
+
makePropNotNullable<T extends keyof TProperties>(property: T): IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, Omit<TProperties, T> & {
|
|
80
|
+
[k in T]: MakeNotNullable<TProperties[k]>;
|
|
81
|
+
}, TMapToType>;
|
|
82
|
+
}
|
|
83
|
+
export declare const object: <T>(properties?: T) => IObjectSchemaBuilder<true, false, true, T extends undefined ? {} : T, undefined>;
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.object = exports.ObjectSchemaBuilder = void 0;
|
|
4
|
+
const SchemaBuilder_js_1 = require("./SchemaBuilder.js");
|
|
5
|
+
const defaultSchemas_js_1 = require("../defaultSchemas.js");
|
|
6
|
+
class ObjectSchemaBuilder extends SchemaBuilder_js_1.SchemaBuilder {
|
|
7
|
+
type = 'object';
|
|
8
|
+
noUnknownProperties;
|
|
9
|
+
properties;
|
|
10
|
+
preprocessors;
|
|
11
|
+
clone() {
|
|
12
|
+
return ObjectSchemaBuilder.create({
|
|
13
|
+
isNullable: this._isNullable,
|
|
14
|
+
isRequired: this._isRequired,
|
|
15
|
+
noUnknownProperties: this.noUnknownProperties,
|
|
16
|
+
properties: this.properties,
|
|
17
|
+
preprocessor: this.preprocessor,
|
|
18
|
+
preprocessors: this.preprocessors,
|
|
19
|
+
validators: this.validators
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
get _schema() {
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
24
|
+
const that = this;
|
|
25
|
+
return Object.assign({
|
|
26
|
+
type: this.type
|
|
27
|
+
}, this.getCommonSchema(), typeof that.properties !== 'undefined' && that.properties
|
|
28
|
+
? {
|
|
29
|
+
properties: Object.keys(that.properties).reduce((acc, curr) => {
|
|
30
|
+
if (!that.properties)
|
|
31
|
+
return;
|
|
32
|
+
if (that.properties[curr] instanceof SchemaBuilder_js_1.SchemaBuilder) {
|
|
33
|
+
acc[curr] = that.properties[curr].clone();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
acc[curr] = that.properties[curr];
|
|
37
|
+
}
|
|
38
|
+
return acc;
|
|
39
|
+
}, {})
|
|
40
|
+
}
|
|
41
|
+
: {}, typeof that.noUnknownProperties !== 'undefined'
|
|
42
|
+
? { noUnknownProperties: that.noUnknownProperties }
|
|
43
|
+
: {}, typeof that.preprocessors !== 'undefined' && that.preprocessors
|
|
44
|
+
? {
|
|
45
|
+
preprocessors: {
|
|
46
|
+
...that.preprocessors
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
: {});
|
|
50
|
+
}
|
|
51
|
+
constructor(obj) {
|
|
52
|
+
super(obj);
|
|
53
|
+
if (typeof obj === 'object' && obj) {
|
|
54
|
+
if (typeof obj.properties !== 'undefined') {
|
|
55
|
+
this.properties = Object.keys(obj.properties).reduce((acc, curr) => {
|
|
56
|
+
if (obj.properties[curr] instanceof SchemaBuilder_js_1.SchemaBuilder) {
|
|
57
|
+
acc[curr] = obj.properties[curr].clone();
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
acc[curr] = {
|
|
61
|
+
...obj.properties[curr]
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return acc;
|
|
65
|
+
}, {});
|
|
66
|
+
}
|
|
67
|
+
if (typeof obj.preprocessors !== 'undefined') {
|
|
68
|
+
this.preprocessors = { ...obj.preprocessors };
|
|
69
|
+
}
|
|
70
|
+
if (typeof obj.noUnknownProperties !== 'undefined') {
|
|
71
|
+
this.noUnknownProperties = obj.noUnknownProperties;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const defaultSchema = defaultSchemas_js_1.defaultSchemas['object'];
|
|
76
|
+
this.isRequired = defaultSchema.isRequired;
|
|
77
|
+
this.isNullable = defaultSchema.isNullable;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
static create(obj) {
|
|
81
|
+
return new ObjectSchemaBuilder(obj);
|
|
82
|
+
}
|
|
83
|
+
canHaveUnknownProps() {
|
|
84
|
+
if (this.noUnknownProperties === false) {
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
return ObjectSchemaBuilder.create({
|
|
88
|
+
...this._schema,
|
|
89
|
+
noUnknownProperties: false
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
noUnknownProps() {
|
|
93
|
+
if (this.noUnknownProperties === true) {
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
return ObjectSchemaBuilder.create({
|
|
97
|
+
...this._schema,
|
|
98
|
+
noUnknownProperties: true
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
optional() {
|
|
102
|
+
if (this.isRequired === false) {
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
return ObjectSchemaBuilder.create({
|
|
106
|
+
...this._schema,
|
|
107
|
+
isRequired: false
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
required() {
|
|
111
|
+
if (this.isRequired === true) {
|
|
112
|
+
return this;
|
|
113
|
+
}
|
|
114
|
+
return ObjectSchemaBuilder.create({
|
|
115
|
+
...this._schema,
|
|
116
|
+
isRequired: true
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
nullable() {
|
|
120
|
+
if (this.isNullable === true) {
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
return ObjectSchemaBuilder.create({
|
|
124
|
+
...this._schema,
|
|
125
|
+
isNullable: true
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
notNullable() {
|
|
129
|
+
if (this.isNullable === false) {
|
|
130
|
+
return this;
|
|
131
|
+
}
|
|
132
|
+
return ObjectSchemaBuilder.create({
|
|
133
|
+
...this._schema,
|
|
134
|
+
isNullable: false
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
addProps(val) {
|
|
138
|
+
if (typeof val === 'undefined')
|
|
139
|
+
return this;
|
|
140
|
+
return ObjectSchemaBuilder.create({
|
|
141
|
+
...this._schema,
|
|
142
|
+
properties: {
|
|
143
|
+
...this.properties,
|
|
144
|
+
...val
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
removeProp(property) {
|
|
149
|
+
if (typeof this.properties === 'undefined') {
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
if (!(property in this.properties)) {
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
const newProperties = {
|
|
156
|
+
...this.properties
|
|
157
|
+
};
|
|
158
|
+
delete newProperties[property];
|
|
159
|
+
let newPreprocessors = this.preprocessors;
|
|
160
|
+
if (typeof newPreprocessors !== 'undefined' &&
|
|
161
|
+
property in newPreprocessors) {
|
|
162
|
+
if (Object.keys(newPreprocessors).length === 1) {
|
|
163
|
+
newPreprocessors = undefined;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
newPreprocessors = {
|
|
167
|
+
...this.preprocessors
|
|
168
|
+
};
|
|
169
|
+
delete newPreprocessors[property];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return ObjectSchemaBuilder.create({
|
|
173
|
+
...this._schema,
|
|
174
|
+
preprocessors: newPreprocessors,
|
|
175
|
+
properties: newProperties
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
setPropPreprocessor(property, validator) {
|
|
179
|
+
if (typeof this.preprocessors === 'undefined') {
|
|
180
|
+
this.preprocessors = {
|
|
181
|
+
[property]: validator
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
this.preprocessors = {
|
|
186
|
+
...this.preprocessors,
|
|
187
|
+
[property]: validator
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return ObjectSchemaBuilder.create({
|
|
191
|
+
...this._schema,
|
|
192
|
+
preprocessors: {
|
|
193
|
+
...this.preprocessors
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
unsetPropPreprocessor(property) {
|
|
198
|
+
if (typeof this.preprocessors === 'undefined' ||
|
|
199
|
+
!(property in this.preprocessors)) {
|
|
200
|
+
return this;
|
|
201
|
+
}
|
|
202
|
+
let newPreprocessors;
|
|
203
|
+
if (Object.keys(this.preprocessors).length === 1) {
|
|
204
|
+
newPreprocessors = undefined;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
newPreprocessors = {
|
|
208
|
+
...this.preprocessors
|
|
209
|
+
};
|
|
210
|
+
delete newPreprocessors[property];
|
|
211
|
+
}
|
|
212
|
+
return ObjectSchemaBuilder.create({
|
|
213
|
+
...this._schema,
|
|
214
|
+
preprocessors: newPreprocessors
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
clearPropsPreprocessors() {
|
|
218
|
+
if (typeof this.preprocessors === 'undefined') {
|
|
219
|
+
return this;
|
|
220
|
+
}
|
|
221
|
+
return ObjectSchemaBuilder.create({
|
|
222
|
+
...this._schema,
|
|
223
|
+
preprocessors: undefined
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
mapToType() {
|
|
227
|
+
return this;
|
|
228
|
+
}
|
|
229
|
+
clearMapToType() {
|
|
230
|
+
return this;
|
|
231
|
+
}
|
|
232
|
+
makeAllPropsOptional() {
|
|
233
|
+
let res = this;
|
|
234
|
+
for (const prop in this.properties) {
|
|
235
|
+
res = res.makePropOptional(prop);
|
|
236
|
+
}
|
|
237
|
+
return res;
|
|
238
|
+
}
|
|
239
|
+
makePropOptional(property) {
|
|
240
|
+
if (typeof this.properties[property] === 'undefined')
|
|
241
|
+
throw new Error(`Property ${property} does not exists`);
|
|
242
|
+
if (this.properties[property] instanceof SchemaBuilder_js_1.SchemaBuilder) {
|
|
243
|
+
return ObjectSchemaBuilder.create({
|
|
244
|
+
...this._schema,
|
|
245
|
+
properties: {
|
|
246
|
+
...this.properties,
|
|
247
|
+
[property]: this.properties[property].optional()
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
return ObjectSchemaBuilder.create({
|
|
253
|
+
...this._schema,
|
|
254
|
+
properties: {
|
|
255
|
+
...this.properties,
|
|
256
|
+
[property]: {
|
|
257
|
+
...this.properties[property],
|
|
258
|
+
isRequired: false
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
makePropRequired(property) {
|
|
265
|
+
if (typeof this.properties[property] === 'undefined')
|
|
266
|
+
throw new Error(`Property ${property} does not exists`);
|
|
267
|
+
if (this.properties[property] instanceof SchemaBuilder_js_1.SchemaBuilder) {
|
|
268
|
+
return ObjectSchemaBuilder.create({
|
|
269
|
+
...this._schema,
|
|
270
|
+
properties: {
|
|
271
|
+
...this.properties,
|
|
272
|
+
[property]: this.properties[property].required()
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
return ObjectSchemaBuilder.create({
|
|
278
|
+
...this._schema,
|
|
279
|
+
properties: {
|
|
280
|
+
...this.properties,
|
|
281
|
+
[property]: {
|
|
282
|
+
...this.properties[property],
|
|
283
|
+
isRequired: true
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
makePropNullable(property) {
|
|
290
|
+
if (typeof this.properties[property] === 'undefined')
|
|
291
|
+
throw new Error(`Property ${property} does not exists`);
|
|
292
|
+
if (this.properties[property] instanceof SchemaBuilder_js_1.SchemaBuilder) {
|
|
293
|
+
return ObjectSchemaBuilder.create({
|
|
294
|
+
...this._schema,
|
|
295
|
+
properties: {
|
|
296
|
+
...this.properties,
|
|
297
|
+
[property]: this.properties[property].nullable()
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
return ObjectSchemaBuilder.create({
|
|
303
|
+
...this._schema,
|
|
304
|
+
properties: {
|
|
305
|
+
...this.properties,
|
|
306
|
+
[property]: {
|
|
307
|
+
...this.properties[property],
|
|
308
|
+
isNullable: true
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
makePropNotNullable(property) {
|
|
315
|
+
if (typeof this.properties[property] === 'undefined')
|
|
316
|
+
throw new Error(`Property ${property} does not exists`);
|
|
317
|
+
if (this.properties[property] instanceof SchemaBuilder_js_1.SchemaBuilder) {
|
|
318
|
+
return ObjectSchemaBuilder.create({
|
|
319
|
+
...this._schema,
|
|
320
|
+
properties: {
|
|
321
|
+
...this.properties,
|
|
322
|
+
[property]: this.properties[property].notNullable()
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
return ObjectSchemaBuilder.create({
|
|
328
|
+
...this._schema,
|
|
329
|
+
properties: {
|
|
330
|
+
...this.properties,
|
|
331
|
+
[property]: {
|
|
332
|
+
...this.properties[property],
|
|
333
|
+
isNullable: false
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
exports.ObjectSchemaBuilder = ObjectSchemaBuilder;
|
|
341
|
+
const object = (properties) => typeof properties === 'undefined'
|
|
342
|
+
? ObjectSchemaBuilder.create()
|
|
343
|
+
: ObjectSchemaBuilder.create().addProps(properties);
|
|
344
|
+
exports.object = object;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Schema, Validator } from '../schema.js';
|
|
2
|
+
export interface ISchemaBuilder<TRequired extends boolean = true, TNullable extends boolean = false> {
|
|
3
|
+
readonly _schema: Schema;
|
|
4
|
+
isRequired: TRequired;
|
|
5
|
+
isNullable: TNullable;
|
|
6
|
+
validators?: Validator[];
|
|
7
|
+
preprocessor?: ((value: unknown) => unknown | Promise<unknown>) | string;
|
|
8
|
+
addValidator(validator: Validator): this;
|
|
9
|
+
clearValidators(): this;
|
|
10
|
+
addPreprocessor(preprocessor: ((value: unknown) => unknown | Promise<unknown>) | string): this;
|
|
11
|
+
clearPreprocessor(): this;
|
|
12
|
+
clone(): this;
|
|
13
|
+
}
|
|
14
|
+
export declare abstract class SchemaBuilder<TRequired extends boolean = true, TNullable extends boolean = false> implements ISchemaBuilder<TRequired, TNullable> {
|
|
15
|
+
protected _isRequired: TRequired;
|
|
16
|
+
protected _isNullable: TNullable;
|
|
17
|
+
validators?: Validator[];
|
|
18
|
+
preprocessor?: ((value: unknown) => unknown | Promise<unknown>) | string;
|
|
19
|
+
abstract clone(): this;
|
|
20
|
+
abstract get _schema(): Schema;
|
|
21
|
+
protected constructor(obj: {
|
|
22
|
+
isRequired?: boolean;
|
|
23
|
+
isNullable?: boolean;
|
|
24
|
+
preprocessor?: ((value: unknown) => unknown | Promise<unknown>) | string;
|
|
25
|
+
validators?: Validator[];
|
|
26
|
+
});
|
|
27
|
+
protected getCommonSchema(): any;
|
|
28
|
+
addPreprocessor(preprocessor: ((value: unknown) => unknown | Promise<unknown>) | string): this;
|
|
29
|
+
clearPreprocessor(): this;
|
|
30
|
+
addValidator(validator: Validator): this;
|
|
31
|
+
clearValidators(): this;
|
|
32
|
+
get isRequired(): TRequired;
|
|
33
|
+
protected set isRequired(val: boolean);
|
|
34
|
+
get isNullable(): TNullable;
|
|
35
|
+
protected set isNullable(val: boolean);
|
|
36
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SchemaBuilder = void 0;
|
|
4
|
+
class SchemaBuilder {
|
|
5
|
+
_isRequired = true;
|
|
6
|
+
_isNullable = false;
|
|
7
|
+
validators;
|
|
8
|
+
preprocessor;
|
|
9
|
+
constructor(obj) {
|
|
10
|
+
if (typeof obj === 'object') {
|
|
11
|
+
if (typeof obj.isRequired !== 'undefined') {
|
|
12
|
+
this.isRequired = obj.isRequired;
|
|
13
|
+
}
|
|
14
|
+
if (typeof obj.isNullable !== 'undefined') {
|
|
15
|
+
this.isNullable = obj.isNullable;
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(obj.validators)) {
|
|
18
|
+
this.validators = [...obj.validators];
|
|
19
|
+
}
|
|
20
|
+
if (typeof obj.preprocessor !== 'undefined') {
|
|
21
|
+
this.preprocessor = obj.preprocessor;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
getCommonSchema() {
|
|
26
|
+
const schemas = [];
|
|
27
|
+
if (typeof this.preprocessor !== 'undefined') {
|
|
28
|
+
schemas.push({
|
|
29
|
+
preprocessor: this.preprocessor
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (typeof this.isRequired !== 'undefined') {
|
|
33
|
+
schemas.push({ isRequired: this.isRequired });
|
|
34
|
+
}
|
|
35
|
+
if (typeof this.isNullable !== 'undefined') {
|
|
36
|
+
schemas.push({ isNullable: this.isNullable });
|
|
37
|
+
}
|
|
38
|
+
if (typeof this.validators !== 'undefined') {
|
|
39
|
+
schemas.push({ validators: [...this.validators] });
|
|
40
|
+
}
|
|
41
|
+
return Object.assign({}, ...schemas);
|
|
42
|
+
}
|
|
43
|
+
addPreprocessor(preprocessor) {
|
|
44
|
+
const result = this.clone();
|
|
45
|
+
result.preprocessor = preprocessor;
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
clearPreprocessor() {
|
|
49
|
+
if (typeof this.preprocessor === 'undefined') {
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
const result = this.clone();
|
|
53
|
+
delete result.preprocessor;
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
addValidator(validator) {
|
|
57
|
+
const result = this.clone();
|
|
58
|
+
if (typeof validator !== 'function')
|
|
59
|
+
throw new Error('validator should be a function');
|
|
60
|
+
if (Array.isArray(result.validators)) {
|
|
61
|
+
result.validators.push(validator);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
result.validators = [validator];
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
clearValidators() {
|
|
69
|
+
if (typeof this.validators === 'undefined')
|
|
70
|
+
return this;
|
|
71
|
+
const result = this.clone();
|
|
72
|
+
delete result.validators;
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
get isRequired() {
|
|
76
|
+
return this._isRequired;
|
|
77
|
+
}
|
|
78
|
+
set isRequired(val) {
|
|
79
|
+
this._isRequired = val;
|
|
80
|
+
}
|
|
81
|
+
get isNullable() {
|
|
82
|
+
return this._isNullable;
|
|
83
|
+
}
|
|
84
|
+
set isNullable(val) {
|
|
85
|
+
this._isNullable = val;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.SchemaBuilder = SchemaBuilder;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ISchemaBuilder } from './SchemaBuilder.js';
|
|
2
|
+
export interface IStringSchemaBuilder<TRequired extends boolean = true, TNullable extends boolean = false, TMinLength extends number | undefined = undefined, TMaxLength extends number | undefined = undefined, TEqualsTo extends string | undefined = undefined> extends ISchemaBuilder<TRequired, TNullable> {
|
|
3
|
+
optional(): IStringSchemaBuilder<false, TNullable, TMinLength, TMaxLength, TEqualsTo>;
|
|
4
|
+
required(): IStringSchemaBuilder<true, TNullable, TMinLength, TMaxLength, TEqualsTo>;
|
|
5
|
+
nullable(): IStringSchemaBuilder<TRequired, true, TMinLength, TMaxLength, TEqualsTo>;
|
|
6
|
+
notNullable(): IStringSchemaBuilder<TRequired, false, TMinLength, TMaxLength, TEqualsTo>;
|
|
7
|
+
minLength<K extends number>(val: K): IStringSchemaBuilder<TRequired, TNullable, K, TMaxLength, TEqualsTo>;
|
|
8
|
+
clearMinLength(): IStringSchemaBuilder<TRequired, TNullable, undefined, TMaxLength, TEqualsTo>;
|
|
9
|
+
maxLength<K extends number>(val: K): IStringSchemaBuilder<TRequired, TNullable, TMinLength, K, TEqualsTo>;
|
|
10
|
+
clearMaxLength(): IStringSchemaBuilder<TRequired, TNullable, TMinLength, undefined, TEqualsTo>;
|
|
11
|
+
equals<T extends string>(val: T): IStringSchemaBuilder<TRequired, TNullable, TMinLength, TMaxLength, T>;
|
|
12
|
+
clearEquals(): IStringSchemaBuilder<TRequired, TNullable, TMinLength, TMaxLength, undefined>;
|
|
13
|
+
}
|
|
14
|
+
export declare const string: <T extends string = undefined>(equals?: T) => IStringSchemaBuilder<true, false, undefined, undefined, T extends undefined ? undefined : T>;
|