validno 0.2.6 → 0.3.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/dist/Schema.js +6 -5
- package/dist/ValidnoResult.js +12 -7
- package/dist/checkType.js +1 -0
- package/dist/constants/details.js +11 -11
- package/dist/constants/schema.js +10 -10
- package/dist/dev.js +67 -27
- package/dist/engine/ValidateEngine.js +44 -0
- package/dist/engine/ValidnoResult.js +102 -0
- package/dist/engine/index.js +2 -0
- package/dist/engine/methods/finishValidation.js +15 -0
- package/dist/engine/methods/handleKey.js +41 -0
- package/dist/engine/methods/handleMissingKey.js +19 -0
- package/dist/engine/methods/handleMissingKeyValidation.js +9 -0
- package/dist/engine/methods/handleNestedKey.js +19 -0
- package/dist/engine/methods/validate.js +14 -0
- package/dist/engine/methods/validateRules.js +172 -0
- package/dist/engine/methods/validateType.js +134 -0
- package/dist/types/common.js +1 -0
- package/dist/utils/errors.js +30 -21
- package/dist/utils/helpers.js +55 -57
- package/dist/utils/validateType.js +9 -8
- package/dist/utils/validations.js +157 -153
- package/dist/validate/index.js +1 -0
- package/dist/validate/validate.js +151 -0
- package/dist/validate.js +136 -127
- package/dist/validateEngine/ValidateEngine.js +44 -0
- package/dist/validateEngine/index.js +2 -0
- package/dist/validateEngine/methods/ValidateEngine.js +139 -0
- package/dist/validateEngine/methods/checkRulesForKey.js +15 -0
- package/dist/validateEngine/methods/checkValueType.js +134 -0
- package/dist/validateEngine/methods/finalizeValidation.js +15 -0
- package/dist/validateEngine/methods/finishValidation.js +15 -0
- package/dist/validateEngine/methods/handleKey.js +43 -0
- package/dist/validateEngine/methods/handleMissingKey.js +19 -0
- package/dist/validateEngine/methods/handleMissingKeyValidation.js +9 -0
- package/dist/validateEngine/methods/handleNestedKey.js +19 -0
- package/dist/validateEngine/methods/validate.js +14 -0
- package/dist/validateEngine/methods/validateKey.js +31 -0
- package/dist/validateEngine/methods/validateKeyDetails.js +13 -0
- package/dist/validateEngine/methods/validateKeyValue.js +13 -0
- package/dist/validateEngine/methods/validateNestedKey.js +19 -0
- package/dist/validateEngine/methods/validateType.js +134 -0
- package/dist/validateEngine/validate.js +14 -0
- package/dist/validateSchema/ValidateEngine.js +147 -0
- package/dist/validateSchema/index.js +6 -0
- package/dist/validateSchema/validate.js +151 -0
- package/dist/validateSchema.js +6 -0
- package/dist/validateType.js +4 -4
- package/package.json +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import validateType from "../validateType.js";
|
|
2
|
+
import validateRules from "../validateRules.js";
|
|
3
|
+
import { ValidationIds } from "../constants/details.js";
|
|
4
|
+
import ValidnoResult from "../ValidnoResult.js";
|
|
5
|
+
import _errors from "../utils/errors.js";
|
|
6
|
+
import _helpers from "../utils/helpers.js";
|
|
7
|
+
class ValidateEngine {
|
|
8
|
+
constructor(definition) {
|
|
9
|
+
this.definition = definition;
|
|
10
|
+
this.result = new ValidnoResult();
|
|
11
|
+
}
|
|
12
|
+
validate(data, validationKeys) {
|
|
13
|
+
const hasKeysToCheck = _helpers.areKeysLimited(validationKeys);
|
|
14
|
+
const schemaKeys = Object.entries(this.definition);
|
|
15
|
+
for (const [key, reqs] of schemaKeys) {
|
|
16
|
+
const toBeValidated = _helpers.needValidation(key, hasKeysToCheck, validationKeys);
|
|
17
|
+
if (!toBeValidated)
|
|
18
|
+
continue;
|
|
19
|
+
const keyResult = this.validateKey({ key, data, reqs });
|
|
20
|
+
this.result.merge(keyResult);
|
|
21
|
+
}
|
|
22
|
+
return this.result.finish();
|
|
23
|
+
}
|
|
24
|
+
handleMissingKey(schema, input) {
|
|
25
|
+
const { key, nestedKey, data, reqs } = input;
|
|
26
|
+
const messageKey = nestedKey || key;
|
|
27
|
+
const messageTitle = reqs.title || messageKey;
|
|
28
|
+
if (!reqs.customMessage) {
|
|
29
|
+
return _errors.getMissingError(messageKey);
|
|
30
|
+
}
|
|
31
|
+
const errorMessage = reqs.customMessage({
|
|
32
|
+
keyword: ValidationIds.Missing,
|
|
33
|
+
value: data[key],
|
|
34
|
+
key: messageKey,
|
|
35
|
+
title: messageTitle,
|
|
36
|
+
reqs,
|
|
37
|
+
schema,
|
|
38
|
+
});
|
|
39
|
+
return errorMessage;
|
|
40
|
+
}
|
|
41
|
+
validateNestedKey(input) {
|
|
42
|
+
const { results, key, nestedKey, data, reqs } = input;
|
|
43
|
+
const nestedKeys = Object.keys(reqs);
|
|
44
|
+
const nestedResults = [];
|
|
45
|
+
for (const itemKey of nestedKeys) {
|
|
46
|
+
const deepParams = {
|
|
47
|
+
key: itemKey,
|
|
48
|
+
data: data[key],
|
|
49
|
+
reqs: reqs[itemKey],
|
|
50
|
+
nestedKey: `${nestedKey}.${itemKey}`
|
|
51
|
+
};
|
|
52
|
+
const deepResults = this.validateKey(deepParams);
|
|
53
|
+
nestedResults.push(deepResults.ok);
|
|
54
|
+
results.merge(deepResults);
|
|
55
|
+
}
|
|
56
|
+
results.fixParentByChilds(nestedKey, nestedResults);
|
|
57
|
+
return results;
|
|
58
|
+
}
|
|
59
|
+
validateKey(input) {
|
|
60
|
+
let { results, key, nestedKey, data, reqs } = input;
|
|
61
|
+
if (data === undefined) {
|
|
62
|
+
const noDataResult = new ValidnoResult();
|
|
63
|
+
noDataResult.setNoData();
|
|
64
|
+
noDataResult.finish();
|
|
65
|
+
return noDataResult;
|
|
66
|
+
}
|
|
67
|
+
if (!results)
|
|
68
|
+
results = new ValidnoResult();
|
|
69
|
+
if (!nestedKey)
|
|
70
|
+
nestedKey = key;
|
|
71
|
+
const hasMissing = _helpers.hasMissing(input);
|
|
72
|
+
if (_helpers.checkNestedIsMissing(reqs, data)) {
|
|
73
|
+
return this.handleMissingNestedKey(results, nestedKey);
|
|
74
|
+
}
|
|
75
|
+
if (_helpers.checkIsNested(reqs)) {
|
|
76
|
+
return this.validateNestedKey({ results, key, data, reqs, nestedKey });
|
|
77
|
+
}
|
|
78
|
+
return this.validateKeyDetails({
|
|
79
|
+
results,
|
|
80
|
+
key,
|
|
81
|
+
nestedKey,
|
|
82
|
+
data,
|
|
83
|
+
reqs,
|
|
84
|
+
hasMissing,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
handleMissingNestedKey(results, nestedKey) {
|
|
88
|
+
results.setMissing(nestedKey);
|
|
89
|
+
return results;
|
|
90
|
+
}
|
|
91
|
+
validateKeyDetails(params) {
|
|
92
|
+
const { results, key, nestedKey, data, reqs, hasMissing } = params;
|
|
93
|
+
const missedCheck = [];
|
|
94
|
+
const typeChecked = [];
|
|
95
|
+
const rulesChecked = [];
|
|
96
|
+
if (hasMissing) {
|
|
97
|
+
return this.handleMissingKeyValidation({ results, key, nestedKey, data, reqs }, missedCheck);
|
|
98
|
+
}
|
|
99
|
+
this.checkValueType(results, key, data[key], reqs, nestedKey, typeChecked);
|
|
100
|
+
this.checkRulesForKey(results, nestedKey, data[key], reqs, data, rulesChecked);
|
|
101
|
+
return this.finalizeValidation({ results, nestedKey, missedCheck, typeChecked, rulesChecked });
|
|
102
|
+
}
|
|
103
|
+
handleMissingKeyValidation(params, missedCheck) {
|
|
104
|
+
const schema = this.definition;
|
|
105
|
+
const { results, key, nestedKey, data, reqs } = params;
|
|
106
|
+
const errMsg = this.handleMissingKey(schema, { key, nestedKey, data, reqs });
|
|
107
|
+
missedCheck.push(false);
|
|
108
|
+
results.setMissing(nestedKey, errMsg);
|
|
109
|
+
return results;
|
|
110
|
+
}
|
|
111
|
+
checkValueType(results, key, value, reqs, nestedKey, typeChecked) {
|
|
112
|
+
const typeCheck = validateType(key, value, reqs, nestedKey);
|
|
113
|
+
typeCheck.forEach((res) => {
|
|
114
|
+
if (!res.passed) {
|
|
115
|
+
typeChecked.push(false);
|
|
116
|
+
results.errors.push(res.details || '');
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
checkRulesForKey(results, nestedKey, value, reqs, data, rulesChecked) {
|
|
121
|
+
const ruleCheck = validateRules.call(this, nestedKey, value, reqs, data);
|
|
122
|
+
if (!ruleCheck.ok) {
|
|
123
|
+
rulesChecked.push(false);
|
|
124
|
+
ruleCheck.details.forEach((el) => {
|
|
125
|
+
if (!(nestedKey in results.errorsByKeys))
|
|
126
|
+
results.errorsByKeys[nestedKey] = [];
|
|
127
|
+
results.errors.push(el);
|
|
128
|
+
results.errorsByKeys[nestedKey] = ['1'];
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
finalizeValidation(checks) {
|
|
133
|
+
const { results, nestedKey, missedCheck, typeChecked, rulesChecked } = checks;
|
|
134
|
+
if (missedCheck.length)
|
|
135
|
+
results.setMissing(nestedKey);
|
|
136
|
+
const isPassed = !typeChecked.length && !rulesChecked.length && !missedCheck.length;
|
|
137
|
+
if (!isPassed) {
|
|
138
|
+
results.setFailed(nestedKey);
|
|
139
|
+
results.errorsByKeys[nestedKey] = [...results.errors];
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
results.setPassed(nestedKey);
|
|
143
|
+
}
|
|
144
|
+
return results.finish();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const validateSchema = (schemaDef, data, keysToValidate) => {
|
|
148
|
+
const engine = new ValidateEngine(schemaDef);
|
|
149
|
+
return engine.validate(data, keysToValidate);
|
|
150
|
+
};
|
|
151
|
+
export default validateSchema;
|
package/dist/validateType.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ValidationDetails, ValidationIds } from "./constants/details.js";
|
|
2
2
|
import _validations from "./utils/validations.js";
|
|
3
3
|
import _errors from "./utils/errors.js";
|
|
4
4
|
import _validateType from "./utils/validateType.js";
|
|
@@ -34,7 +34,7 @@ const validateType = (key, value, requirements, keyName = key) => {
|
|
|
34
34
|
}
|
|
35
35
|
const customErrDetails = hasCustomMessage ?
|
|
36
36
|
requirements.customMessage({
|
|
37
|
-
keyword:
|
|
37
|
+
keyword: ValidationIds.Type,
|
|
38
38
|
value: value,
|
|
39
39
|
key: keyName,
|
|
40
40
|
title: keyTitle,
|
|
@@ -44,7 +44,7 @@ const validateType = (key, value, requirements, keyName = key) => {
|
|
|
44
44
|
null;
|
|
45
45
|
const baseErrDetails = _errors.getErrorDetails(keyName, requirements.type, value);
|
|
46
46
|
const getDetails = (isOK, errorText) => isOK ?
|
|
47
|
-
|
|
47
|
+
ValidationDetails.OK :
|
|
48
48
|
errorText || customErrDetails || baseErrDetails;
|
|
49
49
|
const typeBySchema = requirements.type;
|
|
50
50
|
const result = [];
|
|
@@ -67,7 +67,7 @@ const validateType = (key, value, requirements, keyName = key) => {
|
|
|
67
67
|
const isDate = isNotNull && value.constructor === Date;
|
|
68
68
|
const isValid = isDate && !isNaN(value.getTime());
|
|
69
69
|
const isValidDate = isDate && isValid;
|
|
70
|
-
result.push(_validateType.getResult(keyName, isValidDate, getDetails(isValidDate,
|
|
70
|
+
result.push(_validateType.getResult(keyName, isValidDate, getDetails(isValidDate, ValidationDetails.INVALID_DATE)));
|
|
71
71
|
break;
|
|
72
72
|
}
|
|
73
73
|
case Boolean: {
|