quival 0.2.7 → 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/.prettierrc.json +1 -0
- package/README.md +3 -9
- package/dist/locales/en.js +2 -1
- package/dist/locales/en.min.js +2 -2
- package/dist/locales/ms.js +2 -1
- package/dist/locales/ms.min.js +2 -2
- package/dist/quival.js +233 -200
- package/dist/quival.min.js +2 -2
- package/package.json +5 -6
- package/rollup.config.js +11 -13
- package/src/Checkers.js +16 -12
- package/src/ErrorBag.js +14 -2
- package/src/Validator.js +61 -55
- package/src/helpers.js +3 -3
- package/src/locales/en.js +1 -0
- package/src/locales/ms.js +1 -0
- package/test/functionalities.js +85 -0
- package/test/helpers.js +174 -0
- package/test/{test.js → validation.js} +79 -213
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { strict as assert } from 'assert';
|
|
2
|
+
import Validator from '../src/Validator.js';
|
|
3
|
+
|
|
4
|
+
describe('Functionalities', () => {
|
|
5
|
+
it('Create a new instance', () => {
|
|
6
|
+
const validator = new Validator({ field: 'abc' }, { field: 'string' });
|
|
7
|
+
assert(validator instanceof Validator);
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it('Validate data', async () => {
|
|
11
|
+
const validator = new Validator(
|
|
12
|
+
{
|
|
13
|
+
val1: '@bc',
|
|
14
|
+
val2: 123,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
val1: 'string|alpha|min:5',
|
|
18
|
+
val2: 'string|alpha',
|
|
19
|
+
},
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
assert.deepEqual((await validator.validate()).messages(), {
|
|
23
|
+
val1: ['validation.alpha', 'validation.min'],
|
|
24
|
+
val2: ['validation.string', 'validation.alpha'],
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('Stop on first failure', async () => {
|
|
29
|
+
const validator = new Validator(
|
|
30
|
+
{
|
|
31
|
+
val1: '@bc',
|
|
32
|
+
val2: 123,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
val1: 'string|alpha|min:5',
|
|
36
|
+
val2: 'string|alpha',
|
|
37
|
+
},
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
validator.stopOnFirstFailure();
|
|
41
|
+
|
|
42
|
+
assert.deepEqual((await validator.validate()).messages(), {
|
|
43
|
+
val1: ['validation.alpha', 'validation.min'],
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('Always bail', async () => {
|
|
48
|
+
const validator = new Validator(
|
|
49
|
+
{
|
|
50
|
+
val1: '@bc',
|
|
51
|
+
val2: 123,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
val1: 'string|alpha|min:5',
|
|
55
|
+
val2: 'string|alpha',
|
|
56
|
+
},
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
validator.alwaysBail();
|
|
60
|
+
|
|
61
|
+
assert.deepEqual((await validator.validate()).messages(), {
|
|
62
|
+
val1: ['validation.alpha'],
|
|
63
|
+
val2: ['validation.string'],
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('Stop on first failure and always bail', async () => {
|
|
68
|
+
const validator = new Validator(
|
|
69
|
+
{
|
|
70
|
+
val1: '@bc',
|
|
71
|
+
val2: 123,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
val1: 'string|alpha|min:5',
|
|
75
|
+
val2: 'string|alpha',
|
|
76
|
+
},
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
validator.stopOnFirstFailure().alwaysBail();
|
|
80
|
+
|
|
81
|
+
assert.deepEqual((await validator.validate()).messages(), {
|
|
82
|
+
val1: ['validation.alpha'],
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
package/test/helpers.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { strict as assert } from 'assert';
|
|
2
|
+
import {
|
|
3
|
+
escapeRegExp,
|
|
4
|
+
flattenObject,
|
|
5
|
+
getByPath,
|
|
6
|
+
isDigits,
|
|
7
|
+
isEmpty,
|
|
8
|
+
isNumeric,
|
|
9
|
+
isPlainObject,
|
|
10
|
+
isValidDate,
|
|
11
|
+
parseCsvString,
|
|
12
|
+
parseDate,
|
|
13
|
+
parseDateByFormat,
|
|
14
|
+
setByPath,
|
|
15
|
+
toCamelCase,
|
|
16
|
+
toSnakeCase,
|
|
17
|
+
} from '../src/helpers.js';
|
|
18
|
+
|
|
19
|
+
describe('Helpers', () => {
|
|
20
|
+
it('toCamelCase', () => {
|
|
21
|
+
assert.equal(toCamelCase('a_test_name'), 'aTestName');
|
|
22
|
+
assert.equal(toCamelCase('_test_name'), 'testName');
|
|
23
|
+
assert.equal(toCamelCase('a-test-name'), 'aTestName');
|
|
24
|
+
assert.equal(toCamelCase('-test-name'), 'testName');
|
|
25
|
+
assert.equal(toCamelCase('a test name'), 'aTestName');
|
|
26
|
+
assert.equal(toCamelCase(' test name'), 'testName');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('toSnakeCase', () => {
|
|
30
|
+
assert.equal(toSnakeCase('aTestName'), 'a_test_name');
|
|
31
|
+
assert.equal(toSnakeCase('a_testName'), 'a_test_name');
|
|
32
|
+
assert.equal(toSnakeCase('ATESTNAME'), 'a_t_e_s_t_n_a_m_e');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('escapeRegExp', () => {
|
|
36
|
+
assert.equal(escapeRegExp('.*+?^${}()|[]\\'), '\\.\\*\\+\\?\\^\\$\\{\\}\\(\\)\\|\\[\\]\\\\');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('getByPath', () => {
|
|
40
|
+
assert.equal(getByPath({ a: { b: 1 } }, 'a.b'), 1);
|
|
41
|
+
assert.equal(getByPath({ a: [1, { c: 2 }] }, 'a.1.c'), 2);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('setByPath', () => {
|
|
45
|
+
let obj = { a: { b: 1 } };
|
|
46
|
+
setByPath(obj, 'a.b', 3);
|
|
47
|
+
|
|
48
|
+
assert.deepEqual(obj, { a: { b: 3 } });
|
|
49
|
+
|
|
50
|
+
obj = { a: [1, { c: 2 }] };
|
|
51
|
+
setByPath(obj, 'a.1.c', 5);
|
|
52
|
+
|
|
53
|
+
assert.deepEqual(obj, { a: [1, { c: 5 }] });
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('flattenObject', () => {
|
|
57
|
+
assert.deepEqual(flattenObject({ a: 1, b: { x: 41, y: 42 } }), { a: 1, 'b.x': 41, 'b.y': 42 });
|
|
58
|
+
assert.deepEqual(flattenObject({ a: 1, b: [71, 73, 75] }), { a: 1, 'b.0': 71, 'b.1': 73, 'b.2': 75 });
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('parseCsvString', () => {
|
|
62
|
+
assert.deepEqual(parseCsvString('a,b,c'), ['a', 'b', 'c']);
|
|
63
|
+
assert.deepEqual(parseCsvString('a, b, c'), ['a', ' b', ' c']);
|
|
64
|
+
assert.deepEqual(parseCsvString('"a","b","c"'), ['a', 'b', 'c']);
|
|
65
|
+
assert.deepEqual(parseCsvString('"a", "b", "c"'), ['a', 'b', 'c']);
|
|
66
|
+
assert.deepEqual(parseCsvString('"a", "b", ""'), ['a', 'b', '']);
|
|
67
|
+
|
|
68
|
+
assert.deepEqual(parseCsvString('"r2""c1","r2c2","r2c3"'), ['r2"c1', 'r2c2', 'r2c3']);
|
|
69
|
+
assert.deepEqual(parseCsvString('"r2""c1",r2c2,r2c3'), ['r2"c1', 'r2c2', 'r2c3']);
|
|
70
|
+
assert.deepEqual(parseCsvString('r1c1,"r1,c2",r1c3'), ['r1c1', 'r1,c2', 'r1c3']);
|
|
71
|
+
assert.deepEqual(parseCsvString('"r2""c1",r2c2,"r2""""c3"'), ['r2"c1', 'r2c2', 'r2""c3']);
|
|
72
|
+
assert.deepEqual(parseCsvString('r1c1,"r1,c2","r1"",""c3"'), ['r1c1', 'r1,c2', 'r1","c3']);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('parseDate', () => {
|
|
76
|
+
const date1 = new Date('2023/08/11 00:00:00');
|
|
77
|
+
const date2 = new Date('2023/08/11 08:40:50 am');
|
|
78
|
+
const date3 = new Date();
|
|
79
|
+
date3.setHours(8);
|
|
80
|
+
date3.setMinutes(40);
|
|
81
|
+
date3.setSeconds(50);
|
|
82
|
+
date3.setMilliseconds(0);
|
|
83
|
+
|
|
84
|
+
assert.deepEqual(parseDate('11-08-2023'), date1);
|
|
85
|
+
assert.deepEqual(parseDate('11-08-2023 08:40:50'), date2);
|
|
86
|
+
assert.deepEqual(parseDate('11-08-2023 08:40:50 am'), date2);
|
|
87
|
+
assert.deepEqual(parseDate('11/08/2023'), date1);
|
|
88
|
+
assert.deepEqual(parseDate('11/08/2023 08:40:50'), date2);
|
|
89
|
+
assert.deepEqual(parseDate('11/08/2023 08:40:50 am'), date2);
|
|
90
|
+
assert.deepEqual(parseDate('11.08.2023'), date1);
|
|
91
|
+
assert.deepEqual(parseDate('11.08.2023 08:40:50'), date2);
|
|
92
|
+
assert.deepEqual(parseDate('11.08.2023 08:40:50 am'), date2);
|
|
93
|
+
|
|
94
|
+
assert.deepEqual(parseDate('2023-08-11'), date1);
|
|
95
|
+
assert.deepEqual(parseDate('2023-08-11 08:40:50'), date2);
|
|
96
|
+
assert.deepEqual(parseDate('2023-08-11 08:40:50 am'), date2);
|
|
97
|
+
assert.deepEqual(parseDate('2023/08/11'), date1);
|
|
98
|
+
assert.deepEqual(parseDate('2023/08/11 08:40:50'), date2);
|
|
99
|
+
assert.deepEqual(parseDate('2023/08/11 08:40:50 am'), date2);
|
|
100
|
+
assert.deepEqual(parseDate('2023.08.11'), date1);
|
|
101
|
+
assert.deepEqual(parseDate('2023.08.11 08:40:50'), date2);
|
|
102
|
+
assert.deepEqual(parseDate('2023.08.11 08:40:50 am'), date2);
|
|
103
|
+
|
|
104
|
+
assert.deepEqual(parseDate('08:40:50 2023-08-11'), date2);
|
|
105
|
+
assert.deepEqual(parseDate('08:40:50 am 2023-08-11'), date2);
|
|
106
|
+
assert.deepEqual(parseDate('08:40:50 2023/08/11'), date2);
|
|
107
|
+
assert.deepEqual(parseDate('08:40:50 am 2023/08/11'), date2);
|
|
108
|
+
assert.deepEqual(parseDate('08:40:50 2023.08.11'), date2);
|
|
109
|
+
assert.deepEqual(parseDate('08:40:50 am 2023.08.11'), date2);
|
|
110
|
+
|
|
111
|
+
assert.deepEqual(parseDate('08:40:50'), date3);
|
|
112
|
+
assert.deepEqual(parseDate('08:40:50 am'), date3);
|
|
113
|
+
assert.deepEqual(parseDate('08:40:50'), date3);
|
|
114
|
+
assert.deepEqual(parseDate('08:40:50 am'), date3);
|
|
115
|
+
assert.deepEqual(parseDate('08:40:50'), date3);
|
|
116
|
+
assert.deepEqual(parseDate('08:40:50 am'), date3);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('parseDateByFormat', () => {
|
|
120
|
+
const date1 = new Date('2023/08/11 00:00:00');
|
|
121
|
+
const date2 = new Date('2023/08/11 08:40:50 am');
|
|
122
|
+
const date3 = new Date();
|
|
123
|
+
date3.setHours(8);
|
|
124
|
+
date3.setMinutes(40);
|
|
125
|
+
date3.setSeconds(50);
|
|
126
|
+
date3.setMilliseconds(0);
|
|
127
|
+
|
|
128
|
+
assert.deepEqual(parseDateByFormat('08-11-2023', 'm-d-Y'), date1);
|
|
129
|
+
assert.deepEqual(parseDateByFormat('08-11-23', 'm-d-y'), date1);
|
|
130
|
+
assert.deepEqual(parseDateByFormat('08-11-2023 08:40:50', 'm-d-Y H:i:s'), date2);
|
|
131
|
+
assert.deepEqual(parseDateByFormat('08-11-23 08:40:50', 'm-d-y H:i:s'), date2);
|
|
132
|
+
assert.deepEqual(parseDateByFormat('08-11-2023 08:40:50 am', 'm-d-Y H:i:s a'), date2);
|
|
133
|
+
assert.deepEqual(parseDateByFormat('08-11-23 08:40:50 am', 'm-d-y H:i:s a'), date2);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('isDigits', () => {
|
|
137
|
+
assert(isDigits(123));
|
|
138
|
+
assert(isDigits('123'));
|
|
139
|
+
assert(!isDigits('abc'));
|
|
140
|
+
assert(!isDigits('abc123'));
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('isEmpty', () => {
|
|
144
|
+
assert(isEmpty(''));
|
|
145
|
+
assert(isEmpty(null));
|
|
146
|
+
assert(isEmpty(undefined));
|
|
147
|
+
assert(!isEmpty(123));
|
|
148
|
+
assert(!isEmpty('abc'));
|
|
149
|
+
assert(!isEmpty({}));
|
|
150
|
+
assert(!isEmpty([]));
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('isNumeric', () => {
|
|
154
|
+
assert(isNumeric(123));
|
|
155
|
+
assert(isNumeric('123'));
|
|
156
|
+
assert(!isNumeric('abc'));
|
|
157
|
+
assert(!isNumeric(true));
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it('isPlainObject', () => {
|
|
161
|
+
assert(isPlainObject({}));
|
|
162
|
+
assert(!isPlainObject([]));
|
|
163
|
+
assert(!isPlainObject(new Date()));
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('isValidDate', () => {
|
|
167
|
+
assert(isValidDate(new Date()));
|
|
168
|
+
assert(isValidDate(new Date('2023/08/11 00:00:00')));
|
|
169
|
+
assert(isValidDate(new Date('2023/08/11 08:40:50 am')));
|
|
170
|
+
assert(isValidDate(new Date('08:40:50 am 2023/08/11')));
|
|
171
|
+
assert(!isValidDate(new Date('')));
|
|
172
|
+
assert(!isValidDate(new Date('08:40:50 am')));
|
|
173
|
+
});
|
|
174
|
+
});
|
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
import { strict as assert } from 'assert';
|
|
2
|
-
import {
|
|
3
|
-
escapeRegExp,
|
|
4
|
-
flattenObject,
|
|
5
|
-
getByPath,
|
|
6
|
-
isDigits,
|
|
7
|
-
isEmpty,
|
|
8
|
-
isNumeric,
|
|
9
|
-
isPlainObject,
|
|
10
|
-
isValidDate,
|
|
11
|
-
parseCsvString,
|
|
12
|
-
parseDate,
|
|
13
|
-
parseDateByFormat,
|
|
14
|
-
setByPath,
|
|
15
|
-
toCamelCase,
|
|
16
|
-
toSnakeCase,
|
|
17
|
-
} from '../src/helpers.js';
|
|
18
2
|
import Validator from '../src/Validator.js';
|
|
19
3
|
|
|
20
4
|
globalThis.File = class {
|
|
@@ -29,163 +13,6 @@ globalThis.File = class {
|
|
|
29
13
|
}
|
|
30
14
|
};
|
|
31
15
|
|
|
32
|
-
describe('Helpers', () => {
|
|
33
|
-
it('toCamelCase', () => {
|
|
34
|
-
assert.equal(toCamelCase('a_test_name'), 'aTestName');
|
|
35
|
-
assert.equal(toCamelCase('_test_name'), 'testName');
|
|
36
|
-
assert.equal(toCamelCase('a-test-name'), 'aTestName');
|
|
37
|
-
assert.equal(toCamelCase('-test-name'), 'testName');
|
|
38
|
-
assert.equal(toCamelCase('a test name'), 'aTestName');
|
|
39
|
-
assert.equal(toCamelCase(' test name'), 'testName');
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('toSnakeCase', () => {
|
|
43
|
-
assert.equal(toSnakeCase('aTestName'), 'a_test_name');
|
|
44
|
-
assert.equal(toSnakeCase('a_testName'), 'a_test_name');
|
|
45
|
-
assert.equal(toSnakeCase('ATESTNAME'), 'a_t_e_s_t_n_a_m_e');
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('escapeRegExp', () => {
|
|
49
|
-
assert.equal(escapeRegExp('.*+?^${}()|[]\\'), '\\.\\*\\+\\?\\^\\$\\{\\}\\(\\)\\|\\[\\]\\\\');
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('getByPath', () => {
|
|
53
|
-
assert.equal(getByPath({ a: { b: 1 } }, 'a.b'), 1);
|
|
54
|
-
assert.equal(getByPath({ a: [1, { c: 2 }] }, 'a.1.c'), 2);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('setByPath', () => {
|
|
58
|
-
let obj = { a: { b: 1 } };
|
|
59
|
-
setByPath(obj, 'a.b', 3);
|
|
60
|
-
|
|
61
|
-
assert.deepEqual(obj, { a: { b: 3 } });
|
|
62
|
-
|
|
63
|
-
obj = { a: [1, { c: 2 }] };
|
|
64
|
-
setByPath(obj, 'a.1.c', 5);
|
|
65
|
-
|
|
66
|
-
assert.deepEqual(obj, { a: [1, { c: 5 }] });
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('flattenObject', () => {
|
|
70
|
-
assert.deepEqual(flattenObject({ a: 1, b: { x: 41, y: 42 } }), { a: 1, 'b.x': 41, 'b.y': 42 });
|
|
71
|
-
assert.deepEqual(flattenObject({ a: 1, b: [71, 73, 75] }), { a: 1, 'b.0': 71, 'b.1': 73, 'b.2': 75 });
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('parseCsvString', () => {
|
|
75
|
-
assert.deepEqual(parseCsvString('a,b,c'), ['a', 'b', 'c']);
|
|
76
|
-
assert.deepEqual(parseCsvString('a, b, c'), ['a', ' b', ' c']);
|
|
77
|
-
assert.deepEqual(parseCsvString('"a","b","c"'), ['a', 'b', 'c']);
|
|
78
|
-
assert.deepEqual(parseCsvString('"a", "b", "c"'), ['a', 'b', 'c']);
|
|
79
|
-
assert.deepEqual(parseCsvString('"a", "b", ""'), ['a', 'b', '']);
|
|
80
|
-
|
|
81
|
-
assert.deepEqual(parseCsvString('"r2""c1","r2c2","r2c3"'), ['r2"c1', 'r2c2', 'r2c3']);
|
|
82
|
-
assert.deepEqual(parseCsvString('"r2""c1",r2c2,r2c3'), ['r2"c1', 'r2c2', 'r2c3']);
|
|
83
|
-
assert.deepEqual(parseCsvString('r1c1,"r1,c2",r1c3'), ['r1c1', 'r1,c2', 'r1c3']);
|
|
84
|
-
assert.deepEqual(parseCsvString('"r2""c1",r2c2,"r2""""c3"'), ['r2"c1', 'r2c2', 'r2""c3']);
|
|
85
|
-
assert.deepEqual(parseCsvString('r1c1,"r1,c2","r1"",""c3"'), ['r1c1', 'r1,c2', 'r1","c3']);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it('parseDate', () => {
|
|
89
|
-
const date1 = new Date('2023/08/11 00:00:00');
|
|
90
|
-
const date2 = new Date('2023/08/11 08:40:50 am');
|
|
91
|
-
const date3 = new Date();
|
|
92
|
-
date3.setHours(8);
|
|
93
|
-
date3.setMinutes(40);
|
|
94
|
-
date3.setSeconds(50);
|
|
95
|
-
date3.setMilliseconds(0);
|
|
96
|
-
|
|
97
|
-
assert.deepEqual(parseDate('11-08-2023'), date1);
|
|
98
|
-
assert.deepEqual(parseDate('11-08-2023 08:40:50'), date2);
|
|
99
|
-
assert.deepEqual(parseDate('11-08-2023 08:40:50 am'), date2);
|
|
100
|
-
assert.deepEqual(parseDate('11/08/2023'), date1);
|
|
101
|
-
assert.deepEqual(parseDate('11/08/2023 08:40:50'), date2);
|
|
102
|
-
assert.deepEqual(parseDate('11/08/2023 08:40:50 am'), date2);
|
|
103
|
-
assert.deepEqual(parseDate('11.08.2023'), date1);
|
|
104
|
-
assert.deepEqual(parseDate('11.08.2023 08:40:50'), date2);
|
|
105
|
-
assert.deepEqual(parseDate('11.08.2023 08:40:50 am'), date2);
|
|
106
|
-
|
|
107
|
-
assert.deepEqual(parseDate('2023-08-11'), date1);
|
|
108
|
-
assert.deepEqual(parseDate('2023-08-11 08:40:50'), date2);
|
|
109
|
-
assert.deepEqual(parseDate('2023-08-11 08:40:50 am'), date2);
|
|
110
|
-
assert.deepEqual(parseDate('2023/08/11'), date1);
|
|
111
|
-
assert.deepEqual(parseDate('2023/08/11 08:40:50'), date2);
|
|
112
|
-
assert.deepEqual(parseDate('2023/08/11 08:40:50 am'), date2);
|
|
113
|
-
assert.deepEqual(parseDate('2023.08.11'), date1);
|
|
114
|
-
assert.deepEqual(parseDate('2023.08.11 08:40:50'), date2);
|
|
115
|
-
assert.deepEqual(parseDate('2023.08.11 08:40:50 am'), date2);
|
|
116
|
-
|
|
117
|
-
assert.deepEqual(parseDate('08:40:50 2023-08-11'), date2);
|
|
118
|
-
assert.deepEqual(parseDate('08:40:50 am 2023-08-11'), date2);
|
|
119
|
-
assert.deepEqual(parseDate('08:40:50 2023/08/11'), date2);
|
|
120
|
-
assert.deepEqual(parseDate('08:40:50 am 2023/08/11'), date2);
|
|
121
|
-
assert.deepEqual(parseDate('08:40:50 2023.08.11'), date2);
|
|
122
|
-
assert.deepEqual(parseDate('08:40:50 am 2023.08.11'), date2);
|
|
123
|
-
|
|
124
|
-
assert.deepEqual(parseDate('08:40:50'), date3);
|
|
125
|
-
assert.deepEqual(parseDate('08:40:50 am'), date3);
|
|
126
|
-
assert.deepEqual(parseDate('08:40:50'), date3);
|
|
127
|
-
assert.deepEqual(parseDate('08:40:50 am'), date3);
|
|
128
|
-
assert.deepEqual(parseDate('08:40:50'), date3);
|
|
129
|
-
assert.deepEqual(parseDate('08:40:50 am'), date3);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it('parseDateByFormat', () => {
|
|
133
|
-
const date1 = new Date('2023/08/11 00:00:00');
|
|
134
|
-
const date2 = new Date('2023/08/11 08:40:50 am');
|
|
135
|
-
const date3 = new Date();
|
|
136
|
-
date3.setHours(8);
|
|
137
|
-
date3.setMinutes(40);
|
|
138
|
-
date3.setSeconds(50);
|
|
139
|
-
date3.setMilliseconds(0);
|
|
140
|
-
|
|
141
|
-
assert.deepEqual(parseDateByFormat('08-11-2023', 'm-d-Y'), date1);
|
|
142
|
-
assert.deepEqual(parseDateByFormat('08-11-23', 'm-d-y'), date1);
|
|
143
|
-
assert.deepEqual(parseDateByFormat('08-11-2023 08:40:50', 'm-d-Y H:i:s'), date2);
|
|
144
|
-
assert.deepEqual(parseDateByFormat('08-11-23 08:40:50', 'm-d-y H:i:s'), date2);
|
|
145
|
-
assert.deepEqual(parseDateByFormat('08-11-2023 08:40:50 am', 'm-d-Y H:i:s a'), date2);
|
|
146
|
-
assert.deepEqual(parseDateByFormat('08-11-23 08:40:50 am', 'm-d-y H:i:s a'), date2);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('isDigits', () => {
|
|
150
|
-
assert(isDigits(123));
|
|
151
|
-
assert(isDigits('123'));
|
|
152
|
-
assert(!isDigits('abc'));
|
|
153
|
-
assert(!isDigits('abc123'));
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it('isEmpty', () => {
|
|
157
|
-
assert(isEmpty(''));
|
|
158
|
-
assert(isEmpty(null));
|
|
159
|
-
assert(isEmpty(undefined));
|
|
160
|
-
assert(!isEmpty(123));
|
|
161
|
-
assert(!isEmpty('abc'));
|
|
162
|
-
assert(!isEmpty({}));
|
|
163
|
-
assert(!isEmpty([]));
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('isNumeric', () => {
|
|
167
|
-
assert(isNumeric(123));
|
|
168
|
-
assert(isNumeric('123'));
|
|
169
|
-
assert(!isNumeric('abc'));
|
|
170
|
-
assert(!isNumeric(true));
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it('isPlainObject', () => {
|
|
174
|
-
assert(isPlainObject({}));
|
|
175
|
-
assert(!isPlainObject([]));
|
|
176
|
-
assert(!isPlainObject(new Date()));
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('isValidDate', () => {
|
|
180
|
-
assert(isValidDate(new Date()));
|
|
181
|
-
assert(isValidDate(new Date('2023/08/11 00:00:00')));
|
|
182
|
-
assert(isValidDate(new Date('2023/08/11 08:40:50 am')));
|
|
183
|
-
assert(isValidDate(new Date('08:40:50 am 2023/08/11')));
|
|
184
|
-
assert(!isValidDate(new Date('')));
|
|
185
|
-
assert(!isValidDate(new Date('08:40:50 am')));
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
|
|
189
16
|
describe('Validation', () => {
|
|
190
17
|
describe(`Empty rule`, () => {
|
|
191
18
|
it(`Passes when the rule is empty`, async () => {
|
|
@@ -445,6 +272,16 @@ describe('Validation', () => {
|
|
|
445
272
|
});
|
|
446
273
|
});
|
|
447
274
|
|
|
275
|
+
describe(`Rule 'bail'`, () => {
|
|
276
|
+
it(`Passes when the field is null`, async () => {
|
|
277
|
+
const validator = new Validator({ field: '@bc' }, { field: 'bail|string|alpha|min:5' });
|
|
278
|
+
|
|
279
|
+
assert.deepEqual((await validator.validate()).messages(), {
|
|
280
|
+
field: ['validation.alpha'],
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
|
|
448
285
|
describe(`Rule 'before'`, () => {
|
|
449
286
|
const date = '2022-01-01';
|
|
450
287
|
const rules1 = { field: `before:${date}` };
|
|
@@ -1259,56 +1096,65 @@ describe('Validation', () => {
|
|
|
1259
1096
|
|
|
1260
1097
|
describe(`Rule 'hex_color'`, () => {
|
|
1261
1098
|
it(`Passes when the field is a valid color`, async () => {
|
|
1262
|
-
const validator = new Validator(
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1099
|
+
const validator = new Validator(
|
|
1100
|
+
{
|
|
1101
|
+
field_1: '#abc',
|
|
1102
|
+
field_2: '#abcd',
|
|
1103
|
+
field_3: '#abcabc',
|
|
1104
|
+
field_4: '#abcdabcd',
|
|
1105
|
+
},
|
|
1106
|
+
{
|
|
1107
|
+
field_1: 'hex_color',
|
|
1108
|
+
field_2: 'hex_color',
|
|
1109
|
+
field_3: 'hex_color',
|
|
1110
|
+
field_4: 'hex_color',
|
|
1111
|
+
},
|
|
1112
|
+
);
|
|
1273
1113
|
|
|
1274
1114
|
assert(await validator.passes());
|
|
1275
1115
|
});
|
|
1276
1116
|
|
|
1277
1117
|
it(`Fails when the field is not a valid color`, async () => {
|
|
1278
|
-
const validator = new Validator(
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1118
|
+
const validator = new Validator(
|
|
1119
|
+
{
|
|
1120
|
+
field_1: '#ghi',
|
|
1121
|
+
field_2: '#ghij',
|
|
1122
|
+
field_3: '#ghighi',
|
|
1123
|
+
field_4: '#ghijghij',
|
|
1124
|
+
field_5: 'abc',
|
|
1125
|
+
field_6: 123,
|
|
1126
|
+
field_7: [1, 2, 3],
|
|
1127
|
+
},
|
|
1128
|
+
{
|
|
1129
|
+
field_1: 'hex_color',
|
|
1130
|
+
field_2: 'hex_color',
|
|
1131
|
+
field_3: 'hex_color',
|
|
1132
|
+
field_4: 'hex_color',
|
|
1133
|
+
field_5: 'hex_color',
|
|
1134
|
+
field_6: 'hex_color',
|
|
1135
|
+
field_7: 'hex_color',
|
|
1136
|
+
},
|
|
1137
|
+
);
|
|
1295
1138
|
|
|
1296
1139
|
assert(await validator.fails());
|
|
1297
1140
|
});
|
|
1298
1141
|
|
|
1299
1142
|
it(`Fails when the color's value is not 3, 4, 6 or 8 digits.`, async () => {
|
|
1300
|
-
const validator = new Validator(
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1143
|
+
const validator = new Validator(
|
|
1144
|
+
{
|
|
1145
|
+
field_1: '#1',
|
|
1146
|
+
field_2: '#12',
|
|
1147
|
+
field_3: '#12345',
|
|
1148
|
+
field_4: '#1234567',
|
|
1149
|
+
field_4: '#123456789',
|
|
1150
|
+
},
|
|
1151
|
+
{
|
|
1152
|
+
field_1: 'hex_color',
|
|
1153
|
+
field_2: 'hex_color',
|
|
1154
|
+
field_3: 'hex_color',
|
|
1155
|
+
field_4: 'hex_color',
|
|
1156
|
+
},
|
|
1157
|
+
);
|
|
1312
1158
|
|
|
1313
1159
|
assert(await validator.fails());
|
|
1314
1160
|
});
|
|
@@ -1487,6 +1333,26 @@ describe('Validation', () => {
|
|
|
1487
1333
|
});
|
|
1488
1334
|
});
|
|
1489
1335
|
|
|
1336
|
+
describe(`Rule 'list'`, () => {
|
|
1337
|
+
const rules = { field: 'list' };
|
|
1338
|
+
|
|
1339
|
+
it(`Passes when the field is a list`, async () => {
|
|
1340
|
+
const validator = new Validator({ field: [1, 2, 3] }, rules);
|
|
1341
|
+
assert(await validator.passes());
|
|
1342
|
+
});
|
|
1343
|
+
|
|
1344
|
+
it(`Fails when the field is not a list`, async () => {
|
|
1345
|
+
const validator = new Validator({ field: { a: 1, b: 2, c: 3 } }, rules);
|
|
1346
|
+
assert(await validator.fails());
|
|
1347
|
+
|
|
1348
|
+
validator.setData({ field: 123 });
|
|
1349
|
+
assert(await validator.fails());
|
|
1350
|
+
|
|
1351
|
+
validator.setData({ field: 'abc' });
|
|
1352
|
+
assert(await validator.fails());
|
|
1353
|
+
});
|
|
1354
|
+
});
|
|
1355
|
+
|
|
1490
1356
|
describe(`Rule 'lowercase'`, () => {
|
|
1491
1357
|
const rules = { field: 'lowercase' };
|
|
1492
1358
|
|