@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
JavaScript
;
/**
* 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