@454creative/easy-email
Version:
A framework-agnostic email service library for Node.js with observability and monitoring
150 lines • 4.42 kB
JavaScript
;
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