UNPKG

@mikkelscheike/email-provider-links

Version:

TypeScript library for email provider detection with 140 providers (259 domains), concurrent DNS resolution, alias normalization, and HTTPS login URL validation for login and password reset flows

249 lines 8.51 kB
"use strict"; /** * Email Provider Links * * Maps email addresses to provider login URLs with: * - Known-domain lookup across 140+ providers * - Concurrent DNS detection for business/custom domains * - Provider-specific alias normalization * - Zero runtime dependencies * * @license MIT */ Object.defineProperty(exports, "__esModule", { value: true }); exports.VERSION = exports.DOMAIN_COUNT = exports.PROVIDER_COUNT = exports.isValidEmailAddress = exports.Config = exports.detectEmailAlias = exports.emailsMatch = exports.normalizeEmail = exports.getEmailProviderFast = exports.getEmailProviderSync = exports.getEmailProvider = void 0; exports.validateEmailAddress = validateEmailAddress; exports.getSupportedProviders = getSupportedProviders; exports.isEmailProviderSupported = isEmailProviderSupported; exports.extractDomain = extractDomain; exports.isValidEmail = isValidEmail; exports.getLibraryStats = getLibraryStats; exports.batchProcessEmails = batchProcessEmails; const api_1 = require("./api"); Object.defineProperty(exports, "getEmailProvider", { enumerable: true, get: function () { return api_1.getEmailProvider; } }); Object.defineProperty(exports, "getEmailProviderSync", { enumerable: true, get: function () { return api_1.getEmailProviderSync; } }); Object.defineProperty(exports, "getEmailProviderFast", { enumerable: true, get: function () { return api_1.getEmailProviderFast; } }); Object.defineProperty(exports, "normalizeEmail", { enumerable: true, get: function () { return api_1.normalizeEmail; } }); Object.defineProperty(exports, "emailsMatch", { enumerable: true, get: function () { return api_1.emailsMatch; } }); Object.defineProperty(exports, "Config", { enumerable: true, get: function () { return api_1.Config; } }); const alias_detection_1 = require("./alias-detection"); Object.defineProperty(exports, "detectEmailAlias", { enumerable: true, get: function () { return alias_detection_1.detectEmailAlias; } }); const provider_loader_1 = require("./provider-loader"); const idn_1 = require("./idn"); // ===== EMAIL VALIDATION ===== /** * Enhanced email validation with comprehensive error reporting. */ function validateEmailAddress(email) { if (!email || typeof email !== 'string') { return { isValid: false, error: { type: 'INVALID_INPUT', code: 'MISSING_EMAIL', message: 'Email address is required and must be a string' } }; } const trimmedEmail = email.trim(); if (trimmedEmail.length === 0) { return { isValid: false, error: { type: 'INVALID_INPUT', code: 'EMPTY_EMAIL', message: 'Email address cannot be empty' } }; } const idnError = (0, idn_1.validateInternationalEmail)(trimmedEmail); if (idnError) { return { isValid: false, error: { type: idnError.type, code: idnError.code, message: idnError.message } }; } return { isValid: true, normalizedEmail: trimmedEmail.toLowerCase() }; } // ===== UTILITY FUNCTIONS ===== /** * Get a defensive copy of all supported email providers. */ function getSupportedProviders() { try { const { providers } = (0, provider_loader_1.loadProviders)(); return [...providers]; } catch { return []; } } /** * Check if an email's domain maps to a known provider (sync, no DNS). */ function isEmailProviderSupported(email) { try { if (!email || typeof email !== 'string') { return false; } const result = (0, api_1.getEmailProviderSync)(email); return result.provider !== null; } catch { return false; } } /** * Extract and normalize the domain from an email address. */ function extractDomain(email) { try { if (!email || typeof email !== 'string') { return null; } const validation = validateEmailAddress(email); if (!validation.isValid || !validation.normalizedEmail) { return null; } const parts = validation.normalizedEmail.split('@'); return parts[1] || null; } catch { return null; } } /** * Validate email format (boolean convenience wrapper). */ function isValidEmail(email) { return validateEmailAddress(email).isValid; } /** * Library metadata and statistics. */ function getLibraryStats() { try { const providers = getSupportedProviders(); const domainCount = providers.reduce((total, provider) => total + (provider.domains?.length || 0), 0); return { providerCount: providers.length, domainCount, version: exports.VERSION, supportsAsync: true, supportsIDN: true, supportsAliasDetection: true, supportsConcurrentDNS: true }; } catch { return { providerCount: 0, domainCount: 0, version: exports.VERSION, supportsAsync: true, supportsIDN: true, supportsAliasDetection: true, supportsConcurrentDNS: true }; } } /** * Batch-process multiple email addresses (sync path only). */ function batchProcessEmails(emails, options = {}) { const { includeProviderInfo = false, normalizeEmails = false, deduplicateAliases = false } = options; const results = []; const seenNormalized = new Set(); for (const email of emails) { try { const validation = validateEmailAddress(email); const result = { email, isValid: validation.isValid }; if (!validation.isValid) { result.error = validation.error?.message; results.push(result); continue; } if (normalizeEmails && validation.normalizedEmail) { try { result.normalized = (0, api_1.normalizeEmail)(validation.normalizedEmail); } catch { result.normalized = validation.normalizedEmail; } } if (deduplicateAliases && result.normalized) { if (seenNormalized.has(result.normalized)) { result.isDuplicate = true; } else { seenNormalized.add(result.normalized); } } if (includeProviderInfo && validation.normalizedEmail) { try { const providerResult = (0, api_1.getEmailProviderSync)(validation.normalizedEmail); result.provider = providerResult.provider?.companyProvider || null; result.loginUrl = providerResult.provider?.loginUrl || null; } catch { result.provider = null; } } results.push(result); } catch (error) { results.push({ email, isValid: false, error: error instanceof Error ? error.message : 'Unknown error' }); } } return results; } // ===== LEGACY COMPATIBILITY ===== /** * @deprecated Use validateEmailAddress or isValidEmail instead */ exports.isValidEmailAddress = isValidEmail; exports.PROVIDER_COUNT = api_1.Config.SUPPORTED_PROVIDERS_COUNT; exports.DOMAIN_COUNT = api_1.Config.SUPPORTED_DOMAINS_COUNT; exports.default = { getEmailProvider: api_1.getEmailProvider, getEmailProviderSync: api_1.getEmailProviderSync, getEmailProviderFast: api_1.getEmailProviderFast, validateEmailAddress, isValidEmail, normalizeEmail: api_1.normalizeEmail, emailsMatch: api_1.emailsMatch, detectEmailAlias: alias_detection_1.detectEmailAlias, getSupportedProviders, isEmailProviderSupported, extractDomain, getLibraryStats, batchProcessEmails, Config: api_1.Config, PROVIDER_COUNT: exports.PROVIDER_COUNT, DOMAIN_COUNT: exports.DOMAIN_COUNT }; function readPackageVersion() { try { const pkg = require('../package.json'); return pkg.version || 'unknown'; } catch { return 'unknown'; } } exports.VERSION = readPackageVersion(); //# sourceMappingURL=index.js.map