validno 0.1.6 → 0.1.8
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 +3 -1
- package/dist/checkType.js +4 -2
- package/dist/validate.js +24 -3
- package/package.json +1 -1
- package/src/Schema.ts +8 -2
- package/src/checkType.ts +4 -2
- package/src/validate.ts +42 -5
package/dist/Schema.js
CHANGED
package/dist/checkType.js
CHANGED
|
@@ -82,10 +82,12 @@ const checkType = (key, value, requirements, keyName = key) => {
|
|
|
82
82
|
break;
|
|
83
83
|
case Date:
|
|
84
84
|
const isDate = isNotNull && value.constructor === Date;
|
|
85
|
+
const isValid = isDate && !isNaN(value.getTime());
|
|
86
|
+
const errorMsg = isValid ? getErrorDetails(keyName, requirements.type, value) : 'Дата невалидна';
|
|
85
87
|
result.push({
|
|
86
88
|
key: keyName,
|
|
87
|
-
passed: isDate,
|
|
88
|
-
details: isDate ? 'Passed' :
|
|
89
|
+
passed: isDate && isValid,
|
|
90
|
+
details: isDate && isValid ? 'Passed' : errorMsg
|
|
89
91
|
});
|
|
90
92
|
break;
|
|
91
93
|
case Boolean:
|
package/dist/validate.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import checkRules from "./checkRules.js";
|
|
2
2
|
import checkType from "./checkType.js";
|
|
3
|
-
import { defaultSchemaKeys } from "./Schema.js";
|
|
4
3
|
import _errors from "./utils/errors.js";
|
|
5
4
|
import _validations from "./utils/validations.js";
|
|
5
|
+
import { defaultSchemaKeys } from "./Schema.js";
|
|
6
6
|
export const getResultDefaults = () => {
|
|
7
7
|
return {
|
|
8
8
|
ok: null,
|
|
@@ -11,7 +11,9 @@ export const getResultDefaults = () => {
|
|
|
11
11
|
passed: [],
|
|
12
12
|
errors: [],
|
|
13
13
|
byKeys: {},
|
|
14
|
-
|
|
14
|
+
byTitles: {},
|
|
15
|
+
errorsByKeys: {},
|
|
16
|
+
errorsByTitles: {}
|
|
15
17
|
};
|
|
16
18
|
};
|
|
17
19
|
const checkIsNested = (obj) => {
|
|
@@ -32,12 +34,15 @@ export const mergeResults = (resultsOld, resultsNew) => {
|
|
|
32
34
|
output.missed = [...resultsOld.missed, ...resultsNew.missed];
|
|
33
35
|
output.passed = [...resultsOld.passed, ...resultsNew.passed];
|
|
34
36
|
output.byKeys = Object.assign(Object.assign({}, resultsOld.byKeys), resultsNew.byKeys);
|
|
37
|
+
output.byTitles = Object.assign(Object.assign({}, resultsOld.byTitles), resultsNew.byTitles);
|
|
35
38
|
output.errorsByKeys = Object.assign(Object.assign({}, resultsOld.errorsByKeys), resultsNew.errorsByKeys);
|
|
39
|
+
output.errorsByTitles = Object.assign(Object.assign({}, resultsOld.errorsByTitles), resultsNew.errorsByTitles);
|
|
36
40
|
return output;
|
|
37
41
|
};
|
|
38
42
|
export function handleReqKey(key, data, reqs, deepKey = key) {
|
|
39
43
|
let results = getResultDefaults();
|
|
40
44
|
const hasNested = checkIsNested(reqs);
|
|
45
|
+
const keyTitle = 'title' in reqs ? reqs.title : deepKey;
|
|
41
46
|
const missedCheck = [];
|
|
42
47
|
const typeChecked = [];
|
|
43
48
|
const rulesChecked = [];
|
|
@@ -46,11 +51,13 @@ export function handleReqKey(key, data, reqs, deepKey = key) {
|
|
|
46
51
|
results.missed.push(deepKey);
|
|
47
52
|
results.failed.push(deepKey);
|
|
48
53
|
results.byKeys[deepKey] = false;
|
|
54
|
+
results.byTitles[keyTitle] = false;
|
|
49
55
|
return results;
|
|
50
56
|
}
|
|
51
57
|
if (hasNested) {
|
|
52
58
|
const nestedReqKeys = Object.keys(reqs);
|
|
53
59
|
results.byKeys[deepKey] = true;
|
|
60
|
+
results.byTitles[keyTitle] = true;
|
|
54
61
|
let i = 0;
|
|
55
62
|
while (i < nestedReqKeys.length) {
|
|
56
63
|
const reqKeyI = nestedReqKeys[i];
|
|
@@ -61,13 +68,20 @@ export function handleReqKey(key, data, reqs, deepKey = key) {
|
|
|
61
68
|
return results;
|
|
62
69
|
}
|
|
63
70
|
if (reqs.required === true && key in data === false || data === undefined) {
|
|
64
|
-
|
|
71
|
+
let errMsg = _errors.getMissingError(deepKey);
|
|
72
|
+
if (reqs.customMessage && typeof reqs.customMessage === 'function') {
|
|
73
|
+
errMsg = reqs.customMessage({
|
|
74
|
+
value: data[key], key: deepKey, title: keyTitle, reqs: reqs, schema: this.schema
|
|
75
|
+
});
|
|
76
|
+
}
|
|
65
77
|
missedCheck.push(false);
|
|
66
78
|
results.missed.push(deepKey);
|
|
67
79
|
results.failed.push(deepKey);
|
|
68
80
|
results.errors.push(errMsg);
|
|
69
81
|
results.byKeys[deepKey] = false;
|
|
82
|
+
results.byTitles[keyTitle] = false;
|
|
70
83
|
results.errorsByKeys[deepKey] = [errMsg];
|
|
84
|
+
results.errorsByTitles[keyTitle] = [errMsg];
|
|
71
85
|
return results;
|
|
72
86
|
}
|
|
73
87
|
const typeCheck = checkType(key, data[key], reqs, deepKey);
|
|
@@ -83,8 +97,11 @@ export function handleReqKey(key, data, reqs, deepKey = key) {
|
|
|
83
97
|
ruleCheck.details.forEach((el) => {
|
|
84
98
|
if (deepKey in results.errorsByKeys)
|
|
85
99
|
results.errorsByKeys[deepKey] = [];
|
|
100
|
+
if (deepKey in results.errorsByTitles)
|
|
101
|
+
results.errorsByTitles[keyTitle] = [];
|
|
86
102
|
results.errors.push(el);
|
|
87
103
|
results.errorsByKeys[deepKey] = ['1'];
|
|
104
|
+
results.errorsByTitles[keyTitle] = ['1'];
|
|
88
105
|
});
|
|
89
106
|
}
|
|
90
107
|
if (missedCheck.length)
|
|
@@ -98,7 +115,11 @@ export function handleReqKey(key, data, reqs, deepKey = key) {
|
|
|
98
115
|
results.errorsByKeys[deepKey] = [
|
|
99
116
|
...results.errors
|
|
100
117
|
];
|
|
118
|
+
results.errorsByTitles[keyTitle] = [
|
|
119
|
+
...results.errors
|
|
120
|
+
];
|
|
101
121
|
results.byKeys[deepKey] = (missedCheck.length + typeChecked.length + rulesChecked.length) === 0;
|
|
122
|
+
results.byTitles[keyTitle] = (missedCheck.length + typeChecked.length + rulesChecked.length) === 0;
|
|
102
123
|
return results;
|
|
103
124
|
}
|
|
104
125
|
const isCheckNeeded = (key, hasLimits, onlyKeys) => {
|
package/package.json
CHANGED
package/src/Schema.ts
CHANGED
|
@@ -5,6 +5,8 @@ export type TSchemaItem = {
|
|
|
5
5
|
type: any,
|
|
6
6
|
eachType?: any,
|
|
7
7
|
rules?: {},
|
|
8
|
+
title?: string,
|
|
9
|
+
customMessage?: Function
|
|
8
10
|
}
|
|
9
11
|
|
|
10
12
|
export type TSchemaInput = {
|
|
@@ -15,14 +17,18 @@ export const enum ESchemaFields {
|
|
|
15
17
|
Required = 'required',
|
|
16
18
|
Type = 'type',
|
|
17
19
|
EachType = 'eachType',
|
|
18
|
-
Rules = 'rules'
|
|
20
|
+
Rules = 'rules',
|
|
21
|
+
Title = 'title',
|
|
22
|
+
CustomMessage = 'customMessage'
|
|
19
23
|
}
|
|
20
24
|
|
|
21
25
|
export const defaultSchemaKeys = [
|
|
22
26
|
ESchemaFields.Required,
|
|
23
27
|
ESchemaFields.Type,
|
|
24
28
|
ESchemaFields.EachType,
|
|
25
|
-
ESchemaFields.Rules
|
|
29
|
+
ESchemaFields.Rules,
|
|
30
|
+
ESchemaFields.Title,
|
|
31
|
+
ESchemaFields.CustomMessage
|
|
26
32
|
]
|
|
27
33
|
|
|
28
34
|
export type TSchema = TSchemaInput
|
package/src/checkType.ts
CHANGED
|
@@ -95,11 +95,13 @@ const checkType = (key: string, value: any, requirements: TSchemaItem | TSchemaI
|
|
|
95
95
|
break;
|
|
96
96
|
case Date:
|
|
97
97
|
const isDate = isNotNull && value.constructor === Date
|
|
98
|
+
const isValid = isDate && !isNaN(value.getTime())
|
|
99
|
+
const errorMsg = isValid ? getErrorDetails(keyName, requirements.type, value) : 'Дата невалидна'
|
|
98
100
|
|
|
99
101
|
result.push({
|
|
100
102
|
key: keyName,
|
|
101
|
-
passed: isDate,
|
|
102
|
-
details: isDate ? 'Passed' :
|
|
103
|
+
passed: isDate && isValid,
|
|
104
|
+
details: isDate && isValid ? 'Passed' : errorMsg
|
|
103
105
|
})
|
|
104
106
|
break;
|
|
105
107
|
case Boolean:
|
package/src/validate.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import checkRules from "./checkRules.js";
|
|
2
2
|
import checkType from "./checkType.js";
|
|
3
|
-
import { defaultSchemaKeys, Schema, TSchemaInput } from "./Schema.js";
|
|
4
3
|
import _errors from "./utils/errors.js";
|
|
5
4
|
import _validations from "./utils/validations.js";
|
|
5
|
+
import { defaultSchemaKeys, Schema, TSchemaInput } from "./Schema.js";
|
|
6
6
|
|
|
7
7
|
export type TResult = {
|
|
8
8
|
ok: null | boolean,
|
|
@@ -10,8 +10,10 @@ export type TResult = {
|
|
|
10
10
|
failed: string[],
|
|
11
11
|
passed: string[],
|
|
12
12
|
errors: string[],
|
|
13
|
-
byKeys: {[key: string]: boolean}
|
|
14
|
-
|
|
13
|
+
byKeys: {[key: string]: boolean},
|
|
14
|
+
byTitles: {[key: string]: boolean},
|
|
15
|
+
errorsByKeys: {[key: string]: string[]},
|
|
16
|
+
errorsByTitles: {[key: string]: string[]}
|
|
15
17
|
};
|
|
16
18
|
|
|
17
19
|
export const getResultDefaults = (): TResult => {
|
|
@@ -22,7 +24,9 @@ export const getResultDefaults = (): TResult => {
|
|
|
22
24
|
passed: [],
|
|
23
25
|
errors: [],
|
|
24
26
|
byKeys: {},
|
|
25
|
-
|
|
27
|
+
byTitles: {},
|
|
28
|
+
errorsByKeys: {},
|
|
29
|
+
errorsByTitles: {}
|
|
26
30
|
};
|
|
27
31
|
}
|
|
28
32
|
|
|
@@ -46,7 +50,9 @@ export const mergeResults = (resultsOld: TResult, resultsNew: TResult) => {
|
|
|
46
50
|
output.missed = [...resultsOld.missed, ...resultsNew.missed]
|
|
47
51
|
output.passed = [...resultsOld.passed, ...resultsNew.passed]
|
|
48
52
|
output.byKeys = {...resultsOld.byKeys, ...resultsNew.byKeys}
|
|
53
|
+
output.byTitles = {...resultsOld.byTitles, ...resultsNew.byTitles}
|
|
49
54
|
output.errorsByKeys = {...resultsOld.errorsByKeys, ...resultsNew.errorsByKeys}
|
|
55
|
+
output.errorsByTitles = {...resultsOld.errorsByTitles, ...resultsNew.errorsByTitles}
|
|
50
56
|
|
|
51
57
|
return output
|
|
52
58
|
}
|
|
@@ -54,6 +60,7 @@ export const mergeResults = (resultsOld: TResult, resultsNew: TResult) => {
|
|
|
54
60
|
export function handleReqKey(this: any, key: string, data: any, reqs: TSchemaInput, deepKey = key) {
|
|
55
61
|
let results = getResultDefaults()
|
|
56
62
|
const hasNested = checkIsNested(reqs)
|
|
63
|
+
const keyTitle = 'title' in reqs ? reqs.title : deepKey
|
|
57
64
|
|
|
58
65
|
const missedCheck: boolean[] = [];
|
|
59
66
|
const typeChecked: boolean[] = [];
|
|
@@ -68,6 +75,8 @@ export function handleReqKey(this: any, key: string, data: any, reqs: TSchemaInp
|
|
|
68
75
|
results.missed.push(deepKey)
|
|
69
76
|
results.failed.push(deepKey)
|
|
70
77
|
results.byKeys[deepKey] = false
|
|
78
|
+
// @ts-ignore
|
|
79
|
+
results.byTitles[keyTitle] = false
|
|
71
80
|
return results
|
|
72
81
|
}
|
|
73
82
|
|
|
@@ -75,6 +84,8 @@ export function handleReqKey(this: any, key: string, data: any, reqs: TSchemaInp
|
|
|
75
84
|
if (hasNested) {
|
|
76
85
|
const nestedReqKeys: string[] = Object.keys(reqs)
|
|
77
86
|
results.byKeys[deepKey] = true
|
|
87
|
+
// @ts-ignore
|
|
88
|
+
results.byTitles[keyTitle] = true
|
|
78
89
|
|
|
79
90
|
let i = 0;
|
|
80
91
|
while (i < nestedReqKeys.length) {
|
|
@@ -100,14 +111,25 @@ export function handleReqKey(this: any, key: string, data: any, reqs: TSchemaInp
|
|
|
100
111
|
// Check missing keys
|
|
101
112
|
// @ts-ignore
|
|
102
113
|
if (reqs.required === true && key in data === false || data === undefined) {
|
|
103
|
-
|
|
114
|
+
let errMsg = _errors.getMissingError(deepKey)
|
|
115
|
+
|
|
116
|
+
if (reqs.customMessage && typeof reqs.customMessage === 'function') {
|
|
117
|
+
// @ts-ignore
|
|
118
|
+
errMsg = reqs.customMessage({
|
|
119
|
+
value: data[key], key: deepKey, title: keyTitle, reqs: reqs, schema: this.schema
|
|
120
|
+
})
|
|
121
|
+
}
|
|
104
122
|
|
|
105
123
|
missedCheck.push(false)
|
|
106
124
|
results.missed.push(deepKey)
|
|
107
125
|
results.failed.push(deepKey)
|
|
108
126
|
results.errors.push(errMsg)
|
|
109
127
|
results.byKeys[deepKey] = false
|
|
128
|
+
// @ts-ignore
|
|
129
|
+
results.byTitles[keyTitle] = false
|
|
110
130
|
results.errorsByKeys[deepKey] = [errMsg]
|
|
131
|
+
// @ts-ignore
|
|
132
|
+
results.errorsByTitles[keyTitle] = [errMsg]
|
|
111
133
|
return results
|
|
112
134
|
}
|
|
113
135
|
|
|
@@ -129,9 +151,14 @@ export function handleReqKey(this: any, key: string, data: any, reqs: TSchemaInp
|
|
|
129
151
|
rulesChecked.push(false)
|
|
130
152
|
ruleCheck.details.forEach((el) => {
|
|
131
153
|
if (deepKey in results.errorsByKeys) results.errorsByKeys[deepKey] = []
|
|
154
|
+
// @ts-ignore
|
|
155
|
+
if (deepKey in results.errorsByTitles) results.errorsByTitles[keyTitle] = []
|
|
156
|
+
|
|
132
157
|
results.errors.push(el)
|
|
133
158
|
|
|
134
159
|
results.errorsByKeys[deepKey] = ['1']
|
|
160
|
+
// @ts-ignore
|
|
161
|
+
results.errorsByTitles[keyTitle] = ['1']
|
|
135
162
|
})
|
|
136
163
|
}
|
|
137
164
|
|
|
@@ -148,10 +175,20 @@ export function handleReqKey(this: any, key: string, data: any, reqs: TSchemaInp
|
|
|
148
175
|
...results.errors
|
|
149
176
|
]
|
|
150
177
|
|
|
178
|
+
// @ts-ignore
|
|
179
|
+
results.errorsByTitles[keyTitle] = [
|
|
180
|
+
...results.errors
|
|
181
|
+
]
|
|
182
|
+
|
|
151
183
|
results.byKeys[deepKey] = (
|
|
152
184
|
missedCheck.length + typeChecked.length + rulesChecked.length
|
|
153
185
|
) === 0
|
|
154
186
|
|
|
187
|
+
// @ts-ignore
|
|
188
|
+
results.byTitles[keyTitle] = (
|
|
189
|
+
missedCheck.length + typeChecked.length + rulesChecked.length
|
|
190
|
+
) === 0
|
|
191
|
+
|
|
155
192
|
return results
|
|
156
193
|
}
|
|
157
194
|
|