Skip to content

Commit

Permalink
feat: improved type-safety of date validators
Browse files Browse the repository at this point in the history
  • Loading branch information
GauBen committed Dec 25, 2024
1 parent 7e6c3a3 commit 2560f5d
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 17 deletions.
5 changes: 5 additions & 0 deletions .changeset/blue-hats-film.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"formgator": patch
---

Improved type-safety of date validators
8 changes: 4 additions & 4 deletions src/validators/date.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,21 @@ export function date(attributes?: {
required?: false;
min?: string;
max?: string;
}): FormInput<string | null> & {
}): FormInput<`${number}-${number}-${number}` | null> & {
asNumber(): FormInput<number | null>;
asDate(): FormInput<Date | null>;
};
export function date(attributes: {
required: true;
min?: string;
max?: string;
}): FormInput<string> & {
}): FormInput<`${number}-${number}-${number}`> & {
asNumber(): FormInput<number>;
asDate(): FormInput<Date>;
};
export function date(
attributes: { required?: boolean; min?: string; max?: string } = {},
): FormInput<string | null> & {
): FormInput<`${number}-${number}-${number}` | null> & {
asNumber(): FormInput<number | null>;
asDate(): FormInput<Date | null>;
} {
Expand All @@ -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
Expand Down
8 changes: 4 additions & 4 deletions src/validators/datetimeLocal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,21 @@ export function datetimeLocal(attributes?: {
required?: false;
min?: string;
max?: string;
}): FormInput<string | null> & {
}): FormInput<`${number}-${number}-${number}T${number}:${number}` | null> & {
asNumber(): FormInput<number | null>;
asDate(): FormInput<Date | null>;
};
export function datetimeLocal(attributes: {
required: true;
min?: string;
max?: string;
}): FormInput<string> & {
}): FormInput<`${number}-${number}-${number}T${number}:${number}`> & {
asNumber(): FormInput<number>;
asDate(): FormInput<Date>;
};
export function datetimeLocal(
attributes: { required?: boolean; min?: string; max?: string } = {},
): FormInput<string | null> & {
): FormInput<`${number}-${number}-${number}T${number}:${number}` | null> & {
asNumber(): FormInput<number | null>;
asDate(): FormInput<Date | null>;
} {
Expand All @@ -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
Expand Down
10 changes: 5 additions & 5 deletions src/validators/month.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,27 @@ 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<string | null> & {
}): FormInput<`${number}-${number}` | null> & {
asNumber(): FormInput<number | null>;
asDate(): FormInput<Date | null>;
};
export function month(attributes: {
required: true;
min?: string;
max?: string;
}): FormInput<string> & {
}): FormInput<`${number}-${number}`> & {
asNumber(): FormInput<number>;
asDate(): FormInput<Date>;
};
export function month(
attributes: { required?: boolean; min?: string; max?: string } = {},
): FormInput<string | null> & {
): FormInput<`${number}-${number}` | null> & {
asNumber(): FormInput<number | null>;
asDate(): FormInput<Date | null>;
} {
Expand All @@ -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
Expand Down
8 changes: 4 additions & 4 deletions src/validators/week.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ export function week(attributes?: {
required?: false;
min?: string;
max?: string;
}): FormInput<string | null>;
}): FormInput<`${number}-W${number}` | null>;
export function week(attributes: {
required: true;
min?: string;
max?: string;
}): FormInput<string>;
}): FormInput<`${number}-W${number}`>;
export function week(
attributes: { required?: boolean; min?: string; max?: string } = {},
): FormInput<string | null> {
): FormInput<`${number}-W${number}` | null> {
return {
...methods,
attributes,
Expand All @@ -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}`);
},
};
}

0 comments on commit 2560f5d

Please sign in to comment.