|
|
- 'use strict';
-
- var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d:\d\d)?$/i;
- var DATE_TIME_SEPARATOR = /t|\s/i;
-
- var COMPARE_FORMATS = {
- date: compareDate,
- time: compareTime,
- 'date-time': compareDateTime
- };
-
- var $dataMetaSchema = {
- type: 'object',
- required: [ '$data' ],
- properties: {
- $data: {
- type: 'string',
- anyOf: [
- { format: 'relative-json-pointer' },
- { format: 'json-pointer' }
- ]
- }
- },
- additionalProperties: false
- };
-
- module.exports = function (minMax) {
- var keyword = 'format' + minMax;
- return function defFunc(ajv) {
- defFunc.definition = {
- type: 'string',
- inline: require('./dotjs/_formatLimit'),
- statements: true,
- errors: 'full',
- dependencies: ['format'],
- metaSchema: {
- anyOf: [
- {type: 'string'},
- $dataMetaSchema
- ]
- }
- };
-
- ajv.addKeyword(keyword, defFunc.definition);
- ajv.addKeyword('formatExclusive' + minMax, {
- dependencies: ['format' + minMax],
- metaSchema: {
- anyOf: [
- {type: 'boolean'},
- $dataMetaSchema
- ]
- }
- });
- extendFormats(ajv);
- return ajv;
- };
- };
-
-
- function extendFormats(ajv) {
- var formats = ajv._formats;
- for (var name in COMPARE_FORMATS) {
- var format = formats[name];
- // the last condition is needed if it's RegExp from another window
- if (typeof format != 'object' || format instanceof RegExp || !format.validate)
- format = formats[name] = { validate: format };
- if (!format.compare)
- format.compare = COMPARE_FORMATS[name];
- }
- }
-
-
- function compareDate(d1, d2) {
- if (!(d1 && d2)) return;
- if (d1 > d2) return 1;
- if (d1 < d2) return -1;
- if (d1 === d2) return 0;
- }
-
-
- function compareTime(t1, t2) {
- if (!(t1 && t2)) return;
- t1 = t1.match(TIME);
- t2 = t2.match(TIME);
- if (!(t1 && t2)) return;
- t1 = t1[1] + t1[2] + t1[3] + (t1[4]||'');
- t2 = t2[1] + t2[2] + t2[3] + (t2[4]||'');
- if (t1 > t2) return 1;
- if (t1 < t2) return -1;
- if (t1 === t2) return 0;
- }
-
-
- function compareDateTime(dt1, dt2) {
- if (!(dt1 && dt2)) return;
- dt1 = dt1.split(DATE_TIME_SEPARATOR);
- dt2 = dt2.split(DATE_TIME_SEPARATOR);
- var res = compareDate(dt1[0], dt2[0]);
- if (res === undefined) return;
- return res || compareTime(dt1[1], dt2[1]);
- }
|