53 lines
1.2 KiB
TypeScript
53 lines
1.2 KiB
TypeScript
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;
|
|
} |