import { z } from "zod" export const passwordValidators = { length: { matcher: (password: string) => password.length >= 10 && password.length <= 40, message: "10 to 40 characters", }, hasUppercase: { matcher: (password: string) => /[A-Z]/.test(password), message: "1 uppercase letter", }, hasLowercase: { matcher: (password: string) => /[a-z]/.test(password), message: "1 lowercase letter", }, hasNumber: { matcher: (password: string) => /[0-9]/.test(password), message: "1 number", }, hasSpecialChar: { matcher: (password: string) => /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]+/.test(password), message: "1 special character", }, } export const passwordValidator = (msg = "Required field") => z .string() .min(1, msg) .refine(passwordValidators.length.matcher, { message: passwordValidators.length.message, }) .refine(passwordValidators.hasUppercase.matcher, { message: passwordValidators.hasUppercase.message, }) .refine(passwordValidators.hasLowercase.matcher, { message: passwordValidators.hasLowercase.message, }) .refine(passwordValidators.hasNumber.matcher, { message: passwordValidators.hasNumber.message, }) .refine(passwordValidators.hasSpecialChar.matcher, { message: passwordValidators.hasSpecialChar.message, })