From 994843399eadd044059461ede4352973fa73f505 Mon Sep 17 00:00:00 2001 From: Sahil Suman Date: Wed, 27 Jul 2022 19:12:10 +0530 Subject: [PATCH 1/2] undo styling Signed-off-by: Sahil Suman --- README.md | 2 +- src/lib/isISO8601.js | 41 +---------- test/validators.js | 169 +------------------------------------------ 3 files changed, 5 insertions(+), 207 deletions(-) diff --git a/README.md b/README.md index 8977228c8..8f4f75f3e 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ Validator | Description **isISBN(str [, version])** | check if the string is an ISBN (version 10 or 13). **isISIN(str)** | check if the string is an [ISIN][ISIN] (stock/security identifier). **isISO6391(str)** | check if the string is a valid [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) language code. -**isISO8601(str [, options])** | check if the string is a valid [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date.
`options` is an object which defaults to `{ strict: false, strictSeparator: false }`. If `strict` is true, date strings with invalid dates like `2009-02-29` will be invalid. If `strictSeparator` is true, date strings with date and time separated by anything other than a T will be invalid. +**isISO8601(str)** | check if the string is a valid [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date. **isISO31661Alpha2(str)** | check if the string is a valid [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) officially assigned country code. **isISO31661Alpha3(str)** | check if the string is a valid [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) officially assigned country code. **isISO4217(str)** | check if the string is a valid [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) officially assigned currency code. diff --git a/src/lib/isISO8601.js b/src/lib/isISO8601.js index 1f797347d..b05ceb7de 100644 --- a/src/lib/isISO8601.js +++ b/src/lib/isISO8601.js @@ -1,44 +1,9 @@ import assertString from './util/assertString'; /* eslint-disable max-len */ -// from http://goo.gl/0ejHHW -const iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; -// same as above, except with a strict 'T' separator between date and time -const iso8601StrictSeparator = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; -/* eslint-enable max-len */ -const isValidDate = (str) => { - // str must have passed the ISO8601 check - // this check is meant to catch invalid dates - // like 2009-02-31 - // first check for ordinal dates - const ordinalMatch = str.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/); - if (ordinalMatch) { - const oYear = Number(ordinalMatch[1]); - const oDay = Number(ordinalMatch[2]); - // if is leap year - if ((oYear % 4 === 0 && oYear % 100 !== 0) || oYear % 400 === 0) return oDay <= 366; - return oDay <= 365; - } - const match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number); - const year = match[1]; - const month = match[2]; - const day = match[3]; - const monthString = month ? `0${month}`.slice(-2) : month; - const dayString = day ? `0${day}`.slice(-2) : day; +const iso8601 = /^(?:[-+]\d{2})?(?:\d{4}(?!\d{2}\b))(?:(-?)(?:(?:0[1-9]|1[0-2])(?:\1(?:[12]\d|0[1-9]|3[01]))?|W(?:[0-4]\d|5[0-2])(?:-?[1-7])?|(?:00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[1-6])))(?![T]$|[T][\d]+Z$)(?:[T\s](?:(?:(?:[01]\d|2[0-3])(?:(:?)[0-5]\d)?|24\:?00)(?:[.,]\d+(?!:))?)(?:\2[0-5]\d(?:[.,]\d+)?)?(?:[Z]|(?:[+-])(?:[01]\d|2[0-3])(?::?[0-5]\d)?)?)?)?$/; - // create a date object and compare - const d = new Date(`${year}-${monthString || '01'}-${dayString || '01'}`); - if (month && day) { - return d.getUTCFullYear() === year - && (d.getUTCMonth() + 1) === month - && d.getUTCDate() === day; - } - return true; -}; - -export default function isISO8601(str, options = {}) { +export default function isISO8601(str) { assertString(str); - const check = options.strictSeparator ? iso8601StrictSeparator.test(str) : iso8601.test(str); - if (check && options.strict) return isValidDate(str); - return check; + return !!(!isNaN(Date.parse(str)) && iso8601.test(str)); } diff --git a/test/validators.js b/test/validators.js index 87f73ccd4..83fbd53a3 100644 --- a/test/validators.js +++ b/test/validators.js @@ -10318,50 +10318,24 @@ describe('Validators', () => { }); }); - const validISO8601 = [ + const validISO8601 = [ '2009-12T12:34', '2009', '2009-05-19', '2009-05-19', - '20090519', - '2009123', '2009-05', - '2009-123', - '2009-222', - '2009-001', - '2009-W01-1', - '2009-W51-1', - '2009-W511', - '2009-W33', - '2009W511', '2009-05-19', '2009-05-19 00:00', - '2009-05-19 14', '2009-05-19 14:31', '2009-05-19 14:39:22', '2009-05-19T14:39Z', - '2009-W21-2', - '2009-W21-2T01:22', - '2009-139', '2009-05-19 14:39:22-06:00', '2009-05-19 14:39:22+0600', '2009-05-19 14:39:22-01', - '20090621T0545Z', '2007-04-06T00:00', '2007-04-05T24:00', '2010-02-18T16:23:48.5', - '2010-02-18T16:23:48,444', - '2010-02-18T16:23:48,3-06:00', - '2010-02-18T16:23.4', - '2010-02-18T16:23,25', - '2010-02-18T16:23.33+0600', - '2010-02-18T16.23334444', - '2010-02-18T16,2283', - '2009-05-19 143922.500', - '2009-05-19 1439,55', '2009-10-10', - '2020-366', - '2000-366', ]; const invalidISO8601 = [ @@ -10394,7 +10368,6 @@ describe('Validators', () => { ]; it('should validate ISO 8601 dates', () => { - // from http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ test({ validator: 'isISO8601', valid: validISO8601, @@ -10402,146 +10375,6 @@ describe('Validators', () => { }); }); - it('should validate ISO 8601 dates, with strict = true (regression)', () => { - test({ - validator: 'isISO8601', - args: [ - { strict: true }, - ], - valid: validISO8601, - invalid: invalidISO8601, - }); - }); - - it('should validate ISO 8601 dates, with strict = true', () => { - test({ - validator: 'isISO8601', - args: [ - { strict: true }, - ], - valid: [ - '2000-02-29', - '2009-123', - '2009-222', - '2020-366', - '2400-366', - ], - invalid: [ - '2010-02-30', - '2009-02-29', - '2009-366', - '2019-02-31', - ], - }); - }); - - it('should validate ISO 8601 dates, with strictSeparator = true', () => { - test({ - validator: 'isISO8601', - args: [ - { strictSeparator: true }, - ], - valid: [ - '2009-12T12:34', - '2009', - '2009-05-19', - '2009-05-19', - '20090519', - '2009123', - '2009-05', - '2009-123', - '2009-222', - '2009-001', - '2009-W01-1', - '2009-W51-1', - '2009-W511', - '2009-W33', - '2009W511', - '2009-05-19', - '2009-05-19T14:39Z', - '2009-W21-2', - '2009-W21-2T01:22', - '2009-139', - '20090621T0545Z', - '2007-04-06T00:00', - '2007-04-05T24:00', - '2010-02-18T16:23:48.5', - '2010-02-18T16:23:48,444', - '2010-02-18T16:23:48,3-06:00', - '2010-02-18T16:23.4', - '2010-02-18T16:23,25', - '2010-02-18T16:23.33+0600', - '2010-02-18T16.23334444', - '2010-02-18T16,2283', - '2009-10-10', - '2020-366', - '2000-366', - ], - invalid: [ - '200905', - '2009367', - '2009-', - '2007-04-05T24:50', - '2009-000', - '2009-M511', - '2009M511', - '2009-05-19T14a39r', - '2009-05-19T14:3924', - '2009-0519', - '2009-05-1914:39', - '2009-05-19 14:', - '2009-05-19r14:39', - '2009-05-19 14a39a22', - '200912-01', - '2009-05-19 14:39:22+06a00', - '2009-05-19 146922.500', - '2010-02-18T16.5:23.35:48', - '2010-02-18T16:23.35:48', - '2010-02-18T16:23.35:48.45', - '2009-05-19 14.5.44', - '2010-02-18T16:23.33.600', - '2010-02-18T16,25:23:48,444', - '2010-13-1', - '2009-05-19 00:00', - // Previously valid cases - '2009-05-19 14', - '2009-05-19 14:31', - '2009-05-19 14:39:22', - '2009-05-19 14:39:22-06:00', - '2009-05-19 14:39:22+0600', - '2009-05-19 14:39:22-01', - ], - }); - }); - - it('should validate ISO 8601 dates, with strict = true and strictSeparator = true (regression)', () => { - test({ - validator: 'isISO8601', - args: [ - { strict: true, strictSeparator: true }, - ], - valid: [ - '2000-02-29', - '2009-123', - '2009-222', - '2020-366', - '2400-366', - ], - invalid: [ - '2010-02-30', - '2009-02-29', - '2009-366', - '2019-02-31', - '2009-05-19 14', - '2009-05-19 14:31', - '2009-05-19 14:39:22', - '2009-05-19 14:39:22-06:00', - '2009-05-19 14:39:22+0600', - '2009-05-19 14:39:22-01', - ], - }); - }); - it('should validate RFC 3339 dates', () => { test({ validator: 'isRFC3339', From a68859c1d70a333951aeb6253454580fa94a3b91 Mon Sep 17 00:00:00 2001 From: Sahil Suman Date: Wed, 27 Jul 2022 19:16:40 +0530 Subject: [PATCH 2/2] undo styling fix Signed-off-by: Sahil Suman --- test/validators.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/validators.js b/test/validators.js index 83fbd53a3..b35540c4a 100644 --- a/test/validators.js +++ b/test/validators.js @@ -10318,7 +10318,7 @@ describe('Validators', () => { }); }); - const validISO8601 = [ + const validISO8601 = [ '2009-12T12:34', '2009', '2009-05-19',