UNPKG

@454creative/easy-email

Version:

A framework-agnostic email service library for Node.js with observability and monitoring

150 lines 4.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateEmailRequest = validateEmailRequest; exports.isValidEmail = isValidEmail; exports.checkEmailTypos = checkEmailTypos; exports.validateEmail = validateEmail; exports.getEmailDomain = getEmailDomain; /** * Validates an email request */ function validateEmailRequest(request) { const errors = []; // Validate required fields if (!request.to) { errors.push('Recipient email is required'); } else { const recipients = Array.isArray(request.to) ? request.to : [request.to]; recipients.forEach((email, index) => { if (!isValidEmail(email)) { errors.push(`Invalid recipient email at index ${index}: ${email}`); } }); } if (!request.subject) { errors.push('Subject is required'); } if (!request.text && !request.html) { errors.push('Either text or html content is required'); } // Validate optional fields if (request.from && !isValidEmail(request.from)) { errors.push('Invalid sender email'); } if (request.replyTo && !isValidEmail(request.replyTo)) { errors.push('Invalid reply-to email'); } // Validate CC recipients if (request.cc) { const ccRecipients = Array.isArray(request.cc) ? request.cc : [request.cc]; ccRecipients.forEach((email, index) => { if (!isValidEmail(email)) { errors.push(`Invalid CC email at index ${index}: ${email}`); } }); } // Validate BCC recipients if (request.bcc) { const bccRecipients = Array.isArray(request.bcc) ? request.bcc : [request.bcc]; bccRecipients.forEach((email, index) => { if (!isValidEmail(email)) { errors.push(`Invalid BCC email at index ${index}: ${email}`); } }); } return { isValid: errors.length === 0, errors }; } /** * Validates a single email address */ function isValidEmail(email) { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); } /** * Checks for common email typos and suggests corrections */ function checkEmailTypos(email) { if (!email || typeof email !== 'string') { return null; } const commonTypos = { 'gmail.com': 'gmail.com', 'gmial.com': 'gmail.com', 'gmal.com': 'gmail.com', 'gmai.com': 'gmail.com', 'hotmail.com': 'hotmail.com', 'hotmial.com': 'hotmail.com', 'hotmai.com': 'hotmail.com', 'yahoo.com': 'yahoo.com', 'yaho.com': 'yahoo.com', 'outlook.com': 'outlook.com', 'outlok.com': 'outlook.com', }; const parts = email.split('@'); if (parts.length !== 2) { return null; } const localPart = parts[0]; const domain = parts[1]; const correctedDomain = commonTypos[domain]; if (correctedDomain && correctedDomain !== domain) { return `${localPart}@${correctedDomain}`; } return null; } /** * Validates and suggests corrections for an email address */ function validateEmail(email) { if (!email || typeof email !== 'string') { return { isValid: false, suggestion: null, message: 'Email is required', }; } // Check for common typos const correctedEmail = checkEmailTypos(email); // Check if email is valid const valid = isValidEmail(email); if (valid) { return { isValid: true, suggestion: null, message: 'Email is valid', }; } else if (correctedEmail && isValidEmail(correctedEmail)) { return { isValid: false, suggestion: correctedEmail, message: `Invalid email. Did you mean ${correctedEmail}?`, }; } else { return { isValid: false, suggestion: null, message: 'Invalid email format', }; } } /** * Extracts the domain from an email address * * @param email - Email address * @returns string | null - Domain or null if invalid */ function getEmailDomain(email) { if (!isValidEmail(email)) { return null; } const atIndex = email.lastIndexOf('@'); return email.substring(atIndex + 1); } //# sourceMappingURL=email-validator.js.map