import zod from 'zod'; export const userEmailSchema = zod .string() .email('Invalid email address') .min(3, 'Email is required'); export const userFirstNameSchema = zod .string() .min(1, 'First name is required') .max(32, 'First name must be at most 32 characters long'); export const userLastNameSchema = zod .string() .min(1, 'Last name is required') .max(32, 'Last name must be at most 32 characters long'); export const userNameSchema = zod .string() .min(3, 'Username is required') .max(32, 'Username must be at most 32 characters long') .regex( /^[a-zA-Z0-9_]+$/, 'Username can only contain letters, numbers, and underscores', ); export const loginSchema = zod.object({ email: userEmailSchema.or(userNameSchema), password: zod.string().min(1, 'Password is required'), }); export const registerSchema = zod .object({ firstName: userFirstNameSchema, lastName: userLastNameSchema, email: userEmailSchema, password: zod .string() .min(8, 'Password must be at least 8 characters long') .max(128, 'Password must be at most 128 characters long'), confirmPassword: zod .string() .min(8, 'Password must be at least 8 characters long') .max(128, 'Password must be at most 128 characters long'), username: userNameSchema, }) .refine((data) => data.password === data.confirmPassword, { message: 'Passwords do not match', path: ['confirmPassword'], }) .refine( (data) => !data.password.includes(data.firstName) && !data.password.includes(data.lastName) && !data.password.includes(data.email) && !data.password.includes(data.username), { message: 'Password cannot contain your first name, last name, email, or username', path: ['password'], }, ); export const disallowedUsernames = ['me', 'admin', 'search'];