ejv 1.1.11 → 2.0.1

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 (75) hide show
  1. package/.eslintrc.json +88 -0
  2. package/.mocharc.json +8 -0
  3. package/CHANGELOG.md +109 -68
  4. package/LICENSE +21 -21
  5. package/README-KR.md +596 -592
  6. package/README.md +599 -595
  7. package/build/{constants.js → cjs/constants.js} +45 -46
  8. package/build/cjs/constants.js.map +1 -0
  9. package/build/cjs/ejv.js +1263 -0
  10. package/build/cjs/ejv.js.map +1 -0
  11. package/build/{public_api.js → cjs/index.js} +4 -4
  12. package/build/cjs/index.js.map +1 -0
  13. package/build/cjs/interfaces.js +29 -0
  14. package/build/cjs/interfaces.js.map +1 -0
  15. package/build/cjs/package.json +1 -0
  16. package/build/{tester.js → cjs/tester.js} +88 -83
  17. package/build/cjs/tester.js.map +1 -0
  18. package/build/cjs/util.js +103 -0
  19. package/build/cjs/util.js.map +1 -0
  20. package/build/constants.d.ts +37 -40
  21. package/build/esm/constants.js +115 -0
  22. package/build/esm/constants.js.map +1 -0
  23. package/build/esm/ejv.js +1261 -0
  24. package/build/esm/ejv.js.map +1 -0
  25. package/build/esm/index.js +4 -0
  26. package/build/esm/index.js.map +1 -0
  27. package/build/esm/interfaces.js +33 -0
  28. package/build/esm/interfaces.js.map +1 -0
  29. package/build/esm/package.json +1 -0
  30. package/build/esm/tester.js +240 -0
  31. package/build/esm/tester.js.map +1 -0
  32. package/build/esm/util.js +96 -0
  33. package/build/esm/util.js.map +1 -0
  34. package/build/index.d.ts +3 -0
  35. package/build/interfaces.d.ts +51 -13
  36. package/build/scripts/add-js-extensions.js +46 -0
  37. package/build/scripts/add-js-extensions.js.map +1 -0
  38. package/build/tester.d.ts +16 -17
  39. package/build/util.d.ts +7 -1
  40. package/package.json +50 -39
  41. package/scripts/add-js-extensions.ts +59 -0
  42. package/spec/ArrayScheme.ts +1021 -0
  43. package/spec/CommonScheme.ts +251 -0
  44. package/spec/DateScheme.ts +472 -0
  45. package/spec/NumberScheme.ts +1032 -0
  46. package/spec/ObjectScheme.ts +499 -0
  47. package/spec/RegExpScheme.ts +112 -0
  48. package/spec/StringScheme.ts +1239 -0
  49. package/spec/common-test-util.ts +63 -0
  50. package/spec/ejv.spec.ts +209 -4634
  51. package/spec/testers.spec.ts +833 -832
  52. package/src/constants.ts +155 -156
  53. package/src/ejv.ts +1648 -1071
  54. package/src/index.ts +14 -0
  55. package/src/interfaces.ts +145 -63
  56. package/src/tester.ts +308 -302
  57. package/src/util.ts +124 -59
  58. package/tsconfig.cjs.json +8 -0
  59. package/tsconfig.esm.json +7 -0
  60. package/tsconfig.json +22 -19
  61. package/tsconfig.scripts.json +14 -0
  62. package/tsconfig.types.json +9 -0
  63. package/build/constants.js.map +0 -1
  64. package/build/ejv.js +0 -687
  65. package/build/ejv.js.map +0 -1
  66. package/build/interfaces.js +0 -15
  67. package/build/interfaces.js.map +0 -1
  68. package/build/public_api.d.ts +0 -3
  69. package/build/public_api.js.map +0 -1
  70. package/build/tester.js.map +0 -1
  71. package/build/util.js +0 -68
  72. package/build/util.js.map +0 -1
  73. package/spec/common-test-runner.ts +0 -17
  74. package/src/public_api.ts +0 -3
  75. package/tsconfig.spec.json +0 -19
