email-tld-validator 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/index.js"],"sourcesContent":["import tldData from '../data/tlds.json';\n\nconst VALID_TLDS = new Set(tldData.tlds);\n\n/**\n * Validates the local part (before the @).\n * Max 64 chars, allowed: a-z A-Z 0-9 . _ % + -\n * No leading/trailing/consecutive dots.\n * @param {string} local\n * @returns {boolean}\n */\nfunction isValidLocal(local) {\n if (!local || local.length > 64) return false;\n if (/^\\.|\\.$/.test(local)) return false;\n if (/\\.\\./.test(local)) return false;\n return /^[a-zA-Z0-9._%+\\-]+$/.test(local);\n}\n\n/**\n * Validates the domain part (after the @).\n * Each label: 1–63 chars, alphanumeric + hyphens, no leading/trailing hyphen.\n * Total domain max 253 chars, must have at least 2 labels.\n * @param {string} domain\n * @returns {boolean}\n */\nfunction isValidDomain(domain) {\n if (!domain || domain.length > 253) return false;\n const labels = domain.split('.');\n if (labels.length < 2) return false;\n return labels.every(\n (label) =>\n label.length >= 1 &&\n label.length <= 63 &&\n /^[a-zA-Z0-9]([a-zA-Z0-9\\-]*[a-zA-Z0-9])?$|^[a-zA-Z0-9]$/.test(label),\n );\n}\n\n/**\n * Validates an email address against format rules and the IANA TLD whitelist.\n *\n * @param {string} email\n * @returns {{ valid: boolean, reason?: string }}\n *\n * @example\n * validateEmail('user@example.com') // { valid: true }\n * validateEmail('user@example.invalid') // { valid: false, reason: '\"invalid\" is not a recognized TLD' }\n */\nexport function validateEmail(email) {\n if (typeof email !== 'string' || !email.trim()) {\n return { valid: false, reason: 'Email must be a non-empty string' };\n }\n\n const trimmed = email.trim();\n\n if (trimmed.length > 254) {\n return { valid: false, reason: 'Email address is too long' };\n }\n\n const atIndex = trimmed.lastIndexOf('@');\n if (atIndex === -1) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n const local = trimmed.slice(0, atIndex);\n const domain = trimmed.slice(atIndex + 1);\n\n if (!local) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n if (!isValidLocal(local)) {\n return {\n valid: false,\n reason: 'Invalid characters or format in local part (before @)',\n };\n }\n\n if (!isValidDomain(domain)) {\n return { valid: false, reason: 'Invalid domain format' };\n }\n\n const tld = domain.split('.').pop().toLowerCase();\n if (!VALID_TLDS.has(tld)) {\n return { valid: false, reason: `\"${tld}\" is not a recognized TLD` };\n }\n\n return { valid: true };\n}\n\n/**\n * Returns true if the email passes all validation checks.\n * Convenience wrapper around validateEmail.\n *\n * @param {string} email\n * @returns {boolean}\n *\n * @example\n * isValidEmail('user@example.com') // true\n * isValidEmail('bad-email') // false\n */\nexport function isValidEmail(email) {\n return validateEmail(email).valid;\n}\n\n/**\n * Returns a copy of the internal IANA TLD set.\n * Useful for inspection or custom filtering.\n *\n * @returns {Set<string>}\n */\nexport function getTLDs() {\n return new Set(VALID_TLDS);\n}\n\n/**\n * Returns TLD metadata from the data file (source, updatedAt, count).\n *\n * @returns {{ source: string, updatedAt: string, count: number }}\n */\nexport function getTLDMeta() {\n const { source, updatedAt, count } = tldData;\n return { source, updatedAt, count };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}