import { z } from "zod"; export type AssertUniqueType> = z.ZodEffects>, T[], unknown>; export function generateUniqueValidator>(validator: z.ZodType, ...keys: (keyof T)[]) { return validator.array().refine((val) => { for (const key of keys ?? []) { const values = val.map((item) => item[key as keyof T]); return values.length === new Set(values).size; } }, { message: "Encountered duplicate values in unique field" }) satisfies AssertUniqueType; } export function assertUniqueKeys>(data: T[], validator: z.ZodType, ...keys: (keyof T)[]) { return generateUniqueValidator(validator, ...keys).parse(data) satisfies T[]; } export async function assertUniqueKeysAsync>(data: T[], validator: z.ZodType, ...keys: (keyof T)[]) { return generateUniqueValidator(validator, ...keys).parseAsync(data) satisfies Promise; }