import type { z } from "zod"; type ErrorMessage = string; type Errors<Schema> = Partial<Record<keyof Schema, ErrorMessage>>; export type FormError<Schema extends z.Schema<unknown>> = Partial< Record<keyof Schema["_type"] | "general", ErrorMessage> >; type ValidationResult<Data, Schema> = { data: Data; errors: undefined } | { data: undefined; errors: Errors<Schema> }; export function validate<Data, Schema = z.Schema<Data>["_type"]>( schema: z.Schema<Data>, value: unknown, ): ValidationResult<Data, Schema> { const result = schema.safeParse(value); if (result.success) { return { data: result.data, errors: undefined, }; } const errors: Errors<Schema> = {}; result.error.issues.forEach((error) => { const path = error.path[0] as keyof Schema; if (!errors[path]) { errors[path] = error.message; } }); return { data: undefined, errors, }; }