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

68 lines 3.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveDefaultProvidersPath = resolveDefaultProvidersPath; exports.isBuiltinProvidersPath = isBuiltinProvidersPath; exports.convertProviderToEmailProviderShared = convertProviderToEmailProviderShared; exports.readProvidersDataFile = readProvidersDataFile; exports.buildDomainMapShared = buildDomainMapShared; const fs_1 = require("fs"); const path_1 = require("path"); const schema_1 = require("./schema"); /** * Resolve the providers JSON path for both src (dev/test) and dist (published). */ function resolveDefaultProvidersPath() { const fromDistOrAdjacent = (0, path_1.normalize)((0, path_1.join)(__dirname, 'providers', 'emailproviders.json')); const fromRepoRoot = (0, path_1.normalize)((0, path_1.join)(__dirname, '..', 'providers', 'emailproviders.json')); if ((0, fs_1.existsSync)(fromDistOrAdjacent)) { return fromDistOrAdjacent; } return fromRepoRoot; } function isBuiltinProvidersPath(filePath) { const adjacent = (0, path_1.normalize)((0, path_1.join)(__dirname, 'providers', 'emailproviders.json')); const repoRoot = (0, path_1.normalize)((0, path_1.join)(__dirname, '..', 'providers', 'emailproviders.json')); const normalized = (0, path_1.normalize)(filePath); return normalized === adjacent || normalized === repoRoot; } function convertProviderToEmailProviderShared(compressedProvider) { if (!compressedProvider.type) { console.warn(`Missing type for provider ${compressedProvider.id}`); } const provider = { companyProvider: compressedProvider.companyProvider, loginUrl: compressedProvider.loginUrl || null, domains: compressedProvider.domains || [], type: compressedProvider.type, alias: compressedProvider.alias }; // Attach MX/TXT for DNS detection whenever present, regardless of provider type. if (compressedProvider.mx?.length || compressedProvider.txt?.length) { provider.customDomainDetection = {}; if (compressedProvider.mx?.length) { provider.customDomainDetection.mxPatterns = compressedProvider.mx; } if (compressedProvider.txt?.length) { provider.customDomainDetection.txtPatterns = compressedProvider.txt.map(schema_1.decompressTxtPattern); } } return provider; } function readProvidersDataFile(filePath) { const content = (0, fs_1.readFileSync)(filePath, 'utf8'); const data = JSON.parse(content); if (!data.version || !data.providers || !Array.isArray(data.providers)) { throw new Error('Invalid provider data format'); } return { data, fileSize: content.length }; } function buildDomainMapShared(providers) { const domainMap = new Map(); for (const provider of providers) { for (const domain of provider.domains) { domainMap.set(domain.toLowerCase(), provider); } } return domainMap; } //# sourceMappingURL=provider-store.js.map