From eb34aa08994251ebc0c3536d95158293c3a62b0f Mon Sep 17 00:00:00 2001 From: David Schnell-Davis Date: Wed, 15 Nov 2017 19:33:06 -0800 Subject: [PATCH] Allow Date objects for 'date', 'time', and 'date-time' formats. --- src/lib/src/shared/format-regex.constants.ts | 4 +++- src/lib/src/shared/json.validators.ts | 14 ++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/lib/src/shared/format-regex.constants.ts b/src/lib/src/shared/format-regex.constants.ts index 5bbe35f9..b53b0750 100644 --- a/src/lib/src/shared/format-regex.constants.ts +++ b/src/lib/src/shared/format-regex.constants.ts @@ -1,4 +1,4 @@ -// AJV fast format regular expressions from: +// updated from AJV fast format regular expressions: // https://github.com/epoberezkin/ajv/blob/master/lib/compile/formats.js export const jsonSchemaFormatTests = { @@ -7,6 +7,8 @@ export const jsonSchemaFormatTests = { 'time': /^[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i, + // Modified to allow incomplete entries, such as + // "2000-03-14T01:59:26.535" (needs "Z") or "2000-03-14T01:59" (needs ":00Z") 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d(?::[0-5]\d)?(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i, // email (sources from jsen validator): diff --git a/src/lib/src/shared/json.validators.ts b/src/lib/src/shared/json.validators.ts index 4fbcb70c..34ebb8e0 100755 --- a/src/lib/src/shared/json.validators.ts +++ b/src/lib/src/shared/json.validators.ts @@ -331,19 +331,21 @@ export class JsonValidators { return (control: AbstractControl, invert = false): ValidationErrors|null => { if (isEmpty(control.value)) { return null; } let isValid: boolean; - let currentValue: string = control.value; - if (!isString(currentValue)) { - isValid = false; - } else { + let currentValue: string|Date = control.value; + if (isString(currentValue)) { const formatTest: Function|RegExp = jsonSchemaFormatTests[requiredFormat]; if (typeof formatTest === 'object') { - isValid = (formatTest).test(currentValue); + isValid = (formatTest).test(currentValue); } else if (typeof formatTest === 'function') { - isValid = (formatTest)(currentValue); + isValid = (formatTest)(currentValue); } else { console.error(`format validator error: "${requiredFormat}" is not a recognized format.`); isValid = true; } + } else { + // Allow JavaScript Date objects + isValid = ['date', 'time', 'date-time'].includes(requiredFormat) && + Object.prototype.toString.call(currentValue) === '[object Date]'; } return xor(isValid, invert) ? null : { 'format': { requiredFormat, currentValue } };