ejv 2.0.5 → 2.1.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.
Files changed (57) hide show
  1. package/.mocharc.json +1 -1
  2. package/CHANGELOG.md +18 -0
  3. package/README-KR.md +166 -165
  4. package/README.md +182 -178
  5. package/eslint.config.mjs +59 -0
  6. package/package.json +18 -13
  7. package/spec/ArrayScheme.ts +46 -46
  8. package/spec/CommonScheme.ts +15 -15
  9. package/spec/DateScheme.ts +22 -22
  10. package/spec/NumberScheme.ts +229 -121
  11. package/spec/ObjectScheme.ts +22 -22
  12. package/spec/RegExpScheme.ts +5 -5
  13. package/spec/StringScheme.ts +223 -126
  14. package/spec/common-test-util.ts +2 -2
  15. package/spec/ejv.spec.ts +20 -20
  16. package/spec/testers.spec.ts +5 -5
  17. package/src/constants.ts +12 -5
  18. package/src/ejv.ts +291 -202
  19. package/src/index.ts +1 -1
  20. package/src/interfaces.ts +11 -12
  21. package/src/tester.ts +14 -10
  22. package/src/util.ts +2 -2
  23. package/.eslintrc.json +0 -88
  24. package/build/cjs/constants.js +0 -118
  25. package/build/cjs/constants.js.map +0 -1
  26. package/build/cjs/ejv.js +0 -1270
  27. package/build/cjs/ejv.js.map +0 -1
  28. package/build/cjs/index.js +0 -14
  29. package/build/cjs/index.js.map +0 -1
  30. package/build/cjs/interfaces.js +0 -29
  31. package/build/cjs/interfaces.js.map +0 -1
  32. package/build/cjs/package.json +0 -1
  33. package/build/cjs/tester.js +0 -274
  34. package/build/cjs/tester.js.map +0 -1
  35. package/build/cjs/util.js +0 -103
  36. package/build/cjs/util.js.map +0 -1
  37. package/build/constants.d.ts +0 -101
  38. package/build/ejv.d.ts +0 -2
  39. package/build/esm/constants.js +0 -115
  40. package/build/esm/constants.js.map +0 -1
  41. package/build/esm/ejv.js +0 -1268
  42. package/build/esm/ejv.js.map +0 -1
  43. package/build/esm/index.js +0 -4
  44. package/build/esm/index.js.map +0 -1
  45. package/build/esm/interfaces.js +0 -33
  46. package/build/esm/interfaces.js.map +0 -1
  47. package/build/esm/package.json +0 -1
  48. package/build/esm/tester.js +0 -240
  49. package/build/esm/tester.js.map +0 -1
  50. package/build/esm/util.js +0 -96
  51. package/build/esm/util.js.map +0 -1
  52. package/build/index.d.ts +0 -3
  53. package/build/interfaces.d.ts +0 -76
  54. package/build/scripts/add-js-extensions.js +0 -46
  55. package/build/scripts/add-js-extensions.js.map +0 -1
  56. package/build/tester.d.ts +0 -33
  57. package/build/util.d.ts +0 -7
