From aba4df537b547c4f6a597181ca90b98b039ac5b7 Mon Sep 17 00:00:00 2001 From: Matt DeKok Date: Tue, 17 Oct 2023 01:33:58 +0000 Subject: [PATCH 1/3] Error on invalid dates --- library/src/schemas/date/date.test.ts | 5 +++++ library/src/schemas/date/date.ts | 2 +- library/src/schemas/date/dateAsync.test.ts | 5 +++++ library/src/schemas/date/dateAsync.ts | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/library/src/schemas/date/date.test.ts b/library/src/schemas/date/date.test.ts index 52d59c4a9..7b488986c 100644 --- a/library/src/schemas/date/date.test.ts +++ b/library/src/schemas/date/date.test.ts @@ -14,6 +14,11 @@ describe('date', () => { expect(() => parse(schema, {})).toThrowError(); }); + test('should pass only valid dates', () => { + const error = "Date is invalid!"; + expect(() => parse(date(error), new Date("Not a date"))).toThrowError(error); + }); + test('should throw custom error', () => { const error = 'Value is not a date!'; expect(() => parse(date(error), 123)).toThrowError(error); diff --git a/library/src/schemas/date/date.ts b/library/src/schemas/date/date.ts index 787bb63d5..7e101016b 100644 --- a/library/src/schemas/date/date.ts +++ b/library/src/schemas/date/date.ts @@ -60,7 +60,7 @@ export function date( */ _parse(input, info) { // Check type of input - if (!(input instanceof Date)) { + if (!(input instanceof Date) || Number.isNaN(input.getTime())) { return getSchemaIssues( info, 'type', diff --git a/library/src/schemas/date/dateAsync.test.ts b/library/src/schemas/date/dateAsync.test.ts index 78e7dd8be..8db66cd78 100644 --- a/library/src/schemas/date/dateAsync.test.ts +++ b/library/src/schemas/date/dateAsync.test.ts @@ -14,6 +14,11 @@ describe('dateAsync', () => { await expect(parseAsync(schema, {})).rejects.toThrowError(); }); + test('should pass only valid dates', async () => { + const error = "Date is invalid!"; + await expect(parseAsync(dateAsync(error), new Date("Not a date"))).rejects.toThrowError(error); + }); + test('should throw custom error', async () => { const error = 'Value is not a date!'; await expect(parseAsync(dateAsync(error), 123)).rejects.toThrowError(error); diff --git a/library/src/schemas/date/dateAsync.ts b/library/src/schemas/date/dateAsync.ts index 6ed8a3b1c..8da951902 100644 --- a/library/src/schemas/date/dateAsync.ts +++ b/library/src/schemas/date/dateAsync.ts @@ -63,7 +63,7 @@ export function dateAsync( */ async _parse(input, info) { // Check type of input - if (!(input instanceof Date)) { + if (!(input instanceof Date) || Number.isNaN(input.getTime())) { return getSchemaIssues( info, 'type', From 286724134d49fd9ed05a410543d64f644078de95 Mon Sep 17 00:00:00 2001 From: Matt DeKok Date: Tue, 17 Oct 2023 13:26:30 +0000 Subject: [PATCH 2/3] Use isNaN instead of Number.isNaN --- library/src/schemas/date/date.ts | 2 +- library/src/schemas/date/dateAsync.ts | 2 +- library/src/schemas/number/number.ts | 2 +- library/src/schemas/number/numberAsync.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/library/src/schemas/date/date.ts b/library/src/schemas/date/date.ts index 7e101016b..e775076a3 100644 --- a/library/src/schemas/date/date.ts +++ b/library/src/schemas/date/date.ts @@ -60,7 +60,7 @@ export function date( */ _parse(input, info) { // Check type of input - if (!(input instanceof Date) || Number.isNaN(input.getTime())) { + if (!(input instanceof Date) || isNaN(input.getTime())) { return getSchemaIssues( info, 'type', diff --git a/library/src/schemas/date/dateAsync.ts b/library/src/schemas/date/dateAsync.ts index 8da951902..aa000d482 100644 --- a/library/src/schemas/date/dateAsync.ts +++ b/library/src/schemas/date/dateAsync.ts @@ -63,7 +63,7 @@ export function dateAsync( */ async _parse(input, info) { // Check type of input - if (!(input instanceof Date) || Number.isNaN(input.getTime())) { + if (!(input instanceof Date) || isNaN(input.getTime())) { return getSchemaIssues( info, 'type', diff --git a/library/src/schemas/number/number.ts b/library/src/schemas/number/number.ts index eb881ca60..ba53ed44c 100644 --- a/library/src/schemas/number/number.ts +++ b/library/src/schemas/number/number.ts @@ -60,7 +60,7 @@ export function number( */ _parse(input, info) { // Check type of input - if (typeof input !== 'number' || Number.isNaN(input)) { + if (typeof input !== 'number' || isNaN(input)) { return getSchemaIssues( info, 'type', diff --git a/library/src/schemas/number/numberAsync.ts b/library/src/schemas/number/numberAsync.ts index 6f9a3eba5..20d2c82e0 100644 --- a/library/src/schemas/number/numberAsync.ts +++ b/library/src/schemas/number/numberAsync.ts @@ -66,7 +66,7 @@ export function numberAsync( */ async _parse(input, info) { // Check type of input - if (typeof input !== 'number' || Number.isNaN(input)) { + if (typeof input !== 'number' || isNaN(input)) { return getSchemaIssues( info, 'type', From d8107e331b22e733482bbd0891e57b0773812a11 Mon Sep 17 00:00:00 2001 From: Fabian Hiller Date: Thu, 19 Oct 2023 21:06:54 -0400 Subject: [PATCH 3/3] Fix format, restructure tests and update changelog --- library/CHANGELOG.md | 4 ++++ library/src/schemas/date/date.test.ts | 6 +----- library/src/schemas/date/dateAsync.test.ts | 8 +++----- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/library/CHANGELOG.md b/library/CHANGELOG.md index 8a1084c89..c13545ba5 100644 --- a/library/CHANGELOG.md +++ b/library/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to the library will be documented in this file. +## vX.X.X (Month DD, YYYY) + +- Fix type check in `date` and `dateAsync` for invalid dates (pull request #214) + ## v0.19.0 (October 08, 2023) - Add `notBytes`, `notLength`, `notSize` and `notValue` validation function (pull request #194) diff --git a/library/src/schemas/date/date.test.ts b/library/src/schemas/date/date.test.ts index 7b488986c..e916595b1 100644 --- a/library/src/schemas/date/date.test.ts +++ b/library/src/schemas/date/date.test.ts @@ -11,14 +11,10 @@ describe('date', () => { expect(output).toEqual(input); expect(() => parse(schema, 2023)).toThrowError(); expect(() => parse(schema, '2023-07-10')).toThrowError(); + expect(() => parse(schema, new Date('Invalid Date'))).toThrowError(); expect(() => parse(schema, {})).toThrowError(); }); - test('should pass only valid dates', () => { - const error = "Date is invalid!"; - expect(() => parse(date(error), new Date("Not a date"))).toThrowError(error); - }); - test('should throw custom error', () => { const error = 'Value is not a date!'; expect(() => parse(date(error), 123)).toThrowError(error); diff --git a/library/src/schemas/date/dateAsync.test.ts b/library/src/schemas/date/dateAsync.test.ts index 8db66cd78..9146a74fe 100644 --- a/library/src/schemas/date/dateAsync.test.ts +++ b/library/src/schemas/date/dateAsync.test.ts @@ -11,14 +11,12 @@ describe('dateAsync', () => { expect(output).toEqual(input); await expect(parseAsync(schema, 2023)).rejects.toThrowError(); await expect(parseAsync(schema, '2023-07-10')).rejects.toThrowError(); + await expect( + parseAsync(schema, new Date('Invalid Date')) + ).rejects.toThrowError(); await expect(parseAsync(schema, {})).rejects.toThrowError(); }); - test('should pass only valid dates', async () => { - const error = "Date is invalid!"; - await expect(parseAsync(dateAsync(error), new Date("Not a date"))).rejects.toThrowError(error); - }); - test('should throw custom error', async () => { const error = 'Value is not a date!'; await expect(parseAsync(dateAsync(error), 123)).rejects.toThrowError(error);