Files
auto-trade/features/auth/schemas/auth-schema.ts

95 lines
2.8 KiB
TypeScript
Raw Normal View History

import { z } from "zod";
import { PASSWORD_RULES } from "@/features/auth/constants";
/**
* [ ]
*
* :
* - 8
* - 1
* - 1
* - 1
* - 1
*/
const passwordSchema = z
.string()
.min(PASSWORD_RULES.MIN_LENGTH, {
message: `비밀번호는 최소 ${PASSWORD_RULES.MIN_LENGTH}자 이상이어야 합니다.`,
})
.regex(/[A-Z]/, {
message: "비밀번호에 대문자가 최소 1개 이상 포함되어야 합니다.",
})
.regex(/[a-z]/, {
message: "비밀번호에 소문자가 최소 1개 이상 포함되어야 합니다.",
})
.regex(/[0-9]/, {
message: "비밀번호에 숫자가 최소 1개 이상 포함되어야 합니다.",
})
.regex(/[!@#$%^&*(),.?":{}|<>]/, {
message: "비밀번호에 특수문자가 최소 1개 이상 포함되어야 합니다.",
});
/**
* [ ]
*
*
*/
export const signupSchema = z
.object({
email: z
.string()
.min(1, { message: "이메일을 입력해주세요." })
.email({ message: "올바른 이메일 형식이 아닙니다." }),
password: passwordSchema,
confirmPassword: z
.string()
.min(1, { message: "비밀번호 확인을 입력해주세요." }),
})
.refine((data) => data.password === data.confirmPassword, {
message: "비밀번호가 일치하지 않습니다.",
path: ["confirmPassword"],
});
/**
* [ ]
*/
export const resetPasswordSchema = z
.object({
password: passwordSchema,
confirmPassword: z
.string()
.min(1, { message: "비밀번호 확인을 입력해주세요." }),
})
.refine((data) => data.password === data.confirmPassword, {
message: "비밀번호가 일치하지 않습니다.",
path: ["confirmPassword"],
});
/**
* [ ]
*/
export const loginSchema = z.object({
email: z
.string()
.min(1, { message: "이메일을 입력해주세요." })
.email({ message: "올바른 이메일 형식이 아닙니다." }),
password: z.string().min(1, { message: "비밀번호를 입력해주세요." }),
rememberMe: z.boolean().optional(),
});
/**
* [ ]
*/
export const forgotPasswordSchema = z.object({
email: z
.string()
.min(1, { message: "이메일을 입력해주세요." })
.email({ message: "올바른 이메일 형식이 아닙니다." }),
});
// TypeScript 타입 추론
export type SignupFormData = z.infer<typeof signupSchema>;
export type ResetPasswordFormData = z.infer<typeof resetPasswordSchema>;
export type LoginFormData = z.infer<typeof loginSchema>;
export type ForgotPasswordFormData = z.infer<typeof forgotPasswordSchema>;