@rpcbase/server 0.618.0 → 0.619.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -29,6 +29,6 @@ export type ValidateEmailDomainOptions = {
|
|
|
29
29
|
export declare const getEmailAddressDomain: (email: unknown) => string | undefined;
|
|
30
30
|
export declare const clearEmailDomainValidationCache: () => void;
|
|
31
31
|
export declare const validateEmailDomain: (email: unknown, options?: ValidateEmailDomainOptions) => Promise<EmailDomainValidationResult>;
|
|
32
|
-
export declare const isDisposableEmailAddress: (email: unknown) => Promise<boolean>;
|
|
33
32
|
export declare const getEmailAddressValidationErrorCode: (email: unknown, options?: ValidateEmailDomainOptions) => Promise<EmailAddressValidationErrorCode | undefined>;
|
|
33
|
+
export declare const isEmailAddressValid: (email: unknown, options?: ValidateEmailDomainOptions) => Promise<boolean>;
|
|
34
34
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/email-validation/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,2BAA2B,qBAAqB,CAAA;AAC7D,eAAO,MAAM,+BAA+B,yBAAyB,CAAA;AAErE,MAAM,MAAM,+BAA+B,GACvC,OAAO,2BAA2B,GAClC,OAAO,+BAA+B,CAAA;AAE1C,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC;IACA,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,IAAI,GAAG,aAAa,CAAA;CAC7B,GACC;IACA,MAAM,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,gBAAgB,GAAG,SAAS,GAAG,iBAAiB,GAAG,iBAAiB,CAAA;CAC7E,GACC;IACA,MAAM,EAAE,SAAS,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAA;CACpB,CAAA;AAEH,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,EAAE,mBAAmB,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AA+CD,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAoB/D,CAAA;AAoED,eAAO,MAAM,+BAA+B,QAAO,IAGlD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,OAAO,OAAO,EACd,UAAS,0BAA+B,KACvC,OAAO,CAAC,2BAA2B,CAgCrC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/email-validation/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,2BAA2B,qBAAqB,CAAA;AAC7D,eAAO,MAAM,+BAA+B,yBAAyB,CAAA;AAErE,MAAM,MAAM,+BAA+B,GACvC,OAAO,2BAA2B,GAClC,OAAO,+BAA+B,CAAA;AAE1C,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC;IACA,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,IAAI,GAAG,aAAa,CAAA;CAC7B,GACC;IACA,MAAM,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,gBAAgB,GAAG,SAAS,GAAG,iBAAiB,GAAG,iBAAiB,CAAA;CAC7E,GACC;IACA,MAAM,EAAE,SAAS,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAA;CACpB,CAAA;AAEH,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,EAAE,mBAAmB,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AA+CD,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAoB/D,CAAA;AAoED,eAAO,MAAM,+BAA+B,QAAO,IAGlD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,OAAO,OAAO,EACd,UAAS,0BAA+B,KACvC,OAAO,CAAC,2BAA2B,CAgCrC,CAAA;AAoBD,eAAO,MAAM,kCAAkC,GAC7C,OAAO,OAAO,EACd,UAAS,0BAA+B,KACvC,OAAO,CAAC,+BAA+B,GAAG,SAAS,CAKrD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,OAAO,OAAO,EACd,UAAS,0BAA+B,KACvC,OAAO,CAAC,OAAO,CAA6E,CAAA"}
|
|
@@ -150,7 +150,7 @@ var validateEmailDomain = async (email, options = {}) => {
|
|
|
150
150
|
if (pendingEmailDomainValidations.get(domain) === validation) pendingEmailDomainValidations.delete(domain);
|
|
151
151
|
}
|
|
152
152
|
};
|
|
153
|
-
var
|
|
153
|
+
var hasDisposableEmailDomain = async (email) => {
|
|
154
154
|
const emailDomain = getEmailAddressDomain(email);
|
|
155
155
|
if (!emailDomain) return false;
|
|
156
156
|
const disposableEmailDomains = await getDisposableEmailDomains();
|
|
@@ -164,10 +164,11 @@ var isDisposableEmailAddress = async (email) => {
|
|
|
164
164
|
return false;
|
|
165
165
|
};
|
|
166
166
|
var getEmailAddressValidationErrorCode = async (email, options = {}) => {
|
|
167
|
-
if (await
|
|
167
|
+
if (await hasDisposableEmailDomain(email)) return DISPOSABLE_EMAIL_ERROR_CODE;
|
|
168
168
|
return (await validateEmailDomain(email, options)).status === "invalid" ? INVALID_EMAIL_DOMAIN_ERROR_CODE : void 0;
|
|
169
169
|
};
|
|
170
|
+
var isEmailAddressValid = async (email, options = {}) => await getEmailAddressValidationErrorCode(email, options) === void 0;
|
|
170
171
|
//#endregion
|
|
171
|
-
export { DISPOSABLE_EMAIL_ERROR_CODE, INVALID_EMAIL_DOMAIN_ERROR_CODE, clearEmailDomainValidationCache, getEmailAddressDomain, getEmailAddressValidationErrorCode,
|
|
172
|
+
export { DISPOSABLE_EMAIL_ERROR_CODE, INVALID_EMAIL_DOMAIN_ERROR_CODE, clearEmailDomainValidationCache, getEmailAddressDomain, getEmailAddressValidationErrorCode, isEmailAddressValid, validateEmailDomain };
|
|
172
173
|
|
|
173
174
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["resolve4","resolve6","resolveMx","domainToASCII","DISPOSABLE_EMAIL_ERROR_CODE","INVALID_EMAIL_DOMAIN_ERROR_CODE","EmailAddressValidationErrorCode","EmailDomainResolver","hostname","Promise","Array","exchange","priority","EmailDomainValidationResult","status","domain","reason","ValidateEmailDomainOptions","resolver","useCache","AddressResolution","CachedEmailDomainValidation","expiresAt","result","VALID_CACHE_TTL_MS","INVALID_CACHE_TTL_MS","UNKNOWN_CACHE_TTL_MS","nativeResolver","emailDomainValidationCache","Map","pendingEmailDomainValidations","disposableEmailDomainsPromise","Set","getDisposableEmailDomains","then","default","MailChecker","blacklist","getDnsErrorCode","error","undefined","code","isMissingDnsRecordError","getMailbox","value","trimmed","trim","displayAddress","match","getEmailAddressDomain","email","mailbox","atIndex","lastIndexOf","length","slice","toLowerCase","test","includes","asciiDomain","resolveAddressRecords","results","allSettled","some","errors","filter","PromiseRejectedResult","map","every","validateWithoutCache","mxRecords","Awaited","ReturnType","implicitMx","exchanges","replace","exchangeResults","all","from","getCacheTtl","clearEmailDomainValidationCache","clear","validateEmailDomain","options","now","Date","cached","get","delete","pending","validation","set","isDisposableEmailAddress","emailDomain","disposableEmailDomains","has","nextDot","indexOf","getEmailAddressValidationErrorCode","domainValidation"],"sources":["../../src/email-validation/index.ts"],"sourcesContent":["import { resolve4, resolve6, resolveMx } from \"node:dns/promises\"\nimport { domainToASCII } from \"node:url\"\n\n\nexport const DISPOSABLE_EMAIL_ERROR_CODE = \"disposable_email\"\nexport const INVALID_EMAIL_DOMAIN_ERROR_CODE = \"invalid_email_domain\"\n\nexport type EmailAddressValidationErrorCode =\n | typeof DISPOSABLE_EMAIL_ERROR_CODE\n | typeof INVALID_EMAIL_DOMAIN_ERROR_CODE\n\nexport type EmailDomainResolver = {\n resolveMx(hostname: string): Promise<Array<{ exchange: string; priority: number }>>\n resolve4(hostname: string): Promise<string[]>\n resolve6(hostname: string): Promise<string[]>\n}\n\nexport type EmailDomainValidationResult =\n | {\n status: \"valid\"\n domain: string\n reason: \"mx\" | \"implicit_mx\"\n }\n | {\n status: \"invalid\"\n domain?: string\n reason: \"invalid_domain\" | \"null_mx\" | \"unresolvable_mx\" | \"no_mail_records\"\n }\n | {\n status: \"unknown\"\n domain: string\n reason: \"dns_error\"\n }\n\nexport type ValidateEmailDomainOptions = {\n resolver?: EmailDomainResolver\n useCache?: boolean\n}\n\ntype AddressResolution = \"resolved\" | \"missing\" | \"unknown\"\n\ntype CachedEmailDomainValidation = {\n expiresAt: number\n result: EmailDomainValidationResult\n}\n\nconst VALID_CACHE_TTL_MS = 10 * 60 * 1000\nconst INVALID_CACHE_TTL_MS = 5 * 60 * 1000\nconst UNKNOWN_CACHE_TTL_MS = 30 * 1000\n\nconst nativeResolver: EmailDomainResolver = {\n resolveMx: (hostname) => resolveMx(hostname),\n resolve4: (hostname) => resolve4(hostname),\n resolve6: (hostname) => resolve6(hostname),\n}\n\nconst emailDomainValidationCache = new Map<string, CachedEmailDomainValidation>()\nconst pendingEmailDomainValidations = new Map<string, Promise<EmailDomainValidationResult>>()\n\nlet disposableEmailDomainsPromise: Promise<Set<string>> | undefined\n\nconst getDisposableEmailDomains = (): Promise<Set<string>> => {\n disposableEmailDomainsPromise ??= import(\"mailchecker\").then(\n ({ default: MailChecker }) => MailChecker.blacklist(),\n )\n return disposableEmailDomainsPromise\n}\n\nconst getDnsErrorCode = (error: unknown): string | undefined => {\n if (!error || typeof error !== \"object\" || !(\"code\" in error)) return undefined\n return typeof error.code === \"string\" ? error.code : undefined\n}\n\nconst isMissingDnsRecordError = (error: unknown): boolean => {\n const code = getDnsErrorCode(error)\n return code === \"ENODATA\" || code === \"ENOTFOUND\" || code === \"EBADNAME\"\n}\n\nconst getMailbox = (value: string): string => {\n const trimmed = value.trim()\n const displayAddress = trimmed.match(/<([^<>]+)>$/)\n return (displayAddress?.[1] ?? trimmed).trim()\n}\n\nexport const getEmailAddressDomain = (email: unknown): string | undefined => {\n if (typeof email !== \"string\") return undefined\n\n const mailbox = getMailbox(email)\n const atIndex = mailbox.lastIndexOf(\"@\")\n if (atIndex <= 0 || atIndex === mailbox.length - 1) return undefined\n\n const domain = mailbox.slice(atIndex + 1).toLowerCase()\n if (\n !domain\n || /\\s/.test(domain)\n || domain.includes(\"@\")\n || domain.includes(\"[\")\n || domain.includes(\"]\")\n || domain.includes(\"<\")\n || domain.includes(\">\")\n ) return undefined\n\n const asciiDomain = domainToASCII(domain)\n return asciiDomain || undefined\n}\n\nconst resolveAddressRecords = async(\n hostname: string,\n resolver: EmailDomainResolver,\n): Promise<AddressResolution> => {\n const results = await Promise.allSettled([\n resolver.resolve4(hostname),\n resolver.resolve6(hostname),\n ])\n\n if (results.some((result) => result.status === \"fulfilled\" && result.value.length > 0)) {\n return \"resolved\"\n }\n\n const errors = results\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason)\n\n return errors.every(isMissingDnsRecordError) ? \"missing\" : \"unknown\"\n}\n\nconst validateWithoutCache = async(\n domain: string,\n resolver: EmailDomainResolver,\n): Promise<EmailDomainValidationResult> => {\n let mxRecords: Awaited<ReturnType<EmailDomainResolver[\"resolveMx\"]>>\n\n try {\n mxRecords = await resolver.resolveMx(domain)\n } catch (error) {\n if (!isMissingDnsRecordError(error)) {\n return { status: \"unknown\", domain, reason: \"dns_error\" }\n }\n\n const implicitMx = await resolveAddressRecords(domain, resolver)\n if (implicitMx === \"resolved\") return { status: \"valid\", domain, reason: \"implicit_mx\" }\n if (implicitMx === \"unknown\") return { status: \"unknown\", domain, reason: \"dns_error\" }\n return { status: \"invalid\", domain, reason: \"no_mail_records\" }\n }\n\n if (mxRecords.length === 0) {\n const implicitMx = await resolveAddressRecords(domain, resolver)\n if (implicitMx === \"resolved\") return { status: \"valid\", domain, reason: \"implicit_mx\" }\n if (implicitMx === \"unknown\") return { status: \"unknown\", domain, reason: \"dns_error\" }\n return { status: \"invalid\", domain, reason: \"no_mail_records\" }\n }\n\n const exchanges = mxRecords.map(({ exchange }) => exchange.trim().replace(/\\.$/, \"\"))\n if (exchanges.some((exchange) => !exchange)) {\n return { status: \"invalid\", domain, reason: \"null_mx\" }\n }\n\n const exchangeResults = await Promise.all(\n Array.from(new Set(exchanges)).map((exchange) => resolveAddressRecords(exchange, resolver)),\n )\n\n if (exchangeResults.includes(\"resolved\")) return { status: \"valid\", domain, reason: \"mx\" }\n if (exchangeResults.includes(\"unknown\")) return { status: \"unknown\", domain, reason: \"dns_error\" }\n return { status: \"invalid\", domain, reason: \"unresolvable_mx\" }\n}\n\nconst getCacheTtl = (result: EmailDomainValidationResult): number => {\n if (result.status === \"valid\") return VALID_CACHE_TTL_MS\n if (result.status === \"invalid\") return INVALID_CACHE_TTL_MS\n return UNKNOWN_CACHE_TTL_MS\n}\n\nexport const clearEmailDomainValidationCache = (): void => {\n emailDomainValidationCache.clear()\n pendingEmailDomainValidations.clear()\n}\n\nexport const validateEmailDomain = async(\n email: unknown,\n options: ValidateEmailDomainOptions = {},\n): Promise<EmailDomainValidationResult> => {\n const domain = getEmailAddressDomain(email)\n if (!domain) return { status: \"invalid\", reason: \"invalid_domain\" }\n\n const resolver = options.resolver ?? nativeResolver\n const useCache = options.useCache ?? options.resolver === undefined\n if (!useCache) return validateWithoutCache(domain, resolver)\n\n const now = Date.now()\n const cached = emailDomainValidationCache.get(domain)\n if (cached && cached.expiresAt > now) return cached.result\n if (cached) emailDomainValidationCache.delete(domain)\n\n const pending = pendingEmailDomainValidations.get(domain)\n if (pending) return pending\n\n const validation = validateWithoutCache(domain, resolver).then((result) => {\n emailDomainValidationCache.set(domain, {\n expiresAt: Date.now() + getCacheTtl(result),\n result,\n })\n return result\n })\n\n pendingEmailDomainValidations.set(domain, validation)\n try {\n return await validation\n } finally {\n if (pendingEmailDomainValidations.get(domain) === validation) {\n pendingEmailDomainValidations.delete(domain)\n }\n }\n}\n\nexport const isDisposableEmailAddress = async(email: unknown): Promise<boolean> => {\n const emailDomain = getEmailAddressDomain(email)\n if (!emailDomain) return false\n\n const disposableEmailDomains = await getDisposableEmailDomains()\n let domain = emailDomain\n\n while (domain) {\n if (disposableEmailDomains.has(domain)) return true\n\n const nextDot = domain.indexOf(\".\")\n if (nextDot === -1) return false\n domain = domain.slice(nextDot + 1)\n }\n\n return false\n}\n\nexport const getEmailAddressValidationErrorCode = async(\n email: unknown,\n options: ValidateEmailDomainOptions = {},\n): Promise<EmailAddressValidationErrorCode | undefined> => {\n if (await isDisposableEmailAddress(email)) return DISPOSABLE_EMAIL_ERROR_CODE\n\n const domainValidation = await validateEmailDomain(email, options)\n return domainValidation.status === \"invalid\" ? INVALID_EMAIL_DOMAIN_ERROR_CODE : undefined\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["resolve4","resolve6","resolveMx","domainToASCII","DISPOSABLE_EMAIL_ERROR_CODE","INVALID_EMAIL_DOMAIN_ERROR_CODE","EmailAddressValidationErrorCode","EmailDomainResolver","hostname","Promise","Array","exchange","priority","EmailDomainValidationResult","status","domain","reason","ValidateEmailDomainOptions","resolver","useCache","AddressResolution","CachedEmailDomainValidation","expiresAt","result","VALID_CACHE_TTL_MS","INVALID_CACHE_TTL_MS","UNKNOWN_CACHE_TTL_MS","nativeResolver","emailDomainValidationCache","Map","pendingEmailDomainValidations","disposableEmailDomainsPromise","Set","getDisposableEmailDomains","then","default","MailChecker","blacklist","getDnsErrorCode","error","undefined","code","isMissingDnsRecordError","getMailbox","value","trimmed","trim","displayAddress","match","getEmailAddressDomain","email","mailbox","atIndex","lastIndexOf","length","slice","toLowerCase","test","includes","asciiDomain","resolveAddressRecords","results","allSettled","some","errors","filter","PromiseRejectedResult","map","every","validateWithoutCache","mxRecords","Awaited","ReturnType","implicitMx","exchanges","replace","exchangeResults","all","from","getCacheTtl","clearEmailDomainValidationCache","clear","validateEmailDomain","options","now","Date","cached","get","delete","pending","validation","set","hasDisposableEmailDomain","emailDomain","disposableEmailDomains","has","nextDot","indexOf","getEmailAddressValidationErrorCode","domainValidation","isEmailAddressValid"],"sources":["../../src/email-validation/index.ts"],"sourcesContent":["import { resolve4, resolve6, resolveMx } from \"node:dns/promises\"\nimport { domainToASCII } from \"node:url\"\n\n\nexport const DISPOSABLE_EMAIL_ERROR_CODE = \"disposable_email\"\nexport const INVALID_EMAIL_DOMAIN_ERROR_CODE = \"invalid_email_domain\"\n\nexport type EmailAddressValidationErrorCode =\n | typeof DISPOSABLE_EMAIL_ERROR_CODE\n | typeof INVALID_EMAIL_DOMAIN_ERROR_CODE\n\nexport type EmailDomainResolver = {\n resolveMx(hostname: string): Promise<Array<{ exchange: string; priority: number }>>\n resolve4(hostname: string): Promise<string[]>\n resolve6(hostname: string): Promise<string[]>\n}\n\nexport type EmailDomainValidationResult =\n | {\n status: \"valid\"\n domain: string\n reason: \"mx\" | \"implicit_mx\"\n }\n | {\n status: \"invalid\"\n domain?: string\n reason: \"invalid_domain\" | \"null_mx\" | \"unresolvable_mx\" | \"no_mail_records\"\n }\n | {\n status: \"unknown\"\n domain: string\n reason: \"dns_error\"\n }\n\nexport type ValidateEmailDomainOptions = {\n resolver?: EmailDomainResolver\n useCache?: boolean\n}\n\ntype AddressResolution = \"resolved\" | \"missing\" | \"unknown\"\n\ntype CachedEmailDomainValidation = {\n expiresAt: number\n result: EmailDomainValidationResult\n}\n\nconst VALID_CACHE_TTL_MS = 10 * 60 * 1000\nconst INVALID_CACHE_TTL_MS = 5 * 60 * 1000\nconst UNKNOWN_CACHE_TTL_MS = 30 * 1000\n\nconst nativeResolver: EmailDomainResolver = {\n resolveMx: (hostname) => resolveMx(hostname),\n resolve4: (hostname) => resolve4(hostname),\n resolve6: (hostname) => resolve6(hostname),\n}\n\nconst emailDomainValidationCache = new Map<string, CachedEmailDomainValidation>()\nconst pendingEmailDomainValidations = new Map<string, Promise<EmailDomainValidationResult>>()\n\nlet disposableEmailDomainsPromise: Promise<Set<string>> | undefined\n\nconst getDisposableEmailDomains = (): Promise<Set<string>> => {\n disposableEmailDomainsPromise ??= import(\"mailchecker\").then(\n ({ default: MailChecker }) => MailChecker.blacklist(),\n )\n return disposableEmailDomainsPromise\n}\n\nconst getDnsErrorCode = (error: unknown): string | undefined => {\n if (!error || typeof error !== \"object\" || !(\"code\" in error)) return undefined\n return typeof error.code === \"string\" ? error.code : undefined\n}\n\nconst isMissingDnsRecordError = (error: unknown): boolean => {\n const code = getDnsErrorCode(error)\n return code === \"ENODATA\" || code === \"ENOTFOUND\" || code === \"EBADNAME\"\n}\n\nconst getMailbox = (value: string): string => {\n const trimmed = value.trim()\n const displayAddress = trimmed.match(/<([^<>]+)>$/)\n return (displayAddress?.[1] ?? trimmed).trim()\n}\n\nexport const getEmailAddressDomain = (email: unknown): string | undefined => {\n if (typeof email !== \"string\") return undefined\n\n const mailbox = getMailbox(email)\n const atIndex = mailbox.lastIndexOf(\"@\")\n if (atIndex <= 0 || atIndex === mailbox.length - 1) return undefined\n\n const domain = mailbox.slice(atIndex + 1).toLowerCase()\n if (\n !domain\n || /\\s/.test(domain)\n || domain.includes(\"@\")\n || domain.includes(\"[\")\n || domain.includes(\"]\")\n || domain.includes(\"<\")\n || domain.includes(\">\")\n ) return undefined\n\n const asciiDomain = domainToASCII(domain)\n return asciiDomain || undefined\n}\n\nconst resolveAddressRecords = async(\n hostname: string,\n resolver: EmailDomainResolver,\n): Promise<AddressResolution> => {\n const results = await Promise.allSettled([\n resolver.resolve4(hostname),\n resolver.resolve6(hostname),\n ])\n\n if (results.some((result) => result.status === \"fulfilled\" && result.value.length > 0)) {\n return \"resolved\"\n }\n\n const errors = results\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason)\n\n return errors.every(isMissingDnsRecordError) ? \"missing\" : \"unknown\"\n}\n\nconst validateWithoutCache = async(\n domain: string,\n resolver: EmailDomainResolver,\n): Promise<EmailDomainValidationResult> => {\n let mxRecords: Awaited<ReturnType<EmailDomainResolver[\"resolveMx\"]>>\n\n try {\n mxRecords = await resolver.resolveMx(domain)\n } catch (error) {\n if (!isMissingDnsRecordError(error)) {\n return { status: \"unknown\", domain, reason: \"dns_error\" }\n }\n\n const implicitMx = await resolveAddressRecords(domain, resolver)\n if (implicitMx === \"resolved\") return { status: \"valid\", domain, reason: \"implicit_mx\" }\n if (implicitMx === \"unknown\") return { status: \"unknown\", domain, reason: \"dns_error\" }\n return { status: \"invalid\", domain, reason: \"no_mail_records\" }\n }\n\n if (mxRecords.length === 0) {\n const implicitMx = await resolveAddressRecords(domain, resolver)\n if (implicitMx === \"resolved\") return { status: \"valid\", domain, reason: \"implicit_mx\" }\n if (implicitMx === \"unknown\") return { status: \"unknown\", domain, reason: \"dns_error\" }\n return { status: \"invalid\", domain, reason: \"no_mail_records\" }\n }\n\n const exchanges = mxRecords.map(({ exchange }) => exchange.trim().replace(/\\.$/, \"\"))\n if (exchanges.some((exchange) => !exchange)) {\n return { status: \"invalid\", domain, reason: \"null_mx\" }\n }\n\n const exchangeResults = await Promise.all(\n Array.from(new Set(exchanges)).map((exchange) => resolveAddressRecords(exchange, resolver)),\n )\n\n if (exchangeResults.includes(\"resolved\")) return { status: \"valid\", domain, reason: \"mx\" }\n if (exchangeResults.includes(\"unknown\")) return { status: \"unknown\", domain, reason: \"dns_error\" }\n return { status: \"invalid\", domain, reason: \"unresolvable_mx\" }\n}\n\nconst getCacheTtl = (result: EmailDomainValidationResult): number => {\n if (result.status === \"valid\") return VALID_CACHE_TTL_MS\n if (result.status === \"invalid\") return INVALID_CACHE_TTL_MS\n return UNKNOWN_CACHE_TTL_MS\n}\n\nexport const clearEmailDomainValidationCache = (): void => {\n emailDomainValidationCache.clear()\n pendingEmailDomainValidations.clear()\n}\n\nexport const validateEmailDomain = async(\n email: unknown,\n options: ValidateEmailDomainOptions = {},\n): Promise<EmailDomainValidationResult> => {\n const domain = getEmailAddressDomain(email)\n if (!domain) return { status: \"invalid\", reason: \"invalid_domain\" }\n\n const resolver = options.resolver ?? nativeResolver\n const useCache = options.useCache ?? options.resolver === undefined\n if (!useCache) return validateWithoutCache(domain, resolver)\n\n const now = Date.now()\n const cached = emailDomainValidationCache.get(domain)\n if (cached && cached.expiresAt > now) return cached.result\n if (cached) emailDomainValidationCache.delete(domain)\n\n const pending = pendingEmailDomainValidations.get(domain)\n if (pending) return pending\n\n const validation = validateWithoutCache(domain, resolver).then((result) => {\n emailDomainValidationCache.set(domain, {\n expiresAt: Date.now() + getCacheTtl(result),\n result,\n })\n return result\n })\n\n pendingEmailDomainValidations.set(domain, validation)\n try {\n return await validation\n } finally {\n if (pendingEmailDomainValidations.get(domain) === validation) {\n pendingEmailDomainValidations.delete(domain)\n }\n }\n}\n\nconst hasDisposableEmailDomain = async(email: unknown): Promise<boolean> => {\n const emailDomain = getEmailAddressDomain(email)\n if (!emailDomain) return false\n\n const disposableEmailDomains = await getDisposableEmailDomains()\n let domain = emailDomain\n\n while (domain) {\n if (disposableEmailDomains.has(domain)) return true\n\n const nextDot = domain.indexOf(\".\")\n if (nextDot === -1) return false\n domain = domain.slice(nextDot + 1)\n }\n\n return false\n}\n\nexport const getEmailAddressValidationErrorCode = async(\n email: unknown,\n options: ValidateEmailDomainOptions = {},\n): Promise<EmailAddressValidationErrorCode | undefined> => {\n if (await hasDisposableEmailDomain(email)) return DISPOSABLE_EMAIL_ERROR_CODE\n\n const domainValidation = await validateEmailDomain(email, options)\n return domainValidation.status === \"invalid\" ? INVALID_EMAIL_DOMAIN_ERROR_CODE : undefined\n}\n\nexport const isEmailAddressValid = async(\n email: unknown,\n options: ValidateEmailDomainOptions = {},\n): Promise<boolean> => (await getEmailAddressValidationErrorCode(email, options)) === undefined\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as __toESM, t as __commonJSMin } from "./rolldown-runtime-FDOR9p9I.js";
|
|
2
2
|
import { c as runRtsQuery, d as getDerivedKey, i as normalizeRtsQueryOptions, n as buildRtsAbilityFromRequest, o as resolveRtsRequestTenantId, r as isRtsRequestAuthorized, s as runRtsCount, t as RTS_QUERY_WINDOW_MAX_COUNT, u as syncAuthenticatedSessionMiddleware } from "./queryWindow-DNQxuY_M.js";
|
|
3
3
|
import { i as sendEmail, n as configureEmailTransport, r as createResendEmailTransport, t as EmailDeliveryError } from "./email-B7QOOLlZ.js";
|
|
4
|
-
import { DISPOSABLE_EMAIL_ERROR_CODE, INVALID_EMAIL_DOMAIN_ERROR_CODE, clearEmailDomainValidationCache, getEmailAddressDomain, getEmailAddressValidationErrorCode,
|
|
4
|
+
import { DISPOSABLE_EMAIL_ERROR_CODE, INVALID_EMAIL_DOMAIN_ERROR_CODE, clearEmailDomainValidationCache, getEmailAddressDomain, getEmailAddressValidationErrorCode, isEmailAddressValid, validateEmailDomain } from "./email-validation/index.js";
|
|
5
5
|
import session from "express-session";
|
|
6
6
|
import { RedisStore } from "connect-redis";
|
|
7
7
|
import MongoStore from "connect-mongo";
|
|
@@ -5520,6 +5520,6 @@ var ssrMiddleware = ({ viteInstance, dataRoutes, errorExtraComponent, getHtmlOut
|
|
|
5520
5520
|
}
|
|
5521
5521
|
};
|
|
5522
5522
|
//#endregion
|
|
5523
|
-
export { DISPOSABLE_EMAIL_ERROR_CODE, EmailDeliveryError, INVALID_EMAIL_DOMAIN_ERROR_CODE, RPCBASE_SERVICE_WORKER_MESSAGE_SOURCE, RPCBASE_SERVICE_WORKER_PATH, bindShutdownSignals, clearEmailDomainValidationCache, configureEmailTransport, createResendEmailTransport, getDerivedKey, getEmailAddressDomain, getEmailAddressValidationErrorCode, hashPassword, hashPasswordForStorage, initServer,
|
|
5523
|
+
export { DISPOSABLE_EMAIL_ERROR_CODE, EmailDeliveryError, INVALID_EMAIL_DOMAIN_ERROR_CODE, RPCBASE_SERVICE_WORKER_MESSAGE_SOURCE, RPCBASE_SERVICE_WORKER_PATH, bindShutdownSignals, clearEmailDomainValidationCache, configureEmailTransport, createResendEmailTransport, getDerivedKey, getEmailAddressDomain, getEmailAddressValidationErrorCode, hashPassword, hashPasswordForStorage, initServer, isEmailAddressValid, onShutdown, registerRpcbaseServiceWorkerRoute, rpcbaseServiceWorkerRequestHandler, rpcbaseServiceWorkerSource, sendEmail, ssrMiddleware, validateEmailDomain, verifyPasswordFromStorage };
|
|
5524
5524
|
|
|
5525
5525
|
//# sourceMappingURL=index.js.map
|