validno 0.2.1 → 0.2.2
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/ValidnoResult.js +61 -0
- package/dist/utils/helpers.js +48 -0
- package/dist/utils/nested.js +1 -0
- package/dist/validate.js +66 -113
- package/package.json +1 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import _errors from "./utils/errors.js";
|
|
2
|
+
class ValidnoResult {
|
|
3
|
+
constructor(results) {
|
|
4
|
+
this.ok = (results === null || results === void 0 ? void 0 : results.ok) !== undefined ? results.ok : null;
|
|
5
|
+
this.missed = (results === null || results === void 0 ? void 0 : results.missed) || [];
|
|
6
|
+
this.failed = (results === null || results === void 0 ? void 0 : results.failed) || [];
|
|
7
|
+
this.passed = (results === null || results === void 0 ? void 0 : results.passed) || [];
|
|
8
|
+
this.errors = (results === null || results === void 0 ? void 0 : results.errors) || [];
|
|
9
|
+
this.byKeys = (results === null || results === void 0 ? void 0 : results.byKeys) || {};
|
|
10
|
+
this.errorsByKeys = (results === null || results === void 0 ? void 0 : results.errorsByKeys) || {};
|
|
11
|
+
this.byKeys = (results === null || results === void 0 ? void 0 : results.byKeys) || {};
|
|
12
|
+
}
|
|
13
|
+
fixByKey(key, result) {
|
|
14
|
+
this.byKeys[key] = result;
|
|
15
|
+
if (result === true)
|
|
16
|
+
this.passed.push(key);
|
|
17
|
+
else
|
|
18
|
+
this.failed.push(key);
|
|
19
|
+
}
|
|
20
|
+
pushMissing(key, errMsg) {
|
|
21
|
+
this.missed.push(key);
|
|
22
|
+
this.fixByKey(key, false);
|
|
23
|
+
const error = errMsg || _errors.getMissingError(key);
|
|
24
|
+
this.pushError(key, error);
|
|
25
|
+
}
|
|
26
|
+
pushError(key, msg) {
|
|
27
|
+
if (key in this.errorsByKeys === false) {
|
|
28
|
+
this.errorsByKeys[key] = [];
|
|
29
|
+
}
|
|
30
|
+
this.byKeys[key] = false;
|
|
31
|
+
this.errors.push(msg);
|
|
32
|
+
this.errorsByKeys[key].push(msg);
|
|
33
|
+
}
|
|
34
|
+
joinErrors(separator = '; ') {
|
|
35
|
+
return _errors.joinErrors(this.errors, separator);
|
|
36
|
+
}
|
|
37
|
+
merge(resultsNew) {
|
|
38
|
+
this.failed = [...this.failed, ...resultsNew.failed];
|
|
39
|
+
this.errors = [...this.errors, ...resultsNew.errors];
|
|
40
|
+
this.missed = [...this.missed, ...resultsNew.missed];
|
|
41
|
+
this.passed = [...this.passed, ...resultsNew.passed];
|
|
42
|
+
this.byKeys = Object.assign(Object.assign({}, this.byKeys), resultsNew.byKeys);
|
|
43
|
+
for (const key in resultsNew.errorsByKeys) {
|
|
44
|
+
if (key in this.errorsByKeys === false)
|
|
45
|
+
this.errorsByKeys[key] = [];
|
|
46
|
+
this.errorsByKeys[key] = [
|
|
47
|
+
...this.errorsByKeys[key],
|
|
48
|
+
...resultsNew.errorsByKeys[key]
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
finish() {
|
|
54
|
+
if (this.failed.length)
|
|
55
|
+
this.ok = false;
|
|
56
|
+
else
|
|
57
|
+
this.ok = true;
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export default ValidnoResult;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { defaultSchemaKeys } from "../Schema.js";
|
|
2
|
+
import ValidnoResult from "../ValidnoResult.js";
|
|
3
|
+
import _validations from "./validations.js";
|
|
4
|
+
const _helpers = {};
|
|
5
|
+
_helpers.checkIsNested = (obj) => {
|
|
6
|
+
if (!_validations.isObject(obj))
|
|
7
|
+
return false;
|
|
8
|
+
const objKeys = Object.keys(obj);
|
|
9
|
+
if (objKeys.every((k) => defaultSchemaKeys.includes(k))) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
_helpers.mergeResults = (resultsOld, resultsNew) => {
|
|
17
|
+
const output = new ValidnoResult();
|
|
18
|
+
output.failed = [...resultsOld.failed, ...resultsNew.failed];
|
|
19
|
+
output.errors = [...resultsOld.errors, ...resultsNew.errors];
|
|
20
|
+
output.missed = [...resultsOld.missed, ...resultsNew.missed];
|
|
21
|
+
output.passed = [...resultsOld.passed, ...resultsNew.passed];
|
|
22
|
+
output.byKeys = Object.assign(Object.assign({}, resultsOld.byKeys), resultsNew.byKeys);
|
|
23
|
+
output.errorsByKeys = Object.assign(Object.assign({}, resultsOld.errorsByKeys), resultsNew.errorsByKeys);
|
|
24
|
+
return output;
|
|
25
|
+
};
|
|
26
|
+
_helpers.checkNestedIsMissing = (reqs, data) => {
|
|
27
|
+
const isRequired = reqs.required;
|
|
28
|
+
const isUndef = data === undefined;
|
|
29
|
+
const isEmpty = _validations.isObject(data) && !Object.keys(data).length;
|
|
30
|
+
return isRequired && (isUndef || isEmpty);
|
|
31
|
+
};
|
|
32
|
+
_helpers.areKeysLimited = (onlyKeys) => {
|
|
33
|
+
const hasArrayOfKeys = (Array.isArray(onlyKeys) && onlyKeys.length > 0);
|
|
34
|
+
const hasStringKey = (typeof onlyKeys === 'string' && onlyKeys.length > 0);
|
|
35
|
+
return hasArrayOfKeys || hasStringKey;
|
|
36
|
+
};
|
|
37
|
+
_helpers.needValidation = (key, hasLimits, onlyKeys) => {
|
|
38
|
+
const noLimits = !hasLimits;
|
|
39
|
+
const keyIsInList = (key === onlyKeys || Array.isArray(onlyKeys) && (onlyKeys === null || onlyKeys === void 0 ? void 0 : onlyKeys.includes(key)));
|
|
40
|
+
return noLimits || keyIsInList;
|
|
41
|
+
};
|
|
42
|
+
_helpers.hasMissing = (input) => {
|
|
43
|
+
const { reqs, data, key } = input;
|
|
44
|
+
const isRequired = reqs.required === true;
|
|
45
|
+
const missingData = (data === undefined || key in data === false || data[key] === undefined);
|
|
46
|
+
return isRequired && missingData;
|
|
47
|
+
};
|
|
48
|
+
export default _helpers;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
package/dist/validate.js
CHANGED
|
@@ -1,89 +1,67 @@
|
|
|
1
1
|
import checkType from "./checkType.js";
|
|
2
2
|
import _errors from "./utils/errors.js";
|
|
3
3
|
import checkRules from "./checkRules.js";
|
|
4
|
-
import
|
|
4
|
+
import _helpers from "./utils/helpers.js";
|
|
5
5
|
import { ErrorKeywords } from "./constants/details.js";
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return
|
|
21
|
-
const objKeys = Object.keys(obj);
|
|
22
|
-
if (objKeys.every((k) => defaultSchemaKeys.includes(k))) {
|
|
23
|
-
return false;
|
|
6
|
+
import ValidnoResult from "./ValidnoResult.js";
|
|
7
|
+
function generateMsg(input) {
|
|
8
|
+
let { results, key, deepKey, data, reqs } = input;
|
|
9
|
+
const keyForMsg = deepKey || key;
|
|
10
|
+
const keyTitle = 'title' in reqs ? reqs.title : keyForMsg;
|
|
11
|
+
if (reqs.customMessage && typeof reqs.customMessage === 'function') {
|
|
12
|
+
const errMsg = reqs.customMessage({
|
|
13
|
+
keyword: ErrorKeywords.Missing,
|
|
14
|
+
value: data[key],
|
|
15
|
+
key: keyForMsg,
|
|
16
|
+
title: keyTitle,
|
|
17
|
+
reqs: reqs,
|
|
18
|
+
schema: this.schema
|
|
19
|
+
});
|
|
20
|
+
return errMsg;
|
|
24
21
|
}
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
return _errors.getMissingError(keyForMsg);
|
|
23
|
+
}
|
|
24
|
+
function handleDeepKey(input) {
|
|
25
|
+
const { results, key, deepKey, data, reqs } = input;
|
|
26
|
+
const nesctedKeys = Object.keys(reqs);
|
|
27
|
+
results.fixByKey(deepKey, false);
|
|
28
|
+
let i = 0;
|
|
29
|
+
while (i < nesctedKeys.length) {
|
|
30
|
+
const nestedKey = nesctedKeys[i];
|
|
31
|
+
const deepParams = {
|
|
32
|
+
key: nestedKey,
|
|
33
|
+
data: data[key],
|
|
34
|
+
reqs: reqs[nestedKey],
|
|
35
|
+
deepKey: `${deepKey}.${nestedKey}`
|
|
36
|
+
};
|
|
37
|
+
const deepResults = handleKey.call(this, deepParams);
|
|
38
|
+
results.merge(deepResults);
|
|
39
|
+
i++;
|
|
27
40
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
};
|
|
39
|
-
export function handleReqKey(key, data, reqs, deepKey = key) {
|
|
40
|
-
let results = getResultDefaults();
|
|
41
|
-
const hasNested = checkIsNested(reqs);
|
|
42
|
-
const keyTitle = 'title' in reqs ? reqs.title : deepKey;
|
|
41
|
+
return results;
|
|
42
|
+
}
|
|
43
|
+
export function handleKey(input) {
|
|
44
|
+
let { results, key, deepKey, data, reqs } = input;
|
|
45
|
+
if (!results)
|
|
46
|
+
results = new ValidnoResult();
|
|
47
|
+
if (!deepKey)
|
|
48
|
+
deepKey = key;
|
|
49
|
+
const hasNested = _helpers.checkIsNested(reqs);
|
|
50
|
+
const hasMissing = _helpers.hasMissing(input);
|
|
43
51
|
const missedCheck = [];
|
|
44
52
|
const typeChecked = [];
|
|
45
53
|
const rulesChecked = [];
|
|
46
|
-
if (reqs
|
|
47
|
-
|
|
48
|
-
results.missed.push(deepKey);
|
|
49
|
-
results.failed.push(deepKey);
|
|
50
|
-
results.byKeys[deepKey] = false;
|
|
54
|
+
if (_helpers.checkNestedIsMissing(reqs, data)) {
|
|
55
|
+
results.pushMissing(deepKey);
|
|
51
56
|
return results;
|
|
52
57
|
}
|
|
53
58
|
if (hasNested) {
|
|
54
|
-
|
|
55
|
-
results.byKeys[deepKey] = true;
|
|
56
|
-
let i = 0;
|
|
57
|
-
while (i < nestedReqKeys.length) {
|
|
58
|
-
const reqKeyI = nestedReqKeys[i];
|
|
59
|
-
const deepResults = handleReqKey.call(this, reqKeyI, data[key], reqs[reqKeyI], deepKey + '.' + reqKeyI);
|
|
60
|
-
results = mergeResults(results, deepResults);
|
|
61
|
-
i++;
|
|
62
|
-
}
|
|
63
|
-
return results;
|
|
59
|
+
return handleDeepKey.call(this, { results, key, data, reqs, deepKey });
|
|
64
60
|
}
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
console.log(data);
|
|
68
|
-
let errMsg = _errors.getMissingError(deepKey);
|
|
69
|
-
if (reqs.customMessage && typeof reqs.customMessage === 'function') {
|
|
70
|
-
errMsg = reqs.customMessage({
|
|
71
|
-
keyword: ErrorKeywords.Missing,
|
|
72
|
-
value: data[key],
|
|
73
|
-
key: deepKey,
|
|
74
|
-
title: keyTitle,
|
|
75
|
-
reqs: reqs,
|
|
76
|
-
schema: this.schema
|
|
77
|
-
});
|
|
78
|
-
}
|
|
61
|
+
if (hasMissing) {
|
|
62
|
+
let errMsg = generateMsg.call(this, input);
|
|
79
63
|
missedCheck.push(false);
|
|
80
|
-
results.
|
|
81
|
-
results.failed.push(deepKey);
|
|
82
|
-
results.errors.push(errMsg);
|
|
83
|
-
if (deepKey in results.errorsByKeys === false)
|
|
84
|
-
results.errorsByKeys[deepKey] = [];
|
|
85
|
-
results.errorsByKeys[deepKey].push(errMsg);
|
|
86
|
-
results.byKeys[deepKey] = false;
|
|
64
|
+
results.pushMissing(deepKey, errMsg);
|
|
87
65
|
return results;
|
|
88
66
|
}
|
|
89
67
|
const typeCheck = checkType(key, data[key], reqs, deepKey);
|
|
@@ -104,52 +82,27 @@ export function handleReqKey(key, data, reqs, deepKey = key) {
|
|
|
104
82
|
});
|
|
105
83
|
}
|
|
106
84
|
if (missedCheck.length)
|
|
107
|
-
results.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
results.passed.push(deepKey);
|
|
113
|
-
}
|
|
85
|
+
results.pushMissing(deepKey);
|
|
86
|
+
const isPassed = (!typeChecked.length && !rulesChecked.length && !missedCheck.length);
|
|
87
|
+
results.fixByKey(deepKey, isPassed);
|
|
114
88
|
results.errorsByKeys[deepKey] = [
|
|
115
89
|
...results.errors
|
|
116
90
|
];
|
|
117
|
-
results.
|
|
118
|
-
return results;
|
|
91
|
+
return results.finish();
|
|
119
92
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
results = mergeResults(results, keyResult);
|
|
131
|
-
}
|
|
93
|
+
function validate(schema, data, keysToCheck) {
|
|
94
|
+
const results = new ValidnoResult();
|
|
95
|
+
const hasKeysToCheck = _helpers.areKeysLimited(keysToCheck);
|
|
96
|
+
const schemaKeys = Object.entries(schema.schema);
|
|
97
|
+
for (const [key, reqs] of schemaKeys) {
|
|
98
|
+
const toBeValidated = _helpers.needValidation(key, hasKeysToCheck, keysToCheck);
|
|
99
|
+
if (!toBeValidated)
|
|
100
|
+
continue;
|
|
101
|
+
const keyResult = handleKey.call(this, { key, data, reqs });
|
|
102
|
+
results.merge(keyResult);
|
|
132
103
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
else
|
|
136
|
-
results.ok = true;
|
|
137
|
-
return new ValidnoResult(results);
|
|
104
|
+
results.finish();
|
|
105
|
+
return results;
|
|
138
106
|
}
|
|
139
107
|
;
|
|
140
|
-
class ValidnoResult {
|
|
141
|
-
constructor(results) {
|
|
142
|
-
this.ok = results.ok;
|
|
143
|
-
this.missed = results.missed;
|
|
144
|
-
this.failed = results.failed;
|
|
145
|
-
this.passed = results.passed;
|
|
146
|
-
this.errors = results.errors;
|
|
147
|
-
this.byKeys = results.byKeys;
|
|
148
|
-
this.errorsByKeys = results.errorsByKeys;
|
|
149
|
-
this.byKeys = results.byKeys;
|
|
150
|
-
}
|
|
151
|
-
joinErrors(separator = '; ') {
|
|
152
|
-
return _errors.joinErrors(this.errors, separator);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
108
|
export default validate;
|