@e22m4u/js-repository 0.1.4 → 0.1.6
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 +6 -5
- package/docs/assets/search.js +1 -1
- package/docs/classes/ModelDataValidator.html +2 -2
- package/docs/index.html +7 -5
- package/docs/types/PropertyValidateOptions.html +1 -1
- package/docs/types/PropertyValidator.html +2 -2
- package/docs/types/PropertyValidatorContext.html +2 -2
- package/package.json +1 -1
- package/src/adapter/decorator/data-validation-decorator.js +10 -18
- package/src/adapter/decorator/data-validation-decorator.spec.js +0 -40
- package/src/definition/model/model-data-validator.d.ts +1 -5
- package/src/definition/model/model-data-validator.js +44 -49
- package/src/definition/model/model-data-validator.spec.js +1794 -1840
- package/src/definition/model/properties/property-validator/builtin/index.d.ts +1 -0
- package/src/definition/model/properties/property-validator/builtin/index.js +1 -0
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.spec.js +29 -1
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.spec.js +29 -1
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.d.ts +6 -0
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.js +30 -0
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.spec.js +95 -0
- package/src/definition/model/properties/property-validator/property-validator-registry.js +2 -0
- package/src/definition/model/properties/property-validator/property-validator.d.ts +1 -6
|
@@ -16,9 +16,9 @@ export class ModelDataValidator extends Service {
|
|
|
16
16
|
* @param {string} modelName
|
|
17
17
|
* @param {object} modelData
|
|
18
18
|
* @param {boolean} isPartial
|
|
19
|
-
* @returns {
|
|
19
|
+
* @returns {undefined}
|
|
20
20
|
*/
|
|
21
|
-
|
|
21
|
+
validate(modelName, modelData, isPartial = false) {
|
|
22
22
|
if (!isPureObject(modelData))
|
|
23
23
|
throw new InvalidArgumentError(
|
|
24
24
|
'The data of the model %v should be an Object, but %v given.',
|
|
@@ -30,16 +30,16 @@ export class ModelDataValidator extends Service {
|
|
|
30
30
|
ModelDefinitionUtils,
|
|
31
31
|
).getPropertiesDefinitionInBaseModelHierarchy(modelName);
|
|
32
32
|
const propNames = Object.keys(isPartial ? modelData : propDefs);
|
|
33
|
-
|
|
33
|
+
propNames.forEach(propName => {
|
|
34
34
|
const propDef = propDefs[propName];
|
|
35
|
-
if (!propDef)
|
|
36
|
-
|
|
35
|
+
if (!propDef) return;
|
|
36
|
+
this._validatePropertyValue(
|
|
37
37
|
modelName,
|
|
38
38
|
propName,
|
|
39
39
|
propDef,
|
|
40
40
|
modelData[propName],
|
|
41
41
|
);
|
|
42
|
-
}
|
|
42
|
+
});
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/**
|
|
@@ -49,9 +49,9 @@ export class ModelDataValidator extends Service {
|
|
|
49
49
|
* @param {string} propName
|
|
50
50
|
* @param {string|object} propDef
|
|
51
51
|
* @param {*} propValue
|
|
52
|
-
* @returns {
|
|
52
|
+
* @returns {undefined}
|
|
53
53
|
*/
|
|
54
|
-
|
|
54
|
+
_validatePropertyValue(modelName, propName, propDef, propValue) {
|
|
55
55
|
// undefined and null
|
|
56
56
|
if (propValue == null) {
|
|
57
57
|
const isRequired =
|
|
@@ -64,15 +64,10 @@ export class ModelDataValidator extends Service {
|
|
|
64
64
|
propValue,
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
propDef,
|
|
72
|
-
propValue,
|
|
73
|
-
);
|
|
74
|
-
// PropertyValidators
|
|
75
|
-
await this._validateByPropertyValidators(
|
|
67
|
+
// Property type.
|
|
68
|
+
this._validateValueByPropertyType(modelName, propName, propDef, propValue);
|
|
69
|
+
// Property validators.
|
|
70
|
+
this._validateValueByPropertyValidators(
|
|
76
71
|
modelName,
|
|
77
72
|
propName,
|
|
78
73
|
propDef,
|
|
@@ -81,16 +76,16 @@ export class ModelDataValidator extends Service {
|
|
|
81
76
|
}
|
|
82
77
|
|
|
83
78
|
/**
|
|
84
|
-
* Validate value type.
|
|
79
|
+
* Validate value by property type.
|
|
85
80
|
*
|
|
86
81
|
* @param {string} modelName
|
|
87
82
|
* @param {string} propName
|
|
88
83
|
* @param {string|object} propDef
|
|
89
84
|
* @param {*} propValue
|
|
90
85
|
* @param {boolean} isArrayValue
|
|
91
|
-
* @returns {
|
|
86
|
+
* @returns {undefined}
|
|
92
87
|
*/
|
|
93
|
-
|
|
88
|
+
_validateValueByPropertyType(
|
|
94
89
|
modelName,
|
|
95
90
|
propName,
|
|
96
91
|
propDef,
|
|
@@ -138,8 +133,8 @@ export class ModelDataValidator extends Service {
|
|
|
138
133
|
// ARRAY
|
|
139
134
|
case DataType.ARRAY:
|
|
140
135
|
if (!Array.isArray(propValue)) throw createError('an Array');
|
|
141
|
-
|
|
142
|
-
this.
|
|
136
|
+
propValue.forEach(value =>
|
|
137
|
+
this._validateValueByPropertyType(
|
|
143
138
|
modelName,
|
|
144
139
|
propName,
|
|
145
140
|
propDef,
|
|
@@ -147,29 +142,28 @@ export class ModelDataValidator extends Service {
|
|
|
147
142
|
true,
|
|
148
143
|
),
|
|
149
144
|
);
|
|
150
|
-
await Promise.all(arrayItemsValidationPromises);
|
|
151
145
|
break;
|
|
152
146
|
// OBJECT
|
|
153
147
|
case DataType.OBJECT:
|
|
154
148
|
if (!isPureObject(propValue)) throw createError('an Object');
|
|
155
149
|
if (typeof propDef === 'object' && propDef.model)
|
|
156
|
-
|
|
150
|
+
this.validate(propDef.model, propValue);
|
|
157
151
|
break;
|
|
158
152
|
}
|
|
159
153
|
}
|
|
160
154
|
|
|
161
155
|
/**
|
|
162
|
-
* Validate by property validators.
|
|
156
|
+
* Validate value by property validators.
|
|
163
157
|
*
|
|
164
158
|
* @param {string} modelName
|
|
165
159
|
* @param {string} propName
|
|
166
160
|
* @param {string|object} propDef
|
|
167
161
|
* @param {*} propValue
|
|
168
|
-
* @returns {
|
|
162
|
+
* @returns {undefined}
|
|
169
163
|
*/
|
|
170
|
-
|
|
164
|
+
_validateValueByPropertyValidators(modelName, propName, propDef, propValue) {
|
|
171
165
|
if (typeof propDef === 'string' || propDef.validate == null) return;
|
|
172
|
-
const
|
|
166
|
+
const validateDef = propDef.validate;
|
|
173
167
|
const propertyValidatorRegistry = this.getService(
|
|
174
168
|
PropertyValidatorRegistry,
|
|
175
169
|
);
|
|
@@ -182,30 +176,31 @@ export class ModelDataValidator extends Service {
|
|
|
182
176
|
propValue,
|
|
183
177
|
validatorName,
|
|
184
178
|
);
|
|
185
|
-
const
|
|
186
|
-
const validateBy = async (validatorName, validatorOptions = undefined) => {
|
|
179
|
+
const validateBy = (validatorName, validatorOptions = undefined) => {
|
|
187
180
|
const validator = propertyValidatorRegistry.getValidator(validatorName);
|
|
188
|
-
const context = {validatorName, modelName, propName
|
|
189
|
-
const valid =
|
|
190
|
-
if (valid
|
|
181
|
+
const context = {validatorName, modelName, propName};
|
|
182
|
+
const valid = validator(propValue, validatorOptions, context);
|
|
183
|
+
if (valid instanceof Promise) {
|
|
184
|
+
throw new InvalidArgumentError(
|
|
185
|
+
'Asynchronous property validators are not supported, ' +
|
|
186
|
+
'but the property validator %v returns a Promise.',
|
|
187
|
+
validatorName,
|
|
188
|
+
);
|
|
189
|
+
} else if (valid !== true) {
|
|
190
|
+
throw createError(validatorName);
|
|
191
|
+
}
|
|
191
192
|
};
|
|
192
|
-
if (
|
|
193
|
-
|
|
194
|
-
} else if (Array.isArray(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
Object.keys(options).forEach(validatorName => {
|
|
202
|
-
if (Object.prototype.hasOwnProperty.call(options, validatorName)) {
|
|
203
|
-
const validatorOptions = options[validatorName];
|
|
204
|
-
const validationPromise = validateBy(validatorName, validatorOptions);
|
|
205
|
-
validationPromises.push(validationPromise);
|
|
193
|
+
if (validateDef && typeof validateDef === 'string') {
|
|
194
|
+
validateBy(validateDef);
|
|
195
|
+
} else if (Array.isArray(validateDef)) {
|
|
196
|
+
validateDef.forEach(validatorName => validateBy(validatorName));
|
|
197
|
+
} else if (validateDef !== null && typeof validateDef === 'object') {
|
|
198
|
+
Object.keys(validateDef).forEach(validatorName => {
|
|
199
|
+
if (Object.prototype.hasOwnProperty.call(validateDef, validatorName)) {
|
|
200
|
+
const validatorOptions = validateDef[validatorName];
|
|
201
|
+
validateBy(validatorName, validatorOptions);
|
|
206
202
|
}
|
|
207
203
|
});
|
|
208
|
-
await Promise.all(validationPromises);
|
|
209
204
|
} else {
|
|
210
205
|
throw new InvalidArgumentError(
|
|
211
206
|
'The provided option "validate" of the property %v in the model %v ' +
|
|
@@ -213,7 +208,7 @@ export class ModelDataValidator extends Service {
|
|
|
213
208
|
'but %v given.',
|
|
214
209
|
propName,
|
|
215
210
|
modelName,
|
|
216
|
-
|
|
211
|
+
validateDef,
|
|
217
212
|
);
|
|
218
213
|
}
|
|
219
214
|
}
|