diff options
Diffstat (limited to 'tools/node_modules/eslint/node_modules/ajv-keywords/keywords/_formatLimit.js')
-rw-r--r-- | tools/node_modules/eslint/node_modules/ajv-keywords/keywords/_formatLimit.js | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/tools/node_modules/eslint/node_modules/ajv-keywords/keywords/_formatLimit.js b/tools/node_modules/eslint/node_modules/ajv-keywords/keywords/_formatLimit.js new file mode 100644 index 0000000000..2ae8e007c0 --- /dev/null +++ b/tools/node_modules/eslint/node_modules/ajv-keywords/keywords/_formatLimit.js @@ -0,0 +1,90 @@ +'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 +}; + +module.exports = function (minMax) { + var keyword = 'format' + minMax; + return function defFunc(ajv) { + defFunc.definition = { + type: 'string', + inline: require('./dotjs/_formatLimit'), + statements: true, + errors: 'full', + metaSchema: { + anyOf: [ + { type: 'string' }, + { + type: 'object', + required: [ '$data' ], + properties: { + $data: { + type: 'string', + anyOf: [ + { format: 'relative-json-pointer' }, + { format: 'json-pointer' } + ] + } + }, + additionalProperties: false + } + ] + } + }; + + ajv.addKeyword(keyword, defFunc.definition); + ajv.addKeyword('formatExclusive' + minMax); + 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]); +} |