package/build/cjs/ejv.js DELETED
@@ -1,1270 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ejv = void 0;
4
- const interfaces_1 = require("./interfaces.js");
5
- const constants_1 = require("./constants.js");
6
- const tester_1 = require("./tester.js");
7
- const util_1 = require("./util.js");
8
- function _getEffectiveTypes(scheme) {
9
- let result;
10
- if ((0, tester_1.definedTester)(scheme.type)) {
11
- result = ((0, tester_1.arrayTester)(scheme.type)
12
- ? scheme.type
13
- : [scheme.type]);
14
- }
15
- else if ((0, tester_1.definedTester)(scheme.parent)) {
16
- result = _getEffectiveTypes(scheme.parent);
17
- }
18
- return result;
19
- }
20
- const _ejv = (data, schemes, options) => {
21
- var _a, _b, _c, _d, _e;
22
- // check schemes
23
- if (!(0, tester_1.definedTester)(schemes) || schemes === null) {
24
- return new interfaces_1.EjvError({
25
- type: constants_1.ErrorType.NO_SCHEME,
26
- message: constants_1.ErrorMsg.NO_SCHEME,
27
- data: data,
28
- errorScheme: schemes,
29
- isSchemeError: true
30
- });
31
- }
32
- if (!(0, tester_1.arrayTester)(schemes)) {
33
- return new interfaces_1.EjvError({
34
- type: constants_1.ErrorType.INVALID_SCHEMES,
35
- message: constants_1.ErrorMsg.NO_ARRAY_SCHEME,
36
- data: data,
37
- errorScheme: schemes,
38
- isSchemeError: true
39
- });
40
- }
41
- if (!(0, tester_1.arrayTypeOfTester)(schemes, constants_1.DataType.OBJECT)) {
42
- return new interfaces_1.EjvError({
43
- type: constants_1.ErrorType.INVALID_SCHEMES,
44
- message: constants_1.ErrorMsg.NO_OBJECT_ARRAY_SCHEME,
45
- data: data,
46
- errorScheme: schemes,
47
- isSchemeError: true
48
- });
49
- }
50
- if (!(0, tester_1.minLengthTester)(schemes, 1)) {
51
- return new interfaces_1.EjvError({
52
- type: constants_1.ErrorType.INVALID_SCHEMES,
53
- message: constants_1.ErrorMsg.EMPTY_SCHEME,
54
- data: data,
55
- errorScheme: schemes,
56
- isSchemeError: true
57
- });
58
- }
59
- // check data by schemes
60
- let result = null;
61
- // use for() instead of forEach() to stop
62
- for (const scheme of schemes) {
63
- const key = scheme.key;
64
- const _options = (0, util_1.clone)(options); // divide instance
65
- let value;
66
- if (key) {
67
- value = data[key];
68
- _options.path.push(key);
69
- }
70
- const types = _getEffectiveTypes(scheme);
71
- if (!(0, tester_1.definedTester)(types)) {
72
- return new interfaces_1.EjvError({
73
- type: constants_1.ErrorType.INVALID_SCHEMES,
74
- message: constants_1.ErrorMsg.SCHEMES_SHOULD_HAVE_TYPE,
75
- data: data,
76
- errorScheme: scheme,
77
- isSchemeError: true
78
- });
79
- }
80
- const allDataType = Object.values(constants_1.DataType);
81
- const typeError = types.find((type) => {
82
- return !(0, tester_1.definedTester)(type)
83
- || !(0, tester_1.stringTester)(type)
84
- || !(0, tester_1.enumTester)(type, allDataType);
85
- });
86
- if (typeError) {
87
- return new interfaces_1.EjvError({
88
- type: constants_1.ErrorType.INVALID_SCHEMES,
89
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.SCHEMES_HAS_INVALID_TYPE, {
90
- placeholders: [typeError]
91
- }),
92
- data: data,
93
- errorScheme: scheme,
94
- isSchemeError: true
95
- });
96
- }
97
- if (!(0, tester_1.uniqueItemsTester)(types)) {
98
- const notUniqueItems = types.filter((type) => {
99
- return types.filter((_type) => _type === type).length > 1;
100
- });
101
- const notUniqueItemsSifted = (0, util_1.sift)(notUniqueItems);
102
- return new interfaces_1.EjvError({
103
- type: constants_1.ErrorType.INVALID_SCHEMES,
104
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.SCHEMES_HAS_DUPLICATED_TYPE, {
105
- placeholders: [notUniqueItemsSifted.join(', ')]
106
- }),
107
- data: data,
108
- errorScheme: scheme,
109
- isSchemeError: true
110
- });
111
- }
112
- if (!(0, tester_1.definedTester)(value)) {
113
- if (scheme.optional !== true) {
114
- result = new interfaces_1.EjvError({
115
- type: constants_1.ErrorType.REQUIRED,
116
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.REQUIRED),
117
- data,
118
- path: _options.path,
119
- errorScheme: scheme,
120
- errorData: value
121
- });
122
- break;
123
- }
124
- else {
125
- continue;
126
- }
127
- }
128
- if (value === null) {
129
- if (scheme.nullable !== true) {
130
- result = new interfaces_1.EjvError({
131
- type: constants_1.ErrorType.REQUIRED,
132
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.REQUIRED),
133
- data,
134
- path: _options.path,
135
- errorScheme: scheme,
136
- errorData: value
137
- });
138
- break;
139
- }
140
- else {
141
- continue;
142
- }
143
- }
144
- const typeResolved = types.find((type) => {
145
- return (0, tester_1.typeTester)(value, type);
146
- });
147
- if (typeResolved) {
148
- if ((0, tester_1.definedTester)(scheme.type)) {
149
- if (!(0, tester_1.arrayTester)(scheme.type)) {
150
- if (scheme.type !== typeResolved) {
151
- result = new interfaces_1.EjvError({
152
- type: constants_1.ErrorType.TYPE_MISMATCH,
153
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.TYPE_MISMATCH, {
154
- placeholders: [scheme.type]
155
- }),
156
- data,
157
- path: _options.path,
158
- errorScheme: scheme,
159
- errorData: value
160
- });
161
- }
162
- }
163
- else {
164
- if (!scheme.type.includes(typeResolved)) {
165
- result = new interfaces_1.EjvError({
166
- type: constants_1.ErrorType.TYPE_MISMATCH_ONE_OF,
167
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.TYPE_MISMATCH_ONE_OF, {
168
- placeholders: [JSON.stringify(scheme.type)]
169
- }),
170
- data,
171
- path: _options.path,
172
- errorScheme: scheme,
173
- errorData: value
174
- });
175
- }
176
- }
177
- }
178
- // else do additional validation
179
- }
180
- else {
181
- // type is not resolved
182
- const typesForMsg = scheme.type || ((_a = scheme.parent) === null || _a === void 0 ? void 0 : _a.type);
183
- if (!(0, tester_1.arrayTester)(typesForMsg)) {
184
- result = new interfaces_1.EjvError({
185
- type: constants_1.ErrorType.TYPE_MISMATCH,
186
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.TYPE_MISMATCH, {
187
- placeholders: [typesForMsg]
188
- }),
189
- data,
190
- path: _options.path,
191
- errorScheme: scheme,
192
- errorData: value
193
- });
194
- }
195
- else {
196
- result = new interfaces_1.EjvError({
197
- type: constants_1.ErrorType.TYPE_MISMATCH_ONE_OF,
198
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.TYPE_MISMATCH_ONE_OF, {
199
- placeholders: [JSON.stringify(typesForMsg)]
200
- }),
201
- data,
202
- path: _options.path,
203
- errorScheme: scheme,
204
- errorData: value
205
- });
206
- }
207
- break;
208
- }
209
- // additional check for type resolved
210
- switch (typeResolved) {
211
- case constants_1.DataType.NUMBER: {
212
- const valueAsNumber = value;
213
- const numberScheme = scheme;
214
- if ((0, tester_1.definedTester)(numberScheme.enum)) {
215
- if (!(0, tester_1.arrayTester)(numberScheme.enum)) {
216
- return new interfaces_1.EjvError({
217
- type: constants_1.ErrorType.INVALID_SCHEMES,
218
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ENUM_SHOULD_BE_ARRAY),
219
- data: data,
220
- errorScheme: numberScheme,
221
- isSchemeError: true
222
- });
223
- }
224
- const enumArr = numberScheme.enum;
225
- if (!(0, tester_1.arrayTypeOfTester)(enumArr, constants_1.DataType.NUMBER)) {
226
- return new interfaces_1.EjvError({
227
- type: constants_1.ErrorType.INVALID_SCHEMES,
228
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ENUM_SHOULD_BE_NUMBERS),
229
- data: data,
230
- errorScheme: numberScheme,
231
- isSchemeError: true
232
- });
233
- }
234
- if (!(0, tester_1.enumTester)(valueAsNumber, enumArr)) {
235
- result = new interfaces_1.EjvError({
236
- type: constants_1.ErrorType.ONE_VALUE_OF,
237
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ONE_VALUE_OF, {
238
- placeholders: [JSON.stringify(enumArr)]
239
- }),
240
- data,
241
- path: _options.path,
242
- errorScheme: numberScheme,
243
- errorData: value
244
- });
245
- break;
246
- }
247
- }
248
- if ((0, tester_1.definedTester)(numberScheme.min)
249
- || (0, tester_1.definedTester)((_b = scheme.parent) === null || _b === void 0 ? void 0 : _b.min)) {
250
- const effectiveMin = (0, tester_1.definedTester)(numberScheme.min)
251
- ? numberScheme.min
252
- : (_c = scheme.parent) === null || _c === void 0 ? void 0 : _c.min;
253
- if (!(0, tester_1.numberTester)(effectiveMin)) {
254
- return new interfaces_1.EjvError({
255
- type: constants_1.ErrorType.INVALID_SCHEMES,
256
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MIN_SHOULD_BE_NUMBER),
257
- data: data,
258
- errorScheme: numberScheme,
259
- isSchemeError: true
260
- });
261
- }
262
- if ((0, tester_1.definedTester)(numberScheme.exclusiveMin)) {
263
- if (!(0, tester_1.booleanTester)(numberScheme.exclusiveMin)) {
264
- return new interfaces_1.EjvError({
265
- type: constants_1.ErrorType.INVALID_SCHEMES,
266
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.EXCLUSIVE_MIN_SHOULD_BE_BOOLEAN),
267
- data: data,
268
- errorScheme: numberScheme,
269
- isSchemeError: true
270
- });
271
- }
272
- }
273
- if (numberScheme.exclusiveMin) {
274
- if (!(0, tester_1.exclusiveMinNumberTester)(valueAsNumber, effectiveMin)) {
275
- result = new interfaces_1.EjvError({
276
- type: constants_1.ErrorType.BIGGER_THAN,
277
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.BIGGER_THAN, {
278
- placeholders: [effectiveMin]
279
- }),
280
- data,
281
- path: _options.path,
282
- errorScheme: numberScheme,
283
- errorData: value
284
- });
285
- break;
286
- }
287
- }
288
- else {
289
- if (!(0, tester_1.minNumberTester)(valueAsNumber, effectiveMin)) {
290
- result = new interfaces_1.EjvError({
291
- type: constants_1.ErrorType.BIGGER_THAN_OR_EQUAL,
292
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.BIGGER_THAN_OR_EQUAL, {
293
- placeholders: [effectiveMin]
294
- }),
295
- data,
296
- path: _options.path,
297
- errorScheme: numberScheme,
298
- errorData: value
299
- });
300
- break;
301
- }
302
- }
303
- }
304
- if ((0, tester_1.definedTester)(numberScheme.max)
305
- || (0, tester_1.definedTester)((_d = scheme.parent) === null || _d === void 0 ? void 0 : _d.max)) {
306
- const effectiveMax = (0, tester_1.definedTester)(numberScheme.max)
307
- ? numberScheme.max
308
- : (_e = scheme.parent) === null || _e === void 0 ? void 0 : _e.max;
309
- if (!(0, tester_1.numberTester)(effectiveMax)) {
310
- return new interfaces_1.EjvError({
311
- type: constants_1.ErrorType.INVALID_SCHEMES,
312
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MAX_SHOULD_BE_NUMBER),
313
- data: data,
314
- errorScheme: numberScheme,
315
- isSchemeError: true
316
- });
317
- }
318
- if ((0, tester_1.definedTester)(numberScheme.exclusiveMax)) {
319
- if (!(0, tester_1.booleanTester)(numberScheme.exclusiveMax)) {
320
- return new interfaces_1.EjvError({
321
- type: constants_1.ErrorType.INVALID_SCHEMES,
322
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.EXCLUSIVE_MAX_SHOULD_BE_BOOLEAN),
323
- data: data,
324
- errorScheme: numberScheme,
325
- isSchemeError: true
326
- });
327
- }
328
- }
329
- if (numberScheme.exclusiveMax) {
330
- if (!(0, tester_1.exclusiveMaxNumberTester)(valueAsNumber, effectiveMax)) {
331
- result = new interfaces_1.EjvError({
332
- type: constants_1.ErrorType.SMALLER_THAN,
333
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.SMALLER_THAN, {
334
- placeholders: [effectiveMax]
335
- }),
336
- data,
337
- path: _options.path,
338
- errorScheme: numberScheme,
339
- errorData: value
340
- });
341
- break;
342
- }
343
- }
344
- else {
345
- if (!(0, tester_1.maxNumberTester)(valueAsNumber, effectiveMax)) {
346
- result = new interfaces_1.EjvError({
347
- type: constants_1.ErrorType.SMALLER_THAN_OR_EQUAL,
348
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.SMALLER_THAN_OR_EQUAL, {
349
- placeholders: [effectiveMax]
350
- }),
351
- data,
352
- path: _options.path,
353
- errorScheme: numberScheme,
354
- errorData: value
355
- });
356
- break;
357
- }
358
- }
359
- }
360
- if ((0, tester_1.definedTester)(numberScheme.format)) {
361
- let formats;
362
- const allNumberFormat = Object.values(constants_1.NumberFormat);
363
- if (!(0, tester_1.arrayTester)(numberScheme.format)) {
364
- const formatAsString = numberScheme.format;
365
- if (!(0, tester_1.enumTester)(formatAsString, allNumberFormat)) {
366
- return new interfaces_1.EjvError({
367
- type: constants_1.ErrorType.INVALID_SCHEMES,
368
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_NUMBER_FORMAT, {
369
- placeholders: [formatAsString]
370
- }),
371
- data: data,
372
- errorScheme: numberScheme,
373
- isSchemeError: true
374
- });
375
- }
376
- formats = [numberScheme.format];
377
- }
378
- else {
379
- const formatAsArray = numberScheme.format;
380
- const errorFormat = formatAsArray.find((format) => {
381
- return !(0, tester_1.enumTester)(format, allNumberFormat);
382
- });
383
- if (errorFormat) {
384
- return new interfaces_1.EjvError({
385
- type: constants_1.ErrorType.INVALID_SCHEMES,
386
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_NUMBER_FORMAT, {
387
- placeholders: [errorFormat]
388
- }),
389
- data: data,
390
- errorScheme: numberScheme,
391
- isSchemeError: true
392
- });
393
- }
394
- formats = numberScheme.format;
395
- }
396
- const someFormatIsWrong = formats.some((format) => {
397
- let valid = false;
398
- switch (format) {
399
- case constants_1.NumberFormat.INTEGER:
400
- valid = (0, tester_1.integerTester)(valueAsNumber);
401
- break;
402
- case constants_1.NumberFormat.INDEX:
403
- valid = (0, tester_1.indexTester)(valueAsNumber);
404
- break;
405
- }
406
- return valid;
407
- });
408
- if (!someFormatIsWrong) {
409
- if (!(0, tester_1.arrayTester)(numberScheme.format)) {
410
- result = new interfaces_1.EjvError({
411
- type: constants_1.ErrorType.FORMAT,
412
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.FORMAT, {
413
- placeholders: [numberScheme.format]
414
- }),
415
- data,
416
- path: _options.path,
417
- errorScheme: numberScheme,
418
- errorData: value
419
- });
420
- }
421
- else {
422
- result = new interfaces_1.EjvError({
423
- type: constants_1.ErrorType.FORMAT_ONE_OF,
424
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.FORMAT_ONE_OF, {
425
- placeholders: [JSON.stringify(numberScheme.format)]
426
- }),
427
- data,
428
- path: _options.path,
429
- errorScheme: numberScheme,
430
- errorData: value
431
- });
432
- }
433
- break;
434
- }
435
- }
436
- break;
437
- }
438
- case constants_1.DataType.STRING: {
439
- const valueAsString = value;
440
- const stringScheme = scheme;
441
- if ((0, tester_1.definedTester)(stringScheme.enum)) {
442
- if (!(0, tester_1.arrayTester)(stringScheme.enum)) {
443
- return new interfaces_1.EjvError({
444
- type: constants_1.ErrorType.INVALID_SCHEMES,
445
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ENUM_SHOULD_BE_ARRAY),
446
- data: data,
447
- errorScheme: stringScheme,
448
- isSchemeError: true
449
- });
450
- }
451
- const enumArr = stringScheme.enum;
452
- if (!(0, tester_1.arrayTypeOfTester)(enumArr, constants_1.DataType.STRING)) {
453
- return new interfaces_1.EjvError({
454
- type: constants_1.ErrorType.INVALID_SCHEMES,
455
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ENUM_SHOULD_BE_STRINGS),
456
- data: data,
457
- errorScheme: stringScheme,
458
- isSchemeError: true
459
- });
460
- }
461
- if (!(0, tester_1.enumTester)(valueAsString, enumArr)) {
462
- result = new interfaces_1.EjvError({
463
- type: constants_1.ErrorType.ONE_VALUE_OF,
464
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ONE_VALUE_OF, {
465
- placeholders: [JSON.stringify(stringScheme.enum)]
466
- }),
467
- data,
468
- path: _options.path,
469
- errorScheme: stringScheme,
470
- errorData: value
471
- });
472
- break;
473
- }
474
- }
475
- if ((0, tester_1.definedTester)(stringScheme.length)) {
476
- const length = stringScheme.length;
477
- if (!((0, tester_1.numberTester)(length) && (0, tester_1.integerTester)(length))) {
478
- return new interfaces_1.EjvError({
479
- type: constants_1.ErrorType.INVALID_SCHEMES,
480
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.LENGTH_SHOULD_BE_INTEGER),
481
- data: data,
482
- errorScheme: stringScheme,
483
- isSchemeError: true
484
- });
485
- }
486
- if (!(0, tester_1.lengthTester)(valueAsString, length)) {
487
- result = new interfaces_1.EjvError({
488
- type: constants_1.ErrorType.LENGTH,
489
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.LENGTH, {
490
- placeholders: [length]
491
- }),
492
- data,
493
- path: _options.path,
494
- errorScheme: stringScheme,
495
- errorData: value
496
- });
497
- break;
498
- }
499
- }
500
- if ((0, tester_1.definedTester)(stringScheme.minLength)) {
501
- const minLength = stringScheme.minLength;
502
- if (!((0, tester_1.numberTester)(minLength) && (0, tester_1.integerTester)(minLength))) {
503
- return new interfaces_1.EjvError({
504
- type: constants_1.ErrorType.INVALID_SCHEMES,
505
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MIN_LENGTH_SHOULD_BE_INTEGER),
506
- data: data,
507
- errorScheme: stringScheme,
508
- isSchemeError: true
509
- });
510
- }
511
- if (!(0, tester_1.minLengthTester)(valueAsString, minLength)) {
512
- result = new interfaces_1.EjvError({
513
- type: constants_1.ErrorType.MIN_LENGTH,
514
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MIN_LENGTH, {
515
- placeholders: ['' + minLength]
516
- }),
517
- data,
518
- path: _options.path,
519
- errorScheme: stringScheme,
520
- errorData: value
521
- });
522
- break;
523
- }
524
- }
525
- if ((0, tester_1.definedTester)(stringScheme.maxLength)) {
526
- const maxLength = stringScheme.maxLength;
527
- if (!((0, tester_1.numberTester)(maxLength) && (0, tester_1.integerTester)(maxLength))) {
528
- return new interfaces_1.EjvError({
529
- type: constants_1.ErrorType.INVALID_SCHEMES,
530
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MAX_LENGTH_SHOULD_BE_INTEGER),
531
- data: data,
532
- errorScheme: stringScheme,
533
- isSchemeError: true
534
- });
535
- }
536
- if (!(0, tester_1.maxLengthTester)(valueAsString, maxLength)) {
537
- result = new interfaces_1.EjvError({
538
- type: constants_1.ErrorType.MAX_LENGTH,
539
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MAX_LENGTH, {
540
- placeholders: ['' + maxLength]
541
- }),
542
- data,
543
- path: _options.path,
544
- errorScheme: stringScheme,
545
- errorData: value
546
- });
547
- break;
548
- }
549
- }
550
- if ((0, tester_1.definedTester)(stringScheme.format)) {
551
- let formats;
552
- const allStringFormat = Object.values(constants_1.StringFormat);
553
- if (!(0, tester_1.arrayTester)(stringScheme.format)) {
554
- const formatAsString = stringScheme.format;
555
- if (!(0, tester_1.enumTester)(formatAsString, allStringFormat)) {
556
- return new interfaces_1.EjvError({
557
- type: constants_1.ErrorType.INVALID_SCHEMES,
558
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_STRING_FORMAT, {
559
- placeholders: [formatAsString]
560
- }),
561
- data: data,
562
- errorScheme: stringScheme,
563
- isSchemeError: true
564
- });
565
- }
566
- formats = [stringScheme.format];
567
- }
568
- else {
569
- const formatAsArray = stringScheme.format;
570
- const errorFormat = formatAsArray.find((format) => {
571
- return !(0, tester_1.enumTester)(format, allStringFormat);
572
- });
573
- if (errorFormat) {
574
- return new interfaces_1.EjvError({
575
- type: constants_1.ErrorType.INVALID_SCHEMES,
576
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_STRING_FORMAT, {
577
- placeholders: [errorFormat]
578
- }),
579
- data: data,
580
- errorScheme: stringScheme,
581
- isSchemeError: true
582
- });
583
- }
584
- formats = stringScheme.format;
585
- }
586
- const foundFormatMatching = formats.some((format) => {
587
- let valid = false;
588
- switch (format) {
589
- case constants_1.StringFormat.EMAIL:
590
- valid = (0, tester_1.emailTester)(valueAsString);
591
- break;
592
- case constants_1.StringFormat.DATE:
593
- valid = (0, tester_1.dateFormatTester)(valueAsString);
594
- break;
595
- case constants_1.StringFormat.TIME:
596
- valid = (0, tester_1.timeFormatTester)(valueAsString);
597
- break;
598
- case constants_1.StringFormat.DATE_TIME:
599
- valid = (0, tester_1.dateTimeFormatTester)(valueAsString);
600
- break;
601
- }
602
- return valid;
603
- });
604
- if (!foundFormatMatching) {
605
- if (!(0, tester_1.arrayTester)(stringScheme.format)) {
606
- result = new interfaces_1.EjvError({
607
- type: constants_1.ErrorType.FORMAT,
608
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.FORMAT, {
609
- placeholders: [stringScheme.format]
610
- }),
611
- data,
612
- path: _options.path,
613
- errorScheme: stringScheme,
614
- errorData: value
615
- });
616
- }
617
- else {
618
- result = new interfaces_1.EjvError({
619
- type: constants_1.ErrorType.FORMAT_ONE_OF,
620
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.FORMAT_ONE_OF, {
621
- placeholders: [JSON.stringify(stringScheme.format)]
622
- }),
623
- data,
624
- path: _options.path,
625
- errorScheme: stringScheme,
626
- errorData: value
627
- });
628
- }
629
- break;
630
- }
631
- }
632
- if ((0, tester_1.definedTester)(stringScheme.pattern)) {
633
- // check parameter
634
- if (stringScheme.pattern === null) {
635
- return new interfaces_1.EjvError({
636
- type: constants_1.ErrorType.INVALID_SCHEMES,
637
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_STRING_PATTERN, {
638
- placeholders: ['null']
639
- }),
640
- data: data,
641
- errorScheme: stringScheme,
642
- isSchemeError: true
643
- });
644
- }
645
- const isValidPattern = (pattern) => {
646
- return ((0, tester_1.stringTester)(pattern) && (0, tester_1.minLengthTester)(pattern, 1))
647
- || ((0, tester_1.regExpTester)(pattern) && pattern.toString() !== '/(?:)/' && pattern.toString() !== '/null/');
648
- };
649
- const patternToString = (pattern) => {
650
- let regExpStr;
651
- if (pattern === null) {
652
- regExpStr = '/null/';
653
- }
654
- else if ((0, tester_1.stringTester)(pattern)) {
655
- if ((0, tester_1.minLengthTester)(pattern, 1)) {
656
- regExpStr = new RegExp(pattern).toString();
657
- }
658
- else {
659
- regExpStr = '//';
660
- }
661
- }
662
- else {
663
- regExpStr = pattern.toString();
664
- }
665
- // empty regular expression
666
- if (regExpStr === '/(?:)/') {
667
- regExpStr = '//';
668
- }
669
- return regExpStr;
670
- };
671
- const createArrayErrorMsg = (patternsAsArray) => {
672
- return '[' + patternsAsArray.map((onePattern) => {
673
- return patternToString(onePattern);
674
- }).join(', ') + ']';
675
- };
676
- if ((0, tester_1.arrayTester)(stringScheme.pattern)) {
677
- const patternsAsArray = stringScheme.pattern;
678
- if (!(0, tester_1.minLengthTester)(patternsAsArray, 1)) { // empty array
679
- return new interfaces_1.EjvError({
680
- type: constants_1.ErrorType.INVALID_SCHEMES,
681
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_STRING_PATTERN, {
682
- placeholders: [createArrayErrorMsg(patternsAsArray)]
683
- }),
684
- data: data,
685
- errorScheme: stringScheme,
686
- isSchemeError: true
687
- });
688
- }
689
- try {
690
- const regExpPatterns = patternsAsArray.map((pattern) => {
691
- if (!isValidPattern(pattern)) {
692
- throw new Error((0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_STRING_PATTERN, {
693
- placeholders: [createArrayErrorMsg(patternsAsArray)]
694
- }));
695
- }
696
- return new RegExp(pattern);
697
- });
698
- // check value
699
- const foundMatchPattern = regExpPatterns.some((regexp) => {
700
- return (0, tester_1.stringRegExpTester)(valueAsString, regexp);
701
- });
702
- if (!foundMatchPattern) {
703
- result = new interfaces_1.EjvError({
704
- type: constants_1.ErrorType.PATTERN_ONE_OF,
705
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.PATTERN_ONE_OF, {
706
- placeholders: [createArrayErrorMsg(patternsAsArray)]
707
- }),
708
- data,
709
- path: _options.path,
710
- errorScheme: stringScheme,
711
- errorData: value
712
- });
713
- break;
714
- }
715
- }
716
- catch (e) {
717
- return new interfaces_1.EjvError({
718
- type: constants_1.ErrorType.INVALID_SCHEMES,
719
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_STRING_PATTERN, {
720
- placeholders: [createArrayErrorMsg(patternsAsArray)]
721
- }),
722
- data: data,
723
- errorScheme: stringScheme,
724
- isSchemeError: true
725
- });
726
- }
727
- }
728
- else {
729
- const patternAsOne = stringScheme.pattern;
730
- if (!isValidPattern(patternAsOne)) {
731
- return new interfaces_1.EjvError({
732
- type: constants_1.ErrorType.INVALID_SCHEMES,
733
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_STRING_PATTERN, {
734
- placeholders: [patternToString(patternAsOne)]
735
- }),
736
- data: data,
737
- errorScheme: stringScheme,
738
- isSchemeError: true
739
- });
740
- }
741
- // check value
742
- const regExp = new RegExp(patternAsOne);
743
- if (!(0, tester_1.stringRegExpTester)(valueAsString, regExp)) {
744
- result = new interfaces_1.EjvError({
745
- type: constants_1.ErrorType.PATTERN,
746
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.PATTERN, {
747
- placeholders: [patternToString(patternAsOne)]
748
- }),
749
- data,
750
- path: _options.path,
751
- errorScheme: stringScheme,
752
- errorData: value
753
- });
754
- break;
755
- }
756
- }
757
- }
758
- break;
759
- }
760
- case constants_1.DataType.OBJECT: {
761
- const valueAsObject = value;
762
- const objectScheme = scheme;
763
- if ((0, tester_1.definedTester)(objectScheme.allowNoProperty)) {
764
- if (!(0, tester_1.booleanTester)(objectScheme.allowNoProperty)) {
765
- return new interfaces_1.EjvError({
766
- type: constants_1.ErrorType.INVALID_SCHEMES,
767
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ALLOW_NO_PROPERTY_SHOULD_BE_BOOLEAN),
768
- data: data,
769
- errorScheme: objectScheme,
770
- isSchemeError: true
771
- });
772
- }
773
- if (!objectScheme.allowNoProperty && !(0, tester_1.hasPropertyTester)(valueAsObject)) {
774
- result = new interfaces_1.EjvError({
775
- type: constants_1.ErrorType.PROPERTY,
776
- message: constants_1.ErrorMsg.PROPERTY,
777
- data,
778
- path: _options.path,
779
- errorScheme: objectScheme,
780
- errorData: value
781
- });
782
- break;
783
- }
784
- }
785
- if ((0, tester_1.definedTester)(objectScheme.properties)) {
786
- if (!(0, tester_1.arrayTester)(objectScheme.properties)) {
787
- return new interfaces_1.EjvError({
788
- type: constants_1.ErrorType.INVALID_SCHEMES,
789
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.PROPERTIES_SHOULD_BE_ARRAY),
790
- data: data,
791
- errorScheme: objectScheme,
792
- isSchemeError: true
793
- });
794
- }
795
- const properties = objectScheme.properties;
796
- if (!(0, tester_1.minLengthTester)(properties, 1)) {
797
- return new interfaces_1.EjvError({
798
- type: constants_1.ErrorType.INVALID_SCHEMES,
799
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.PROPERTIES_SHOULD_HAVE_ITEMS),
800
- data: data,
801
- errorScheme: objectScheme,
802
- isSchemeError: true
803
- });
804
- }
805
- if (!(0, tester_1.arrayTypeOfTester)(properties, constants_1.DataType.OBJECT)) {
806
- return new interfaces_1.EjvError({
807
- type: constants_1.ErrorType.INVALID_SCHEMES,
808
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.PROPERTIES_SHOULD_BE_ARRAY_OF_OBJECT),
809
- data: data,
810
- errorScheme: objectScheme,
811
- isSchemeError: true
812
- });
813
- }
814
- if (!(0, tester_1.objectTester)(value)) {
815
- result = new interfaces_1.EjvError({
816
- type: constants_1.ErrorType.TYPE_MISMATCH,
817
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.TYPE_MISMATCH, {
818
- placeholders: ['object']
819
- }),
820
- data,
821
- path: _options.path,
822
- errorScheme: objectScheme,
823
- errorData: value
824
- });
825
- break;
826
- }
827
- const partialData = data[key];
828
- const partialScheme = objectScheme.properties;
829
- scheme.parent = objectScheme;
830
- // call recursively
831
- result = _ejv(partialData, partialScheme, _options);
832
- if (result) {
833
- // inject original data
834
- result.data = data;
835
- }
836
- }
837
- break;
838
- }
839
- case constants_1.DataType.DATE: {
840
- const valueAsDate = value;
841
- const dateScheme = scheme;
842
- const parentDateScheme = scheme.parent;
843
- if ((0, tester_1.definedTester)(dateScheme.min)
844
- || (0, tester_1.definedTester)(parentDateScheme === null || parentDateScheme === void 0 ? void 0 : parentDateScheme.min)) {
845
- const minDateCandidate = dateScheme.min || (parentDateScheme === null || parentDateScheme === void 0 ? void 0 : parentDateScheme.min);
846
- if (!(((0, tester_1.stringTester)(minDateCandidate)
847
- && ((0, tester_1.dateFormatTester)(minDateCandidate)
848
- || (0, tester_1.dateTimeFormatTester)(minDateCandidate)))
849
- || (0, tester_1.dateTester)(minDateCandidate))) {
850
- return new interfaces_1.EjvError({
851
- type: constants_1.ErrorType.INVALID_SCHEMES,
852
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MIN_DATE_SHOULD_BE_DATE_OR_STRING),
853
- data: data,
854
- errorScheme: dateScheme,
855
- isSchemeError: true
856
- });
857
- }
858
- const effectiveMin = new Date(minDateCandidate);
859
- if ((0, tester_1.definedTester)(dateScheme.exclusiveMin)) {
860
- if (!(0, tester_1.booleanTester)(dateScheme.exclusiveMin)) {
861
- return new interfaces_1.EjvError({
862
- type: constants_1.ErrorType.INVALID_SCHEMES,
863
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.EXCLUSIVE_MIN_SHOULD_BE_BOOLEAN),
864
- data: data,
865
- errorScheme: dateScheme,
866
- isSchemeError: true
867
- });
868
- }
869
- if (dateScheme.exclusiveMin) {
870
- if (!(0, tester_1.exclusiveMinDateTester)(valueAsDate, effectiveMin)) {
871
- result = new interfaces_1.EjvError({
872
- type: constants_1.ErrorType.AFTER_DATE,
873
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.AFTER_DATE, {
874
- placeholders: [effectiveMin.toISOString()]
875
- }),
876
- data,
877
- path: _options.path,
878
- errorScheme: dateScheme,
879
- errorData: value
880
- });
881
- break;
882
- }
883
- }
884
- else {
885
- if (!(0, tester_1.minDateTester)(valueAsDate, effectiveMin)) {
886
- result = new interfaces_1.EjvError({
887
- type: constants_1.ErrorType.AFTER_OR_SAME_DATE,
888
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.AFTER_OR_SAME_DATE, {
889
- placeholders: [effectiveMin.toISOString()]
890
- }),
891
- data,
892
- path: _options.path,
893
- errorScheme: dateScheme,
894
- errorData: value
895
- });
896
- break;
897
- }
898
- }
899
- }
900
- else {
901
- if (!(0, tester_1.minDateTester)(valueAsDate, effectiveMin)) {
902
- result = new interfaces_1.EjvError({
903
- type: constants_1.ErrorType.AFTER_OR_SAME_DATE,
904
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.AFTER_OR_SAME_DATE, {
905
- placeholders: [effectiveMin.toISOString()]
906
- }),
907
- data,
908
- path: _options.path,
909
- errorScheme: dateScheme,
910
- errorData: value
911
- });
912
- break;
913
- }
914
- }
915
- }
916
- if ((0, tester_1.definedTester)(dateScheme.max)
917
- || (0, tester_1.definedTester)(parentDateScheme === null || parentDateScheme === void 0 ? void 0 : parentDateScheme.max)) {
918
- const maxDateCandidate = dateScheme.max || (parentDateScheme === null || parentDateScheme === void 0 ? void 0 : parentDateScheme.max);
919
- if (!(((0, tester_1.stringTester)(maxDateCandidate)
920
- && ((0, tester_1.dateFormatTester)(maxDateCandidate)
921
- || (0, tester_1.dateTimeFormatTester)(maxDateCandidate)))
922
- || (0, tester_1.dateTester)(maxDateCandidate))) {
923
- return new interfaces_1.EjvError({
924
- type: constants_1.ErrorType.INVALID_SCHEMES,
925
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MAX_DATE_SHOULD_BE_DATE_OR_STRING),
926
- data: data,
927
- errorScheme: dateScheme,
928
- isSchemeError: true
929
- });
930
- }
931
- const effectiveMax = new Date(maxDateCandidate);
932
- if ((0, tester_1.definedTester)(dateScheme.exclusiveMax)) {
933
- if (!(0, tester_1.booleanTester)(dateScheme.exclusiveMax)) {
934
- return new interfaces_1.EjvError({
935
- type: constants_1.ErrorType.INVALID_SCHEMES,
936
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.EXCLUSIVE_MAX_SHOULD_BE_BOOLEAN),
937
- data: data,
938
- errorScheme: dateScheme,
939
- isSchemeError: true
940
- });
941
- }
942
- }
943
- if (dateScheme.exclusiveMax) {
944
- if (!(0, tester_1.exclusiveMaxDateTester)(valueAsDate, effectiveMax)) {
945
- result = new interfaces_1.EjvError({
946
- type: constants_1.ErrorType.BEFORE_DATE,
947
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.BEFORE_DATE, {
948
- placeholders: [effectiveMax.toISOString()]
949
- }),
950
- data,
951
- path: _options.path,
952
- errorScheme: dateScheme,
953
- errorData: value
954
- });
955
- break;
956
- }
957
- }
958
- else {
959
- if (!(0, tester_1.maxDateTester)(valueAsDate, effectiveMax)) {
960
- result = new interfaces_1.EjvError({
961
- type: constants_1.ErrorType.BEFORE_OR_SAME_DATE,
962
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.BEFORE_OR_SAME_DATE, {
963
- placeholders: [effectiveMax.toISOString()]
964
- }),
965
- data,
966
- path: _options.path,
967
- errorScheme: dateScheme,
968
- errorData: value
969
- });
970
- break;
971
- }
972
- }
973
- }
974
- break;
975
- }
976
- case constants_1.DataType.ARRAY: {
977
- const valueAsArray = value;
978
- const arrayScheme = scheme;
979
- if ((0, tester_1.definedTester)(arrayScheme.length)) {
980
- const length = arrayScheme.length;
981
- if (!((0, tester_1.numberTester)(length) && (0, tester_1.integerTester)(length))) {
982
- return new interfaces_1.EjvError({
983
- type: constants_1.ErrorType.INVALID_SCHEMES,
984
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.LENGTH_SHOULD_BE_INTEGER),
985
- data: data,
986
- errorScheme: arrayScheme,
987
- isSchemeError: true
988
- });
989
- }
990
- if (!(0, tester_1.lengthTester)(valueAsArray, length)) {
991
- result = new interfaces_1.EjvError({
992
- type: constants_1.ErrorType.LENGTH,
993
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.LENGTH, {
994
- placeholders: ['' + length]
995
- }),
996
- data,
997
- path: _options.path,
998
- errorScheme: arrayScheme,
999
- errorData: value
1000
- });
1001
- break;
1002
- }
1003
- }
1004
- if ((0, tester_1.definedTester)(arrayScheme.minLength)) {
1005
- const minLength = arrayScheme.minLength;
1006
- if (!((0, tester_1.numberTester)(arrayScheme.minLength) && (0, tester_1.integerTester)(minLength))) {
1007
- return new interfaces_1.EjvError({
1008
- type: constants_1.ErrorType.INVALID_SCHEMES,
1009
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MIN_LENGTH_SHOULD_BE_INTEGER),
1010
- data: data,
1011
- errorScheme: arrayScheme,
1012
- isSchemeError: true
1013
- });
1014
- }
1015
- if (!(0, tester_1.minLengthTester)(valueAsArray, minLength)) {
1016
- result = new interfaces_1.EjvError({
1017
- type: constants_1.ErrorType.MIN_LENGTH,
1018
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MIN_LENGTH, {
1019
- placeholders: ['' + minLength]
1020
- }),
1021
- data,
1022
- path: _options.path,
1023
- errorScheme: arrayScheme,
1024
- errorData: value
1025
- });
1026
- break;
1027
- }
1028
- }
1029
- if ((0, tester_1.definedTester)(arrayScheme.maxLength)) {
1030
- const maxLength = arrayScheme.maxLength;
1031
- if (!((0, tester_1.numberTester)(arrayScheme.maxLength) && (0, tester_1.integerTester)(maxLength))) {
1032
- return new interfaces_1.EjvError({
1033
- type: constants_1.ErrorType.INVALID_SCHEMES,
1034
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MAX_LENGTH_SHOULD_BE_INTEGER),
1035
- data: data,
1036
- errorScheme: arrayScheme,
1037
- isSchemeError: true
1038
- });
1039
- }
1040
- if (!(0, tester_1.maxLengthTester)(valueAsArray, maxLength)) {
1041
- result = new interfaces_1.EjvError({
1042
- type: constants_1.ErrorType.MAX_LENGTH,
1043
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.MAX_LENGTH, {
1044
- placeholders: ['' + maxLength]
1045
- }),
1046
- data,
1047
- path: _options.path,
1048
- errorScheme: arrayScheme,
1049
- errorData: value
1050
- });
1051
- break;
1052
- }
1053
- }
1054
- if ((0, tester_1.definedTester)(arrayScheme.unique)) {
1055
- if (!(0, tester_1.booleanTester)(arrayScheme.unique)) {
1056
- return new interfaces_1.EjvError({
1057
- type: constants_1.ErrorType.INVALID_SCHEMES,
1058
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.UNIQUE_SHOULD_BE_BOOLEAN),
1059
- data: data,
1060
- errorScheme: arrayScheme,
1061
- isSchemeError: true
1062
- });
1063
- }
1064
- if (arrayScheme.unique && !(0, tester_1.uniqueItemsTester)(valueAsArray)) {
1065
- result = new interfaces_1.EjvError({
1066
- type: constants_1.ErrorType.UNIQUE_ITEMS,
1067
- message: constants_1.ErrorMsg.UNIQUE_ITEMS,
1068
- data,
1069
- path: _options.path,
1070
- errorScheme: arrayScheme,
1071
- errorData: value
1072
- });
1073
- break;
1074
- }
1075
- }
1076
- if ((0, tester_1.definedTester)(arrayScheme.items)) {
1077
- // convert array to object
1078
- if (valueAsArray.length > 0) {
1079
- const now = new Date();
1080
- const tempKeyArr = valueAsArray.map((_value, i) => {
1081
- return '' + (+now + i);
1082
- });
1083
- if ((0, tester_1.stringTester)(arrayScheme.items) // by DataType
1084
- || ((0, tester_1.arrayTester)(arrayScheme.items) && (0, tester_1.arrayTypeOfTester)(arrayScheme.items, constants_1.DataType.STRING)) // by DataType[]
1085
- ) {
1086
- const itemTypes = ((0, tester_1.arrayTester)(arrayScheme.items)
1087
- ? arrayScheme.items
1088
- : [arrayScheme.items]);
1089
- const itemTypeError = itemTypes.find((type) => {
1090
- return !(0, tester_1.definedTester)(type)
1091
- || !(0, tester_1.stringTester)(type)
1092
- || !(0, tester_1.enumTester)(type, allDataType);
1093
- });
1094
- if (itemTypeError) {
1095
- return new interfaces_1.EjvError({
1096
- type: constants_1.ErrorType.INVALID_SCHEMES,
1097
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.SCHEMES_HAS_INVALID_TYPE, {
1098
- placeholders: [itemTypeError]
1099
- }),
1100
- data: data,
1101
- errorScheme: scheme,
1102
- isSchemeError: true
1103
- });
1104
- }
1105
- const partialData = {};
1106
- const partialSchemes = [];
1107
- tempKeyArr.forEach((tempKey, i) => {
1108
- partialData[tempKey] = valueAsArray[i];
1109
- partialSchemes.push({
1110
- key: tempKey,
1111
- type: itemTypes
1112
- });
1113
- });
1114
- scheme.parent = arrayScheme;
1115
- // call recursively
1116
- const partialResult = _ejv(partialData, partialSchemes, _options);
1117
- // convert new EjvError
1118
- if (partialResult) {
1119
- let errorMsg;
1120
- if ((0, tester_1.arrayTester)(arrayScheme.items)) {
1121
- errorMsg = (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ITEMS_TYPE, {
1122
- placeholders: [JSON.stringify(itemTypes)]
1123
- });
1124
- }
1125
- else {
1126
- errorMsg = (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ITEMS_TYPE, {
1127
- placeholders: [arrayScheme.items]
1128
- });
1129
- }
1130
- const partialKeys = (partialResult.path || '').split('/');
1131
- const partialKey = partialKeys[partialKeys.length - 1];
1132
- const partialScheme = partialSchemes.find((_scheme) => {
1133
- return _scheme.key === partialKey;
1134
- });
1135
- const partialKeyIndex = partialSchemes.indexOf(partialScheme);
1136
- result = new interfaces_1.EjvError({
1137
- type: constants_1.ErrorType.ITEMS_TYPE,
1138
- message: errorMsg,
1139
- data,
1140
- path: [..._options.path, '' + partialKeyIndex],
1141
- errorScheme: partialScheme,
1142
- errorData: partialData[partialKey]
1143
- });
1144
- }
1145
- break;
1146
- }
1147
- else if (((0, tester_1.objectTester)(arrayScheme.items) && arrayScheme.items !== null) // by Scheme
1148
- || ((0, tester_1.arrayTester)(arrayScheme.items) && (0, tester_1.arrayTypeOfTester)(arrayScheme.items, constants_1.DataType.OBJECT)) // by Scheme[]
1149
- ) {
1150
- const itemsAsSchemes = (0, tester_1.arrayTester)(arrayScheme.items)
1151
- ? arrayScheme.items
1152
- : [arrayScheme.items];
1153
- let partialError = null;
1154
- // use for() instead of forEach() to break
1155
- const valueLength = valueAsArray.length;
1156
- for (let arrIndex = 0; arrIndex < valueLength; arrIndex++) {
1157
- const oneValue = valueAsArray[arrIndex];
1158
- const partialData = {};
1159
- const partialSchemes = [];
1160
- const tempKeyForThisValue = tempKeyArr[arrIndex];
1161
- partialData[tempKeyForThisValue] = oneValue;
1162
- partialSchemes.push(...itemsAsSchemes.map((oneScheme) => {
1163
- const newScheme = (0, util_1.clone)(oneScheme); // divide instance
1164
- newScheme.key = tempKeyForThisValue;
1165
- return newScheme;
1166
- }));
1167
- const partialResults = partialSchemes.map((partialScheme) => {
1168
- // call recursively
1169
- const partialResult = _ejv(partialData, [partialScheme], _options);
1170
- if (partialResult) {
1171
- partialResult.path = (partialResult.path || '').replace(tempKeyForThisValue, '' + arrIndex);
1172
- }
1173
- return partialResult;
1174
- });
1175
- if (!partialResults.some((oneResult) => oneResult === null)) {
1176
- partialError = partialResults.find((oneResult) => {
1177
- return !!oneResult;
1178
- });
1179
- break;
1180
- }
1181
- }
1182
- if (partialError) {
1183
- let errorType;
1184
- let errorMsg;
1185
- if (!!itemsAsSchemes && itemsAsSchemes.length > 1) {
1186
- errorType = constants_1.ErrorType.ITEMS_SCHEMES;
1187
- errorMsg = (0, util_1.createErrorMsg)(constants_1.ErrorMsg.ITEMS_SCHEMES, {
1188
- placeholders: [JSON.stringify(itemsAsSchemes)]
1189
- });
1190
- }
1191
- else {
1192
- errorType = partialError.type;
1193
- errorMsg = partialError.message;
1194
- if (errorType === constants_1.ErrorType.REQUIRED) {
1195
- // REQUIRED in array is TYPE_MISMATCH except with nullable === true
1196
- errorType = constants_1.ErrorType.TYPE_MISMATCH;
1197
- errorMsg = (0, util_1.createErrorMsg)(constants_1.ErrorMsg.TYPE_MISMATCH, {
1198
- placeholders: [JSON.stringify(arrayScheme.items)]
1199
- });
1200
- }
1201
- }
1202
- result = new interfaces_1.EjvError({
1203
- type: errorType,
1204
- message: errorMsg,
1205
- data
1206
- });
1207
- if (errorType === constants_1.ErrorType.INVALID_SCHEMES) {
1208
- result.errorScheme = arrayScheme;
1209
- result.isSchemeError = true;
1210
- result.isDataError = false;
1211
- }
1212
- else {
1213
- result.path = partialError.path;
1214
- result.errorData = partialError.errorData;
1215
- }
1216
- break;
1217
- }
1218
- }
1219
- else {
1220
- return new interfaces_1.EjvError({
1221
- type: constants_1.ErrorType.INVALID_SCHEMES,
1222
- message: (0, util_1.createErrorMsg)(constants_1.ErrorMsg.INVALID_ITEMS_SCHEME, {
1223
- placeholders: [JSON.stringify(arrayScheme.items)]
1224
- }),
1225
- data: data,
1226
- errorScheme: arrayScheme,
1227
- isSchemeError: true
1228
- });
1229
- }
1230
- }
1231
- }
1232
- break;
1233
- }
1234
- }
1235
- if (result) {
1236
- break;
1237
- }
1238
- }
1239
- if (result !== null && (0, tester_1.definedTester)(options.customErrorMsg)) {
1240
- const customErrorMsgObj = options.customErrorMsg;
1241
- // override error message
1242
- const customMsg = customErrorMsgObj[result.type];
1243
- if ((0, tester_1.definedTester)(customMsg)) {
1244
- result.message = customMsg;
1245
- }
1246
- }
1247
- return result;
1248
- };
1249
- const ejv = (data, schemes, options) => {
1250
- // check data itself
1251
- if (!(0, tester_1.definedTester)(data) || !(0, tester_1.objectTester)(data) || data === null) {
1252
- return new interfaces_1.EjvError({
1253
- type: constants_1.ErrorType.NO_DATA,
1254
- message: constants_1.ErrorMsg.NO_DATA,
1255
- data: data,
1256
- path: undefined,
1257
- errorScheme: undefined,
1258
- errorData: data,
1259
- isSchemeError: false
1260
- });
1261
- }
1262
- const internalOption = (options
1263
- ? Object.assign({}, options) : {});
1264
- if (!(0, tester_1.definedTester)(internalOption.path)) {
1265
- internalOption.path = [];
1266
- }
1267
- return _ejv(data, schemes, internalOption);
1268
- };
1269
- exports.ejv = ejv;
1270
- //# sourceMappingURL=ejv.js.map