UNPKG

2.21 kBJavaScriptView Raw
1'use strict';
2
3var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d:\d\d)?$/i;
4var DATE_TIME_SEPARATOR = /t|\s/i;
5
6var COMPARE_FORMATS = {
7 date: compareDate,
8 time: compareTime,
9 'date-time': compareDateTime
10};
11
12module.exports = function (minMax) {
13 var keyword = 'format' + minMax;
14 return function defFunc(ajv) {
15 defFunc.definition = {
16 type: 'string',
17 inline: require('./dotjs/_formatLimit'),
18 statements: true,
19 errors: 'full',
20 metaSchema: {
21 anyOf: [
22 { type: 'string' },
23 {
24 type: 'object',
25 required: [ '$data' ],
26 properties: {
27 $data: {
28 type: 'string',
29 anyOf: [
30 { format: 'relative-json-pointer' },
31 { format: 'json-pointer' }
32 ]
33 }
34 },
35 additionalProperties: false
36 }
37 ]
38 }
39 };
40
41 ajv.addKeyword(keyword, defFunc.definition);
42 ajv.addKeyword('formatExclusive' + minMax);
43 extendFormats(ajv);
44 return ajv;
45 };
46};
47
48
49function extendFormats(ajv) {
50 var formats = ajv._formats;
51 for (var name in COMPARE_FORMATS) {
52 var format = formats[name];
53 // the last condition is needed if it's RegExp from another window
54 if (typeof format != 'object' || format instanceof RegExp || !format.validate)
55 format = formats[name] = { validate: format };
56 if (!format.compare)
57 format.compare = COMPARE_FORMATS[name];
58 }
59}
60
61
62function compareDate(d1, d2) {
63 if (!(d1 && d2)) return;
64 if (d1 > d2) return 1;
65 if (d1 < d2) return -1;
66 if (d1 === d2) return 0;
67}
68
69
70function compareTime(t1, t2) {
71 if (!(t1 && t2)) return;
72 t1 = t1.match(TIME);
73 t2 = t2.match(TIME);
74 if (!(t1 && t2)) return;
75 t1 = t1[1] + t1[2] + t1[3] + (t1[4]||'');
76 t2 = t2[1] + t2[2] + t2[3] + (t2[4]||'');
77 if (t1 > t2) return 1;
78 if (t1 < t2) return -1;
79 if (t1 === t2) return 0;
80}
81
82
83function compareDateTime(dt1, dt2) {
84 if (!(dt1 && dt2)) return;
85 dt1 = dt1.split(DATE_TIME_SEPARATOR);
86 dt2 = dt2.split(DATE_TIME_SEPARATOR);
87 var res = compareDate(dt1[0], dt2[0]);
88 if (res === undefined) return;
89 return res || compareTime(dt1[1], dt2[1]);
90}