From 3f1fba43cff6236f674e5328785c39bc3b5df70f Mon Sep 17 00:00:00 2001 From: Osho957 Date: Tue, 17 Sep 2024 19:47:26 +0530 Subject: [PATCH] (Bug Fix) isDate function: Add validation for delimiter and length checks to prevent undefined errors --- src/lib/isDate.js | 56 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/src/lib/isDate.js b/src/lib/isDate.js index ede3e33e6..def28e094 100644 --- a/src/lib/isDate.js +++ b/src/lib/isDate.js @@ -1,13 +1,15 @@ -import merge from './util/merge'; +import merge from "./util/merge"; const default_date_options = { - format: 'YYYY/MM/DD', - delimiters: ['/', '-'], + format: "YYYY/MM/DD", + delimiters: ["/", "-"], strictMode: false, }; function isValidFormat(format) { - return /(^(y{4}|y{2})[.\/-](m{1,2})[.\/-](d{1,2})$)|(^(m{1,2})[.\/-](d{1,2})[.\/-]((y{4}|y{2})$))|(^(d{1,2})[.\/-](m{1,2})[.\/-]((y{4}|y{2})$))/gi.test(format); + return /(^(y{4}|y{2})[.\/-](m{1,2})[.\/-](d{1,2})$)|(^(m{1,2})[.\/-](d{1,2})[.\/-]((y{4}|y{2})$))|(^(d{1,2})[.\/-](m{1,2})[.\/-]((y{4}|y{2})$))/gi.test( + format + ); } function zip(date, format) { @@ -22,21 +24,38 @@ function zip(date, format) { } export default function isDate(input, options) { - if (typeof options === 'string') { // Allow backward compatibility for old format isDate(input [, format]) + if (typeof options === "string") { + // Allow backward compatibility for old format isDate(input [, format]) options = merge({ format: options }, default_date_options); } else { options = merge(options, default_date_options); } - if (typeof input === 'string' && isValidFormat(options.format)) { - const formatDelimiter = options.delimiters - .find(delimiter => options.format.indexOf(delimiter) !== -1); + if (typeof input === "string" && isValidFormat(options.format)) { + // Ensure the input contains at least one valid delimiter + const hasValidDelimiter = options.delimiters.some((delimiter) => + input.includes(delimiter) + ); + if (!hasValidDelimiter) { + return false; + } + + const formatDelimiter = options.delimiters.find( + (delimiter) => options.format.indexOf(delimiter) !== -1 + ); const dateDelimiter = options.strictMode ? formatDelimiter - : options.delimiters.find(delimiter => input.indexOf(delimiter) !== -1); - const dateAndFormat = zip( - input.split(dateDelimiter), - options.format.toLowerCase().split(formatDelimiter) - ); + : options.delimiters.find((delimiter) => input.indexOf(delimiter) !== -1); + + // Split input and format by the delimiters + const inputParts = input.split(dateDelimiter); + const formatParts = options.format.toLowerCase().split(formatDelimiter); + + // Check if splitting produced the same number of parts + if (inputParts.length !== formatParts.length) { + return false; + } + + const dateAndFormat = zip(inputParts, formatParts); const dateObj = {}; for (const [dateWord, formatWord] of dateAndFormat) { @@ -50,7 +69,7 @@ export default function isDate(input, options) { let fullYear = dateObj.y; // Check if the year starts with a hyphen - if (fullYear.startsWith('-')) { + if (fullYear.startsWith("-")) { return false; // Hyphen before year is not allowed } @@ -82,11 +101,16 @@ export default function isDate(input, options) { day = `0${dateObj.d}`; } - return new Date(`${fullYear}-${month}-${day}T00:00:00.000Z`).getUTCDate() === +dateObj.d; + // Construct a date string in the format YYYY-MM-DD and validate + const parsedDate = new Date(`${fullYear}-${month}-${day}T00:00:00.000Z`); + return parsedDate.getUTCDate() === +dateObj.d; // Check if the day matches } if (!options.strictMode) { - return Object.prototype.toString.call(input) === '[object Date]' && isFinite(input); + return ( + Object.prototype.toString.call(input) === "[object Date]" && + isFinite(input) + ); } return false;