102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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]);
 | 
						|
}
 |