@e22m4u/js-repository 0.4.0 → 0.5.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 +479 -61
- package/dist/cjs/index.cjs +319 -270
- package/package.json +1 -1
- package/src/adapter/adapter-loader.js +1 -1
- package/src/adapter/adapter-loader.spec.js +1 -1
- package/src/adapter/decorator/data-sanitizing-decorator.js +1 -1
- package/src/adapter/decorator/data-transformation-decorator.js +1 -1
- package/src/adapter/decorator/data-validation-decorator.js +1 -1
- package/src/adapter/decorator/default-values-decorator.js +1 -1
- package/src/adapter/decorator/fields-filtering-decorator.js +1 -1
- package/src/adapter/decorator/inclusion-decorator.js +1 -1
- package/src/adapter/decorator/property-uniqueness-decorator.js +1 -1
- package/src/definition/datasource/datasource-definition-validator.js +3 -3
- package/src/definition/datasource/datasource-definition-validator.spec.js +3 -3
- package/src/definition/model/model-data-sanitizer.js +2 -2
- package/src/definition/model/model-data-transformer.js +71 -13
- package/src/definition/model/model-data-transformer.spec.js +2073 -407
- package/src/definition/model/model-data-validator.js +125 -37
- package/src/definition/model/model-data-validator.spec.js +2138 -440
- package/src/definition/model/model-definition-utils.js +5 -5
- package/src/definition/model/model-definition-utils.spec.js +7 -7
- package/src/definition/model/model-definition-validator.js +7 -7
- package/src/definition/model/model-definition-validator.spec.js +10 -7
- package/src/definition/model/properties/properties-definition-validator.js +129 -54
- package/src/definition/model/properties/properties-definition-validator.spec.js +85 -25
- package/src/definition/model/properties/property-transformer/builtin/index.d.ts +0 -1
- package/src/definition/model/properties/property-transformer/builtin/index.js +0 -1
- package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.d.ts +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.spec.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.d.ts +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.spec.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/trim-transformer.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/trim-transformer.spec.js +1 -1
- package/src/definition/model/properties/property-transformer/property-transformer-registry.js +2 -4
- package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +2 -4
- package/src/definition/model/properties/property-transformer/property-transformer.d.ts +2 -2
- package/src/definition/model/properties/property-uniqueness-validator.js +4 -4
- package/src/definition/model/properties/property-uniqueness-validator.spec.js +4 -4
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.d.ts +1 -1
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.spec.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.d.ts +1 -1
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.spec.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.d.ts +1 -1
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.spec.js +2 -2
- package/src/definition/model/properties/property-validator/property-validator-registry.js +2 -2
- package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +2 -2
- package/src/definition/model/properties/property-validator/property-validator.d.ts +2 -2
- package/src/definition/model/relations/relations-definition-validator.js +23 -23
- package/src/definition/model/relations/relations-definition-validator.spec.js +24 -24
- package/src/errors/invalid-operator-value-error.js +1 -1
- package/src/errors/invalid-operator-value-error.spec.js +1 -1
- package/src/filter/fields-clause-tool.js +5 -5
- package/src/filter/fields-clause-tool.spec.js +16 -16
- package/src/filter/include-clause-tool.js +6 -6
- package/src/filter/include-clause-tool.spec.js +2 -2
- package/src/filter/operator-clause-tool.js +13 -13
- package/src/filter/operator-clause-tool.spec.js +13 -13
- package/src/filter/order-clause-tool.js +3 -3
- package/src/filter/order-clause-tool.spec.js +4 -4
- package/src/filter/slice-clause-tool.js +5 -5
- package/src/filter/slice-clause-tool.spec.js +5 -5
- package/src/filter/where-clause-tool.js +4 -4
- package/src/filter/where-clause-tool.spec.js +3 -3
- package/src/relations/belongs-to-resolver.js +14 -14
- package/src/relations/belongs-to-resolver.spec.js +14 -14
- package/src/relations/has-many-resolver.js +22 -22
- package/src/relations/has-many-resolver.spec.js +23 -23
- package/src/relations/has-one-resolver.js +22 -22
- package/src/relations/has-one-resolver.spec.js +23 -23
- package/src/relations/references-many-resolver.js +7 -7
- package/src/relations/references-many-resolver.spec.js +7 -7
- package/src/repository/repository-registry.js +1 -1
- package/src/utils/exclude-object-keys.js +1 -1
- package/src/utils/exclude-object-keys.spec.js +1 -1
- package/src/utils/model-name-to-model-key.js +1 -1
- package/src/utils/model-name-to-model-key.spec.js +7 -7
- package/src/utils/select-object-keys.js +3 -3
- package/src/utils/select-object-keys.spec.js +3 -3
- package/src/definition/model/properties/property-transformer/builtin/to-title-case-transformer.d.ts +0 -6
- package/src/definition/model/properties/property-transformer/builtin/to-title-case-transformer.js +0 -22
- package/src/definition/model/properties/property-transformer/builtin/to-title-case-transformer.spec.js +0 -41
|
@@ -22,7 +22,7 @@ export class ModelDataValidator extends Service {
|
|
|
22
22
|
validate(modelName, modelData, isPartial = false) {
|
|
23
23
|
if (!isPureObject(modelData))
|
|
24
24
|
throw new InvalidArgumentError(
|
|
25
|
-
'The data of the model %v should be an Object, but %v given.',
|
|
25
|
+
'The data of the model %v should be an Object, but %v was given.',
|
|
26
26
|
modelName,
|
|
27
27
|
modelData,
|
|
28
28
|
);
|
|
@@ -70,22 +70,21 @@ export class ModelDataValidator extends Service {
|
|
|
70
70
|
// a required property should
|
|
71
71
|
// not have an empty value
|
|
72
72
|
throw new InvalidArgumentError(
|
|
73
|
-
'The property %v of the model %v is required, but %v given.',
|
|
73
|
+
'The property %v of the model %v is required, but %v was given.',
|
|
74
74
|
propName,
|
|
75
75
|
modelName,
|
|
76
76
|
propValue,
|
|
77
77
|
);
|
|
78
78
|
}
|
|
79
|
-
//
|
|
80
|
-
|
|
79
|
+
// проверка соответствия типа значения
|
|
80
|
+
this._validateValueByPropertyType(modelName, propName, propDef, propValue);
|
|
81
|
+
// проверка значения валидаторами
|
|
81
82
|
this._validateValueByPropertyValidators(
|
|
82
83
|
modelName,
|
|
83
84
|
propName,
|
|
84
85
|
propDef,
|
|
85
86
|
propValue,
|
|
86
87
|
);
|
|
87
|
-
// type checking of the property value
|
|
88
|
-
this._validateValueByPropertyType(modelName, propName, propDef, propValue);
|
|
89
88
|
}
|
|
90
89
|
|
|
91
90
|
/**
|
|
@@ -118,8 +117,8 @@ export class ModelDataValidator extends Service {
|
|
|
118
117
|
|
|
119
118
|
const createError = expected => {
|
|
120
119
|
const pattern = isArrayValue
|
|
121
|
-
? 'The array property %v of the model %v must have %s element, but %s given.'
|
|
122
|
-
: 'The property %v of the model %v must have %s, but %s given.';
|
|
120
|
+
? 'The array property %v of the model %v must have %s element, but %s was given.'
|
|
121
|
+
: 'The property %v of the model %v must have %s, but %s was given.';
|
|
123
122
|
const ctorName = getCtorName(propValue);
|
|
124
123
|
const givenStr = ctorName ?? typeof propValue;
|
|
125
124
|
return new InvalidArgumentError(
|
|
@@ -182,45 +181,134 @@ export class ModelDataValidator extends Service {
|
|
|
182
181
|
if (typeof propDef === 'string' || propDef.validate == null) return;
|
|
183
182
|
const validateDef = propDef.validate;
|
|
184
183
|
const validatorRegistry = this.getService(PropertyValidatorRegistry);
|
|
185
|
-
const createError = validatorName =>
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
'
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
);
|
|
194
|
-
const validateBy = (validatorName, validatorOptions = undefined) => {
|
|
195
|
-
const validator = validatorRegistry.getValidator(validatorName);
|
|
196
|
-
const context = {validatorName, modelName, propName};
|
|
197
|
-
const valid = validator(propValue, validatorOptions, context);
|
|
198
|
-
if (valid instanceof Promise) {
|
|
199
|
-
throw new InvalidArgumentError(
|
|
200
|
-
'Asynchronous property validators are not supported, ' +
|
|
201
|
-
'but the property validator %v returns a Promise.',
|
|
184
|
+
const createError = validatorName => {
|
|
185
|
+
if (validatorName) {
|
|
186
|
+
return new InvalidArgumentError(
|
|
187
|
+
'The property %v of the model %v has the invalid value %v ' +
|
|
188
|
+
'that caught by the property validator %v.',
|
|
189
|
+
propName,
|
|
190
|
+
modelName,
|
|
191
|
+
propValue,
|
|
202
192
|
validatorName,
|
|
203
193
|
);
|
|
204
|
-
} else
|
|
194
|
+
} else {
|
|
195
|
+
return new InvalidArgumentError(
|
|
196
|
+
'The property %v of the model %v has the invalid value %v ' +
|
|
197
|
+
'that caught by a property validator.',
|
|
198
|
+
propName,
|
|
199
|
+
modelName,
|
|
200
|
+
propValue,
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
// объявление функции для проверки значения
|
|
205
|
+
// с помощью указанного валидатора
|
|
206
|
+
const validateBy = (validatorOrName, validatorOptions = undefined) => {
|
|
207
|
+
let validatorName, validatorFn;
|
|
208
|
+
// если первый аргумент является строкой, то строка
|
|
209
|
+
// воспринимается как название зарегистрированного
|
|
210
|
+
// валидатора
|
|
211
|
+
if (typeof validatorOrName === 'string') {
|
|
212
|
+
validatorName = validatorOrName;
|
|
213
|
+
validatorFn = validatorRegistry.getValidator(validatorName);
|
|
214
|
+
}
|
|
215
|
+
// если первый аргумент является функцией,
|
|
216
|
+
// то функция воспринимается как валидатор
|
|
217
|
+
else if (typeof validatorOrName === 'function') {
|
|
218
|
+
validatorName =
|
|
219
|
+
validatorOrName.name && validatorOrName.name !== 'validate'
|
|
220
|
+
? validatorOrName.name
|
|
221
|
+
: undefined;
|
|
222
|
+
validatorFn = validatorOrName;
|
|
223
|
+
}
|
|
224
|
+
// если первый аргумент не является строкой
|
|
225
|
+
// и функцией, то выбрасывается ошибка
|
|
226
|
+
else {
|
|
227
|
+
throw new InvalidArgumentError(
|
|
228
|
+
'Validator must be a non-empty String or ' +
|
|
229
|
+
'a Function, but %v was given.',
|
|
230
|
+
validatorOrName,
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
const context = {validatorName, modelName, propName};
|
|
234
|
+
const valid = validatorFn(propValue, validatorOptions, context);
|
|
235
|
+
// если валидатор возвращает Promise,
|
|
236
|
+
// то выбрасывается ошибка
|
|
237
|
+
if (valid instanceof Promise) {
|
|
238
|
+
if (validatorName) {
|
|
239
|
+
throw new InvalidArgumentError(
|
|
240
|
+
'Asynchronous property validators are not supported, ' +
|
|
241
|
+
'but the property %v of the model %v has the property ' +
|
|
242
|
+
'validator %v that returns a Promise.',
|
|
243
|
+
propName,
|
|
244
|
+
modelName,
|
|
245
|
+
validatorName,
|
|
246
|
+
);
|
|
247
|
+
} else {
|
|
248
|
+
throw new InvalidArgumentError(
|
|
249
|
+
'Asynchronous property validators are not supported, ' +
|
|
250
|
+
'but the property %v of the model %v has a property ' +
|
|
251
|
+
'validator that returns a Promise.',
|
|
252
|
+
propName,
|
|
253
|
+
modelName,
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// если валидатор вернул значение отличное
|
|
258
|
+
// от true, то выбрасывается ошибка
|
|
259
|
+
else if (valid !== true) {
|
|
205
260
|
throw createError(validatorName);
|
|
206
261
|
}
|
|
207
262
|
};
|
|
263
|
+
// если значением опции "validate" является строка,
|
|
264
|
+
// то строка воспринимается как название валидатора
|
|
208
265
|
if (validateDef && typeof validateDef === 'string') {
|
|
209
266
|
validateBy(validateDef);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
267
|
+
}
|
|
268
|
+
// если значение опции "validate" является функция,
|
|
269
|
+
// то функция воспринимается как валидатор
|
|
270
|
+
else if (validateDef && typeof validateDef === 'function') {
|
|
271
|
+
validateBy(validateDef);
|
|
272
|
+
}
|
|
273
|
+
// если значение опции "validate" является массив, то каждый
|
|
274
|
+
// элемент массива воспринимается как название валидатора
|
|
275
|
+
// или функция-валидатор
|
|
276
|
+
else if (Array.isArray(validateDef)) {
|
|
277
|
+
validateDef.forEach(validatorOrName => {
|
|
278
|
+
if (
|
|
279
|
+
!validatorOrName ||
|
|
280
|
+
(typeof validatorOrName !== 'string' &&
|
|
281
|
+
typeof validatorOrName !== 'function')
|
|
282
|
+
) {
|
|
283
|
+
throw new InvalidArgumentError(
|
|
284
|
+
'The provided option "validate" for the property %v in the model %v ' +
|
|
285
|
+
'has an Array value that should contain validator names or validator ' +
|
|
286
|
+
'functions, but %v was given.',
|
|
287
|
+
propName,
|
|
288
|
+
modelName,
|
|
289
|
+
validatorOrName,
|
|
290
|
+
);
|
|
217
291
|
}
|
|
292
|
+
validateBy(validatorOrName);
|
|
218
293
|
});
|
|
219
|
-
}
|
|
294
|
+
}
|
|
295
|
+
// если значение опции "validate" является объектом,
|
|
296
|
+
// то ключи объекта воспринимаются как названия валидаторов,
|
|
297
|
+
// а их значения аргументами
|
|
298
|
+
else if (validateDef !== null && typeof validateDef === 'object') {
|
|
299
|
+
Object.keys(validateDef).forEach(validatorName => {
|
|
300
|
+
const validatorOptions = validateDef[validatorName];
|
|
301
|
+
validateBy(validatorName, validatorOptions);
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
// если значение опции "validate" не является строкой,
|
|
305
|
+
// функцией и массивом, то выбрасывается ошибка
|
|
306
|
+
else {
|
|
220
307
|
throw new InvalidArgumentError(
|
|
221
|
-
'The provided option "validate"
|
|
222
|
-
'should be a
|
|
223
|
-
'
|
|
308
|
+
'The provided option "validate" for the property %v in the model %v ' +
|
|
309
|
+
'should be either a validator name, a validator function, an array ' +
|
|
310
|
+
'of validator names or functions, or an object mapping validator ' +
|
|
311
|
+
'names to their arguments, but %v was given.',
|
|
224
312
|
propName,
|
|
225
313
|
modelName,
|
|
226
314
|
validateDef,
|