@@ -0,0 +1,1032 @@
1
+ import { describe, it } from 'mocha';
2
+ import { expect } from 'chai';
3
+
4
+ import { ejv } from '../src/ejv';
5
+
6
+ import { EjvError, Scheme } from '../src/interfaces';
7
+ import { ErrorMsg, ErrorType } from '../src/constants';
8
+ import { createErrorMsg } from '../src/util';
9
+ import { checkSchemeError, TypeTester, typeTesterArr } from './common-test-util';
10
+
11
+
12
+ describe('NumberScheme', () => {
13
+ describe('type', () => {
14
+ describe('mismatch', () => {
15
+ typeTesterArr
16
+ .filter((obj: TypeTester): boolean => obj.type !== 'number')
17
+ .forEach((obj: TypeTester): void => {
18
+ const data = {
19
+ a: obj.value
20
+ };
21
+
22
+ it(obj.type, () => {
23
+ const error: EjvError | null = ejv(data, [{
24
+ key: 'a',
25
+ type: 'number'
26
+ }]);
27
+
28
+ expect(error).to.be.instanceof(EjvError);
29
+
30
+ if (!error) {
31
+ throw new Error('spec failed');
32
+ }
33
+
34
+ expect(error.type).to.be.eql(ErrorType.TYPE_MISMATCH);
35
+ expect(error.message).to.be.eql(createErrorMsg(ErrorMsg.TYPE_MISMATCH, {
36
+ placeholders: ['number']
37
+ }));
38
+ expect(error.path).to.be.eql('a');
39
+ expect(error.data).to.be.deep.equal(data);
40
+ expect(error.errorData).to.be.eql(obj.value);
41
+ });
42
+ });
43
+
44
+ it('multiple types', () => {
45
+ const value = 123;
46
+ const typeArr: string[] = ['boolean', 'string'];
47
+
48
+ const data = {
49
+ a: value
50
+ };
51
+
52
+ const error: EjvError | null = ejv(data, [{
53
+ key: 'a',
54
+ type: typeArr
55
+ }]);
56
+
57
+ expect(error).to.be.instanceof(EjvError);
58
+
59
+ if (!error) {
60
+ throw new Error('spec failed');
61
+ }
62
+
63
+ expect(error.type).to.be.eql(ErrorType.TYPE_MISMATCH_ONE_OF);
64
+ expect(error.message).to.be.eql(createErrorMsg(ErrorMsg.TYPE_MISMATCH_ONE_OF, {
65
+ placeholders: [JSON.stringify(typeArr)]
66
+ }));
67
+ expect(error.path).to.be.eql('a');
68
+ expect(error.data).to.be.deep.equal(data);
69
+ expect(error.errorData).to.be.eql(value);
70
+ });
71
+ });
72
+
73
+ describe('match', () => {
74
+ it('optional', () => {
75
+ expect(ejv({
76
+ a: undefined
77
+ }, [{
78
+ key: 'a',
79
+ type: 'number',
80
+ optional: true
81
+ }])).to.be.null;
82
+ });
83
+
84
+ it('single type', () => {
85
+ expect(ejv({
86
+ a: 123
87
+ }, [{
88
+ key: 'a',
89
+ type: 'number'
90
+ }])).to.be.null;
91
+ });
92
+
93
+ it('multiple types', () => {
94
+ expect(ejv({
95
+ a: 123
96
+ }, [{
97
+ key: 'a',
98
+ type: ['number', 'string']
99
+ }])).to.be.null;
100
+ });
101
+
102
+ it('multiple types', () => {
103
+ expect(ejv({
104
+ a: 123
105
+ }, [{
106
+ key: 'a',
107
+ type: ['string', 'number']
108
+ }])).to.be.null;
109
+ });
110
+ });
111
+ });
112
+
113
+ describe('enum', () => {
114
+ describe('check parameter', () => {
115
+ it('undefined is ok', () => {
116
+ expect(ejv({
117
+ a: 1
118
+ }, [{
119
+ key: 'a',
120
+ type: 'number',
121
+ enum: undefined
122
+ }])).to.be.null;
123
+ });
124
+
125
+ it('null', () => {
126
+ const data = {
127
+ a: 1
128
+ };
129
+
130
+ const errorScheme: Scheme = {
131
+ key: 'a',
132
+ type: 'number',
133
+ enum: null as unknown as number[]
134
+ };
135
+
136
+ checkSchemeError({
137
+ data,
138
+ errorScheme,
139
+ message: createErrorMsg(ErrorMsg.ENUM_SHOULD_BE_ARRAY)
140
+ });
141
+ });
142
+
143
+ it('not array', () => {
144
+ const data = {
145
+ a: 10
146
+ };
147
+
148
+ const errorScheme: Scheme = {
149
+ key: 'a',
150
+ type: 'number',
151
+ enum: 1 as unknown as number[]
152
+ };
153
+
154
+ checkSchemeError({
155
+ data,
156
+ errorScheme,
157
+ message: createErrorMsg(ErrorMsg.ENUM_SHOULD_BE_ARRAY)
158
+ });
159
+ });
160
+
161
+ it('not number', () => {
162
+ const data = {
163
+ a: 10
164
+ };
165
+
166
+ const errorScheme: Scheme = {
167
+ key: 'a',
168
+ type: 'number',
169
+ enum: ['10']
170
+ };
171
+
172
+ checkSchemeError({
173
+ data,
174
+ errorScheme,
175
+ message: createErrorMsg(ErrorMsg.ENUM_SHOULD_BE_NUMBERS)
176
+ });
177
+ });
178
+ });
179
+
180
+ it('fail', () => {
181
+ const enumArr: number[] = [9, 11];
182
+
183
+ const data = {
184
+ a: 10
185
+ };
186
+
187
+ const error: EjvError | null = ejv(data, [{
188
+ key: 'a',
189
+ type: 'number',
190
+ enum: enumArr
191
+ }]);
192
+
193
+ expect(error).to.be.instanceof(EjvError);
194
+
195
+ if (!error) {
196
+ throw new Error('spec failed');
197
+ }
198
+
199
+ expect(error.type).to.be.eql(ErrorType.ONE_VALUE_OF);
200
+ expect(error.message).to.be.eql(createErrorMsg(ErrorMsg.ONE_VALUE_OF, {
201
+ placeholders: [JSON.stringify(enumArr)]
202
+ }));
203
+ expect(error.path).to.be.eql('a');
204
+ expect(error.data).to.be.deep.equal(data);
205
+ expect(error.errorData).to.be.eql(10);
206
+ });
207
+
208
+ it('ok', () => {
209
+ expect(ejv({
210
+ a: 10
211
+ }, [{
212
+ key: 'a',
213
+ type: 'number',
214
+ enum: [9, 10, 11]
215
+ }])).to.be.null;
216
+ });
217
+ });
218
+
219
+ describe('min & exclusiveMin', () => {
220
+ describe('min only', () => {
221
+ describe('check parameter', () => {
222
+ it('undefined is ok', () => {
223
+ expect(ejv({
224
+ a: 1
225
+ }, [{
226
+ key: 'a',
227
+ type: 'number',
228
+ min: undefined
229
+ }])).to.be.null;
230
+ });
231
+
232
+ it('null', () => {
233
+ const data = {
234
+ a: 3
235
+ };
236
+
237
+ const errorScheme: Scheme = {
238
+ key: 'a',
239
+ type: 'number',
240
+ min: null as unknown as number
241
+ };
242
+
243
+ checkSchemeError({
244
+ data,
245
+ errorScheme,
246
+ message: createErrorMsg(ErrorMsg.MIN_SHOULD_BE_NUMBER)
247
+ });
248
+ });
249
+
250
+ it('min type', () => {
251
+ const data = {
252
+ a: 3
253
+ };
254
+
255
+ const errorScheme: Scheme = {
256
+ key: 'a',
257
+ type: 'number',
258
+ min: '3'
259
+ };
260
+
261
+ checkSchemeError({
262
+ data,
263
+ errorScheme,
264
+ message: createErrorMsg(ErrorMsg.MIN_SHOULD_BE_NUMBER)
265
+ });
266
+ });
267
+ });
268
+
269
+ it('ok', () => {
270
+ const error1: EjvError | null = ejv({
271
+ a: 9
272
+ }, [{
273
+ key: 'a',
274
+ type: 'number',
275
+ min: 10
276
+ }]);
277
+
278
+ expect(error1).to.be.instanceof(EjvError);
279
+
280
+ if (!error1) {
281
+ throw new Error('spec failed');
282
+ }
283
+
284
+ expect(error1.type).to.be.eql(ErrorType.BIGGER_THAN_OR_EQUAL);
285
+ expect(error1.message).to.be.eql(createErrorMsg(ErrorMsg.BIGGER_THAN_OR_EQUAL, {
286
+ placeholders: [10]
287
+ }));
288
+
289
+ expect(ejv({
290
+ a: 10
291
+ }, [{
292
+ key: 'a',
293
+ type: 'number',
294
+ min: 10
295
+ }])).to.be.null;
296
+
297
+ expect(ejv({
298
+ a: 11
299
+ }, [{
300
+ key: 'a',
301
+ type: 'number',
302
+ min: 10
303
+ }])).to.be.null;
304
+ });
305
+ });
306
+
307
+ describe('exclusiveMin', () => {
308
+ describe('check parameter', () => {
309
+ it('exclusiveMin type', () => {
310
+ const data = {
311
+ a: 3
312
+ };
313
+
314
+ const errorScheme: Scheme = {
315
+ key: 'a',
316
+ type: 'number',
317
+ min: 3,
318
+ exclusiveMin: '3' as unknown as boolean
319
+ };
320
+
321
+ checkSchemeError({
322
+ data,
323
+ errorScheme,
324
+ message: createErrorMsg(ErrorMsg.EXCLUSIVE_MIN_SHOULD_BE_BOOLEAN)
325
+ });
326
+ });
327
+ });
328
+
329
+ it('exclusiveMin === true', () => {
330
+ const error1: EjvError | null = ejv({
331
+ a: 9
332
+ }, [{
333
+ key: 'a',
334
+ type: 'number',
335
+ min: 10,
336
+ exclusiveMin: true
337
+ }]);
338
+
339
+ expect(error1).to.be.instanceof(EjvError);
340
+
341
+ if (!error1) {
342
+ throw new Error('spec failed');
343
+ }
344
+
345
+ expect(error1.type).to.be.eql(ErrorType.BIGGER_THAN);
346
+ expect(error1.message).to.be.eql(createErrorMsg(ErrorMsg.BIGGER_THAN, {
347
+ placeholders: [10]
348
+ }));
349
+
350
+ const error2: EjvError | null = ejv({
351
+ a: 10
352
+ }, [{
353
+ key: 'a',
354
+ type: 'number',
355
+ min: 10,
356
+ exclusiveMin: true
357
+ }]);
358
+
359
+ expect(error2).to.be.instanceof(EjvError);
360
+
361
+ if (!error2) {
362
+ throw new Error('spec failed');
363
+ }
364
+
365
+ expect(error2.type).to.be.eql(ErrorType.BIGGER_THAN);
366
+ expect(error2.message).to.be.eql(createErrorMsg(ErrorMsg.BIGGER_THAN, {
367
+ placeholders: [10]
368
+ }));
369
+
370
+ expect(ejv({
371
+ a: 11
372
+ }, [{
373
+ key: 'a',
374
+ type: 'number',
375
+ min: 10,
376
+ exclusiveMin: true
377
+ }])).to.be.null;
378
+ });
379
+
380
+ it('exclusiveMin === false', () => {
381
+ const error1: EjvError | null = ejv({
382
+ a: 9
383
+ }, [{
384
+ key: 'a',
385
+ type: 'number',
386
+ min: 10,
387
+ exclusiveMin: false
388
+ }]);
389
+
390
+ expect(error1).to.be.instanceof(EjvError);
391
+
392
+ if (!error1) {
393
+ throw new Error('spec failed');
394
+ }
395
+
396
+ expect(error1.type).to.be.eql(ErrorType.BIGGER_THAN_OR_EQUAL);
397
+ expect(error1.message).to.be.eql(createErrorMsg(ErrorMsg.BIGGER_THAN_OR_EQUAL, {
398
+ placeholders: [10]
399
+ }));
400
+
401
+ expect(ejv({
402
+ a: 10
403
+ }, [{
404
+ key: 'a',
405
+ type: 'number',
406
+ min: 10,
407
+ exclusiveMin: false
408
+ }])).to.be.null;
409
+
410
+ expect(ejv({
411
+ a: 11
412
+ }, [{
413
+ key: 'a',
414
+ type: 'number',
415
+ min: 10,
416
+ exclusiveMin: false
417
+ }])).to.be.null;
418
+ });
419
+ });
420
+ });
421
+
422
+ describe('max & exclusiveMax', () => {
423
+ describe('max only', () => {
424
+ describe('check parameter', () => {
425
+ it('undefined is ok', () => {
426
+ expect(ejv({
427
+ a: 1
428
+ }, [{
429
+ key: 'a',
430
+ type: 'number',
431
+ max: undefined
432
+ }])).to.be.null;
433
+ });
434
+
435
+ it('null', () => {
436
+ const data = {
437
+ a: 3
438
+ };
439
+
440
+ const errorScheme: Scheme = {
441
+ key: 'a',
442
+ type: 'number',
443
+ max: null as unknown as number
444
+ };
445
+
446
+ checkSchemeError({
447
+ data,
448
+ errorScheme,
449
+ message: createErrorMsg(ErrorMsg.MAX_SHOULD_BE_NUMBER)
450
+ });
451
+ });
452
+
453
+ it('max type', () => {
454
+ const data = {
455
+ a: 3
456
+ };
457
+
458
+ const errorScheme: Scheme = {
459
+ key: 'a',
460
+ type: 'number',
461
+ max: '3'
462
+ };
463
+
464
+ checkSchemeError({
465
+ data,
466
+ errorScheme,
467
+ message: createErrorMsg(ErrorMsg.MAX_SHOULD_BE_NUMBER)
468
+ });
469
+ });
470
+ });
471
+
472
+ it('ok', () => {
473
+ expect(ejv({
474
+ a: 9
475
+ }, [{
476
+ key: 'a',
477
+ type: 'number',
478
+ max: 10
479
+ }])).to.be.null;
480
+
481
+ expect(ejv({
482
+ a: 10
483
+ }, [{
484
+ key: 'a',
485
+ type: 'number',
486
+ max: 10
487
+ }])).to.be.null;
488
+
489
+ const error1: EjvError | null = ejv({
490
+ a: 11
491
+ }, [{
492
+ key: 'a',
493
+ type: 'number',
494
+ max: 10
495
+ }]);
496
+
497
+ expect(error1).to.be.instanceof(EjvError);
498
+
499
+ if (!error1) {
500
+ throw new Error('spec failed');
501
+ }
502
+
503
+ expect(error1.type).to.be.eql(ErrorType.SMALLER_THAN_OR_EQUAL);
504
+ expect(error1.message).to.be.eql(createErrorMsg(ErrorMsg.SMALLER_THAN_OR_EQUAL, {
505
+ placeholders: [10]
506
+ }));
507
+ });
508
+ });
509
+
510
+ describe('exclusiveMax', () => {
511
+ describe('check parameter', () => {
512
+ it('exclusiveMax type', () => {
513
+ const data = {
514
+ a: 3
515
+ };
516
+
517
+ const errorScheme: Scheme = {
518
+ key: 'a',
519
+ type: 'number',
520
+ max: 3,
521
+ exclusiveMax: '3' as unknown as boolean
522
+ };
523
+
524
+ checkSchemeError({
525
+ data,
526
+ errorScheme,
527
+ message: createErrorMsg(ErrorMsg.EXCLUSIVE_MAX_SHOULD_BE_BOOLEAN)
528
+ });
529
+ });
530
+ });
531
+
532
+ it('exclusiveMax === true', () => {
533
+ expect(ejv({
534
+ a: 9
535
+ }, [{
536
+ key: 'a',
537
+ type: 'number',
538
+ max: 10,
539
+ exclusiveMax: true
540
+ }])).to.be.null;
541
+
542
+ const error1: EjvError | null = ejv({
543
+ a: 10
544
+ }, [{
545
+ key: 'a',
546
+ type: 'number',
547
+ max: 10,
548
+ exclusiveMax: true
549
+ }]);
550
+
551
+ expect(error1).to.be.instanceof(EjvError);
552
+
553
+ if (!error1) {
554
+ throw new Error('spec failed');
555
+ }
556
+
557
+ expect(error1.type).to.be.eql(ErrorType.SMALLER_THAN);
558
+ expect(error1.message).to.be.eql(createErrorMsg(ErrorMsg.SMALLER_THAN, {
559
+ placeholders: [10]
560
+ }));
561
+
562
+ const error2: EjvError | null = ejv({
563
+ a: 11
564
+ }, [{
565
+ key: 'a',
566
+ type: 'number',
567
+ max: 10,
568
+ exclusiveMax: true
569
+ }]);
570
+
571
+ expect(error2).to.be.instanceof(EjvError);
572
+
573
+ if (!error2) {
574
+ throw new Error('spec failed');
575
+ }
576
+
577
+ expect(error2.type).to.be.eql(ErrorType.SMALLER_THAN);
578
+ expect(error2.message).to.be.eql(createErrorMsg(ErrorMsg.SMALLER_THAN, {
579
+ placeholders: [10]
580
+ }));
581
+ });
582
+
583
+ it('exclusiveMax === false', () => {
584
+ expect(ejv({
585
+ a: 9
586
+ }, [{
587
+ key: 'a',
588
+ type: 'number',
589
+ max: 10,
590
+ exclusiveMax: false
591
+ }])).to.be.null;
592
+
593
+ expect(ejv({
594
+ a: 10
595
+ }, [{
596
+ key: 'a',
597
+ type: 'number',
598
+ max: 10,
599
+ exclusiveMax: false
600
+ }])).to.be.null;
601
+
602
+ const error1: EjvError | null = ejv({
603
+ a: 11
604
+ }, [{
605
+ key: 'a',
606
+ type: 'number',
607
+ max: 10,
608
+ exclusiveMax: false
609
+ }]);
610
+
611
+ expect(error1).to.be.instanceof(EjvError);
612
+
613
+ if (!error1) {
614
+ throw new Error('spec failed');
615
+ }
616
+
617
+ expect(error1.type).to.be.eql(ErrorType.SMALLER_THAN_OR_EQUAL);
618
+ expect(error1.message).to.be.eql(createErrorMsg(ErrorMsg.SMALLER_THAN_OR_EQUAL, {
619
+ placeholders: [10]
620
+ }));
621
+ });
622
+ });
623
+ });
624
+
625
+ describe('format', () => {
626
+ describe('check parameter', () => {
627
+ it('undefined is ok', () => {
628
+ expect(ejv({
629
+ a: 123.5
630
+ }, [{
631
+ key: 'a',
632
+ type: 'number',
633
+ format: undefined
634
+ }])).to.be.null;
635
+ });
636
+
637
+ it('null', () => {
638
+ const data = {
639
+ a: 123.5
640
+ };
641
+
642
+ const errorScheme: Scheme = {
643
+ key: 'a',
644
+ type: 'number',
645
+ format: null as unknown as string
646
+ };
647
+
648
+ checkSchemeError({
649
+ data,
650
+ errorScheme,
651
+ message: createErrorMsg(ErrorMsg.INVALID_NUMBER_FORMAT, {
652
+ placeholders: ['null']
653
+ })
654
+ });
655
+ });
656
+
657
+ describe('invalid number format', () => {
658
+ const data = {
659
+ a: 1
660
+ };
661
+
662
+ it('single', () => {
663
+ const errorScheme: Scheme = {
664
+ key: 'a',
665
+ type: 'number',
666
+ format: 'invalidNumberFormat'
667
+ };
668
+
669
+ checkSchemeError({
670
+ data,
671
+ errorScheme,
672
+ message: createErrorMsg(ErrorMsg.INVALID_NUMBER_FORMAT, {
673
+ placeholders: ['invalidNumberFormat']
674
+ })
675
+ });
676
+ });
677
+
678
+ it('multiple', () => {
679
+ const errorScheme: Scheme = {
680
+ key: 'a',
681
+ type: 'number',
682
+ format: ['index', 'invalidNumberFormat']
683
+ };
684
+
685
+ checkSchemeError({
686
+ data,
687
+ errorScheme,
688
+ message: createErrorMsg(ErrorMsg.INVALID_NUMBER_FORMAT, {
689
+ placeholders: ['invalidNumberFormat']
690
+ })
691
+ });
692
+ });
693
+ });
694
+ });
695
+
696
+ describe('integer', () => {
697
+ describe('single format', () => {
698
+ it('fail', () => {
699
+ const error: EjvError | null = ejv({
700
+ a: 123.5
701
+ }, [{
702
+ key: 'a',
703
+ type: 'number',
704
+ format: 'integer'
705
+ }]);
706
+
707
+ expect(error).to.be.instanceof(EjvError);
708
+
709
+ if (!error) {
710
+ throw new Error('spec failed');
711
+ }
712
+
713
+ expect(error.type).to.be.eql(ErrorType.FORMAT);
714
+ expect(error.message).to.be.eql(createErrorMsg(ErrorMsg.FORMAT, {
715
+ placeholders: ['integer']
716
+ }));
717
+ });
718
+
719
+ it('ok', () => {
720
+ expect(ejv({
721
+ a: 123
722
+ }, [{
723
+ key: 'a',
724
+ type: 'number',
725
+ format: 'integer'
726
+ }])).to.be.null;
727
+ });
728
+ });
729
+
730
+ describe('multiple formats', () => {
731
+ it('fail', () => {
732
+ const formatArr: string[] = ['integer'];
733
+
734
+ const error: EjvError | null = ejv({
735
+ a: 123.5
736
+ }, [{
737
+ key: 'a',
738
+ type: 'number',
739
+ format: formatArr
740
+ }]);
741
+
742
+ expect(error).to.be.instanceof(EjvError);
743
+
744
+ if (!error) {
745
+ throw new Error('spec failed');
746
+ }
747
+
748
+ expect(error.type).to.be.eql(ErrorType.FORMAT_ONE_OF);
749
+ expect(error.message).to.be.eql(createErrorMsg(ErrorMsg.FORMAT_ONE_OF, {
750
+ placeholders: [JSON.stringify(formatArr)]
751
+ }));
752
+ });
753
+
754
+ it('ok', () => {
755
+ expect(ejv({
756
+ a: -7
757
+ }, [{
758
+ key: 'a',
759
+ type: 'number',
760
+ format: ['integer']
761
+ }])).to.be.null;
762
+
763
+ expect(ejv({
764
+ a: 0
765
+ }, [{
766
+ key: 'a',
767
+ type: 'number',
768
+ format: ['integer']
769
+ }])).to.be.null;
770
+
771
+ expect(ejv({
772
+ a: 123
773
+ }, [{
774
+ key: 'a',
775
+ type: 'number',
776
+ format: ['integer']
777
+ }])).to.be.null;
778
+ });
779
+
780
+ it('ok - with others', () => {
781
+ expect(ejv({
782
+ a: -7
783
+ }, [{
784
+ key: 'a',
785
+ type: 'number',
786
+ format: ['integer', 'index']
787
+ }])).to.be.null;
788
+
789
+ expect(ejv({
790
+ a: 0
791
+ }, [{
792
+ key: 'a',
793
+ type: 'number',
794
+ format: ['integer', 'index']
795
+ }])).to.be.null;
796
+
797
+ expect(ejv({
798
+ a: 123
799
+ }, [{
800
+ key: 'a',
801
+ type: 'number',
802
+ format: ['integer', 'index']
803
+ }])).to.be.null;
804
+ });
805
+
806
+ it('ok - with others', () => {
807
+ expect(ejv({
808
+ a: -7
809
+ }, [{
810
+ key: 'a',
811
+ type: 'number',
812
+ format: ['index', 'integer']
813
+ }])).to.be.null;
814
+
815
+ expect(ejv({
816
+ a: 0
817
+ }, [{
818
+ key: 'a',
819
+ type: 'number',
820
+ format: ['index', 'integer']
821
+ }])).to.be.null;
822
+
823
+ expect(ejv({
824
+ a: 123
825
+ }, [{
826
+ key: 'a',
827
+ type: 'number',
828
+ format: ['index', 'integer']
829
+ }])).to.be.null;
830
+ });
831
+ });
832
+ });
833
+
834
+ describe('index', () => {
835
+ describe('single format', () => {
836
+ it('fail', () => {
837
+ const error1: EjvError | null = ejv({
838
+ a: 1.5
839
+ }, [{
840
+ key: 'a',
841
+ type: 'number',
842
+ format: 'index'
843
+ }]);
844
+
845
+ expect(error1).to.be.instanceof(EjvError);
846
+
847
+ if (!error1) {
848
+ throw new Error('spec failed');
849
+ }
850
+
851
+ expect(error1.type).to.be.eql(ErrorType.FORMAT);
852
+ expect(error1.message).to.be.eql(createErrorMsg(ErrorMsg.FORMAT, {
853
+ placeholders: ['index']
854
+ }));
855
+
856
+ const error2: EjvError | null = ejv({
857
+ a: -1
858
+ }, [{
859
+ key: 'a',
860
+ type: 'number',
861
+ format: 'index'
862
+ }]);
863
+
864
+ expect(error2).to.be.instanceof(EjvError);
865
+
866
+ if (!error2) {
867
+ throw new Error('spec failed');
868
+ }
869
+
870
+ expect(error2.type).to.be.eql(ErrorType.FORMAT);
871
+ expect(error2.message).to.be.eql(createErrorMsg(ErrorMsg.FORMAT, {
872
+ placeholders: ['index']
873
+ }));
874
+
875
+ const error3: EjvError | null = ejv({
876
+ a: -1.6
877
+ }, [{
878
+ key: 'a',
879
+ type: 'number',
880
+ format: 'index'
881
+ }]);
882
+
883
+ expect(error3).to.be.instanceof(EjvError);
884
+
885
+ if (!error3) {
886
+ throw new Error('spec failed');
887
+ }
888
+
889
+ expect(error3.type).to.be.eql(ErrorType.FORMAT);
890
+ expect(error3.message).to.be.eql(createErrorMsg(ErrorMsg.FORMAT, {
891
+ placeholders: ['index']
892
+ }));
893
+ });
894
+
895
+ it('ok', () => {
896
+ expect(ejv({
897
+ a: 0
898
+ }, [{
899
+ key: 'a',
900
+ type: 'number',
901
+ format: 'index'
902
+ }])).to.be.null;
903
+
904
+ expect(ejv({
905
+ a: 6
906
+ }, [{
907
+ key: 'a',
908
+ type: 'number',
909
+ format: 'index'
910
+ }])).to.be.null;
911
+ });
912
+ });
913
+
914
+ describe('multiple formats', () => {
915
+ it('fail', () => {
916
+ const formatArr: string[] = ['index'];
917
+
918
+ const error1: EjvError | null = ejv({
919
+ a: 1.5
920
+ }, [{
921
+ key: 'a',
922
+ type: 'number',
923
+ format: formatArr
924
+ }]);
925
+
926
+ expect(error1).to.be.instanceof(EjvError);
927
+
928
+ if (!error1) {
929
+ throw new Error('spec failed');
930
+ }
931
+
932
+ expect(error1.type).to.be.eql(ErrorType.FORMAT_ONE_OF);
933
+ expect(error1.message).to.be.eql(createErrorMsg(ErrorMsg.FORMAT_ONE_OF, {
934
+ placeholders: [JSON.stringify(formatArr)]
935
+ }));
936
+
937
+ const error2: EjvError | null = ejv({
938
+ a: -1
939
+ }, [{
940
+ key: 'a',
941
+ type: 'number',
942
+ format: formatArr
943
+ }]);
944
+
945
+ expect(error2).to.be.instanceof(EjvError);
946
+
947
+ if (!error2) {
948
+ throw new Error('spec failed');
949
+ }
950
+
951
+ expect(error2.type).to.be.eql(ErrorType.FORMAT_ONE_OF);
952
+ expect(error2.message).to.be.eql(createErrorMsg(ErrorMsg.FORMAT_ONE_OF, {
953
+ placeholders: [JSON.stringify(formatArr)]
954
+ }));
955
+
956
+ const error3: EjvError | null = ejv({
957
+ a: -1.6
958
+ }, [{
959
+ key: 'a',
960
+ type: 'number',
961
+ format: formatArr
962
+ }]);
963
+
964
+ expect(error3).to.be.instanceof(EjvError);
965
+
966
+ if (!error3) {
967
+ throw new Error('spec failed');
968
+ }
969
+
970
+ expect(error3.type).to.be.eql(ErrorType.FORMAT_ONE_OF);
971
+ expect(error3.message).to.be.eql(createErrorMsg(ErrorMsg.FORMAT_ONE_OF, {
972
+ placeholders: [JSON.stringify(formatArr)]
973
+ }));
974
+ });
975
+
976
+ it('ok', () => {
977
+ expect(ejv({
978
+ a: 0
979
+ }, [{
980
+ key: 'a',
981
+ type: 'number',
982
+ format: ['index']
983
+ }])).to.be.null;
984
+
985
+ expect(ejv({
986
+ a: 6
987
+ }, [{
988
+ key: 'a',
989
+ type: 'number',
990
+ format: ['index']
991
+ }])).to.be.null;
992
+ });
993
+
994
+ it('ok - with others', () => {
995
+ expect(ejv({
996
+ a: 0
997
+ }, [{
998
+ key: 'a',
999
+ type: 'number',
1000
+ format: ['index', 'integer']
1001
+ }])).to.be.null;
1002
+
1003
+ expect(ejv({
1004
+ a: 6
1005
+ }, [{
1006
+ key: 'a',
1007
+ type: 'number',
1008
+ format: ['index', 'integer']
1009
+ }])).to.be.null;
1010
+ });
1011
+
1012
+ it('ok - with others', () => {
1013
+ expect(ejv({
1014
+ a: 0
1015
+ }, [{
1016
+ key: 'a',
1017
+ type: 'number',
1018
+ format: ['integer', 'index']
1019
+ }])).to.be.null;
1020
+
1021
+ expect(ejv({
1022
+ a: 6
1023
+ }, [{
1024
+ key: 'a',
1025
+ type: 'number',
1026
+ format: ['integer', 'index']
1027
+ }])).to.be.null;
1028
+ });
1029
+ });
1030
+ });
1031
+ });
1032
+ });