From 2560f5d3155095280b0b90d06f662258d28a4819 Mon Sep 17 00:00:00 2001 From: Gautier Ben Aim Date: Wed, 25 Dec 2024 23:50:47 +0100 Subject: [PATCH] feat: improved type-safety of date validators --- .changeset/blue-hats-film.md | 5 +++++ src/validators/date.ts | 8 ++++---- src/validators/datetimeLocal.ts | 8 ++++---- src/validators/month.ts | 10 +++++----- src/validators/week.ts | 8 ++++---- 5 files changed, 22 insertions(+), 17 deletions(-) create mode 100644 .changeset/blue-hats-film.md diff --git a/.changeset/blue-hats-film.md b/.changeset/blue-hats-film.md new file mode 100644 index 0000000..054ff21 --- /dev/null +++ b/.changeset/blue-hats-film.md @@ -0,0 +1,5 @@ +--- +"formgator": patch +--- + +Improved type-safety of date validators diff --git a/src/validators/date.ts b/src/validators/date.ts index 2c99199..59bd98f 100644 --- a/src/validators/date.ts +++ b/src/validators/date.ts @@ -15,7 +15,7 @@ export function date(attributes?: { required?: false; min?: string; max?: string; -}): FormInput & { +}): FormInput<`${number}-${number}-${number}` | null> & { asNumber(): FormInput; asDate(): FormInput; }; @@ -23,13 +23,13 @@ export function date(attributes: { required: true; min?: string; max?: string; -}): FormInput & { +}): FormInput<`${number}-${number}-${number}`> & { asNumber(): FormInput; asDate(): FormInput; }; export function date( attributes: { required?: boolean; min?: string; max?: string } = {}, -): FormInput & { +): FormInput<`${number}-${number}-${number}` | null> & { asNumber(): FormInput; asDate(): FormInput; } { @@ -44,7 +44,7 @@ export function date( if (Number.isNaN(Date.parse(value))) return failures.invalid(); if (attributes.min && value < attributes.min) return failures.min(attributes.min); if (attributes.max && value > attributes.max) return failures.max(attributes.max); - return succeed(value); + return succeed(value as `${number}-${number}-${number}`); }, /** * Returns the date as a number representing the number of milliseconds diff --git a/src/validators/datetimeLocal.ts b/src/validators/datetimeLocal.ts index bfd8f1e..5de5e7e 100644 --- a/src/validators/datetimeLocal.ts +++ b/src/validators/datetimeLocal.ts @@ -15,7 +15,7 @@ export function datetimeLocal(attributes?: { required?: false; min?: string; max?: string; -}): FormInput & { +}): FormInput<`${number}-${number}-${number}T${number}:${number}` | null> & { asNumber(): FormInput; asDate(): FormInput; }; @@ -23,13 +23,13 @@ export function datetimeLocal(attributes: { required: true; min?: string; max?: string; -}): FormInput & { +}): FormInput<`${number}-${number}-${number}T${number}:${number}`> & { asNumber(): FormInput; asDate(): FormInput; }; export function datetimeLocal( attributes: { required?: boolean; min?: string; max?: string } = {}, -): FormInput & { +): FormInput<`${number}-${number}-${number}T${number}:${number}` | null> & { asNumber(): FormInput; asDate(): FormInput; } { @@ -44,7 +44,7 @@ export function datetimeLocal( if (Number.isNaN(Date.parse(value))) return failures.invalid(); if (attributes.min && value < attributes.min) return failures.min(attributes.min); if (attributes.max && value > attributes.max) return failures.max(attributes.max); - return succeed(value); + return succeed(value as `${number}-${number}-${number}T${number}:${number}`); }, /** * Returns the date as a number representing the number of milliseconds diff --git a/src/validators/month.ts b/src/validators/month.ts index d1c6641..a47e84c 100644 --- a/src/validators/month.ts +++ b/src/validators/month.ts @@ -9,13 +9,13 @@ import { type FormInput, failures, methods, safeParse, succeed } from "../defini * - `min` - Minimum date. * - `max` - Maximum date. * - * The output value is a string with the format `yyyy-mm-dd`. + * The output value is a string with the format `yyyy-mm`. */ export function month(attributes?: { required?: false; min?: string; max?: string; -}): FormInput & { +}): FormInput<`${number}-${number}` | null> & { asNumber(): FormInput; asDate(): FormInput; }; @@ -23,13 +23,13 @@ export function month(attributes: { required: true; min?: string; max?: string; -}): FormInput & { +}): FormInput<`${number}-${number}`> & { asNumber(): FormInput; asDate(): FormInput; }; export function month( attributes: { required?: boolean; min?: string; max?: string } = {}, -): FormInput & { +): FormInput<`${number}-${number}` | null> & { asNumber(): FormInput; asDate(): FormInput; } { @@ -43,7 +43,7 @@ export function month( if (!/^\d{4}-(0\d|1[12])$/.test(value)) return failures.invalid(); if (attributes.min && value < attributes.min) return failures.min(attributes.min); if (attributes.max && value > attributes.max) return failures.max(attributes.max); - return succeed(value); + return succeed(value as `${number}-${number}`); }, /** * Returns the month as a number representing the number of milliseconds diff --git a/src/validators/week.ts b/src/validators/week.ts index b190ac2..3ec9ca3 100644 --- a/src/validators/week.ts +++ b/src/validators/week.ts @@ -15,15 +15,15 @@ export function week(attributes?: { required?: false; min?: string; max?: string; -}): FormInput; +}): FormInput<`${number}-W${number}` | null>; export function week(attributes: { required: true; min?: string; max?: string; -}): FormInput; +}): FormInput<`${number}-W${number}`>; export function week( attributes: { required?: boolean; min?: string; max?: string } = {}, -): FormInput { +): FormInput<`${number}-W${number}` | null> { return { ...methods, attributes, @@ -34,7 +34,7 @@ export function week( if (!/^\d{4}-W(0[1-9]|[1-4]\d|5[0-3])$/.test(value)) return failures.invalid(); if (attributes.min && value < attributes.min) return failures.min(attributes.min); if (attributes.max && value > attributes.max) return failures.max(attributes.max); - return succeed(value); + return succeed(value as `${number}-W${number}`); }, }; }