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]);
 | |
| }
 |