@better-auth-ui/core
Version:
Authentication components and data utilities for [Better Auth](https://better-auth.com), available for React and Solid.
63 lines (51 loc) • 1.89 kB
text/typescript
import emailProviderData from "@mikkelscheike/email-provider-links/dist/providers/emailproviders.json" with {
type: "json"
}
type RawEmailProvider = {
companyProvider: string
loginUrl?: string | null
domains?: string[]
}
export type EmailProviderLink = {
/** Human-readable provider name, e.g. `"Gmail"` or `"GMX"`. */
companyProvider: string
/** Direct URL to the provider's webmail login, e.g. `"https://mail.google.com/mail/"`. */
loginUrl: string
}
let domainMap: Map<string, EmailProviderLink> | undefined
function getDomainMap(): Map<string, EmailProviderLink> {
if (domainMap) return domainMap
domainMap = new Map()
const { providers } = emailProviderData as { providers: RawEmailProvider[] }
for (const provider of providers) {
if (!provider.loginUrl) continue
for (const domain of provider.domains ?? []) {
domainMap.set(domain.toLowerCase(), {
companyProvider: provider.companyProvider,
loginUrl: provider.loginUrl
})
}
}
return domainMap
}
/**
* Resolve the webmail login link for an email address from its domain.
*
* Mirrors the synchronous domain lookup of `@mikkelscheike/email-provider-links`
* but reads its bundled provider dataset directly so it stays browser-safe — the
* package's runtime depends on Node built-ins (`fs`/`dns`) and cannot be bundled
* for the client. Covers 130+ providers including niche ones like `gmx.de`.
*
* @param email - Full email address, e.g. `"jane@gmx.de"`.
* @returns The matching provider link, or `null` for unknown/custom domains.
*/
export function getEmailProviderLink(email: string): EmailProviderLink | null {
const atIndex = email.lastIndexOf("@")
if (atIndex === -1) return null
const domain = email
.slice(atIndex + 1)
.trim()
.toLowerCase()
if (!domain) return null
return getDomainMap().get(domain) ?? null
}