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