2026-02-05 09:38:42 +09:00
|
|
|
|
import { z } from "zod";
|
2026-02-04 09:34:41 +09:00
|
|
|
|
import { PASSWORD_RULES } from "@/features/auth/constants";
|
|
|
|
|
|
|
|
|
|
|
|
const passwordSchema = z
|
|
|
|
|
|
.string()
|
|
|
|
|
|
.min(PASSWORD_RULES.MIN_LENGTH, {
|
|
|
|
|
|
message: `비밀번호는 최소 ${PASSWORD_RULES.MIN_LENGTH}자 이상이어야 합니다.`,
|
|
|
|
|
|
})
|
|
|
|
|
|
.regex(/[A-Z]/, {
|
2026-02-05 09:38:42 +09:00
|
|
|
|
message: "대문자를 최소 1개 이상 포함해야 합니다.",
|
2026-02-04 09:34:41 +09:00
|
|
|
|
})
|
|
|
|
|
|
.regex(/[a-z]/, {
|
2026-02-05 09:38:42 +09:00
|
|
|
|
message: "소문자를 최소 1개 이상 포함해야 합니다.",
|
2026-02-04 09:34:41 +09:00
|
|
|
|
})
|
|
|
|
|
|
.regex(/[0-9]/, {
|
2026-02-05 09:38:42 +09:00
|
|
|
|
message: "숫자를 최소 1개 이상 포함해야 합니다.",
|
2026-02-04 09:34:41 +09:00
|
|
|
|
})
|
|
|
|
|
|
.regex(/[!@#$%^&*(),.?":{}|<>]/, {
|
2026-02-05 09:38:42 +09:00
|
|
|
|
message: "특수문자를 최소 1개 이상 포함해야 합니다.",
|
2026-02-04 09:34:41 +09:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
export const signupSchema = z
|
|
|
|
|
|
.object({
|
|
|
|
|
|
email: z
|
|
|
|
|
|
.string()
|
2026-02-05 09:38:42 +09:00
|
|
|
|
.min(1, { message: "이메일을 입력해 주세요." })
|
|
|
|
|
|
.email({ message: "유효한 이메일 형식이 아닙니다." }),
|
2026-02-04 09:34:41 +09:00
|
|
|
|
password: passwordSchema,
|
|
|
|
|
|
confirmPassword: z
|
|
|
|
|
|
.string()
|
2026-02-05 09:38:42 +09:00
|
|
|
|
.min(1, { message: "비밀번호 확인을 입력해 주세요." }),
|
2026-02-04 09:34:41 +09:00
|
|
|
|
})
|
|
|
|
|
|
.refine((data) => data.password === data.confirmPassword, {
|
|
|
|
|
|
message: "비밀번호가 일치하지 않습니다.",
|
|
|
|
|
|
path: ["confirmPassword"],
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
export const resetPasswordSchema = z
|
|
|
|
|
|
.object({
|
|
|
|
|
|
password: passwordSchema,
|
|
|
|
|
|
confirmPassword: z
|
|
|
|
|
|
.string()
|
2026-02-05 09:38:42 +09:00
|
|
|
|
.min(1, { message: "비밀번호 확인을 입력해 주세요." }),
|
2026-02-04 09:34:41 +09:00
|
|
|
|
})
|
|
|
|
|
|
.refine((data) => data.password === data.confirmPassword, {
|
|
|
|
|
|
message: "비밀번호가 일치하지 않습니다.",
|
|
|
|
|
|
path: ["confirmPassword"],
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
export const loginSchema = z.object({
|
|
|
|
|
|
email: z
|
|
|
|
|
|
.string()
|
2026-02-05 09:38:42 +09:00
|
|
|
|
.min(1, { message: "이메일을 입력해 주세요." })
|
|
|
|
|
|
.email({ message: "유효한 이메일 형식이 아닙니다." }),
|
|
|
|
|
|
password: z.string().min(1, { message: "비밀번호를 입력해 주세요." }),
|
2026-02-04 09:34:41 +09:00
|
|
|
|
rememberMe: z.boolean().optional(),
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
export const forgotPasswordSchema = z.object({
|
|
|
|
|
|
email: z
|
|
|
|
|
|
.string()
|
2026-02-05 09:38:42 +09:00
|
|
|
|
.min(1, { message: "이메일을 입력해 주세요." })
|
|
|
|
|
|
.email({ message: "유효한 이메일 형식이 아닙니다." }),
|
2026-02-04 09:34:41 +09:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
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>;
|