ajv-formats
Advanced tools
Comparing version 2.1.1 to 3.0.0-rc.0
import type { Format } from "ajv"; | ||
export declare type FormatMode = "fast" | "full"; | ||
export declare type FormatName = "date" | "time" | "date-time" | "duration" | "uri" | "uri-reference" | "uri-template" | "url" | "email" | "hostname" | "ipv4" | "ipv6" | "regex" | "uuid" | "json-pointer" | "json-pointer-uri-fragment" | "relative-json-pointer" | "byte" | "int32" | "int64" | "float" | "double" | "password" | "binary"; | ||
export declare type FormatName = "date" | "time" | "date-time" | "iso-time" | "iso-date-time" | "duration" | "uri" | "uri-reference" | "uri-template" | "url" | "email" | "hostname" | "ipv4" | "ipv6" | "regex" | "uuid" | "json-pointer" | "json-pointer-uri-fragment" | "relative-json-pointer" | "byte" | "int32" | "int64" | "float" | "double" | "password" | "binary"; | ||
export declare type DefinedFormats = { | ||
@@ -5,0 +5,0 @@ [key in FormatName]: Format; |
@@ -11,4 +11,6 @@ "use strict"; | ||
// date-time: http://tools.ietf.org/html/rfc3339#section-5.6 | ||
time: fmtDef(time, compareTime), | ||
"date-time": fmtDef(date_time, compareDateTime), | ||
time: fmtDef(getTime(true), compareTime), | ||
"date-time": fmtDef(getDateTime(true), compareDateTime), | ||
"iso-time": fmtDef(getTime(), compareIsoTime), | ||
"iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), | ||
// duration: https://tools.ietf.org/html/rfc3339#appendix-A | ||
@@ -26,3 +28,3 @@ duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, | ||
// optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html | ||
ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, | ||
ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, | ||
ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, | ||
@@ -57,4 +59,6 @@ regex, | ||
date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), | ||
time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareTime), | ||
"date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), | ||
time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime), | ||
"date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), | ||
"iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime), | ||
"iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime), | ||
// uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js | ||
@@ -97,18 +101,37 @@ uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, | ||
} | ||
const TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i; | ||
function time(str, withTimeZone) { | ||
const matches = TIME.exec(str); | ||
if (!matches) | ||
return false; | ||
const hour = +matches[1]; | ||
const minute = +matches[2]; | ||
const second = +matches[3]; | ||
const timeZone = matches[5]; | ||
return (((hour <= 23 && minute <= 59 && second <= 59) || | ||
(hour === 23 && minute === 59 && second === 60)) && | ||
(!withTimeZone || timeZone !== "")); | ||
const TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i; | ||
function getTime(strictTimeZone) { | ||
return function time(str) { | ||
const matches = TIME.exec(str); | ||
if (!matches) | ||
return false; | ||
const hr = +matches[1]; | ||
const min = +matches[2]; | ||
const sec = +matches[3]; | ||
const tz = matches[4]; | ||
const tzSign = matches[5] === "-" ? -1 : 1; | ||
const tzH = +(matches[6] || 0); | ||
const tzM = +(matches[7] || 0); | ||
if (tzH > 23 || tzM > 59 || (strictTimeZone && !tz)) | ||
return false; | ||
if (hr <= 23 && min <= 59 && sec < 60) | ||
return true; | ||
// leap second | ||
const utcMin = min - tzM * tzSign; | ||
const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0); | ||
return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61; | ||
}; | ||
} | ||
function compareTime(t1, t2) { | ||
function compareTime(s1, s2) { | ||
if (!(s1 && s2)) | ||
return undefined; | ||
const t1 = new Date("2020-01-01T" + s1).valueOf(); | ||
const t2 = new Date("2020-01-01T" + s2).valueOf(); | ||
if (!(t1 && t2)) | ||
return undefined; | ||
return t1 - t2; | ||
} | ||
function compareIsoTime(t1, t2) { | ||
if (!(t1 && t2)) | ||
return undefined; | ||
const a1 = TIME.exec(t1); | ||
@@ -118,4 +141,4 @@ const a2 = TIME.exec(t2); | ||
return undefined; | ||
t1 = a1[1] + a1[2] + a1[3] + (a1[4] || ""); | ||
t2 = a2[1] + a2[2] + a2[3] + (a2[4] || ""); | ||
t1 = a1[1] + a1[2] + a1[3]; | ||
t2 = a2[1] + a2[2] + a2[3]; | ||
if (t1 > t2) | ||
@@ -128,6 +151,9 @@ return 1; | ||
const DATE_TIME_SEPARATOR = /t|\s/i; | ||
function date_time(str) { | ||
// http://tools.ietf.org/html/rfc3339#section-5.6 | ||
const dateTime = str.split(DATE_TIME_SEPARATOR); | ||
return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1], true); | ||
function getDateTime(strictTimeZone) { | ||
const time = getTime(strictTimeZone); | ||
return function date_time(str) { | ||
// http://tools.ietf.org/html/rfc3339#section-5.6 | ||
const dateTime = str.split(DATE_TIME_SEPARATOR); | ||
return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1]); | ||
}; | ||
} | ||
@@ -137,2 +163,11 @@ function compareDateTime(dt1, dt2) { | ||
return undefined; | ||
const d1 = new Date(dt1).valueOf(); | ||
const d2 = new Date(dt2).valueOf(); | ||
if (!(d1 && d2)) | ||
return undefined; | ||
return d1 - d2; | ||
} | ||
function compareIsoDateTime(dt1, dt2) { | ||
if (!(dt1 && dt2)) | ||
return undefined; | ||
const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); | ||
@@ -139,0 +174,0 @@ const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); |
@@ -17,3 +17,3 @@ "use strict"; | ||
if (opts.keywords) | ||
limit_1.default(ajv); | ||
(0, limit_1.default)(ajv); | ||
return ajv; | ||
@@ -31,3 +31,3 @@ }; | ||
var _b; | ||
(_a = (_b = ajv.opts.code).formats) !== null && _a !== void 0 ? _a : (_b.formats = codegen_1._ `require("ajv-formats/dist/formats").${exportName}`); | ||
(_a = (_b = ajv.opts.code).formats) !== null && _a !== void 0 ? _a : (_b.formats = (0, codegen_1._) `require("ajv-formats/dist/formats").${exportName}`); | ||
for (const f of list) | ||
@@ -34,0 +34,0 @@ ajv.addFormat(f, fs[f]); |
@@ -14,4 +14,4 @@ "use strict"; | ||
const error = { | ||
message: ({ keyword, schemaCode }) => codegen_1.str `should be ${KWDs[keyword].okStr} ${schemaCode}`, | ||
params: ({ keyword, schemaCode }) => codegen_1._ `{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}`, | ||
message: ({ keyword, schemaCode }) => (0, codegen_1.str) `should be ${KWDs[keyword].okStr} ${schemaCode}`, | ||
params: ({ keyword, schemaCode }) => (0, codegen_1._) `{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}`, | ||
}; | ||
@@ -39,4 +39,4 @@ exports.formatLimitDefinition = { | ||
}); | ||
const fmt = gen.const("fmt", codegen_1._ `${fmts}[${fCxt.schemaCode}]`); | ||
cxt.fail$data(codegen_1.or(codegen_1._ `typeof ${fmt} != "object"`, codegen_1._ `${fmt} instanceof RegExp`, codegen_1._ `typeof ${fmt}.compare != "function"`, compareCode(fmt))); | ||
const fmt = gen.const("fmt", (0, codegen_1._) `${fmts}[${fCxt.schemaCode}]`); | ||
cxt.fail$data((0, codegen_1.or)((0, codegen_1._) `typeof ${fmt} != "object"`, (0, codegen_1._) `${fmt} instanceof RegExp`, (0, codegen_1._) `typeof ${fmt}.compare != "function"`, compareCode(fmt))); | ||
} | ||
@@ -56,3 +56,3 @@ function validateFormat() { | ||
ref: fmtDef, | ||
code: opts.code.formats ? codegen_1._ `${opts.code.formats}${codegen_1.getProperty(format)}` : undefined, | ||
code: opts.code.formats ? (0, codegen_1._) `${opts.code.formats}${(0, codegen_1.getProperty)(format)}` : undefined, | ||
}); | ||
@@ -62,3 +62,3 @@ cxt.fail$data(compareCode(fmt)); | ||
function compareCode(fmt) { | ||
return codegen_1._ `${fmt}.compare(${data}, ${schemaCode}) ${KWDs[keyword].fail} 0`; | ||
return (0, codegen_1._) `${fmt}.compare(${data}, ${schemaCode}) ${KWDs[keyword].fail} 0`; | ||
} | ||
@@ -65,0 +65,0 @@ }, |
{ | ||
"name": "ajv-formats", | ||
"version": "2.1.1", | ||
"version": "3.0.0-rc.0", | ||
"description": "Format validation for Ajv v7+", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
@@ -29,4 +29,6 @@ # ajv-formats | ||
- _date_: full-date according to [RFC3339](http://tools.ietf.org/html/rfc3339#section-5.6). | ||
- _time_: time with optional time-zone. | ||
- _date-time_: date-time from the same source (time-zone is mandatory). | ||
- _time_: time (time-zone is mandatory). | ||
- _date-time_: date-time (time-zone is mandatory). | ||
- _iso-time_: time with optional time-zone. | ||
- _iso-date-time_: date-time with optional time-zone. | ||
- _duration_: duration from [RFC3339](https://tools.ietf.org/html/rfc3339#appendix-A) | ||
@@ -112,3 +114,3 @@ - _uri_: full URI. | ||
In `"fast"` mode the following formats are simplified: `"date"`, `"time"`, `"date-time"`, `"uri"`, `"uri-reference"`, `"email"`. For example `"date"`, `"time"` and `"date-time"` do not validate ranges in `"fast"` mode, only string structure, and other formats have simplified regular expressions. | ||
In `"fast"` mode the following formats are simplified: `"date"`, `"time"`, `"date-time"`, `"iso-time"`, `"iso-date-time"`, `"uri"`, `"uri-reference"`, `"email"`. For example, `"date"`, `"time"` and `"date-time"` do not validate ranges in `"fast"` mode, only string structure, and other formats have simplified regular expressions. | ||
@@ -115,0 +117,0 @@ ## Tests |
@@ -10,2 +10,4 @@ import type {Format, FormatDefinition} from "ajv" | ||
| "date-time" | ||
| "iso-time" | ||
| "iso-date-time" | ||
| "duration" | ||
@@ -48,4 +50,6 @@ | "uri" | ||
// date-time: http://tools.ietf.org/html/rfc3339#section-5.6 | ||
time: fmtDef(time, compareTime), | ||
"date-time": fmtDef(date_time, compareDateTime), | ||
time: fmtDef(getTime(true), compareTime), | ||
"date-time": fmtDef(getDateTime(true), compareDateTime), | ||
"iso-time": fmtDef(getTime(), compareIsoTime), | ||
"iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), | ||
// duration: https://tools.ietf.org/html/rfc3339#appendix-A | ||
@@ -67,3 +71,3 @@ duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, | ||
// optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html | ||
ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, | ||
ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, | ||
ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, | ||
@@ -100,9 +104,17 @@ regex, | ||
time: fmtDef( | ||
/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, | ||
/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, | ||
compareTime | ||
), | ||
"date-time": fmtDef( | ||
/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, | ||
/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, | ||
compareDateTime | ||
), | ||
"iso-time": fmtDef( | ||
/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, | ||
compareIsoTime | ||
), | ||
"iso-date-time": fmtDef( | ||
/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, | ||
compareIsoDateTime | ||
), | ||
// uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js | ||
@@ -150,20 +162,33 @@ uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, | ||
const TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i | ||
const TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i | ||
function time(str: string, withTimeZone?: boolean): boolean { | ||
const matches: string[] | null = TIME.exec(str) | ||
if (!matches) return false | ||
function getTime(strictTimeZone?: boolean): (str: string) => boolean { | ||
return function time(str: string): boolean { | ||
const matches: string[] | null = TIME.exec(str) | ||
if (!matches) return false | ||
const hr: number = +matches[1] | ||
const min: number = +matches[2] | ||
const sec: number = +matches[3] | ||
const tz: string | undefined = matches[4] | ||
const tzSign: number = matches[5] === "-" ? -1 : 1 | ||
const tzH: number = +(matches[6] || 0) | ||
const tzM: number = +(matches[7] || 0) | ||
if (tzH > 23 || tzM > 59 || (strictTimeZone && !tz)) return false | ||
if (hr <= 23 && min <= 59 && sec < 60) return true | ||
// leap second | ||
const utcMin = min - tzM * tzSign | ||
const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0) | ||
return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61 | ||
} | ||
} | ||
const hour: number = +matches[1] | ||
const minute: number = +matches[2] | ||
const second: number = +matches[3] | ||
const timeZone: string = matches[5] | ||
return ( | ||
((hour <= 23 && minute <= 59 && second <= 59) || | ||
(hour === 23 && minute === 59 && second === 60)) && | ||
(!withTimeZone || timeZone !== "") | ||
) | ||
function compareTime(s1: string, s2: string): number | undefined { | ||
if (!(s1 && s2)) return undefined | ||
const t1 = new Date("2020-01-01T" + s1).valueOf() | ||
const t2 = new Date("2020-01-01T" + s2).valueOf() | ||
if (!(t1 && t2)) return undefined | ||
return t1 - t2 | ||
} | ||
function compareTime(t1: string, t2: string): number | undefined { | ||
function compareIsoTime(t1: string, t2: string): number | undefined { | ||
if (!(t1 && t2)) return undefined | ||
@@ -173,4 +198,4 @@ const a1 = TIME.exec(t1) | ||
if (!(a1 && a2)) return undefined | ||
t1 = a1[1] + a1[2] + a1[3] + (a1[4] || "") | ||
t2 = a2[1] + a2[2] + a2[3] + (a2[4] || "") | ||
t1 = a1[1] + a1[2] + a1[3] | ||
t2 = a2[1] + a2[2] + a2[3] | ||
if (t1 > t2) return 1 | ||
@@ -182,6 +207,10 @@ if (t1 < t2) return -1 | ||
const DATE_TIME_SEPARATOR = /t|\s/i | ||
function date_time(str: string): boolean { | ||
// http://tools.ietf.org/html/rfc3339#section-5.6 | ||
const dateTime: string[] = str.split(DATE_TIME_SEPARATOR) | ||
return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1], true) | ||
function getDateTime(strictTimeZone?: boolean): (str: string) => boolean { | ||
const time = getTime(strictTimeZone) | ||
return function date_time(str: string): boolean { | ||
// http://tools.ietf.org/html/rfc3339#section-5.6 | ||
const dateTime: string[] = str.split(DATE_TIME_SEPARATOR) | ||
return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1]) | ||
} | ||
} | ||
@@ -191,2 +220,10 @@ | ||
if (!(dt1 && dt2)) return undefined | ||
const d1 = new Date(dt1).valueOf() | ||
const d2 = new Date(dt2).valueOf() | ||
if (!(d1 && d2)) return undefined | ||
return d1 - d2 | ||
} | ||
function compareIsoDateTime(dt1: string, dt2: string): number | undefined { | ||
if (!(dt1 && dt2)) return undefined | ||
const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR) | ||
@@ -193,0 +230,0 @@ const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
56824
749
126
1