UNPKG

@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
"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;