import { z } from 'zod'; /** * Email validation schema using Zod */ export const emailSchema = z.string() .email('Invalid email format') .min(3, 'Email too short') .max(254, 'Email too long') .toLowerCase() .trim(); /** * Validates an email address * @param email - The email address to validate * @returns Validation result with sanitized email or error */ export function validateEmail(email: string): { success: boolean; email?: string; error?: string; } { const result = emailSchema.safeParse(email); if (result.success) { return { success: true, email: result.data, }; } return { success: false, error: result.error.errors[0]?.message || 'Invalid email', }; } /** * Check if email appears to be from a disposable email service * Basic check - can be extended with comprehensive list */ const DISPOSABLE_DOMAINS = new Set([ 'tempmail.com', 'throwaway.email', 'guerrillamail.com', 'mailinator.com', '10minutemail.com', ]); export function isDisposableEmail(email: string): boolean { const domain = email.split('@')[1]?.toLowerCase(); return domain ? DISPOSABLE_DOMAINS.has(domain) : false; }