47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
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,
|
|
})
|