// TODO: use temporal import { z } from "zod"; export const validDateTimeSchema = z .union([z.string(), z.date(), z.number()]) .refine((input) => { const inputAsDate = new Date(input); if (!isValidDateTime(inputAsDate)) { return false; } return true; }) .transform((input): string => new Date(input).toISOString()) .brand<"ValidDateTime">(); export const validDateSchema = z .string() .refine((input) => { if (!isValidDate(input)) { return false; } return true; }) .brand<"ValidDateTime">(); export type ValidDateTime = z.infer; export type ValidDate = z.infer; function isValidDateTime(input: Date): boolean { return !Number.isNaN(input.getTime()); } function isValidDate(input: string): boolean { return /^\d{4}-\d{2}-\d{2}$/.test(input) && isValidDateTime(new Date(input)); }