ejv 2.1.3 → 2.1.5
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/README-KR.md +47 -1
- package/README.md +47 -0
- package/build/cjs/constants.js +10 -0
- package/build/cjs/constants.js.map +1 -1
- package/build/cjs/ejv.js +83 -4
- package/build/cjs/ejv.js.map +1 -1
- package/build/cjs/interfaces.js.map +1 -1
- package/build/cjs/package.json +1 -1
- package/build/cjs/tester.js +145 -125
- package/build/cjs/tester.js.map +1 -1
- package/build/cjs/util.js +15 -16
- package/build/cjs/util.js.map +1 -1
- package/build/constants.d.ts +11 -1
- package/build/ejv.d.ts +1 -1
- package/build/esm/constants.js +10 -0
- package/build/esm/constants.js.map +1 -1
- package/build/esm/ejv.js +83 -3
- package/build/esm/ejv.js.map +1 -1
- package/build/esm/interfaces.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/tester.js +93 -76
- package/build/esm/tester.js.map +1 -1
- package/build/esm/util.js +8 -8
- package/build/esm/util.js.map +1 -1
- package/build/interfaces.d.ts +7 -1
- package/build/scripts/create-package-json.js +13 -0
- package/build/scripts/create-package-json.js.map +1 -0
- package/build/tester.d.ts +38 -34
- package/build/util.d.ts +5 -5
- package/eslint.config.mjs +1 -0
- package/package.json +18 -19
- package/scripts/create-package-json.ts +15 -0
- package/spec/ArrayScheme.ts +113 -12
- package/spec/BufferScheme.ts +406 -0
- package/spec/DateScheme.ts +12 -8
- package/spec/NumberScheme.ts +23 -14
- package/spec/ObjectScheme.ts +12 -9
- package/spec/RegExpScheme.ts +2 -2
- package/spec/StringScheme.ts +34 -18
- package/spec/common-test-util.ts +13 -10
- package/spec/testers.spec.ts +35 -1
- package/src/constants.ts +14 -1
- package/src/ejv.ts +109 -2
- package/src/interfaces.ts +13 -1
- package/src/tester.ts +99 -77
- package/src/util.ts +9 -9
package/src/tester.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DATA_TYPE } from './constants';
|
|
2
|
-
import { AnyObject } from './interfaces';
|
|
2
|
+
import { AnyObject, BufferLike } from './interfaces';
|
|
3
3
|
|
|
4
|
-
export
|
|
4
|
+
export function typeTester (value: unknown, type: DATA_TYPE): boolean {
|
|
5
5
|
let valid: boolean;
|
|
6
6
|
|
|
7
7
|
switch (type) {
|
|
@@ -32,72 +32,88 @@ export const typeTester = (value: unknown, type: DATA_TYPE): boolean => {
|
|
|
32
32
|
case DATA_TYPE.ARRAY:
|
|
33
33
|
valid = arrayTester(value);
|
|
34
34
|
break;
|
|
35
|
+
|
|
36
|
+
case DATA_TYPE.BUFFER:
|
|
37
|
+
valid = bufferTester(value);
|
|
38
|
+
break;
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
return valid;
|
|
38
|
-
}
|
|
42
|
+
}
|
|
39
43
|
|
|
40
|
-
export
|
|
44
|
+
export function definedTester (value: unknown): value is boolean {
|
|
41
45
|
return value !== undefined;
|
|
42
|
-
}
|
|
46
|
+
}
|
|
43
47
|
|
|
44
|
-
export
|
|
48
|
+
export function enumTester<T> (value: T, arr: T[]): boolean {
|
|
45
49
|
return arr.includes(value);
|
|
46
|
-
}
|
|
50
|
+
}
|
|
47
51
|
|
|
48
|
-
export
|
|
52
|
+
export function notEnumTester<T> (value: T, arr: T[]): boolean {
|
|
49
53
|
return !enumTester(value, arr);
|
|
50
|
-
}
|
|
54
|
+
}
|
|
51
55
|
|
|
52
|
-
export
|
|
56
|
+
export function lengthTester (value: string | unknown[], length: number): boolean {
|
|
53
57
|
return value.length === length;
|
|
54
|
-
}
|
|
58
|
+
}
|
|
55
59
|
|
|
56
|
-
export
|
|
60
|
+
export function minLengthTester (value: string | unknown[], minLength: number): boolean {
|
|
57
61
|
return value.length >= minLength;
|
|
58
|
-
}
|
|
62
|
+
}
|
|
59
63
|
|
|
60
|
-
export
|
|
64
|
+
export function maxLengthTester (value: string | unknown[], maxLength: number): boolean {
|
|
61
65
|
return value.length <= maxLength;
|
|
62
|
-
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function bufferLengthTester (value: BufferLike, length: number): boolean {
|
|
69
|
+
return value.byteLength === length;
|
|
70
|
+
}
|
|
63
71
|
|
|
64
|
-
export
|
|
72
|
+
export function minByteLengthTester (value: BufferLike, minLength: number): boolean {
|
|
73
|
+
return value.byteLength >= minLength;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function maxByteLengthTester (value: BufferLike, maxLength: number): boolean {
|
|
77
|
+
return value.byteLength <= maxLength;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function booleanTester (value: unknown): value is boolean {
|
|
65
81
|
return typeof value === 'boolean';
|
|
66
|
-
}
|
|
82
|
+
}
|
|
67
83
|
|
|
68
|
-
export
|
|
84
|
+
export function numberTester (value: unknown): value is number {
|
|
69
85
|
return typeof value === 'number' && !isNaN(value);
|
|
70
|
-
}
|
|
86
|
+
}
|
|
71
87
|
|
|
72
|
-
export
|
|
88
|
+
export function integerTester (value: number): boolean {
|
|
73
89
|
return +value.toFixed(0) === value;
|
|
74
|
-
}
|
|
90
|
+
}
|
|
75
91
|
|
|
76
|
-
export
|
|
92
|
+
export function indexTester (value: number): value is number {
|
|
77
93
|
return integerTester(value) && value >= 0;
|
|
78
|
-
}
|
|
94
|
+
}
|
|
79
95
|
|
|
80
|
-
export
|
|
96
|
+
export function minNumberTester (value: number, min: number): boolean {
|
|
81
97
|
return value >= min;
|
|
82
|
-
}
|
|
98
|
+
}
|
|
83
99
|
|
|
84
|
-
export
|
|
100
|
+
export function exclusiveMinNumberTester (value: number, min: number): boolean {
|
|
85
101
|
return value > min;
|
|
86
|
-
}
|
|
102
|
+
}
|
|
87
103
|
|
|
88
|
-
export
|
|
104
|
+
export function maxNumberTester (value: number, max: number): boolean {
|
|
89
105
|
return value <= max;
|
|
90
|
-
}
|
|
106
|
+
}
|
|
91
107
|
|
|
92
|
-
export
|
|
108
|
+
export function exclusiveMaxNumberTester (value: number, max: number): boolean {
|
|
93
109
|
return value < max;
|
|
94
|
-
}
|
|
110
|
+
}
|
|
95
111
|
|
|
96
|
-
export
|
|
112
|
+
export function stringTester (value: unknown): value is string {
|
|
97
113
|
return typeof value === 'string';
|
|
98
|
-
}
|
|
114
|
+
}
|
|
99
115
|
|
|
100
|
-
export
|
|
116
|
+
export function stringRegExpTester (value: string, regExp: string | RegExp): boolean {
|
|
101
117
|
let valid = false;
|
|
102
118
|
|
|
103
119
|
let _regExp: RegExp | undefined = undefined;
|
|
@@ -114,18 +130,18 @@ export const stringRegExpTester = (value: string, regExp: string | RegExp): bool
|
|
|
114
130
|
}
|
|
115
131
|
|
|
116
132
|
return valid;
|
|
117
|
-
}
|
|
133
|
+
}
|
|
118
134
|
|
|
119
135
|
// RFC 5322, 3.4.1. spec
|
|
120
|
-
export
|
|
136
|
+
export function emailTester (value: string): boolean {
|
|
121
137
|
let valid = false;
|
|
122
138
|
|
|
123
139
|
if (stringTester(value) && stringRegExpTester(value, /^.+@.+$/)) {
|
|
124
140
|
const valueAsString: string = value as string;
|
|
125
141
|
|
|
126
142
|
const atIndex: number = valueAsString.lastIndexOf('@');
|
|
127
|
-
const localPart: string = valueAsString.
|
|
128
|
-
const domain: string = valueAsString.
|
|
143
|
+
const localPart: string = valueAsString.substring(0, atIndex);
|
|
144
|
+
const domain: string = valueAsString.substring(atIndex + 1);
|
|
129
145
|
|
|
130
146
|
// regular expression sources
|
|
131
147
|
// const aTextRegExpStr : string = '[-a-zA-Z0-9!#$%&\\\'*+/=?^_`{|}~]+';
|
|
@@ -150,9 +166,9 @@ export const emailTester = (value: string): boolean => {
|
|
|
150
166
|
}
|
|
151
167
|
|
|
152
168
|
return valid;
|
|
153
|
-
}
|
|
169
|
+
}
|
|
154
170
|
|
|
155
|
-
export
|
|
171
|
+
export function jsonStrTester (value: string): boolean {
|
|
156
172
|
try {
|
|
157
173
|
JSON.parse(value);
|
|
158
174
|
|
|
@@ -161,14 +177,14 @@ export const jsonStrTester = (value: string): boolean => {
|
|
|
161
177
|
catch (e: unknown) { // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
162
178
|
return false;
|
|
163
179
|
}
|
|
164
|
-
}
|
|
180
|
+
}
|
|
165
181
|
|
|
166
182
|
// RFC 3339 (https://www.ietf.org/rfc/rfc3339.txt) : YYYY-MM-DDThh:mm:ss[.SSSZ]
|
|
167
|
-
|
|
183
|
+
function rfc3339Tester (value: string): boolean {
|
|
168
184
|
return /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3])(:([0-5][0-9])){2}(\.\d+)?(Z|[-+]\d{2}:\d{2})?$/.test(value);
|
|
169
|
-
}
|
|
185
|
+
}
|
|
170
186
|
|
|
171
|
-
|
|
187
|
+
function iso8601DateTester (value: string): boolean {
|
|
172
188
|
const years = '(\\d{4})';
|
|
173
189
|
const months = '(0[1-9]|1[0-2])';
|
|
174
190
|
const dates = '(0[1-9]|[1-2][0-9]|3[0-1])';
|
|
@@ -187,9 +203,9 @@ const iso8601DateTester = (value: string): boolean => {
|
|
|
187
203
|
].some((regExp: RegExp): boolean => {
|
|
188
204
|
return regExp.test(value);
|
|
189
205
|
});
|
|
190
|
-
}
|
|
206
|
+
}
|
|
191
207
|
|
|
192
|
-
|
|
208
|
+
function iso8601TimeTester (value: string): boolean {
|
|
193
209
|
const hours = '([0-1]\\d|2[0-3])';
|
|
194
210
|
const minutes = '([0-5]\\d)';
|
|
195
211
|
const seconds = '([0-5]\\d|60)'; // 60 for leap second
|
|
@@ -208,9 +224,9 @@ const iso8601TimeTester = (value: string): boolean => {
|
|
|
208
224
|
.some((regExp: RegExp): boolean => {
|
|
209
225
|
return regExp.test(value);
|
|
210
226
|
});
|
|
211
|
-
}
|
|
227
|
+
}
|
|
212
228
|
|
|
213
|
-
|
|
229
|
+
function iso8601DateTimeTester (value: string): boolean {
|
|
214
230
|
let valid = false;
|
|
215
231
|
|
|
216
232
|
if (/.+T.+/.test(value) // should have 1 'T'
|
|
@@ -235,19 +251,19 @@ const iso8601DateTimeTester = (value: string): boolean => {
|
|
|
235
251
|
}
|
|
236
252
|
|
|
237
253
|
return valid;
|
|
238
|
-
}
|
|
254
|
+
}
|
|
239
255
|
|
|
240
|
-
export
|
|
256
|
+
export function dateFormatTester (value: string): boolean {
|
|
241
257
|
return iso8601DateTester(value);
|
|
242
|
-
}
|
|
258
|
+
}
|
|
243
259
|
|
|
244
|
-
export
|
|
260
|
+
export function timeFormatTester (value: string): boolean {
|
|
245
261
|
return iso8601TimeTester(value);
|
|
246
|
-
}
|
|
262
|
+
}
|
|
247
263
|
|
|
248
|
-
export
|
|
264
|
+
export function dateTimeFormatTester (value: string): boolean {
|
|
249
265
|
return rfc3339Tester(value) || iso8601DateTimeTester(value);
|
|
250
|
-
}
|
|
266
|
+
}
|
|
251
267
|
|
|
252
268
|
// // with port
|
|
253
269
|
// export const urlTester = (value : any) : boolean => {
|
|
@@ -270,54 +286,60 @@ export const dateTimeFormatTester = (value: string): boolean => {
|
|
|
270
286
|
// return ipv4Tester(value) || ipv6Tester(value);
|
|
271
287
|
// };
|
|
272
288
|
|
|
273
|
-
export
|
|
289
|
+
export function objectTester (value: unknown): boolean {
|
|
274
290
|
return typeof value === 'object';
|
|
275
|
-
}
|
|
291
|
+
}
|
|
276
292
|
|
|
277
|
-
export
|
|
293
|
+
export function hasPropertyTester (value: AnyObject): boolean {
|
|
278
294
|
return Object.keys(value).length > 0;
|
|
279
|
-
}
|
|
295
|
+
}
|
|
280
296
|
|
|
281
|
-
export
|
|
297
|
+
export function dateTester (value: unknown): value is Date {
|
|
282
298
|
return objectTester(value)
|
|
283
299
|
&& value !== null
|
|
284
300
|
&& typeof value === 'object'
|
|
285
301
|
&& value instanceof Date
|
|
286
302
|
&& !isNaN(value.getFullYear());
|
|
287
|
-
}
|
|
303
|
+
}
|
|
288
304
|
|
|
289
|
-
export
|
|
305
|
+
export function minDateTester (value: Date, min: Date): boolean {
|
|
290
306
|
return +value >= +min;
|
|
291
|
-
}
|
|
307
|
+
}
|
|
292
308
|
|
|
293
|
-
export
|
|
309
|
+
export function exclusiveMinDateTester (value: Date, min: Date): boolean {
|
|
294
310
|
return +value > +min;
|
|
295
|
-
}
|
|
311
|
+
}
|
|
296
312
|
|
|
297
|
-
export
|
|
313
|
+
export function maxDateTester (value: Date, max: Date): boolean {
|
|
298
314
|
return +value <= +max;
|
|
299
|
-
}
|
|
315
|
+
}
|
|
300
316
|
|
|
301
|
-
export
|
|
317
|
+
export function exclusiveMaxDateTester (value: Date, max: Date): boolean {
|
|
302
318
|
return +value < +max;
|
|
303
|
-
}
|
|
319
|
+
}
|
|
304
320
|
|
|
305
|
-
export
|
|
321
|
+
export function arrayTester (value: unknown): value is unknown[] {
|
|
306
322
|
return Array.isArray(value);
|
|
307
|
-
}
|
|
323
|
+
}
|
|
308
324
|
|
|
309
|
-
export
|
|
325
|
+
export function arrayTypeOfTester (array: unknown[], type: DATA_TYPE): boolean {
|
|
310
326
|
return array.every((item: unknown): boolean => {
|
|
311
327
|
return typeTester(item, type);
|
|
312
328
|
});
|
|
313
|
-
}
|
|
329
|
+
}
|
|
314
330
|
|
|
315
|
-
export
|
|
331
|
+
export function uniqueItemsTester (array: unknown[]): boolean {
|
|
316
332
|
return array.every((item: unknown): boolean => {
|
|
317
333
|
return array.filter((target: unknown): boolean => target === item).length === 1;
|
|
318
334
|
});
|
|
319
|
-
}
|
|
335
|
+
}
|
|
320
336
|
|
|
321
|
-
export
|
|
337
|
+
export function regExpTester (value: unknown): value is RegExp {
|
|
322
338
|
return value instanceof RegExp;
|
|
323
|
-
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export function bufferTester (value: unknown): value is BufferLike {
|
|
342
|
+
return (ArrayBuffer.isView(value) && !(value instanceof DataView)) // normally buffer, ex. Uint8Array, Uint16Array, ...
|
|
343
|
+
|| value instanceof ArrayBuffer
|
|
344
|
+
|| (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer);
|
|
345
|
+
}
|
package/src/util.ts
CHANGED
|
@@ -14,15 +14,15 @@ enum CloneDataType {
|
|
|
14
14
|
RegExp = 'regexp'
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export
|
|
17
|
+
export function isArray<T> (value: unknown): value is T[] {
|
|
18
18
|
return value !== undefined
|
|
19
19
|
&& value !== null
|
|
20
20
|
&& Array.isArray(value);
|
|
21
|
-
}
|
|
21
|
+
}
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
// sanitize removes undefined & null fields from object. default false
|
|
25
|
-
export
|
|
25
|
+
export function clone<T> (obj: T, sanitize?: boolean): T {
|
|
26
26
|
let result !: T;
|
|
27
27
|
|
|
28
28
|
if (obj) {
|
|
@@ -90,10 +90,10 @@ export const clone = <T> (obj: T, sanitize?: boolean): T => {
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
return result;
|
|
93
|
-
}
|
|
93
|
+
}
|
|
94
94
|
|
|
95
95
|
|
|
96
|
-
export
|
|
96
|
+
export function sift<T> (arr: T[]): T[] {
|
|
97
97
|
return arr.reduce((acc: T[], cur: T) => {
|
|
98
98
|
if (cur !== null && cur !== undefined && !acc.includes(cur)) {
|
|
99
99
|
acc.push(cur);
|
|
@@ -101,12 +101,12 @@ export const sift = <T> (arr: T[]): T[] => {
|
|
|
101
101
|
|
|
102
102
|
return acc;
|
|
103
103
|
}, []);
|
|
104
|
-
}
|
|
104
|
+
}
|
|
105
105
|
|
|
106
106
|
|
|
107
|
-
export
|
|
107
|
+
export function createErrorMsg (errorMsg: ERROR_MESSAGE, param?: {
|
|
108
108
|
placeholders?: (string | number)[]
|
|
109
|
-
}): string
|
|
109
|
+
}): string {
|
|
110
110
|
let result: string = errorMsg;
|
|
111
111
|
|
|
112
112
|
if (param?.placeholders) {
|
|
@@ -121,4 +121,4 @@ export const createErrorMsg = (errorMsg: ERROR_MESSAGE, param?: {
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
return result;
|
|
124
|
-
}
|
|
124
|
+
}
|