@type-ddd/email
Version:
Library that provides TypeScript type definitions for handling Email in Domain-Driven Design contexts. It facilitates the validation and manipulation of emails.
158 lines (157 loc) • 5.34 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.IsValidEmail = exports.IsValidDomain = exports.IsValidNick = exports.IsValidCountry = exports.IsValidOrganizationName = exports.IsValidPart = exports.HasValidLength = exports.IsValidChar = exports.IsNumber = exports.IsAlphabet = exports.IsSpecialChar = exports.GetCharCode = void 0;
/**
* a-z = 97 - 122
* 0-9 = 48 - 57
* 95 = _
* 45 = -
* 64 = @
* 46 = .
*/
const ValidChars = { min: 97, max: 122, specials: [95, 45, 64, 46, 43] };
const ValidCharsNum = { min: 48, max: 57 };
const GetCharCode = (char) => {
return typeof char === 'string' ? char.charCodeAt(0) : 0;
};
exports.GetCharCode = GetCharCode;
const IsSpecialChar = (char) => {
const code = (0, exports.GetCharCode)(char);
return ValidChars.specials.includes(code);
};
exports.IsSpecialChar = IsSpecialChar;
const IsAlphabet = (char) => {
const code = (0, exports.GetCharCode)(char);
const isGreaterThanMin = code >= ValidChars.min;
const isLessThanMax = code <= ValidChars.max;
return isGreaterThanMin && isLessThanMax;
};
exports.IsAlphabet = IsAlphabet;
const IsNumber = (char) => {
const charCode = (0, exports.GetCharCode)(char);
const isValid = charCode >= ValidCharsNum.min && charCode <= ValidCharsNum.max;
return isValid;
};
exports.IsNumber = IsNumber;
const IsValidChar = (char) => {
const isAlphabet = (0, exports.IsAlphabet)(char);
const isSpecial = (0, exports.IsSpecialChar)(char);
const isNumber = (0, exports.IsNumber)(char);
return isAlphabet || isSpecial || isNumber;
};
exports.IsValidChar = IsValidChar;
const HasValidLength = (email) => {
return typeof email === 'string' && email.length <= 256;
};
exports.HasValidLength = HasValidLength;
const IsValidPart = (part) => {
const hifen = 45;
const isValidSpecialChar = (char) => (0, exports.GetCharCode)(char) === hifen;
const chars = part.replace(/\./g, '').split('');
let i = 0;
while (chars[i]) {
const isValidChar = (0, exports.IsAlphabet)(chars[i]) ||
(0, exports.IsNumber)(chars[i]) ||
isValidSpecialChar(chars[i]);
if (!isValidChar)
return false;
i++;
}
return true;
};
exports.IsValidPart = IsValidPart;
const IsValidOrganizationName = (name) => {
return name.length <= 10 && name.length >= 2;
};
exports.IsValidOrganizationName = IsValidOrganizationName;
const IsValidCountry = (country) => {
const isValidLength = country.length > 0 && country.length <= 4;
if (!isValidLength)
return false;
const chars = country.split('');
let i = 0;
while (chars[i]) {
const isChar = (0, exports.IsAlphabet)(chars[i]);
if (!isChar)
return false;
i++;
}
return true;
};
exports.IsValidCountry = IsValidCountry;
const IsValidNick = (email) => {
const nick = email.split('@')?.[0];
return (!nick.startsWith('+') &&
!nick.endsWith('+') &&
!nick.startsWith('-') &&
!nick.endsWith('-'));
};
exports.IsValidNick = IsValidNick;
const IsValidDomain = (email) => {
const domain = email.split('@');
const parts = domain[1].split('.');
if (parts.length === 1 || parts.length > 3)
return false;
const isInValidStartAndEnd = domain[1].startsWith('-') ||
domain[1].endsWith('-');
if (isInValidStartAndEnd)
return false;
const isLessThanMax = email.length <= 64;
if (!isLessThanMax)
return false;
const isValidOrgName = (0, exports.IsValidOrganizationName)(parts[1]);
if (typeof parts[2] === 'string') {
const isValidCountry = (0, exports.IsValidCountry)(parts[2]);
if (!isValidCountry)
return false;
}
if (!isValidOrgName)
return false;
let i = 0;
while (parts[i]) {
const isValidPart = (0, exports.IsValidPart)(parts[i]);
if (!isValidPart)
return false;
i++;
}
return true;
};
exports.IsValidDomain = IsValidDomain;
/**
* @description validate email
* @param email string with @ symbol
* @returns true if is a valid email and false if not
*/
const IsValidEmail = (email) => {
const isString = typeof email === 'string';
if (!isString)
return false;
const trimEmail = email.trim().toLowerCase();
const isValidFirsChar = (0, exports.IsAlphabet)(trimEmail[0]) ||
(0, exports.IsNumber)(trimEmail[0]);
if (!isValidFirsChar)
return false;
const hasOnlyOneAt = trimEmail.split('')
.filter((char) => char === '@').length === 1;
const hasOnlyOnePlus = trimEmail.split('')
.filter((char) => char === '+').length > 1;
if (!hasOnlyOneAt || hasOnlyOnePlus)
return false;
const isValidLength = (0, exports.HasValidLength)(trimEmail);
if (!isValidLength)
return false;
const isValidDomain = (0, exports.IsValidDomain)(trimEmail);
if (!isValidDomain)
return false;
if (!(0, exports.IsValidNick)(trimEmail))
return false;
const hasInvalidChar = trimEmail
.split('')
.map((char) => (0, exports.IsValidChar)(char))
.includes(false);
if (hasInvalidChar)
return false;
return true;
};
exports.IsValidEmail = IsValidEmail;
exports.default = exports.IsValidEmail;