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